Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Entrambe le parti precedenti la revisione Revisione precedente Prossima revisione | Revisione precedente Prossima revisioneEntrambe le parti successive la revisione | ||
software:devices:modbus [2015/09/15 16:54] – [Table] qem207 | software:devices:modbus [2015/09/16 11:46] – [6.1.4. Processo dei parametri tipo iwordNN] qem207 | ||
---|---|---|---|
Linea 32: | Linea 32: | ||
===== - Installazione ===== | ===== - Installazione ===== | ||
+ | FIXME | ||
==== - Dichiarazione device nel file di configurazione (.CNF) ==== | ==== - Dichiarazione device nel file di configurazione (.CNF) ==== | ||
Linea 54: | Linea 55: | ||
riferimento al manuale firmware dell’hardware stesso. | riferimento al manuale firmware dell’hardware stesso. | ||
- | === - Esempio | + | **Esempio** |
<code QCL> | <code QCL> | ||
INTDEVICE | INTDEVICE | ||
Linea 152: | Linea 152: | ||
===== - Parte 1 : Modbus Master ===== | ===== - Parte 1 : Modbus Master ===== | ||
+ | FIXME | ||
Il device MODBUS può utilizzare una porta seriale o TCPIP per comunicare in modalità master (parametro //mode// = 0). Esso da la | Il device MODBUS può utilizzare una porta seriale o TCPIP per comunicare in modalità master (parametro //mode// = 0). Esso da la | ||
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 | ||
Linea 270: | Linea 270: | ||
modbus.par = 0 ; parity | modbus.par = 0 ; parity | ||
modbus.tout = 100 ; timeout | modbus.tout = 100 ; timeout | ||
- | tm_opencom = 2000 ; timeout for OPENCOM command | + | |
modbus.OPENCOM | modbus.OPENCOM | ||
+ | tm_opencom = 200 ; timeout for OPENCOM command | ||
WAIT modbus.st_opencom OR tm_opencom | WAIT modbus.st_opencom OR tm_opencom | ||
IF NOT modbus.st_opencom | IF NOT modbus.st_opencom | ||
Linea 282: | Linea 283: | ||
modbus.mode = 0 ; modbus master | modbus.mode = 0 ; modbus master | ||
modbus.prot = 2 ; TCPIP | modbus.prot = 2 ; TCPIP | ||
+ | modbus.tout = 100 ; timeout | ||
tcpip_port= 502 ; number of tcpip port (default 502) | tcpip_port= 502 ; number of tcpip port (default 502) | ||
- | modbus.brate = & | ||
modbus.stopb = tcpip_port / & | modbus.stopb = tcpip_port / & | ||
modbus.par | modbus.par | ||
- | modbus.tout = 100 ; timeout | ||
- | tm_opencom = 500 ; waiting time to have a correct response | ||
modbus.OPENCOM | modbus.OPENCOM | ||
+ | tm_opencom = 500 ; waiting time to have a correct response | ||
WAIT tm_opencom | WAIT tm_opencom | ||
IF NOT modbus.st_opencom | IF NOT modbus.st_opencom | ||
Linea 331: | Linea 331: | ||
swTemp1 = modbus.iword15 | swTemp1 = modbus.iword15 | ||
</ | </ | ||
- | === - Schema a blocchi === | + | ==== - 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 341: | Linea 341: | ||
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 421: | Linea 421: | ||
=== - Parametri - Modbus Master === | === - Parametri - Modbus Master === | ||
- | ^ Nome ^ D ^ R ^ A ^ Condizioni | + | ^ Nome ^ D ^ R ^ A ^ Condizioni |
- | | mode | B | R | R/W | - | **Mode**\\ (0 ÷ 2)\\ Definisce se la scheda deve funzionare come master o come slave.\\ **0** = master;\\ **1** = slave con area di scambio dati fissa;\\ **2** = slave senza area di scambio dati fissa: ad ogni scrittura o lettura eseguita dal master viene messi a 1 il flag st_msgrx.\\ Contemporaneamente i parametri //type//, //addr// e //num// indicano le caratteristiche del messaggio ricevuto.\\ - **Type** indica il tipo di funzione che vuole fare ill master (lettura o scrittura), | + | | mode | B | R | R/W | - | **Mode**\\ (0 ÷ 2)\\ Definisce se la scheda deve funzionare come master o come slave.\\ **0** = master. |
- | | prot | B | R | R/W | - | **Protocol**\\ (0 ÷ 1)\\ Definisce il tipo di protocollo Modbus da utilizzare.\\ **0** = ASCII,\\ **1** = RTU,\\ **2** = TCPIP | + | | prot | B | R | R/W | - | **Protocol**\\ (0 ÷ 1)\\ Definisce il tipo di protocollo Modbus da utilizzare.\\ **0** = ASCII,\\ **1** = RTU,\\ **2** = TCPIP | |
- | | wider | B | R | R/W | - | **Wide Registers**\\ (0 ÷ 1)\\ Indica se utilizzare l’estensione del protocollo per i registri a 32bit. Vedere capitolo “Estensione del protocollo” :\\ **0** = normale,\\ **1** = protocollo esteso. | + | | wider | B | R | R/W | - | **Wide Registers**\\ (0 ÷ 1)\\ Indica se utilizzare l’estensione del protocollo per i registri a 32bit. Vedere capitolo “Estensione del protocollo” :\\ **0** = normale,\\ **1** = protocollo esteso. |
- | | idcard | + | | idcard |
- | | type | B | 1 | R/W | - | **Type**\\ Definisce il tipo di richiesta che il master deve eseguire.\\ Valori ammessi: 1, 2, 3, 4, 5, 6, 15, 16 | | + | | type | B | 1 | R/W | - | **Type**\\ Definisce il tipo di richiesta che il master deve eseguire.\\ Valori ammessi: 1, 2, 3, 4, 5, 6, 15, 16 |
- | | addr | L | 1 | R/W | - | **Address**\\ (1 ÷ 65535)\\ Definisce l’indirizzo utilizzato dal master per definire quale sia il dato da leggere o scrivere. | + | | addr | L | 1 | R/W | - | **Address**\\ (1 ÷ 65535)\\ Definisce l’indirizzo utilizzato dal master per definire quale sia il dato da leggere o scrivere. |
- | | tabreg | + | | tabreg |
- | | num | W | 1 | R/W | - | **Number**\\ (1 ÷ 512)\\ È il numero d' | + | | num | W | 1 | R/W | - | **Number**\\ (1 ÷ 512)\\ È il numero d' |
- | | brate | L | R | R/W | - | **Baud rate**\\ Baud rate della seriale.\\ Valori validi: 4800, 9600, 19200, 38400, 57600, 115200. | + | | brate | L | R | R/W | - | **Baud rate**\\ Baud rate della seriale.\\ Valori validi: 4800, 9600, 19200, 38400, 57600, 115200. |
- | | stopb | B | R | R/W | - | **Stop bit**\\ Valori validi: 1, 2. | | + | | stopb | B | R | R/W | - | **Stop bit**\\ Valori validi: 1, 2. |
- | | par | B | R | R/W | - | **Parity**\\ (0 ÷ 2)\\ **0** = none (nessuna), | + | | par | B | R | R/W | - | **Parity**\\ (0 ÷ 2)\\ **0** = none (nessuna), |
- | | tout | W | R | R/W | - | **Timeout**\\ (0 ÷ 9999 msec)\\ Per la modalitá master è il tempo massimo in cui lo slave deve rispondere.\\ Impostandolo a zero il Timeout è disabilitato. | + | | tout | W | R | R/W | - | **Timeout**\\ (0 ÷ 9999 msec)\\ Per la modalitá master è il tempo massimo in cui lo slave deve rispondere.\\ Impostandolo a zero il Timeout è disabilitato. |
- | | toutsyc | + | | toutsyc |
- | | iword1÷32 | + | | iword1÷32 |
- | | st_ibit0÷15 | + | | st_ibit0÷15 |
- | | ilong1÷16 | + | | ilong1÷16 |
- | | oword1÷32 | + | | oword1÷32 |
- | | st_obit0÷15 | + | | st_obit0÷15 |
- | | olong1÷16 | + | | olong1÷16 |
- | Per configurare il numero della porta TCPIP è necessario andare a scrivere sui parametri | + | Per configurare il numero della porta TCPIP è necessario andare a scrivere sui parametri |
- | brate = & | + | * **stopb** = tcpip_port / & |
- | stopb = tcpip_port / & | + | * **par** = tcpip_port ANDB & |
- | par | + | 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 === | ||
+ | ^ Nome ^ D ^ R ^ A ^ Condizioni | ||
+ | | 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 // | ||
+ | | serr | B | 0 | R/W | - | **Serial Errors**\\ Indica se sono stati riscontrati errori nella comunicazione seriale. Il parametro viene aggiornato ad ogni errore rilevato. Il valore permane fino:\\ - ad un successivo errore;\\ - alla scrittura di uno dei seguenti parametri: mode, prot, wider, brate, stopb, par;\\ - ad una scrittura sullo stesso (qualsiasi valore lo azzera).\\ **0** = nessun errore,\\ **1** = parity error,\\ **2** = framing error,\\ **3** = overrun error. | ||
+ | | stype | W | 0 | R | - | **Slave type**\\ Indica il tipo di slave connesso. Il parametro viene aggiornato quando il parametro // | ||
- | |||
- | |||
- | === - Variabili - Modbus Master === | ||
- | ^Nome^D^R^A^Condizioni^Descrizione^ | ||
- | |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 // | ||
- | |serr|B|0|R/ | ||
- | |stype|W|0|R|-|**Slave type**\\ Indica il tipo di slave connesso. Il parametro viene aggiornato quando il parametro // | ||
=== - Stati - Modbus Master === | === - Stati - Modbus Master === | ||
Linea 481: | Linea 481: | ||
===== - 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. 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) | ||
+ | === - 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 &H00FF | ||
+ | |||
+ | 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 | ||
=== - 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 497: | Linea 534: | ||
== 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 516: | Linea 550: | ||
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 535: | Linea 566: | ||
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 571: | Linea 602: | ||
=== - 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 602: | Linea 636: | ||
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 630: | Linea 665: | ||
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 | + | |
</ | </ | ||