Vai al contenuto
PLC Forum


Inizializzazione Puntatori Any


Dalia85

Messaggi consigliati

Salve a tutti,

sono alle prime armi :wallbash: con la programmazione in Siemens Step 7 (AWL) e ho dei dubbi riguardo ai puntatori ANY.

In pratica devo copiare dei dati da un DB ad un altro utilizzando la funzione BLKMOV che richiede nei parametri src e dest dei puntatori ANY.

Io però vorrei che il puntatore non sia fisso ma dipenda da un'altra variabile che mi indica l'inizio della parte di memoria da dove copiare i dati

Ad esempio:

se la variabile x è 0 allora voglio che il puntatore ANY sia P# DBX 0.0 WORD 4

se la variabile x è 1 allora voglio che il puntatore ANY sia P# DBX 1.0 WORD 4

se la variabile x è 8 allora voglio che il puntatore ANY sia P# DBX 8.0 WORD 4

etc

Qualcuno sa aiutarmi?

Grazie :smile:

Link al commento
Condividi su altri siti


hai diverse soluzioni.

la prima più banale ma meno efficace è quella di richiamare sfc20 diverse volte a seconda del valore della variabile X. se x=1 salta a sfc20 1 se x=2 salta a sfc20 2. questo è un modo semplice ma che usa molta memoria ed è poco elegante.

http://www.plcforum.it/f/topic/150893-dati-in-formato-any/

nella discussione qui sopra si parla invece di come trasformare P# DBX 0.0 WORD 4 in una vera e propria variabile. nel tuo caso dovresti indicizzare il byte.

Link al commento
Condividi su altri siti

Ho messo un progetto di esempio che carica tramite SFC20 una STRUCT (potrebbe essere una di 10 ricette selezionabili tramite una INT) da una DB ad un altra DB

il codice dell'FC è molto semplice:

// Preimposta AR1 per puntare al parametro di ingresso #Indirizzo_iniziale
      L     P##Indirizzo_iniziale
      LAR1  
// Copia il dato any #Indirizzo_iniziale nel un dato locale #Indirizzo_sorgente
      L     D [AR1,P#0.0]               // 10h, dati e fattore ripetizione
      T     LD     0
      L     W [AR1,P#4.0]               // nr.db
      T     LW     4
      L     D [AR1,P#6.0]               // pointer
      T     LD     6
// Modifica il puntatore ANY secondo l'#Offset calcolato moltiplicando #NrRic per 
// il numero di bytes della ricetta 
      L     #NrRic                      // Nr. ricetta da caricare (0-1-2-...)
      L     LW     2                    // fattore ripetizione nell ANY (bytes)
      *D                                // *
      SLD   3                           // trasforma in pointer
      L     LD     6
      +D                                // somma nell'ANY
      T     LD     6



// Ora il dato locale #Indirizzo_sorgente contiene un puntatore ANY che punta a 
// #Indirizzo_iniziale + #Offset


      CALL  "BLKMOV"
       SRCBLK :=#Indirizzo_sorgente
       RET_VAL:=#RV
       DSTBLK :="Ric".ACT



Modificato: da JumpMan
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...