Vai al contenuto

AlessandroRH

Puntatore in BLKMOV su TIA Portal V15

Recommended Posts

AlessandroRH

Ciao a tutti,

Il seguente codice è stato più volte utilizzato in un PLC S7-300 con esito positivo, ma non è valido in un PLC S7-1500.

Il compilatore non accetta la P#DBX0.0 BYTE 20

-----------------------------------------------------------------------------------

...

T     #Address
AUF DB [ #Address]

CALL  BLKMOV
      blk_type:=Variant
      SRCBLK  :=P#DB100.0DBX0.0 BYTE 20
      RET_VAL :=#RetVal
      DSTBLK  :=P#DBX0.0 BYTE 20

-----------------------------------------------------------------------------------

Nel PLC S7-300 il campo DSTBLK puntava automaticamente la DB specificata nel valore "Address". Ora vorrei eseguire la stessa funzione in un S7-1500, ma non capisco dov'è l'errore.

 

Come potrete notare dalle immagini, ove vi è un esempio, il mio intento è quello di copiare un'area di una determinata DB (DB100) all'interno di una seconda DB che però varia in base al valore che ricevo in una word sommato ad un valore fisso.

 

Es. se in DB100.DBW0 ricevo il valore 3, questo andrà a sommarsi a 10 e scriverò il risultato in una variabile temporanea "#Address". 

      Nella variabile "#Address" avrò quindi il valore 13.

      Tramite il comando AUF apro, quindi, la DB103 per poi scriverci al suo interno l'area di memoria specificata in SRCBLK. Ma non ho idea di come scrivere l'istruzione in DSTBLK.

 

Sapreste darmi una soluzione ?? Anche al di fuori del mio esempio.
 

 

Vi ringrazio anticipatamente 😉

 

Immagine.png

Immagine2.png

Immagine3.png

Condividi questa discussione


Link discussione
Condividi su altri siti
ken

così sui due piedi non è corretto nemmeno in s7 per 300. auf apre un db, dopo viene aperto db100 nella sorgente. quale db ho aperto ora? db100 o db contenuto nella variabile #address?

un  modo corretto di usare sfc20 indicizzato lo trovi qui

 

per tai portal?

io mi farei una funzione in scl

 

 

Condividi questa discussione


Link discussione
Condividi su altri siti
amed

Prova ad entrare nelle Proprietà dei DB che usi apri Attrbuti e dosattiva Accesso ottimizzato.. Così facendo attivo l'accesso Standard come in S7-300 e puoi usare gli indirizzi assoluti. Ciao

Condividi questa discussione


Link discussione
Condividi su altri siti
AlessandroRH

vi ringrazio per l'interessamento 👍

 

ho optato nella soluzione SCL, ma ora sono bloccato in un'istruzione che non riesco a scrivere correttamente.

 

premetto che sono riuscito nel mio intento, ma per rendere migliore l'elaborazione della funzione che sto elaborando avrei bisogno di nuovo del vostro aiuto, se possibile.

avrei la necessità di scrivere quanto segue in SCL, ma non ho idea di come scriverlo correttamente:

 

#Number_DB := 100;

#Word_DB := 0;

 

%DB[#Number_DB].DBW[#Word_DB]; //questa funzione non so come farla accettare in SCL

 

qualcuno di voi è in grado di aiutarmi ??

grazie

 

Condividi questa discussione


Link discussione
Condividi su altri siti
batta

Devi usare le istruzioni PEEK e POKE.

Condividi questa discussione


Link discussione
Condividi su altri siti
Oraz85

Ciao AlessandroRH,

quello in cui sei incappato tu è il caso per cui, secondo me, a valle della migrazione è richiesto maggior tempo per far funzionare il codice anche su S7-1500. La differenza tra 300 e 1500 (che porta poi all'errore di compilazione) è che nel 300 ogni blocco AWL utilizza gli stessi registri DB, registri indirizzi e accumulatori mentre nel 1500 ogni blocco ha i suoi.

Nel caso specifico, il registro DB usato dall'SFC20 non è lo stesso usato dall'FC100. Questo comporta che, il DB #Address non potrà essere utilizzato all'interno della FC100. Ne deriva che, nell'AWL dell'S7-1500, tutti i passaggi di dati nelle CALL devono essere COMPLETAMENTE SPECIFICATI (nel tuo caso nel DSTBLK passi il bit, il byte, la lunghezza ma non il numero di DB). Per correggerlo l'unica soluzione è creare un tipo di dato ANY nelle TEMP dell'FC100, riempirlo di tutti i dati e passarlo quindi in appoggio al DSTBLK. Allego un estratto di un manualetto Siemens che mostra la soluzione.

E' chiaro che, se dovessi scrivere il codice da zero e finissi in questa situazione, significa che non ho usato nel modo migliore l'S7-1500 perchè l'S7-1500 le indicizzazioni (questa è un indicizzazione dato che stai di volta in volta cambiando il numero della DB) le può fare in simbolico e quindi in modo molto più semplice, chiaro, facilmente debuggabile e slegato da dimensione e posizione dei dati.

A questo link trovi un manualetto rapido sulle indicizzazioni e puntamento indiretto dei dati su S7-1500 ed S7-1200:

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

 

2018-10-12 09_25_16-Migrazione da S7300 a TIA Portal e S71500.docx  -  Modalità compatibilità - Word.png

Condividi questa discussione


Link discussione
Condividi su altri siti

Registrati o accedi per inserire messaggi

Devi essere un utente registrato per lasciare un messaggio. La registrazione è GRATUITA.

Crea un account

Iscriviti alla nostra comunità. È facile!

Registra un nuovo account

Connettiti

Hai già un account? Connettiti qui

Connettiti adesso

×