Vai al contenuto
PLC Forum


Comando Do


Scaram

Messaggi consigliati

Salve, mi piacerebbe sapere nel dettaglio cosa faccia di preciso il comando "DO" in S5. Ovviamente l'ho cercato in lungo e largo ma non ho trovato niente ne' su manuali ne' in rete... Mi e' stato detto che ha una funzionalita'per certi versi simile al "DO-WHILE" dei linguaggi tipo Java pero' a me servirebbe sapere precisamente come funziona,comprese le modifiche (se ci sono) che porta sugli accumulatori e la parola di stato...

Vi riporto per esempio uno stralcio di codice nel quale compare il suddetto comando:

A =ERR

BEC

DO =DB

L KF 0

T FW198

LW =STDW

T FW200

L KM 10000000 00000000

M003: T FW 196

DO FW 200

L DW 0

AW

L KF 0

><F

= =ERR

JC =M001

Da quello che si denota in questo codice il comando DO viene usato la prima volta con un parametro di tipo puntatore (e, per la cronaca, questo in S7 viene tradotto con AUF,ovvero il comando per aprire un blocco dati). La seconda volta invece viene usato con un parametro di tipo FlagWord (e questo in S7 viene tradotto in maniera che evito di riportare per non complicare ancora di piu' le cose). Insomma che fa questo comando???

Grazie in anticipo. :rolleyes:

Link al commento
Condividi su altri siti


Matteo Montanari

il comando DO significa DatablockOpen, letteralmente apri il blocco dati.

DO =DB -> qui apre il blocco dati indicato in DB

DO FW 200 -> qui apre il blocco dati "puntato" nella varibile FW200, ovvero il numero del DB corrispondente al numero presente nella word 200 dei flag (merker).

(non mi ricordo se il numero doveva essere scritto in decimale o esadecimale).

per alcune cose il programma di "traduzione" da S5 a S7 funziona, in altri casi è molto più semplice riscrivere la funzione in linguaggio S7...(parere personale)

Link al commento
Condividi su altri siti

LW =STDW // leggi la word STDW dove STDW e' un parametro rivevuto alla chiamata dell'FB

T FW200 // e salvala in FW200

......

......

DO FW 200

L DW 0 // leggi il contenuto della DW indicata da FW200. Il DO unito all'istruzione successiva permette di fare una lettura indiretta in memoria. Se ad esempio il parametro STDW vale 123 alla fine sara' letta la DW123 del blocco dati aperto

Link al commento
Condividi su altri siti

Il mnemonic inglese DO(procesing operation) equivale al mnemonic tedesco B(operazione di elaborazione)..

non mi ricordo se il numero doveva essere scritto in decimale o esadecimale
esadecimale!
Il DO unito all'istruzione successiva permette di fare una lettura indiretta in memoria
e quindi si comporta da puntatore: il valore della variabile rappresenta l'indirizzo di un'altra variabile...

Un'altro esempio..

DB6
..
.
DW 12   KH = 0108
DW 13   KH = 0001

FBx
A DB 6
..
..
B DW 12 ( DO DW 12)
U M 0.0
B DW 13
SS T 0

Programma eseguito
A DB 6
..
.
U M 8.1   (KH = 0108)
SS T 1    (KH = 0001)

Modificato: da Savino
Link al commento
Condividi su altri siti

Grazie a tutti!!! In effetti mi era venuto piu' di un dubbio sul fatto che facesse qualcosa tipo DO-WHILE... Vedendolo utilizzato avevo supposto anch'io che fosse un comando di "apertura" delle DB, pero' per fare cio' io avevo sempre visto usare il comando OPN (o AUF in tedesco)... La differenza immagino stia nel discorso puntatatore che mi avete appena eplicitato in maniera chiarissima... ^_^

Credo che dovro' fare un paio di discorsetti a chi mi aveva mal consigliato citandomi il DO-WHILE... :angry:

Modificato: da Scaram
Link al commento
Condividi su altri siti

Vediamo se ho capito bene...

Questo stralcio di codice S5:

DO FW 200

L DW 0

viene tradotto in S7 come:

T #conv_akku1

L STW

T #conv_stw

L MB 201

SLW 4

LAR1

L #conv_stw

T STW

L #conv_akku1

L DBW [AR1,P#0.0]

Posso pero' ridurre il codice S7 alle istruzioni

L DW [FW 200]

E' corretto questo? Il codice e' equivalente o no?

Link al commento
Condividi su altri siti

L'intenzione e' corretta e con un plc AB funzionerebbe, ma non con lo step 7 che non permette questa sintesi.

In step 7 l'indirizzo e' sempre un undirizzo a bit che per comodita' di solito si puo' dichiarare nella forma byte.bit. Il numero che esprime l'indirizzo a bit e' del tipo doppio intero.

Un modo per rendere L DW [FW 200] puo' essere.

 L     FW   200                    // leggi il numero intero che punta al byte, 0 primo byte, 1 secondo, 2 terzo...
      ITD                               // convertilo in doppio intero (32 bit)
      SLW   3                           // moltiplica per 8 per avere l'indirizzo a bit
      T     FD   202                    // salvalo in un registro a 32 bit
      L     DBW [FD 202]                // leggi indirettamente puntando al bit intero X 8 e preleva una word

Modificato: da rguaresc
Link al commento
Condividi su altri siti

Per quanto non molto stringata e' preferibile alla grande questa forma rispetto a quella che crea il tool di conversione e che ho postato sopra,no? :)

Pero' non mi e' molto chiaro perche' l'istruzione

L DBW[FW 200]

non sia accettata da step7 mentre invece ad esempio

T DBW[FW 200]

non da' problemi.

Link al commento
Condividi su altri siti

Sempre su questo benedetto comando...

DO FW 166

C DB 0

Puo' essere tradotto in S7 con

AUF DB[MW 166] ???

L'editor non mi segnala errori ma vorrei esserne sicuro...

Mentre invece

DO FW 168

T DD 0

se lo traduco in S7 come

T DBD [MW 168]

mi segnala errore...

Link al commento
Condividi su altri siti

Ovviamente l'errore era nella sintassi, il comando corretto e'

T DBD [MD 168]

Ho provato con il PLCSIM ,facendo i test piu' svariati, se fosse giusto utilizzare AUF DB[MW 166] al posto del malloppone che mi propone il tool di conversione. Ebbene sembra proprio che si possa fare, non ho riscontrato errori di nessun tipo :)

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