Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Prossima revisione | Revisione precedente Prossima revisioneEntrambe le parti successive la revisione | ||
software:devices:modbus [2014/10/23 15:12] – modifica esterna 127.0.0.1 | software:devices:modbus [2015/09/16 11:54] – [Read Coil (type = 1)] qem207 | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
====== DEVICE MODBUS ====== | ====== DEVICE MODBUS ====== | ||
- | |||
- | |||
===== - Introduzione ===== | ===== - Introduzione ===== | ||
Il protocollo MODBUS< | Il protocollo MODBUS< | ||
integrare PLC’s, computers, terminals, inverter e altre apparecchiature. MODBUS è un protocollo di comunicazione | integrare PLC’s, computers, terminals, inverter e altre apparecchiature. MODBUS è un protocollo di comunicazione | ||
- | Master/ | + | Master/ |
- | collegati fino ad un massimo 247 slave sulla stessa linea. Ad ogni dispositivo è assegnato un indirizzo che distingue esso | + | |
da tutti gli altri dispositivi connessi.\\ | da tutti gli altri dispositivi connessi.\\ | ||
Il device MODBUS permette di scegliere quale porta seriale, presente sullo strumento, usare per il collegamento. | Il device MODBUS permette di scegliere quale porta seriale, presente sullo strumento, usare per il collegamento. | ||
Le caratteristiche della trasmissione dati (nr. dispositivo fisico, baud rate, parità, stop bits) e del modo di trasmissione devono | Le caratteristiche della trasmissione dati (nr. dispositivo fisico, baud rate, parità, stop bits) e del modo di trasmissione devono | ||
essere selezionate su ogni stazione e non possono essere modificate durante il funzionamento.\\ | essere selezionate su ogni stazione e non possono essere modificate durante il funzionamento.\\ | ||
- | Ci sono due modi di trasmissione utilizzabili nel protocollo Modbus. Ambedue i modi permettono le stesse capacità di | + | Con l' |
comunicazione. Il modo è selezionato dal master e deve essere unico per tutti i dispositivi connessi alla rete. I modi sono: | comunicazione. Il modo è selezionato dal master e deve essere unico per tutti i dispositivi connessi alla rete. I modi sono: | ||
* ASCII (American Standard Code for Information Interchange) | * ASCII (American Standard Code for Information Interchange) | ||
Linea 33: | Linea 30: | ||
===== - Installazione ===== | ===== - Installazione ===== | ||
+ | FIXME | ||
==== - Dichiarazione device nel file di configurazione (.CNF) ==== | ==== - Dichiarazione device nel file di configurazione (.CNF) ==== | ||
Linea 39: | Linea 37: | ||
del device. | del device. | ||
<code QCL> | <code QCL> | ||
- | ; | ||
- | ; | ||
- | ; | ||
INTDEVICE | INTDEVICE | ||
... | ... | ||
- | < | + | < |
... | ... | ||
</ | </ | ||
Linea 53: | Linea 48: | ||
|MODBUS|è la parola chiave che identifica il device descritto in questo documento,| | |MODBUS|è la parola chiave che identifica il device descritto in questo documento,| | ||
|TCamp|è tempo di campionamento del device,| | |TCamp|è tempo di campionamento del device,| | ||
- | |serial_port|è la definizione del tipo di porta seriale collegata | + | |channel|è la definizione del tipo di canale di comunicazione collegato |
Per quanto riguarda la dichiarazione dell’hardware utilizzato nella sezione “BUS” dell’unità di configurazione si dovrà fare | Per quanto riguarda la dichiarazione dell’hardware utilizzato nella sezione “BUS” dell’unità di configurazione si dovrà fare | ||
riferimento al manuale firmware dell’hardware stesso. | riferimento al manuale firmware dell’hardware stesso. | ||
- | === - Esempio | + | **Esempio** |
<code QCL> | <code QCL> | ||
- | ; | ||
- | ; | ||
- | ; | ||
INTDEVICE | INTDEVICE | ||
- | modbus | + | modbus |
</ | </ | ||
- | |||
===== - Tabelle “scambio dati” per il MODBUS ===== | ===== - Tabelle “scambio dati” per il MODBUS ===== | ||
Linea 159: | Linea 149: | ||
===== - Parte 1 : Modbus Master ===== | ===== - Parte 1 : Modbus Master ===== | ||
- | + | FIXME | |
- | Il device MODBUS può utilizzare una porta seriale per comunicare in modalità master (parametro //mode// = 0). Esso da la | + | Il device MODBUS può utilizzare una porta seriale |
possibilità (tramite parametri, stati e comandi) a tutti gli strumenti di poter colloquiare con qualsiasi apparecchiatura utilizzante | possibilità (tramite parametri, stati e comandi) a tutti gli strumenti di poter colloquiare con qualsiasi apparecchiatura utilizzante | ||
protocollo Modbus.\\ | protocollo Modbus.\\ | ||
Linea 196: | Linea 186: | ||
**type** = tipo di richiesta che si vuole processare (lettura o scrittura di word o di bit).\\ | **type** = tipo di richiesta che si vuole processare (lettura o scrittura di word o di bit).\\ | ||
**idcard** = indirizzo dell’unità slave verso cui si vuole inviare la richiesta.\\ | **idcard** = indirizzo dell’unità slave verso cui si vuole inviare la richiesta.\\ | ||
- | **addr** = indice da cui iniziare a leggere o da cui iniziare a scrivere nello slave in questione. Sono previsti valori tra 1 e 512 per valori del parametro type = 1, 2, 5, 15 (scrittura e lettura di bit), mentre per valori type = 3, 4, 6, 16 (scrittura e lettura di word) i valori previsti sono tra 1 e 32.\\ | + | **addr** = indice da cui iniziare a leggere o da cui iniziare a scrivere nello slave in questione.\\ |
**tabreg** = per le operazioni di lettura (type = 1, 2, 3, 4), questo parametro indica la posizione nella “tabella dei dati letti” dove verrà memorizzato il dato letto sullo slave. Per le operazioni di scrittura (type = 5, 6, 15, 16), questo parametro indica da posizione nella “tabella dei dati da scrivere” dove si trova il dato da scrivere sullo slave. Sono previsti valori tra 1 e 512 per valori del parametro type = 1, 2, 5, 15 (scrittura e lettura di bit), mentre per valori type = 3, 4, 6, 16 (scrittura e lettura di word) i valori previsti sono tra 1 e 32.\\ | **tabreg** = per le operazioni di lettura (type = 1, 2, 3, 4), questo parametro indica la posizione nella “tabella dei dati letti” dove verrà memorizzato il dato letto sullo slave. Per le operazioni di scrittura (type = 5, 6, 15, 16), questo parametro indica da posizione nella “tabella dei dati da scrivere” dove si trova il dato da scrivere sullo slave. Sono previsti valori tra 1 e 512 per valori del parametro type = 1, 2, 5, 15 (scrittura e lettura di bit), mentre per valori type = 3, 4, 6, 16 (scrittura e lettura di word) i valori previsti sono tra 1 e 32.\\ | ||
- | **num** = numero di valori che si intendono leggere o scrivere (se il tipo richiesta type lo prevede). Sono previsti valori tra 1 e 512 per valori del parametro type = 1, 2, (lettura di bit), mentre per valori type = 3, 4, 16 (scrittura multipla e lettura di word) i valori previsti sono tra 1 e 32. | + | **num** = numero di valori che si intendono leggere o scrivere (se il tipo richiesta type lo prevede). Sono previsti valori tra 1 e 128 per valori del parametro type = 1, 2, (lettura di bit), mentre per valori type = 3, 4, 16 (scrittura multipla e lettura di word) i valori previsti sono tra 1 e 32. |
=== - Comandi per inviare il messaggio: === | === - Comandi per inviare il messaggio: === | ||
Linea 214: | Linea 204: | ||
==== - Richieste di lettura ==== | ==== - Richieste di lettura ==== | ||
- | === - Read Coil (type = 1) === | + | === Read Coil === |
Funzione di lettura a bit. Si vogliono leggere i bit di un certo slave (// | Funzione di lettura a bit. Si vogliono leggere i bit di un certo slave (// | ||
impostare //addr// per indicare l’indirizzo del bit nello slave da cui si intende iniziare a leggere. Il parametro //num// indica il | impostare //addr// per indicare l’indirizzo del bit nello slave da cui si intende iniziare a leggere. Il parametro //num// indica il | ||
Linea 222: | Linea 212: | ||
(//addr// + //num// - 1) <= 512 e (//tabreg// + //num// - 1) <= 512 altrimenti la richiesta non potrà essere eseguita (segnalazione mediante //wcmd//). | (//addr// + //num// - 1) <= 512 e (//tabreg// + //num// - 1) <= 512 altrimenti la richiesta non potrà essere eseguita (segnalazione mediante //wcmd//). | ||
- | === - Read Input (type = 2) === | + | === Read Input (type = 2) === |
Funzione di lettura a bit. Si vogliono leggere i bit di un certo slave (// | Funzione di lettura a bit. Si vogliono leggere i bit di un certo slave (// | ||
Alcuni slave possono mettere a disposizione delle zone di memoria differenti a seconda se i bit letti sono Coil o Input. Nel caso di slave Qmove le due richieste hanno lo stesso effetto. | Alcuni slave possono mettere a disposizione delle zone di memoria differenti a seconda se i bit letti sono Coil o Input. Nel caso di slave Qmove le due richieste hanno lo stesso effetto. | ||
- | === - Read Holding Register (type = 3) === | + | === Read Holding Register (type = 3) === |
Funzione di lettura a word. Si vogliono leggere le word di un certo slave (idcard). Viene impostato il parametro //type// = 3.\\ | Funzione di lettura a word. Si vogliono leggere le word di un certo slave (idcard). Viene impostato il parametro //type// = 3.\\ | ||
Bisogna impostare addr per indicare l’indirizzo della word nello slave da cui si intende iniziare a leggere. Il parametro num | Bisogna impostare addr per indicare l’indirizzo della word nello slave da cui si intende iniziare a leggere. Il parametro num | ||
Linea 235: | Linea 225: | ||
wcmd). | wcmd). | ||
- | === - Read Input Register (type = 4) === | + | === Read Input Register (type = 4) === |
Funzione di lettura ingressi a word. Si vogliono leggere i bit di un certo slave (idcard). La funzione è identica alla “Read | Funzione di lettura ingressi a word. Si vogliono leggere i bit di un certo slave (idcard). La funzione è identica alla “Read | ||
Holding Register”. Il significato delle due funzione si distingue a livello di protocollo MODBUS. Alcuni slave possono | Holding Register”. Il significato delle due funzione si distingue a livello di protocollo MODBUS. Alcuni slave possono | ||
Linea 243: | Linea 233: | ||
==== - Richieste di scrittura ==== | ==== - Richieste di scrittura ==== | ||
- | === - Force coil (type = 5) === | + | === Force coil (type = 5) === |
Funzione di scrittura bit. Si vogliono scrivere (forzare) i bit di un certo slave (// | Funzione di scrittura bit. Si vogliono scrivere (forzare) i bit di un certo slave (// | ||
5.\\ Bisogna impostare addr per indicare l’indirizzo del bit nello slave in cui si intende scrivere. Bisogna impostare tabreg | 5.\\ Bisogna impostare addr per indicare l’indirizzo del bit nello slave in cui si intende scrivere. Bisogna impostare tabreg | ||
per indicare l’indice del bit nella “tabella dei dati da scrivere” in cui è contenuto il valore da scrivere. | per indicare l’indice del bit nella “tabella dei dati da scrivere” in cui è contenuto il valore da scrivere. | ||
- | === - Force register (type = 6) === | + | === Force register (type = 6) === |
Funzione di scrittura singola word. Si vuole scrivere (forzare) la word di un certo slave (// | Funzione di scrittura singola word. Si vuole scrivere (forzare) la word di un certo slave (// | ||
//type// = 6.\\ Bisogna impostare addr per indicare l’indirizzo della word nello slave in cui si intende scrivere. Bisogna | //type// = 6.\\ Bisogna impostare addr per indicare l’indirizzo della word nello slave in cui si intende scrivere. Bisogna | ||
impostare tabreg per indicare l’indice della word nella “tabella dei dati da scrivere” in cui è contenuto il valore da scrivere. | impostare tabreg per indicare l’indice della word nella “tabella dei dati da scrivere” in cui è contenuto il valore da scrivere. | ||
- | === - Force multiple coil (type = 15) === | + | === Force multiple coil (type = 15) === |
Funzione di scrittura bit multipli. Si vogliono scrivere (forzare) i bit di un certo slave (// | Funzione di scrittura bit multipli. Si vogliono scrivere (forzare) i bit di un certo slave (// | ||
//type// = 15.\\ Bisogna impostare addr per indicare l’indirizzo del bit nello slave in cui si intende scrivere. Si deve impostare in | //type// = 15.\\ Bisogna impostare addr per indicare l’indirizzo del bit nello slave in cui si intende scrivere. Si deve impostare in | ||
Linea 260: | Linea 250: | ||
(addr + num - 1) <= 512 e (tabreg + num - 1) <= 512 altrimenti la richiesta non potrà essere eseguita (segnalazione mediante wcmd). | (addr + num - 1) <= 512 e (tabreg + num - 1) <= 512 altrimenti la richiesta non potrà essere eseguita (segnalazione mediante wcmd). | ||
- | === - Force multiple register (type = 16) === | + | === Force multiple register (type = 16) === |
Funzione di scrittura word multiple. Si vogliono scrivere (forzare) le word di un certo slave (// | Funzione di scrittura word multiple. Si vogliono scrivere (forzare) le word di un certo slave (// | ||
//type// = 16.\\ Bisogna impostare addr per indicare l’indirizzo della word nello slave in cui si intende scrivere. Si deve | //type// = 16.\\ Bisogna impostare addr per indicare l’indirizzo della word nello slave in cui si intende scrivere. Si deve | ||
Linea 269: | Linea 259: | ||
==== - Esempi ==== | ==== - Esempi ==== | ||
- | 1) Lettura | + | 1) Impostazioni modbus e apertura |
<code QCL> | <code QCL> | ||
- | MAIN: | + | modbus.mode = 0 ; modbus master |
- | modbus: | + | modbus.prot = 1 ; RTU |
- | | + | modbus.brate |
- | | + | modbus.stopb |
- | | + | modbus.par = 0 ; parity |
- | | + | modbus.tout = 100 ; timeout |
- | SEND modbus | + | |
- | WAIT modbus: | + | modbus.OPENCOM |
- | IF (modbus:err) | + | tm_opencom = 200 ; timeout for OPENCOM command |
- | CALL ErroreModbus | + | WAIT modbus.st_opencom OR tm_opencom |
- | | + | IF NOT modbus.st_opencom |
- | ENDIF | + | |
- | | + | ENDIF |
- | + | ||
- | | + | |
- | JUMP MAIN | + | |
</ | </ | ||
- | 2) Lettura dei holding register dal nr.600 al nr.606 dello slave id 8\\ | + | 2) Impostazioni modbus e apertura del canale |
- | Siccome l’area | + | |
<code QCL> | <code QCL> | ||
- | MAIN: | + | modbus.mode = 0 ; modbus master |
- | modbus: | + | modbus.prot = 2 ; TCPIP |
- | | + | modbus.tout = 100 ; timeout |
- | | + | |
- | modbus: | + | tcpip_port= 502 ; number of tcpip port (default 502) |
- | | + | modbus.stopb |
- | SEND modbus | + | modbus.par = tcpip_port ANDB & |
- | WAIT modbus: | + | |
- | IF (modbus:err) | + | modbus.OPENCOM |
- | CALL ErroreModbus | + | tm_opencom |
- | | + | WAIT tm_opencom |
- | + | IF NOT modbus.st_opencom | |
- | | + | |
- | slVelocita = modbus: | + | ENDIF |
- | slPosiz = modbus:ilong7 | + | |
- | swTemp1 | + | |
- | + | ||
- | | + | |
- | JUMP MAIN | + | |
</ | </ | ||
- | === - Schema a blocchi === | + | 3) Lettura del registro input nr.7 dello slave id 67 |
+ | <code QCL> | ||
+ | modbus.idcard = 67 | ||
+ | modbus.addr = 7 | ||
+ | modbus.tabreg = 7 | ||
+ | modbus.num = 1 | ||
+ | modbus.type = 4 | ||
+ | modbus.SEND | ||
+ | WAIT modbus.st_sended | ||
+ | IF (modbus.err) | ||
+ | CALL ErroreModbus | ||
+ | ENDIF | ||
+ | slVelocita = modbus.iword7 | ||
+ | </ | ||
+ | |||
+ | 4) Lettura dei holding register dal nr.600 al nr.606 dello slave id 8\\ | ||
+ | Siccome l’area di scambio dati QCL non supporta l’indirizzo 600, si utilizza il parametro tabreg per salvare i dati letti all’indirizzo 10 | ||
+ | <code QCL> | ||
+ | modbus.idcard = 8 | ||
+ | modbus.addr = 600 | ||
+ | modbus.num = 6 | ||
+ | modbus.tabreg = 10 | ||
+ | modbus.type = 3 | ||
+ | modbus.SEND | ||
+ | WAIT modbus.st_sended | ||
+ | IF (modbus.err) | ||
+ | CALL ErroreModbus | ||
+ | ENDIF | ||
+ | |||
+ | swTemp1 = modbus.iword10 | ||
+ | slVelocita = modbus.ilong6 | ||
+ | slPosiz = modbus.ilong7 | ||
+ | swTemp1 = modbus.iword15 | ||
+ | </ | ||
+ | ==== - Schema a blocchi | ||
{{: | {{: | ||
- | === - Broadcast === | + | ==== - Broadcast |
Il Broadcast è un messaggio speciale che viene inviato dal Master e viene ricevuto contemporaneamente da tutti gli slave | Il Broadcast è un messaggio speciale che viene inviato dal Master e viene ricevuto contemporaneamente da tutti gli slave | ||
connessi. La funzionalitá broadcast (idcard = 0) è supportata solamente in modo master e se viene usato un messaggio | connessi. La funzionalitá broadcast (idcard = 0) è supportata solamente in modo master e se viene usato un messaggio | ||
Linea 323: | Linea 338: | ||
messaggi. Non è possibile utilizzare il comando SENDSYC. | messaggi. Non è possibile utilizzare il comando SENDSYC. | ||
- | === - Identificazione degli Slave === | + | ==== - Identificazione degli Slave ==== |
La scheda quando funziona in modalità Master permette, con un speciale comando, di riconoscere se lo slave collegato è | La scheda quando funziona in modalità Master permette, con un speciale comando, di riconoscere se lo slave collegato è | ||
di tipo QEM. In caso affermativo determina anche il modello di slave connesso. Questo permette di realizzare una diagnostica | di tipo QEM. In caso affermativo determina anche il modello di slave connesso. Questo permette di realizzare una diagnostica | ||
Linea 330: | Linea 345: | ||
Il comando READSTYPE eseguito dopo aver opportunamente selezionato lo slave (tramite parametro idcard) invia allo | Il comando READSTYPE eseguito dopo aver opportunamente selezionato lo slave (tramite parametro idcard) invia allo | ||
slave una richiesta modbus nr.17 per il riconoscimento. Lo slave risponderà con un suo valore predefinito e potrà essere | slave una richiesta modbus nr.17 per il riconoscimento. Lo slave risponderà con un suo valore predefinito e potrà essere | ||
- | letto nel parametro stype. Nel caso lo slave non sia prodotto da QEM srl, il parametro avrà valore –1 ad indicare che lo | + | letto nel parametro stype del master. Nel caso lo slave non sia prodotto da QEM srl, il parametro avrà valore –1 ad indicare che lo |
slave è connesso ma non è possibile identificarlo.\\ | slave è connesso ma non è possibile identificarlo.\\ | ||
Per il device MODBUS lo slave ID è diverso a seconda dello slave QEM utilizzato. Per una codifica degli slave in questo | Per il device MODBUS lo slave ID è diverso a seconda dello slave QEM utilizzato. Per una codifica degli slave in questo | ||
Linea 337: | Linea 352: | ||
Esempio d' | Esempio d' | ||
<code QCL> | <code QCL> | ||
- | CONFIG: | + | modbus: |
- | modbus: | + | modbus.READSTYPE |
- | READSTYPE | + | WAIT modbus.st_sended |
- | | + | IF (modbus.err) |
- | | + | sbConfig = 3 ; |
- | | + | ELSE |
- | | + | IF (modbus.stype EQ 1) ; |
- | | + | sbConfig = 1 |
- | | + | ELSE |
- | | + | sbConfig = 2 |
- | | + | ENDIF |
- | | + | |
ENDIF | ENDIF | ||
</ | </ | ||
- | |||
==== - Estensione del protocollo ==== | ==== - Estensione del protocollo ==== | ||
Linea 405: | Linea 418: | ||
=== - Parametri - Modbus Master === | === - Parametri - Modbus Master === | ||
- | ^Nome^D^R^A^Condizioni^Descrizione^ | + | ^ Nome |
- | |mode|B|R|R/ | + | | mode |
- | |prot|B|R|R/ | + | | prot |
- | |wider|B|R|R/ | + | | wider | B | R | R/W | - |
- | |idcard|W|R|R/ | + | | idcard |
- | |type|B|1|R/ | + | | type |
- | |addr|L|1|R/ | + | | addr |
- | |tabreg|W|1|R/ | + | | tabreg |
- | |num|W|1|R/ | + | | num | W | 1 | R/W | - |
- | |brate|L|R|R/ | + | | brate | L | R | R/W | - |
- | |stopb|B|R|R/ | + | | stopb | B | R | R/W | - |
- | |par|B|R|R/ | + | | par | B | R | R/W | - |
- | |tout|W|R|R/ | + | | tout |
- | |toutsyc|W|R|R/ | + | | toutsyc |
- | |iword1÷32|W|0|R|-|**Input Word nr.** (1Input Long nr. (1÷16)32)| | + | | iword1÷32 |
- | |st_ibit0÷15|F|0|R|-|**Input bit nel parametro iword1**| | + | | st_ibit0÷15 |
- | |ilong1÷16|L|0|R|-|**Input Long nr.** (1÷16)| | + | | ilong1÷16 |
- | |oword1÷32|W|0|R/ | + | | oword1÷32 |
- | |st_obit0÷15|F|0|R/ | + | | st_obit0÷15 |
- | |olong1÷16|L|0|R/ | + | | olong1÷16 |
+ | |||
+ | |||
+ | Per configurare il numero della porta TCPIP è necessario andare a scrivere sui parametri //stopb// e //par//. Rispettivamente : | ||
+ | * **stopb** = tcpip_port / & | ||
+ | * **par** = tcpip_port ANDB & | ||
+ | Per impostare lo slave TCPIP a cui si vuole eseguire la richiesta è necessario andare a scrivere sul parametro // | ||
+ | Un indirizzo IP può essere espresso come TcpAddr3.TcpAddr2.TcpAddr1.TcpAddr0 (per esempio 192.168.0.1). | ||
+ | * **brate** = (TcpAddr3 * & | ||
=== - Variabili - Modbus Master === | === - Variabili - Modbus Master === | ||
- | ^Nome^D^R^A^Condizioni^Descrizione^ | + | ^ Nome |
- | |err|B|0|R|-|**Errors**\\ Indica se sono stati riscontrati errori nel protocollo.\\ In modalità master il parametro viene aggiornato in coincidenza dell’attivazione dello stato // | + | | err | B | 0 | R | - |
- | |serr|B|0|R/ | + | | serr |
- | |stype|W|0|R|-|**Slave type**\\ Indica il tipo di slave connesso. Il parametro viene aggiornato quando il parametro // | + | | stype | W | 0 | R | - |
=== - Stati - Modbus Master === | === - Stati - Modbus Master === | ||
Linea 455: | Linea 478: | ||
===== - Parte 2 : Modbus Slave ===== | ===== - Parte 2 : Modbus Slave ===== | ||
+ | FIXME | ||
==== - Modo di funzionamento SLAVE ==== | ==== - Modo di funzionamento SLAVE ==== | ||
- | La modalità slave viene impostata con il parametro mode = 1. Bisogna introdurre nei parametri il codice dell’ID slave tramite il parametro idcard. Le operazioni che spettano all’applicativo QCL sono essenzialmente due: | + | La modalità slave viene impostata con il parametro mode = 1 o mode = 2. Bisogna introdurre nei parametri il codice dell’ID slave tramite il parametro idcard. |
+ | |||
+ | **Impostazioni modbus e apertura del canale di comunicazione di tipo seriale** | ||
+ | <code QCL> | ||
+ | modbus.mode = 1 ; modbus slave | ||
+ | modbus.prot = 1 ; RTU | ||
+ | modbus.brate = 57600 ; baudrate | ||
+ | modbus.stopb = 1 ; stop bits | ||
+ | modbus.par = 0 ; parity | ||
+ | modbus.idcard = 1 ; slave id | ||
+ | |||
+ | modbus.OPENCOM | ||
+ | tm_opencom = 100 ; timeout for OPENCOM command | ||
+ | WAIT modbus.st_opencom OR tm_opencom | ||
+ | IF NOT modbus.st_opencom | ||
+ | OpenComError = 1 ; com not opened | ||
+ | ENDIF | ||
+ | </ | ||
+ | **Impostazioni modbus e apertura del canale di comunicazione di tipo TCPIP** | ||
+ | <code QCL> | ||
+ | modbus.mode = 1 ; modbus slave | ||
+ | modbus.prot = 2 ; TCPIP | ||
+ | |||
+ | tcpip_port= 502 ; number of tcpip port (default 502) | ||
+ | ; maste | ||
+ | modbus.stopb = tcpip_port / & | ||
+ | modbus.par | ||
+ | ; slave | ||
+ | modbus.stopb = (tcpip_port ANDB & | ||
+ | modbus.par = tcpip_port ANDB & | ||
+ | |||
+ | modbus.OPENCOM | ||
+ | tm_opencom = 100 ; waiting time to have a correct response | ||
+ | WAIT (modbus.st_opencom OR timerOpencom) | ||
+ | IF NOT modbus.st_opencom | ||
+ | OpenComError = 1 ; com not opened | ||
+ | ENDIF | ||
+ | </ | ||
+ | FIXME | ||
+ | |||
+ | Le operazioni che spettano all’applicativo QCL sono essenzialmente due: | ||
* aggiornare i parametri tipo owordNN, olongNN (che verranno poi letti dal master) | * aggiornare i parametri tipo owordNN, olongNN (che verranno poi letti dal master) | ||
* processare i parametri tipo iwordNN, ilongNN (che sono stati scritti dal master) | * processare i parametri tipo iwordNN, ilongNN (che sono stati scritti dal master) | ||
- | |||
=== - Aggiornamento dei parametri tipo owordNN === | === - Aggiornamento dei parametri tipo owordNN === | ||
Per aggiornare i parametri tipo owordNN il QCL deve scrivere i valori nei parametri quindi inviare il comando VALIDATE. | Per aggiornare i parametri tipo owordNN il QCL deve scrivere i valori nei parametri quindi inviare il comando VALIDATE. | ||
Linea 469: | Linea 531: | ||
solamente dopo il comando VALIDATE. | solamente dopo il comando VALIDATE. | ||
- | == Esempio: == | + | **Esempio** |
<code QCL> | <code QCL> | ||
- | MAIN: | + | modbus.olong1 = anpos.speed |
- | modbus:olong1 = anpos:speed | + | modbus.oword1 = npezzi |
- | | + | modbus.oword2 = npezzitot |
- | | + | modbus.oword3 = anpos.dir |
- | | + | modbus.olong2 = anpos.posit |
- | | + | modbus.VALIDATE |
- | | + | |
- | WAIT 1 | + | |
- | JUMP MAIN | + | |
</ | </ | ||
Linea 488: | Linea 547: | ||
solo allora lo stato st_msgrx viene disattivato. | solo allora lo stato st_msgrx viene disattivato. | ||
- | Esempio: | + | **Esempio** |
<code QCL> | <code QCL> | ||
- | MAIN: | + | WAIT modbus.st_msgrx |
- | WAIT modbus:st_msgrx | + | anpos.speed = modbus.ilong1 |
- | | + | anpos:posit = modbus.ilong2 |
- | | + | npezzi |
- | switch | + | RECEIVED modbus |
- | | + | |
- | WAIT 1 | + | |
- | JUMP MAIN | + | |
</ | </ | ||
Naturalmente non esiste nessun controllo per evitare che durante la lettura dei parametri //iwordNN// il master erroneamente | Naturalmente non esiste nessun controllo per evitare che durante la lettura dei parametri //iwordNN// il master erroneamente | ||
Linea 509: | Linea 565: | ||
Tutte le richieste di scrittura che arrivano dal master MODBUS fanno riferimento ai dati di tipo //iwordNN// accedendo quindi | Tutte le richieste di scrittura che arrivano dal master MODBUS fanno riferimento ai dati di tipo //iwordNN// accedendo quindi | ||
alla stessa area dati. Lo slave mette a disposizione i parametri //iwordNN// dove il master potrà scrivere i dati. | alla stessa area dati. Lo slave mette a disposizione i parametri //iwordNN// dove il master potrà scrivere i dati. | ||
+ | ==== - Schema a blocchi ==== | ||
{{: | {{: | ||
Linea 545: | Linea 601: | ||
=== - Parametri - Modbus Slave === | === - Parametri - Modbus Slave === | ||
- | ^Nome^D^R^A^Condizioni^ Descrizione^ | + | ^ Nome |
- | |mode|B|R|R/ | + | | mode |
- | |prot|B|R|R/ | + | | prot |
- | |wider|B|R|R/ | + | | wider | B | R | R/W | - |
- | |idcard|W|R|R/ | + | | idcard |
- | |brate|L|R|R/ | + | | brate | L | R | R/W | - |
- | |stopb|B|R|R/ | + | | stopb | B | R | R/W | - |
- | |par|B|R|R/ | + | | par | B | R | R/W | - |
- | |rdelay|W|R|R/ | + | | rdelay |
- | |iword1÷32|W|0|R|-|**Input Word nr.** (1Input Long nr. (1÷16)32)| | + | | iword1÷32 |
- | |st_ibit0÷15|F|0|R|-|**Input bit nel parametro iword1**| | + | | st_ibit0÷15 |
- | |ilong1÷16|L|0|R|-|**Input Long nr.** (1÷16)| | + | | ilong1÷16 |
- | |oword1÷32|W|0|R/ | + | | oword1÷32 |
- | |st_obit0÷15|F|0|R/ | + | | st_obit0÷15 |
- | |olong1÷16|L|0|R/ | + | | olong1÷16 |
+ | |||
+ | |||
=== - Variabili - Modbus Slave === | === - Variabili - Modbus Slave === | ||
Linea 576: | Linea 635: | ||
Il device esegue tutti i comandi ricevuti entro lo stesso tempo di campionamento iniziando da quello con la priorità maggiore.\\ | Il device esegue tutti i comandi ricevuti entro lo stesso tempo di campionamento iniziando da quello con la priorità maggiore.\\ | ||
Per esempio se il device riceve nello stesso tempo di campionamento i comandi CLOSECOM e OPENCOM, per primo esegue il comando OPENCOM e poi quello di CLOSECOM lasciando perciò la porta di comunicazione chiusa. | Per esempio se il device riceve nello stesso tempo di campionamento i comandi CLOSECOM e OPENCOM, per primo esegue il comando OPENCOM e poi quello di CLOSECOM lasciando perciò la porta di comunicazione chiusa. | ||
- | ^Nome^D^R^A^Condizioni^ Descrizione^ | + | ^ Nome ^ D ^ R ^ A ^ Condizioni |
- | |RECEIVED|-|-|-|st_msgrx = 1\\ mode = 1\\ st_opencom = 1|**Received**\\ Utilizzato solamente in modalitá slave. Indica che l’applicativo QCL ha processato le informazioni che il master ha inviato| | + | | RECEIVED |
- | |VALIDATE|-|-|-|mode = 1\\ st_opencom = 1|**Validate**\\ Indica che i parametri di scambio dati QCL diventano disponibili al master.| | + | | VALIDATE |
- | |CLRWDATA|-|-|-|-|**Clear Warning Data**\\ Azzera la segnalazione del parametro wdata| | + | | CLRWDATA |
- | |CLRWCMD|-|-|-|-|**Clear Warning Command**\\ Azzera la segnalazione del parametro wcmd| | + | | CLRWCMD |
- | |OPENCOM|-|-|-|st_opencom = 0|**Open Serial communication**\\ Apre la comunicazione seriale (il device quindi impegna la porta di comunicazione). Lo stato // | + | | OPENCOM |
- | |CLOSECOM|-|-|-|-|**Close Serial communication**\\ Chiude la comunicazione seriale (il device quindi non impegna piú la porta di comunicazione). Lo stato // | + | | CLOSECOM |
Linea 604: | Linea 664: | ||
solo una volta) come mostrato nel seguente esempio. | solo una volta) come mostrato nel seguente esempio. | ||
- | ==== - Esempio: ==== | + | ==== Esempio: ==== |
<code QCL> | <code QCL> | ||
- | ;------------------------------------------- | + | ; impostazione |
- | ; | + | modbus.mode = 0 |
- | modbus:mode = 0 | + | modbus.brate = 38400 |
- | modbus:brate = 38400 | + | ... |
- | … | + | modbus.OPENCOM |
- | … | + | WAIT modbus.st_opencom |
- | ; | + | |
- | OPENCOM | + | |
- | WAIT modbus:st_opencom | + | |
- | MAIN: | + | modbus.idcard = 8 |
- | modbus:idcard = 8 | + | modbus.addr = 600 |
- | | + | modbus.num = 6 |
- | | + | modbus.tabreg = 10 |
- | | + | modbus.type = 3 |
- | | + | modbus.SEND |
- | | + | WAIT modbus.st_sended |
- | | + | IF (modbus.err) |
- | | + | CALL ErroreModbus |
- | | + | ENDIF |
- | | + | |
- | WAIT 1 | + | |
- | JUMP MAIN | + | |
- | END | + | |
</ | </ | ||