Vai al contenuto
PLC Forum


Uso Puntatori In Fb


MarioS

Messaggi consigliati

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. :blink: ....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 #FIRST

STOR: NOP 0

L #INDICE_POINTER

LAR1

L #VAL

T ...... [ar1,p#0.0] //TRASFERIMENTO INDICIZZATO DEL VALORE ISTANTANEO

Spero di essere stato chiaro..... :)

Ciao

Link al commento
Condividi su altri siti


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). :unsure:

Link al commento
Condividi su altri siti

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

:rolleyes: 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..... :D

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 #FIRST

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

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