AlessandroRH Inserito: 11 luglio 2018 Segnala Share Inserito: 11 luglio 2018 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 😉 Link al commento Condividi su altri siti More sharing options...
ken Inserita: 11 luglio 2018 Segnala Share Inserita: 11 luglio 2018 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 Link al commento Condividi su altri siti More sharing options...
amed Inserita: 12 luglio 2018 Segnala Share Inserita: 12 luglio 2018 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 Link al commento Condividi su altri siti More sharing options...
AlessandroRH Inserita: 12 luglio 2018 Autore Segnala Share Inserita: 12 luglio 2018 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 Link al commento Condividi su altri siti More sharing options...
batta Inserita: 12 luglio 2018 Segnala Share Inserita: 12 luglio 2018 Devi usare le istruzioni PEEK e POKE. Link al commento Condividi su altri siti More sharing options...
Oraz85 Inserita: 12 ottobre 2018 Segnala Share Inserita: 12 ottobre 2018 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 Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora