Blackriv3r Inserito: 29 ottobre 2012 Segnala Share 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? Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 30 ottobre 2012 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
Blackriv3r Inserita: 30 ottobre 2012 Autore Segnala Share 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. Link al commento Condividi su altri siti More sharing options...
pcontini Inserita: 30 ottobre 2012 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 31 ottobre 2012 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
Blackriv3r Inserita: 1 novembre 2012 Autore Segnala Share 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! Link al commento Condividi su altri siti More sharing options...
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