MarioS Inserito: 15 novembre 2006 Segnala Share Inserito: 15 novembre 2006 Ciao a tutti , ho un problema legato all'utilizzo di un ARRAY definito nelle variabili STAT di un FB a cui vorrei puntare con un indice di un puntatore. ....Ora cerco di spiegarmi meglio..Ho creato un Fb con l'intento di memorizzare ciclicamente un valore in REAL in una determinata area della DB di istanza associata al mio FB.Quindi ho definito nelle variabili STAT un ARREY ("STORE_DATA" ARRAY [1..299] Of Real] ) al quale dovrei puntare con un puntatore per andare a depositare il mio valore ciclicamente incrementando ovviamente l'indice . come si vede sotto mi sono creato l'indice a bit del puntatore moltiplicando il byte 22 che è l'inizio del mio ARRAY , per 8. Poi ho caricato l'indice in AR1 ...e qui nasce il problema...che istruzione devo usare per trasferire il valore #VAL nella variabile puntata??? U #FIRST //PRIMA ELABORAZIONE SPB STOR L 22 //BYTE INIZIALE AREA DATI L 8 *I T #INDICE_POINTER //CALCOLO INDICE PUNTATORE UN #FIRST //BIT 1^ CICLO S #FIRSTSTOR: NOP 0 L #INDICE_POINTER LAR1 L #VAL T ...... [ar1,p#0.0] //TRASFERIMENTO INDICIZZATO DEL VALORE ISTANTANEOSpero di essere stato chiaro..... Ciao Link al commento Condividi su altri siti More sharing options...
mynameisrex Inserita: 15 novembre 2006 Segnala Share Inserita: 15 novembre 2006 Se vai sull'. e cerchi "Tipi di dati validi per i dati locali degli FB" (io l'ho trovato cecando POINTER) vedrai che per quanto riguarda gli FB non è ammesso lavorare sulle variabili STAT (istanza) !!!!Io normalmente scrivo (o leggo) i dati da DB "esterne"... e così funziona egregiamente. P.S. non ho avuto modo di provarlo, ma se devi spostarti di 4 byte alla volta (REAL=32 bit) probabilmente devi moltiplicare l'indice del puntatore x16 (SLW4). Link al commento Condividi su altri siti More sharing options...
rguaresc Inserita: 15 novembre 2006 Segnala Share Inserita: 15 novembre 2006 Prova cosi':L'indirizzamento e' a bit quindi #INDICE_POINTER deve andare a passi di 32. Sara' 0 per il real che si deposita a partire dal byte 22, 32 per il successivo real da depositare nel byte 26 e cosi via. Supponi che il DB di istanza sia DB10. AUF DB 10 // apri il blocco dati di istanza dell'FB LAR1 P#DBX 22.0 // carica in AR1 in formato puntatore l'indirizzo del primo bit destinazione TAR1 // copialo nell'accumulatore L #indice_pointer // deve andare a passi di 32 in formato DINT. +D // sommali LAR1 // il risultato nel registro AR1 L valore_real // carica inn ACCU1 il dato real T D [AR1,P#0.0] // trasferisci in modalita' 32 bit secondo AR1 Link al commento Condividi su altri siti More sharing options...
Ron the bon Inserita: 16 novembre 2006 Segnala Share Inserita: 16 novembre 2006 Secondo me l'unico errore e' che moltiplichi solo per 8. Tu lavori con dati Real, quindi devi moltiplicare il tutto *2, o usare swl4. Link al commento Condividi su altri siti More sharing options...
MarioS Inserita: 16 novembre 2006 Autore Segnala Share Inserita: 16 novembre 2006 Problema risolto.....Dopo vari tentativi ho scoperto che le DB di istanza vengono riconosciute come DI.Quindi basta sostituire il normale utilizzo dell'operando DB usato per le DB globali, con l'operando DI e tutto funzionoa perfettamente..... Il primo dato lo devo trasferire in DID 22 quindi essendo l'indirizzo del puntatore a bit lo moltiplico per 8.Il puntatore viene poi incrementato di 32 (essendo il mio dato #VAL un REAL) per puntare alla prossima DID 26 e così via.Grazie a Gianluigi....... U #FIRST //PRIMA ELABORAZIONE SPB STOR L 22 //BYTE INIZIALE AREA DATI L 8 *I T #INDICE_POINTER //CALCOLO INDICE PUNTATORE UN #FIRST //BIT 1^ CICLO S #FIRSTSTOR: NOP 0 L #INDICE_POINTER LAR1 L #VAL T DID [AR1,P#0.0] //TRASFERIMENTO INDICIZZATO DEL VALORE ISTANTANEO L #INDICE_POINTER L 32 +I T #INDICE_POINTER //INCREMENTO INDICE DEL PUNTATORE 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