Renato_x Inserito: 14 marzo 2006 Segnala Inserito: 14 marzo 2006 Ciao a tutti, domanda:è possibile accedere ad un elemento di un array tramite un volore contenuto in un merker (indice)?es. MioBlocco.MioArray[MB60] ? o qualcosa di simile.mi serve accedere ad un elemento dell'array in base ad un valore che leggo da un inputdimenticavo: programmando in KOPgrazie
Lc001 Inserita: 15 marzo 2006 Segnala Inserita: 15 marzo 2006 se fosse una cosa cosi sarebbe perfetto pero io non lho trovato sul .. e io use indirect addressing per questo. cioe per esempio hai un array = array[0..9] di byte adesso array[0] = 0 (bit di comcincio)array[1] = 9 (bit di comincio)...tu puoi fare per esempio L L#0t ld0opn db10 l dbb[ld 0]adesso tuo indice e ld0 pero non e come visual basic.. tutto bit based devi aggiungere 8 per avere prossimo valore..
Renato_x Inserita: 15 marzo 2006 Autore Segnala Inserita: 15 marzo 2006 grazie per la rispostaSul manuale come ci sono i soliti esempi stupidi...la cosa è un po' + complicata di come l'ho spiegata, in realtà mi serve un array di strutture (a meno di divididere la struttura in n array) e ho già notato che appena cambio un tipo di dato nella struttura mi si incasina tutto...Con alley bradley la stessa cosa è semplicissima (ergo è perfetto ), come lo rimpiango...
walterword Inserita: 15 marzo 2006 Segnala Inserita: 15 marzo 2006 hanno creato set di istruzioni nuove in siemens? per puntare ad una variabile indicizzata in awl , anche perche in kop e fup non si puo ,bisogna creare un array o array di struttura/e e poi ottenere il formato puntatore , esempiomio_array :array[1..100] of int ;mio_indice:int;mio_indice=3;l mio_indice slw 3 lar1l dbw[ar1,p#0.0]t mw10
walterword Inserita: 15 marzo 2006 Segnala Inserita: 15 marzo 2006 ricordati che un array di strutture altro non e' che una tabella quindi ogni volta che vuoi spostarti alla riga successiva dovrai sommare un offset in bytes che sara il numero di bytes di una riga Questo si usa quando vuoi fare un loop while -do o for next in awl ed iterare tra tutte le righe I singoli elementi di una riga , cioe della tua struttura li punti con l'offset del puntatore mia_tab:array[1..100] of struct dato1:int;dato2:real;dato3;byte;end_struct index:int;L 1t index u(L indexL 700<I)spbn salt L index slw 3 lar1L dbw[AR1,p#0.0] //qui carichi la var mia_tab[1].dato1T MW20L dbw[AR1,p#2.0] //qui carichi la var mia_tab[1].dato2T MD22L dbw[AR1,p#6.0] //qui carichi la var mia_tab[1].dato3T MB27//incremento l'offset per saltare alla riga successiva //incremento l'indice del loop // ect ect ect salt:nop 0l indexl 100<i
batta Inserita: 15 marzo 2006 Segnala Inserita: 15 marzo 2006 (modificato) FUNCTION FC 100 : VOIDTITLE =Leggi dato da DB con puntatoreAUTHOR : battaVERSION : 0.1VAR_INPUT N_DB : BLOCK_DB ; StrByte : INT ; ID : INT ; END_VARVAR_OUTPUT Value : INT ; END_VARVAR_TEMP Addr : DINT ; END_VARBEGINNETWORKTITLE =Calcola puntatore e leggi dato AUF #N_DB; //Apri DB L P#DBX 0.0; //Inizializza puntatore L #StrByte; //Leggi indirizzo inizio array, ITD ; //trasforma in DINT SLD 3; //conversione indirizzo da byte a bit +D ; //indirizzo inizio array in formato puntatore L #ID; //Carica numero variabile da puntare (allineata a ZERO) ITD ; //Trasforma in DINT SLD 4; //conversione indirizzo da word a bit +D ; T #Addr; //Indirizzo in formato puntatore della variabile nel DB L DBW [#Addr]; //Leggi valore variabile puntata T #Value; //Trasferisci in uscitaEND_FUNCTIONPuoi compilare questa FC (crea nuovo sorgente ed inserisci con copia/incolla) e richiamarla in programma kop."N_DB" = DB che contiene il tuo array"StrByte" [iNT] = indirizzo (byte) inizio array (non è detto che il tuo array parta da inizio DB)"ID" [iNT] = indice variabile dell'array (in INT, allineata a ZERO)"Value" [iNT] = valore lettoATTENZIONE: non viene eseguito nessun controllo ne' sull'esistenza del DB ne' sulla validità dell'indirizzo calcolatoSe questa funzione non fa al caso tuo, specifica meglio quello di cui hai bisogno e vedremo cosa si può fare. Modificato: 15 marzo 2006 da batta
Renato_x Inserita: 15 marzo 2006 Autore Segnala Inserita: 15 marzo 2006 Grazie per le info, io non so quasi niente in awl comunque imparo presto (se trovassi il tempo per documentarmi...), per adesso sto cercando di capire se quello che ho fatto con Allen Bradley è fattibile anche con step 7 (senza impiccarmi)se dovessi gestire un array di struct? (è solo ipotesi, sono disposto a dividere la struct in n array di INT)mi serve anche la funzione per scrivere nell'array, ma credo che sia sufficiente modificare la parte finale della funzione.
batta Inserita: 15 marzo 2006 Segnala Inserita: 15 marzo 2006 Bene, crea una struttura composta da n array di int. Poi devi sempre fare riferimento agli indirizzi.Credo sia superfluo dirlo, ma nel DB non devi apportare modifiche (aggiunta o cancellazione di variabili prima della struttura) che vadano a modificare gli indirizzi delle variabili della tua struttura.In Allen Bradley (logix5000?) se non mi sbaglio gli indirizzi non esistono, mentre in S7 è sempre e solo l'indirizzo che conta.Per scrivere devi solo dichiarare la variabile "Value" come variabile in ingresso anzichè in uscita, e modificare le ultime due righe della mia funzione come segue: L #Value T DBW [#Addr]
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