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/16 11:26] – [Table] qem207 | software:devices:modbus [2015/09/17 11:01] – [5.10.2. Parametri] qem202 | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
====== DEVICE MODBUS ====== | ====== DEVICE MODBUS ====== | ||
- | |||
- | |||
===== - Introduzione ===== | ===== - Introduzione ===== | ||
Linea 17: | Linea 15: | ||
Il presente manuale si suddivide in due parti:\\ | Il presente manuale si suddivide in due parti:\\ | ||
- | Parte I - Modbus Master: utilizzo del device | + | Parte I - Descrizione funzionamento |
- | Parte II - Modbus Slave: utilizzo del device | + | Parte II - Descrizione funzionamento |
Linea 31: | Linea 29: | ||
- | ===== - Installazione ===== | ||
- | ==== - Dichiarazione device | + | |
+ | ===== - Dichiarazione device | ||
Dichiarazione del device utilizzato (device interno): nome del device assegnato, MODBUS, posizione dello slot e numero | Dichiarazione del device utilizzato (device interno): nome del device assegnato, MODBUS, posizione dello slot e numero | ||
Linea 54: | Linea 52: | ||
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 151: | Linea 147: | ||
- | ===== - Parte 1 : Modbus Master | + | ===== - Descrizione funzionamento come master |
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 207: | Linea 202: | ||
==== - 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 215: | Linea 210: | ||
(//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 === |
- | 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. | + | |
- | === - Read Holding Register | + | === Read Holding Register === |
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 228: | Linea 222: | ||
wcmd). | wcmd). | ||
- | === - Read Input Register | + | === Read Input Register === |
- | 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”. |
- | Holding Register”. Il significato delle due funzione si distingue a livello di protocollo MODBUS. Alcuni slave possono | + | |
- | mettere a disposizione delle zone di memoria differenti a seconda se le word lette sono Holding o Input. Nel caso di slave | + | |
- | Qmove le due richieste hanno lo stesso effetto. | + | |
==== - Richieste di scrittura ==== | ==== - Richieste di scrittura ==== | ||
- | === - Force coil (type = 5) === | + | === Force coil === |
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 | + | === Force register === |
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 === |
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 253: | Linea 244: | ||
(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 | + | === Force multiple register === |
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 286: | Linea 277: | ||
tcpip_port= 502 ; number of tcpip port (default 502) | tcpip_port= 502 ; number of tcpip port (default 502) | ||
- | modbus.stopb = tcpip_port | + | modbus.stopb = (tcpip_port |
- | modbus.par | + | modbus.par = tcpip_port ANDB & |
modbus.OPENCOM | modbus.OPENCOM | ||
Linea 331: | Linea 322: | ||
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 332: | ||
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 420: | Linea 411: | ||
RW = Read / Write.\\ | RW = Read / Write.\\ | ||
- | === - Parametri | + | === - Parametri === |
^ 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. | | mode | B | R | R/W | - | **Mode**\\ (0 ÷ 2)\\ Definisce se la scheda deve funzionare come master o come slave.\\ **0** = master. | ||
Linea 442: | Linea 433: | ||
| olong1÷16 | | olong1÷16 | ||
+ | La possibilità di comunicare con il protocollo TCPIP è stata sviluppata in un tempo successivo rispetto alla nascita del device MODBUS. Per questo modivo l' | ||
Per configurare il numero della porta TCPIP è necessario andare a scrivere sui parametri //stopb// e //par//. Rispettivamente : | Per configurare il numero della porta TCPIP è necessario andare a scrivere sui parametri //stopb// e //par//. Rispettivamente : | ||
Linea 451: | Linea 443: | ||
- | === - Variabili | + | === - Variabili === |
^ Nome ^ D ^ R ^ A ^ Condizioni | ^ 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 // | | 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 // | ||
Linea 458: | Linea 450: | ||
- | === - Stati - Modbus Master | + | === - Stati === |
^Nome^D^R^A^Condizioni^Descrizione^ | ^Nome^D^R^A^Condizioni^Descrizione^ | ||
|st_sended|F|0|R|-|**Sended**\\ Stato utilizzato solo in modalità master. L’attivazione indica il completamento della trasmissione di un messaggio. Lo stato viene resettato con i comandi SEND o SENDSYC.| | |st_sended|F|0|R|-|**Sended**\\ Stato utilizzato solo in modalità master. L’attivazione indica il completamento della trasmissione di un messaggio. Lo stato viene resettato con i comandi SEND o SENDSYC.| | ||
Linea 465: | Linea 457: | ||
|wcmd|F|0|R|-|**Warning Command**\\ Questo bit segnala che è non è stato eseguito un comando perché mancano le condizioni necessarie.| | |wcmd|F|0|R|-|**Warning Command**\\ Questo bit segnala che è non è stato eseguito un comando perché mancano le condizioni necessarie.| | ||
- | === - Comandi | + | === - Comandi === |
I comandi a disposizione per gestire il device sono elencati sotto in ordine di priorità decrescente.\\ | I comandi a disposizione per gestire il device sono elencati sotto in ordine di priorità decrescente.\\ | ||
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.\\ | ||
Linea 480: | Linea 472: | ||
- | ===== - Parte 2 : Modbus Slave ===== | + | ===== - Descrizione funzionamento come slave ===== |
==== - Modo di funzionamento SLAVE ==== | ==== - Modo di funzionamento SLAVE ==== | ||
- | 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. | + | 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. |
- | * aggiornare i parametri tipo owordNN, olongNN (che verranno poi letti 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 | + | **Impostazioni modbus e apertura del canale di comunicazione di tipo seriale** |
<code QCL> | <code QCL> | ||
modbus.mode = 1 ; modbus slave | modbus.mode = 1 ; modbus slave | ||
Linea 504: | Linea 493: | ||
ENDIF | ENDIF | ||
</ | </ | ||
- | === - Impostazioni modbus e apertura del canale di comunicazione di tipo TCPIP === | + | **Impostazioni modbus e apertura del canale di comunicazione di tipo TCPIP** |
<code QCL> | <code QCL> | ||
modbus.mode = 1 ; modbus slave | modbus.mode = 1 ; modbus slave | ||
Linea 510: | Linea 499: | ||
tcpip_port= 502 ; number of tcpip port (default 502) | tcpip_port= 502 ; number of tcpip port (default 502) | ||
- | ; maste | ||
- | modbus.stopb = tcpip_port / & | ||
- | modbus.par | ||
- | ; slave | ||
modbus.stopb = (tcpip_port ANDB & | modbus.stopb = (tcpip_port ANDB & | ||
- | modbus.par = tcpip_port ANDB &H00FF | + | modbus.par = tcpip_port ANDB &H000000FF |
modbus.OPENCOM | modbus.OPENCOM | ||
Linea 524: | Linea 509: | ||
ENDIF | ENDIF | ||
</ | </ | ||
- | FIXME | + | |
+ | Le operazioni che spettano all’applicativo QCL sono essenzialmente due: | ||
+ | * aggiornare i parametri tipo owordNN, olongNN (che verranno poi letti 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 532: | Linea 520: | ||
solamente dopo il comando VALIDATE. | solamente dopo il comando VALIDATE. | ||
- | == Esempio: == | + | **Esempio** |
<code QCL> | <code QCL> | ||
modbus.olong1 = anpos.speed | modbus.olong1 = anpos.speed | ||
Linea 548: | Linea 536: | ||
solo allora lo stato st_msgrx viene disattivato. | solo allora lo stato st_msgrx viene disattivato. | ||
- | Esempio: | + | **Esempio** |
<code QCL> | <code QCL> | ||
WAIT modbus.st_msgrx | WAIT modbus.st_msgrx | ||
Linea 566: | Linea 554: | ||
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 601: | Linea 589: | ||
RW = Read / Write. | RW = Read / Write. | ||
- | === - Parametri | + | === - Parametri === |
^ 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.\\ **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.\\ **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), | ||
Linea 621: | Linea 609: | ||
- | === - Variabili | + | === - Variabili === |
^Nome^D^R^A^Condizioni^ Descrizione^ | ^Nome^D^R^A^Condizioni^ Descrizione^ | ||
|serr|B|0|R/ | |serr|B|0|R/ | ||
- | === - Stati - Modbus Slave === | + | === - Stati === |
^Nome^D^R^A^Condizioni^ Descrizione^ | ^Nome^D^R^A^Condizioni^ Descrizione^ | ||
|st_msgrx|F|0|R||-|**Message received**\\ Stato utilizzato solo in modalitá slave. Indica che un messagio del master ha eseguito una scrittura nell’area scambio dati QCL. Lo stato viene resettato con il comando RECEIVED.| | |st_msgrx|F|0|R||-|**Message received**\\ Stato utilizzato solo in modalitá slave. Indica che un messagio del master ha eseguito una scrittura nell’area scambio dati QCL. Lo stato viene resettato con il comando RECEIVED.| | ||
Linea 632: | Linea 620: | ||
|wcmd|F|0|R|-|**Warning Command**\\ Questo bit segnala che è non è stato eseguito un comando perchè mancano le condizioni necessarie.| | |wcmd|F|0|R|-|**Warning Command**\\ Questo bit segnala che è non è stato eseguito un comando perchè mancano le condizioni necessarie.| | ||
- | === - Comandi | + | === - Comandi === |
I comandi a disposizione per gestire il device sono elencati sotto in ordine di priorità decrescente.\\ | I comandi a disposizione per gestire il device sono elencati sotto in ordine di priorità decrescente.\\ | ||
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.\\ | ||
Linea 665: | Linea 653: | ||
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 | + | |
</ | </ | ||