Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Copiare Dati In Modo Parametrico


Messaggi consigliati

Inserito:

ciao a tutti, ho il seguente problema:

dovrei copiare una gran quantità di dati in un lungo archivio (abbastanza da scoraggiarmi ad usare le istruzioni L, T ripetute n volte). Per fare questo ho creato un UDT per definire tutti i campi di una ricetta.

Nella chiamata alla SFC 20 che vedete sotto, "DBricette".BUFFER è un UDT e "DBricette".ARCHIVIO_RECORDS[]

è un array dello stesso tipo.

CALL "BLKMOV"

SRCBLK :="DBricette".BUFFER

RET_VAL:="Err_sfc20"

DSTBLK :="DBricette".ARCHIVIO_RECORDS[1]

il mio problema, come potete immaginare, è che non devo copiare il BUFFER sempre nella posizione 1 del vettore ma dovrei parametrizzarla. se metto una variabile di tipo BYTE, WORD o INT al posto dell'indice, ricevo errori di sintassi.

qualcun altro ha avuto in passato lo stesso problema?


Inserita:

Guarda questo link

discussione su block move

comunque devi dare il bit di partenza e il numero di word byte o double word che devi spostare

deve essere coincidente con la lunghezza di destinazione.

Inserita:

Grazie STEU ma così come l'ho scritto sul post il blocco già funziona, il fatto è che dovrei mettere una variabile al posto dell'1 sull'indice dell'array o comunque dovrei trovare un modo per copiare blocchi con un offset variabile...

Matteo Montanari
Inserita:

Prova con questo codice:

FUNCTION "FC_COPY_BLOCK" : VOID
TITLE =COPY BLOCK
AUTHOR : 
NAME : Copy_Bk
VERSION : 0.1


VAR_INPUT
  DB_SORGENTE : WORD;    //Nr.DB Sorgente
  DB_DESTINAZIONE : WORD;    //Nr.DB Destinazione
  BYTE_SORGENTE : DWORD;    //Nr.BYTE Sorgente
  BYTE_DESTINAZIONE : DWORD;    //Nr.BYTE Destinazione
  NR_BYTE : WORD;    //NR.BYTE da trasferire
END_VAR
VAR_TEMP
  SORGENTE : ANY;    //Parametro ANY sorgente
  DESTINAZIONE : ANY;    //Parametro ANY Destinazione
  RETVAL : INT;    //Valore ritorno SFC
END_VAR
BEGIN
NETWORK
TITLE =COMPILAZIONE AREA ANY SORGENTE

      LAR1  P##SORGENTE; // Indirizzo sorgente area ANY
      L     W#16#1002; // Codice ID e tipo dati
      T     LW [AR1,P#0.0]; 
      L     #NR_BYTE; // Nr.byte da trasferire
      T     LW [AR1,P#2.0]; 
      L     #DB_SORGENTE; // Nr.DB
      T     LW [AR1,P#4.0]; 
      L     #BYTE_SORGENTE; 
      SLD   3; 
      OD    DW#16#84000000; 
      T     LD [AR1,P#6.0]; 
NETWORK
TITLE =COMPILAZIONE AREA ANY DESTINAZIONE

      LAR1  P##DESTINAZIONE; // Indirizzo destinazione area ANY
      L     W#16#1002; // Codice ID e tipo dati
      T     LW [AR1,P#0.0]; 
      L     #NR_BYTE; // Nr.byte da trasferire
      T     LW [AR1,P#2.0]; 
      L     #DB_DESTINAZIONE; // Nr.DB
      T     LW [AR1,P#4.0]; 
      L     #BYTE_DESTINAZIONE; 
      SLD   3; 
      OD    DW#16#84000000; 
      T     LD [AR1,P#6.0]; 
NETWORK
TITLE =TRASFERIMENTO BLOCCO

      CALL "MOVE_BLOCK" (// SFC20 DATA BLOCK_MOVE
           SRCBLK                   := #SORGENTE,
           RET_VAL                  := #RETVAL,
           DSTBLK                   := #DESTINAZIONE);

END_FUNCTION

che comunque è nel manuale Siemens, sia cartaceo che elettronico, non che trovarlo sia semplice ma ...

Inserita:

:unsure: sto ancora cercando nella documentazione, ma proprio non riesco a trovare...

comunque è proprio ciò di cui avevo bisogno. ;) Grazie

qualcuno può darmi qualche riferimento per la documentazione citata?

Matteo Montanari
Inserita:

manuale in linea -> sottocartella "cerca" -> Impiego del tipo di parametri ANY

ed hai esempio della funzione .

da quella presentata nel manuale sono stati aggiunti i parametri per renderla "più" utile.

eventualmente puoi modificare gli indirizzamenti e da copia DB -> DB può diventare qualsiasi cosa...

(controlla per questo anche articolo "Formato del tipo di parametri ANY")

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