Vai al contenuto
PLC Forum


Array Di Array


Blackriv3r

Messaggi consigliati

Ciao a tutti

ho il seguente problema

Sto programmando con una cpu CJ2M che supporta le strutture dati e proprio con questi ultimi ho un problema.

Ho dichiarato una struttura "Prova" formata da diversi membri di tipo DINT. Ciascuno dei membri è un array di 10 elementi.

Prova [struct]

Cane DINT[10]

Gatto DINT[10]

Presente Bool

In simboli ho dichiarato la variabile Prova1 di tipo Prova come array di 5 elementi.

Il mio problema è che non posso andare ad annidare 2 array

IndiceMax:=5;

IndiceMax2:= 10;

FOR i :=1 TO IndiceMax BY 1 DO;

Prova.Presente := TRUE;

FOR j:= 1 TO IndiceMax2 BY 1 DO;

Prova.Cane[j]=Prova.Presente AND j<= 8;

END_FOR;

END_FOR;

In teoria questi 2 cicli dovrebbero fare la seguente operazione:

Con il primo for vado a settare a 1 il bit di presenza di prova per i 5 valori della matrice (Prova1;Prova2 ecc...Prova5)

Con il secondo for verifico la condizione che Prova[1].Cane[1] sia 1 solamente se Prova1 stessa è presente e l'indice della matrice j sia minore o uguale a 8.

Stessa cosa per il valore Cane2 sempre contenuto in Prova[1] ecc....

Compilando il programma ottengo : Indice di matrice non valido

Cosa sbaglio?

Link al commento
Condividi su altri siti


Secondo me, l'errore sta nell'indice massimo.

Gli array partono sempre con indice 0, per cui un array di 5 elementi avrà indici da 0 a 4.

Pertanto, siccome nella prima FOR vai da 1 a 5, quest'ultimo indice non esiste per l'array (che finisce a 4).

Stessa cosa per il secondo FOR (da 1 a 10 anziché da 0 a 9).

Riprova e fammi sapere

Link al commento
Condividi su altri siti

Ho provato a cambiare i valori di Indice massimo ma ottengo lo stesso errore.

Forse mi sono spiegato male ma il primo indice lo legge correttamente, mentre il secondo è quello che mi causa l'errore

Prova.Cane[j]=Prova.Presente AND j<= 8;

Il problema è che se non metto [j] il compilatore si aspetta l'indice e se lo metto lo vede come indice di matrice non valido.

Premetto che entrambi gli indici sono stati definiti come variabili di tipo Int.

Link al commento
Condividi su altri siti

Riporto dal manuale W447-E1-12 - OPERATION MANUAL Function Blocks/Structured Text


Note Only one-dimensional arrays are supported by the CX-Programmer.

Ciao

Link al commento
Condividi su altri siti

Ho fatto delle prove.

Utilizzando la tua struct, ho testato questo:

FOR i :=0 TO 4 BY 1 DO;

Prova.Cane[2] := 13;

END_FOR;

Qualsiasi numero io metta per l'elemento Cane (da 0 a 9, altrimenti abbiamo un errore di fuori intervallo), viene compilato. In pratica, puntiamo a un membro definito della struttura.

Se invece metto

FOR i :=0 TO 4 BY 1 DO;

Prova.Cane := 13;

END_FOR;

si ha l'errore di indice non valido. E' come se lo ST non potesse puntare a membri variabili, ma solo fissi.

Anche

FOR i :=0 TO 4 BY 1 DO;

Prova[3].Cane := 13;

END_FOR;

provoca il medesimo errore, a indicare che non è un problema di array multidimensionali, ma di gestione dei membri di una struttura.

Ah, come vorrei il C nella programmazione dei PLC...

Modificato: da Ctec
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...