Vai al contenuto
PLC Forum


Array Di Array


Messaggi consigliati

Inserito:

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?


Inserita:

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

Inserita:

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.

Inserita:

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


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

Ciao

Inserita: (modificato)

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
Inserita:

Grazie a tutti

pare che sia una limitazione di Omron con l'ST!!! Le strutture non sono supportate adeguatamente per ora!

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...