Vai al contenuto
PLC Forum


Copiare Dati In Modo Parametrico


TMlm

Messaggi consigliati

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?

Link al commento
Condividi su altri siti


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

Link al commento
Condividi su altri siti

Matteo Montanari

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

Matteo Montanari

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")

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