Vai al contenuto
PLC Forum


Copia Db


maxntt

Messaggi consigliati

Avrei bisogno di una cortesia da parte di qualcuno che sappia (ancora) programmare in AWL.

Il mio problema è il seguente: in funzione dello stato di un ingresso digitale devo copiare (o meglio, trasferire) un DB (nello specifico il DB181 se l'ingresso è a 0 o il DB182 se l'ingresso è a 1) sul DB180. Le strutture dei DB sono identiche, cambiano ovviamente i valori che contengono (tempi, misure...). Non so se la cosa è fattibile in modo semplice (con altri PLC è immediato ma con Siemens...!!). Tenete presente che a parte semplici routine di logica non ho mai fatto nulla con S5.

Grazie!! :unsure:

Link al commento
Condividi su altri siti


Salve,

la cosa non dovrebbe essere difficoltosa da realizzare, per esempio potresti a seconda dello stato del tuo ingresso, richiamare una o l'altra FB, che caricano uno dei due set di dati verso il DB180.

Oppure su di un'unica DB a seconda dello stato dell'ingresso, utilizzare le istruzione di salto condizionato (SPB) ad una label per caricare anche in questo caso il set di dati preposto verso il DB180.

Ora non avendo STEP5 installato nel mio PC non posso affermare con sicurezza quello che sto per dirti, ma penso che non potendo lavorare con un'indirizzamento di tipo indiretto, e non potendo disporre di biblioteche con funzioni tipo la classica SFC20 di S7; credo che dovrai utilizzare tutta una serie di MOVE che in AWL sono es.:

L DW x

T DW y

Se i DB in questione non contengono un numero eccessivo di dati, puoi considerare di fare quanto detto pocanzi.

Se i dati nel DB iniziano ad essere molti, francamente al momento non avrei altra soluzione più "snella" da suggerirti.

Link al commento
Condividi su altri siti

Ripensando a quanto scritto nel precedente post, in parte si può lavorare con indirizzamenti di tipo indiretto ed usare anche un'istruzione la TNB che effettua il trasferimento di un pacchetto massimo di 255byte specificando l'indirizzo finale della sorgente e l'indirizzo finale della destinazione.

Tuttavia queste ed altre istruzioni diciamo più "sofisticate", sono possibili solo a partire dalla CPU103 per la serie S5-100, mi sembra invece che per la serie 115 non ci siano problemi di sorta.

Ora non so quale sia il tipo di CPU sulla quale devi apportare le modifiche al programma.

Modificato: da cagliostro
Link al commento
Condividi su altri siti

Ciao, io ho programmato S5 anni fa solo in AWL, NON sono molto fresco

però posso dirti che ho delle funzioni che fanno la copia esatta dei DB, in ogni caso è fatta con l'istruzione LOOP sfuttando

la possibilita di aprire due db in contemporanea e trasferire le variabili

Potresti forse trovare anche qualcosa scritta in STEP 7 che potresti tranquillamente convertirla in S5 chiaramente

la struttura STEP 7 deve provenire da una precedente conversione da S5. (quindi senza usare i puntatori S7)

Io ( essendo poco pratico di PLCforum ) non so se si possono mettere degli esempi o scrivere delle righe di programma

nel caso si possa fare se non hai risolto posso provare (se possibile) a fare una ricerca rapida

visto che anche io sono alle prese con test su CPU S5.

SALUTI

Link al commento
Condividi su altri siti

Grazie per l'aiuto...

Il sistema in questione è della serie 155 con CPU 947.

La mole di dati scritta sul DB è abbastanza ampia (ho ricordo di almeno 80 valori di formati misti).Ciò che mi avete suggerito è giusto solo che, ahimè non so come fare...

Vorrei scrivere qualche riga per fare la seguente funzione:

Se M129.0 è = a 1 allora trasferisci tutto il contenuto di DB181 sul DB180

Se M129.1 è = a 1 allora trasferisci tutto il contenuto di DB182 sul DB180

...va bene anche fatto costruendo uno o due FB ma...come?

Link al commento
Condividi su altri siti

Salve,

premessa:

Non ho installato S5 nel mio PC per cui il codice che ti posto non è stato testato, quindi potrebbe essere necessario procedere al solito debug.

Tuttavia vale la pena provarlo.

1) Prima cosa l'esempio postato è stato fatto per DB181 che copia verso DB180.

2) Poi per la DB182 duplichi la funzione in un'altra FBxx ci cambi il nome e l'indirizzo del DB sorgente.

3) Importante: Il richiamo della funzione FB avviene attraverso M129.0, ma utilizzando però un oneshot

Crea una FBxx che chiamerai per esempio DBMOVE1, all'interno della FB copi questo codice:

:L KF 80 //questo dato contiene la lunghezza del tuo data block che hai specificato essere di circa 80 Word , poi inserisic tu il dato preciso

:T MW140 //questo è l'indice del loop, ho usato la MW 140 vedi tu eventualmente se usare la stessa o cambiare indirizzo

CYCL :A DB181 //abilita il blocco dati sorgente

:B MW140

:L DW0 //carica il valore della la prima word del DB181

:A DB180 //abilita il blocco dati di destinazione

:B MW140

:T DW0 //trasferisce il valore di DW0 del DB181 versao la DW0 del DB180

:L MW140 //carica il valore dell'indice del loop

:Dxx//e lo decrementa di 1 Nota: Metti solamente D e togli xx, le ho messe altrimenti compariva lo smile

:T MW140 //indice del vlaore dell contatore di loop -1

: SPN =CYCL //salta alla label CYCL se MW140 non ha raggiunto il valore 0

:BE

In questo modo viene fatta una copia del DB 181 partendo dalla DW80 per arrivare alla DW0 verso la DB180.

Ti ripeto è una cosa improvvisata e non testata

Eventualmente

Io ( essendo poco pratico di PLCforum ) non so se si possono mettere degli esempi o scrivere delle righe di programma

nel caso si possa fare se non hai risolto posso provare (se possibile) a fare una ricerca rapida

contatta svsoftware

però posso dirti che ho delle funzioni che fanno la copia esatta dei DB,
Modificato: da cagliostro
Link al commento
Condividi su altri siti

Correggo un'errore nel codice postato in precedenza

Dxx//e lo decrementa di 1 Nota: Metti solamente D e togli xx, le ho messe altrimenti compariva lo smile

diventa

D 1//mi ero dimenticato di inserire la quantità da decrementare.

Inoltre mi ero scordato di commentare l'istruzione B, in pratica l'operazione seguente viene combinata con il parametro indicato nella parola MW e poi eseguita, in pratica si tratta di un OR che alla fine riporta l'indice della variabile MW140 sulla DW0 cambiandone l'indirizzo.

Quindi si parte a scrivere da DW80 a scendere fino alla 0.

Modificato: da cagliostro
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...