Vai al contenuto
PLC Forum


RICETTE Array di Array in ST


biondo

Messaggi consigliati

Ciao a tutti, sto creandomi un FB in linguaggio ST per poter gestire le ricette :clap:  delle mie macchine.

Ho creato un Array di word di 100 posizioni (DM0-DM99) Ary_a  sono i parametri (le variabili) per ciscuna ricetta.

Poi ho l'area delle ricette Ary_b , altro array di 100 posizioni (per esempio D10000-D10099)

Infine ho un Array di 100 posizioni Ary_c  di tipo Ary_b .(D10000-D19999)

 

Cosi' facendo a seconda dell'indice della ricetta da salvare con un ciclo FOR dovrei copiare Ary_a  su Ary_b + indice offset.

 

Il problema ora è come diachiarere in ST una variabile matrice di matrice ovvero un array di 100 elementi Ary_C di tipo Ary_b

in modo da evere un primo indice che mi va da 0-99 per copiare i 100 parametri , un secondo indice da 0-99 per selezionare l'area di partenza per la copia.

 

Qualcuno sa come creare o bypassare il problema in ST ?  :wallbash:

 

Grazie per qualsiasi suggerimento e/o risposta.

 

Buona serata.

 

 

Link al commento
Condividi su altri siti


Credo che tu stia usando un CJ e non un NJ. Le cose non sono identiche.

In CJ (CX programmer) non è possibile creare direttamente array multidimensionali, o array di array.

Puoi farlo creando in Tipi di Dati una Struct contenente i dati della tua ricetta, nel tuo caso ha come elemento una matrice di 100 elementi [0..99].

Poi definisci un simbolo che è un array di struct, cui poi potrai puntare con gli indici (praticamente ricetta.elemento[j]).

Tra l'altro, questo sistema consente di usare come elementi della ricetta dei dati eterogenei (le strutture contengono dati che non sono necessariamente dello stesso tipo). Molto comodo nelle ricette.

 

Ma la cosa più comoda per copiare aree è usare la XFER magari usando un puntatore al primo elemento e spostando cento elementi tutti in una volta, senza FOR.

Link al commento
Condividi su altri siti

Ciao Ctec, hai ragione sto usando un CJ1M..... fammi capire meglio definisco una variabile di tipo array [100] elementi e poi non ho capito l'ulteriore simbolo che devo creare come variabile....

Puoi spiegarti meglio.... Grazie

Link al commento
Condividi su altri siti

Ciao Ctec,

 

finalmente ho capito........ sono andato in tipo di dati e ho creato la mia struttura (vedi allegato1)... poi ho creato una variabile interna

 

Recipe di tipo della mia struttura (Ric) che è un array a 100 posizioni con AT  DM0 (allegato 2).

 

Ora stavo testando semplicemente con un indice k per vedere se funziona.....ma riscontro un errore strano....INDICE DI MATRICE NON VALIDO

 

(vedi errore allegato 2)... mi sfugge qualcosa ?

 

Se al posto del mio indice k metto un valore numerico la compilazione non da errore......

 

Qualche idea ?:worthy:

 

Grazie .

 

 

Struttura ricette.jpg

Variabile interna Ricette 100 e errore.jpg

Link al commento
Condividi su altri siti

Nel CJ (CP e CS) non è possibile indicare un indice variabile in una matrice. Era quello che volevo dire nel mio primo post.

Per fare quello che vuoi te, tanto usi aree fisse del CJ, meglio usare una XFER con un puntatore.

Appena ho due minuti ti mando un esempio

Link al commento
Condividi su altri siti

Dunque. Premesso che (purtroppo) nel CX-programmer non si può indicizzare una matrice, si ricorre a un sistema diverso.

Suppongo che tu abbia definito la tua ricetta (in uso) come hai detto come un array Ary_a che inizia da D0, ed è lungo 100word. Tale lunghezza la definiamo nella tabella dei simboli con una costante WordRicetta pari a &100.

Nel momento che vorrai salvare la tua ricetta in uso nel tuo archivio, te hai indicato che il tuo archivio comincia a D10000, e quindi definiamo un'altra costante come &10000 e la chiamiamo StartRicette.

Ora ci definiamo una temporanera doppia  UDINT , e la chiamiamo DTemp. Poi una UINT chiamata NewRic che conterrà il numero della ricetta su cui scrivere o da cui leggere. Il suo contenuto sarà da 0 al numero massimo di ricette che vogliamo. E infine una UINT chiamata Pointer che ci servirà da puntatore

Abbiamo tutto pronto per trasferire i dati da e per l'archivio.

 

Per scrivere faremo così (ladder):

* NewRic WordRicetta DTemp   (preparo a puntare alla ricetta giusta in archivio)

+ DTemp StartRicette Pointer    (aggiungo l'offset di inizio archivio)

XFER WordRicetta Ary_a[0] @Pointer   (trasferisco 100 word dalla mia ricetta attuale all'archivio puntato).

 

Similmente per leggere faremo così (ladder):

* NewRic WordRicetta DTemp   (preparo a puntare alla ricetta giusta in archivio)

+ DTemp StartRicette Pointer    (aggiungo l'offset di inizio archivio)

XFER WordRicetta @PointercAry_a[0]    (trasferisco 100 word dall'archivio puntato alla mia ricetta attuale ).

 

Spero sia chiaro

Link al commento
Condividi su altri siti

Ciao, intanto grazie per la pazienza e i suggerimenti, :clap:

 

ho dato un occhio al tuo codice, la domanda è funziona anche in ST o devo per forza farlo in LADDER ?

 

Grazie

 

 

Link al commento
Condividi su altri siti

Lavorando con il CJ2 ed CX-Programmer è possibile indicizzare in modo dinamico gli array sia in ladder che in ST (task o blocco funzione che sia).

Se non ricordo male era possibile farlo anche con il CJ1 ma solo dentro gli FB.

 

Nel blocco funzione riportato sopra non viene dichiarata la variabile K. Quindi il compilatore si lamenta.

 

Ciao.

Link al commento
Condividi su altri siti

Col CJ1 in ladder è impossibile indicizzare gli array. Si possono indicizzare nelle FB, ma non si possono fare array di array, nè array multidimensionali.

Col CJ2 ha ragione 0.0, si può fare. Ma non array di array.

 

In ST col CJ1 non si può (a mia conoscenza) usare l'indirezione, o indirizzamento indiretto (possibile col CJ2), né è possibile usare in una FB ladder i puntatori @ o * (indirizzamento indiretto). Attualmente è un po' un controsenso usare il CJ1, meglio il CJ2 su tutti i fronti.

 

Ti ho messo un esempio con la XFER in ladder, perché funziona sicuramente con i CJ1 e CP1.

 

Link al commento
Condividi su altri siti

Grazie  ... preciso che  utilizzo CJ2M  Cpu 12  e   per mio sfizio 

volevo fare tutta la gestione del FB  in  linguaggio ST..........

 

Ctec  0.0  pensate si possa fare ?

 

Grazie

Link al commento
Condividi su altri siti

Ciao ragazzi, sto provando ad usare XFER con indirizzamento indiretto (@D200) e funziona regolarmente se la metto nella sezione 1....o comunque sotto Nuovo Programma

 

SE invece la creo con "GENERAZIONE BLOCCO FUNZIONE LADDER"  mi importa tutto quanto ma la XFER non va .....

 

Non c'è proprio modo di scrivere  (XFER  &10 @D200 D0)    all'interno del FB in Ladder......:wallbash::wallbash:  ci DEVE essere una soluzione.....

 

 

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...