Vai al contenuto
PLC Forum


MOVE da byte di ingressi a array di byte in DB


Cesare Nicola

Messaggi consigliati

Cesare Nicola

Devo fare un move di 20 byte di ingresso periferia, che vengono scritti da un partner Profibus, in un array di 20 byte contenuto in una DB. La DB è ad accesso ottimizzato. Vorrei fare il trasferimento in una volta sola, con un MOVE_BLOCK, MOVE_BLOCK_VARIANT ma non riesco: in un caso o nell'altro c'è sempre o il parametro d'ingresso o quello di uscita non compatibili con quel blocco. Possibile che debba fare venti MOVE singoli (o 4  MOVE di 5 Dword)? Mi sembra strano.

Link al commento
Condividi su altri siti


Ciao,

credo che l'unica alternativa per evitare 20 volte il blocco MOVE sia quello di togliere la spunta all'ottimizzazione del DB 

 

aggiornaci se ci dovessero essere altri metodi

Link al commento
Condividi su altri siti

Cesare Nicola
Quote

credo che l'unica alternativa per evitare 20 volte il blocco MOVE sia quello di togliere la spunta all'ottimizzazione del DB

No, non riesco nemmeno così.
 

Quote

Creare un fb in scl con un ciclo for.

Ci avevo pensato ma dovrei indicizzare l'accesso ai byte di ingresso periferia e non so come fare, credo non si possa: dovrebbero far parte di un array ma non è possibile creare un array di ingressi.

Visto il poco tempo a disposizione lascio stare, uso i MOVE e a posto così.

Link al commento
Condividi su altri siti

1 ora fa, Cesare Nicola scrisse:

No, non riesco nemmeno così.

 

Se il DB non è ad accesso ottimizzato puoi usare il BLKMOV usando i puntatori.

Ad esempio, i byte d'ingresso sono da EB1 a EB20 e devi copiarli in un array del DB10. Se il DB non è ottimizzato avrai che l'array parte da un certo byte, ad esempio dallo zero.

Puoi scrivere

 

CALL BLKMOVE

Variant

SRCBLK := P#E1.0 byte 20

Ret_VAL := #RetValBLKMOV

DSTBLK := P#DB10.DBX0.0 Byte 20

 

Link al commento
Condividi su altri siti

Cesare Nicola

Col 1200 esiste il blocco MOVE_BLK ma non accetta un puntatore in ingresso. C'è poi il blocco MOVE_BLK_VARIANT che accetta un puntatore, ma mi dà sempre qualche errore nel RetVal, mi sembra di capire perché vado a scrivere in un array (nella DB) ma non prelevo da un array.

Link al commento
Condividi su altri siti

39 minuti fa, Cesare Nicola scrisse:

Col 1200 esiste il blocco MOVE_BLK ma non accetta un puntatore in ingresso. C'è poi il blocco MOVE_BLK_VARIANT che accetta un puntatore, ma mi dà sempre qualche errore nel RetVal, mi sembra di capire perché vado a scrivere in un array (nella DB) ma non prelevo da un array.

 

Ho provato a testare sul mio PLC usando MOVE_BLK_Variant

 

Ho copiato un'area di 10 byte in ingresso su un array nel DB13

 

image.png.384444e58b74f95a893262d198fc9162.png

 

image.png.a123707981b1faf509e97c181c8d13e7.png

 

 

Link al commento
Condividi su altri siti

Cesare Nicola

Perfetto, adesso funziona. Il problema era che in DEST mettevo il simbolo e non il puntatore. Non ho dimestichezza col MOVE_BLOCK_VARIANT.

 

Quote

Per leggere dalla periferia c'è anche l'istruzione DPRD_DAT, e DPWR_DAT per scrivere.

Sì, Batta, li conosco e li uso abitualmente ma in questo caso mi sembrava più semplice e immediato leggere la periferia con un MOVE (anche se poi, all'atto pratico magari non cambia nulla).

Grazie a tutti.

Move.PNG

Link al commento
Condividi su altri siti

2 ore fa, batta scrisse:

Per leggere dalla periferia c'è anche l'istruzione DPRD_DAT, e DPWR_DAT per scrivere.

 

Sì Batta, anche io uso la lettura e la scrittura consistente per la lettura/scrittura da/su periferiche in profibus o il profinet. Ma, a quanto ho capito, il quesito di Cesare era proprio sulla MOVE in un array (che potrebbe essere usata anche per la lettura dagli ingressi del PLC).

 

☺️

Link al commento
Condividi su altri siti

  • 3 months later...

Per questo caso un'altra soluzione che permetterebbe di lavorare completamente in simbolico è la realizzazione di un UDT (ad array di 20byte) da piazzare sull'immagine di processo (con 1500 e 1200 è concesso) in corrispondenza degli ingressi. In questo modo con un semplice MOVE è possibile spostare in simbolico l'array dall'area di ingressi all'array contenuto nella DB. Se i due array sono di dimensione diversa allora bisogna utilizzare l'istruzione MOVE_BLK che sposta elementi da un array all'altro ma tutto in simbolico.

Per indicizzazioni e puntamenti indiretti consiglio questo manualetto rapido scaricabile dal link seguente:

 

https://support.industry.siemens.com/tf/it/en/posts/indirect-access-s7-1500-indicizzazione-dei-dati-su-s7-1500/200654/?page=0&pageSize=10

 

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