Blackriv3r Inserito: 29 ottobre 2012 Segnala Inserito: 29 ottobre 2012 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?
Ctec Inserita: 30 ottobre 2012 Segnala Inserita: 30 ottobre 2012 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
Blackriv3r Inserita: 30 ottobre 2012 Autore Segnala Inserita: 30 ottobre 2012 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.
pcontini Inserita: 30 ottobre 2012 Segnala Inserita: 30 ottobre 2012 Riporto dal manuale W447-E1-12 - OPERATION MANUAL Function Blocks/Structured Text Note Only one-dimensional arrays are supported by the CX-Programmer. Ciao
Ctec Inserita: 31 ottobre 2012 Segnala Inserita: 31 ottobre 2012 (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: 31 ottobre 2012 da Ctec
Blackriv3r Inserita: 1 novembre 2012 Autore Segnala Inserita: 1 novembre 2012 Grazie a tutti pare che sia una limitazione di Omron con l'ST!!! Le strutture non sono supportate adeguatamente per ora!
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora