Protocolli di comunicazione¶
Protocollo modbus¶
Il modbus è un protocollo di comunicazione seriale diventato uno standard de facto nella comunicazione di tipo industriale, ed è ora il protocollo di connessione più diffuso fra i dispositivi elettronici industriali. E” un protocollo di tipo richiesta/risposta ed offre dei servizi specificati da function codes.
SlimLine supporta il protocollo modbus Rtu sulle porte seriali, e modbus Over IP su connessione ethernet su porta 502. Il protocollo modbus Rtu sulla porta seriale ha come parametri di comunicazione di default 115200, e, 8, 1, e l’indirizzo di nodo sia su porta seriale che su TCP/IP è 1.
Accesso variabili da modbus¶
Le funzioni del protocollo accedono tutte alla memoria utente MX100, le funzioni supportate sono:
Code | Function | Tipo oggetto | Accesso | Range indirizzo |
---|---|---|---|---|
01h | Read coil status | Array di bit | Read | 40000-44095 (20000-24095) (Note 1) |
02h | Read input status | Array di bit | Read | 40000-44095 (20000-24095) (Note 1) |
03h | Read holding registers | Array di word (16 Bit) | Read | 40000-42047 (20000-22047) (Note 2) |
04h | Read input registers | Array di word (16 Bit) | Read | 40000-42047 (20000-22047) (Note 2) |
05h | Force single coil | Bit singolo | Write | 40000-44095 (20000-24095) (Note 1) |
06h | Preset single register | Word singola (16 Bit) | Write | 40000-42047 (20000-22047) (Note 2) |
08h | Loopback diagnostic test | |||
0Fh | Force multiple coils | Array di bit | Write | 40000-42047 (20000-22047) (Note 1) |
10h | Preset multiple registers | Array di word (16 Bit) | Write | 40000-42047 (20000-22047) (Note 2) |
Da versione SFW167D000 l’area è indirizzabile anche nel range da 20000 a 2xxxx.
Note 1) Nelle funzioni che accedono al bit singolo (In realtà ogni bit equivale ad un byte di memoria) si utilizza nel comando l’indirizzo della variabile, quindi dovendo accedere alla locazione MX100.50 utilizzeremo come indirizzo il valore 40050.
Note 2) Nelle funzioni che accedono ai registri (16 Bits) occorre considerare l’indirizzo della variabile diviso per 2, quindi dovendo raggiungere da modbus la locazione MX100.50 utilizzeremo come indirizzo il valore 40025.
Lettura variabili da modbus¶
Per la lettura delle variabili si utilizza il comando Read holding registers (Codice 0x03). Ipotizzando di dover accedere in lettura ad una variabile DWORD allocata in memoria all’indirizzo MX100.64 calcoleremo l’indirizzo di lettura nel modo:
((Indirizzo variabile/2)+Offset)-1 → ((64/2)+40000)-1=40031 → 0x9C5F
Essendo una variabile DWORD dovremo leggere 2 registri consecutivi a partire dal suo indirizzo di allocazione, ipotizzando che il valore della variabile sia 0x12345678 avremo.
Frames modbus RTU
Stringa di comando: `` 01 03 9C 5F 00 02 DA 49 ``
Stringa di risposta: `` 01 03 04 56 78 12 34 66 D5 ``
Frames modbus TCP/IP
Stringa di comando: `` 00 00 00 00 00 06 01 03 9C 5F 00 02 ``
Stringa di risposta: `` 00 00 00 00 00 07 01 03 04 56 78 12 34 ``
La rappresentazione dei dati in SlimLine è nel formato Little-Endian, la numerazione inizia dal byte meno significativo per finire col più significativo, quindi come si nota dalla stringa di risposta il valore della variabile a 32 bits 0x12345678 viene ritornato suddiviso in due registri a 16 bits con i valori 0x5678, 0x1234.
Scrittura variabili da modbus¶
Per la scrittura delle variabili si utilizza il comando Preset multiple registers (Codice 0x10). Ipotizzando di dover accedere in scrittura ad una variabile DWORD allocata in memoria all’indirizzo MX100.64 calcoleremo l’indirizzo di scrittura nel modo:
((Indirizzo variabile/2)+Offset)-1 → ((64/2)+40000)-1=40031 → 0x9C5F
Essendo una variabile DWORD dovremo scrivere 2 registri consecutivi a partire dal suo indirizzo di allocazione, ipotizzando di dover scrivere nella variabile il valore 0x12345678 avremo.
Frames modbus RTU
Stringa di comando: `` 01 10 9C 5F 00 02 04 56 78 12 34 D3 33 ``
Stringa di risposta: `` 01 10 9C 5F 00 02 5F 8A ``
Frames modbus TCP/IP
Stringa di comando: `` 00 00 00 00 00 0B 01 10 9C 5F 00 02 04 56 78 12 34 ``
Stringa di risposta: `` 00 00 00 00 00 06 01 10 9C 5F 00 02 ``
La rappresentazione dei dati in SlimLine è nel formato Little-Endian, la numerazione inizia dal byte meno significativo per finire col più significativo, quindi come si nota dalla stringa di comando il valore da scrivere a 32 bits 0x12345678 viene definito suddiviso in due registri a 16 bits con i valori 0x5678, 0x1234.
Accesso Real time clock da modbus¶
E” possibile accedere al real time clock utilizzando i comandi modbus di accesso ai registri le funzioni supportate sono:
Code | Function | Tipo oggetto | Accesso | Range indirizzo |
---|---|---|---|---|
03h | Read holding registers | Array di word (16 Bit) | Read | 100-105 (150 per l’Epoch time) |
04h | Read input registers | Array di word (16 Bit) | Read | 100-105 (150 per l’Epoch time) |
06h | Preset single register | Array di word (16 Bit) | Write | 100-105 (150 per l’Epoch time) |
10h | Preset multiple registers | Array di word (16 Bit) | Write | 100-105 (150 per l’Epoch time) |
I registri (16 Bits) del real time clock sono allocati in locazioni consecutive a partire dall’indirizzo modbus 100. I registri contengono il valore attuale del real time clock e scrivendo un nuovo valore il real time clock verrà automaticamente aggiornato.
Address | Register | Note |
100 | Second | Valore secondi (Range da 0 a 59) |
101 | Minute | Valore minuti (Range da 0 a 59) |
102 | Hour | Valore ora (Range da 0 a 23) |
103 | Day | Valore giorno (Range da 1 a 31) |
104 | Month | Valore mese (Range da 1 a 12) |
105 | Year | Valore anno (Range da 1900 a 2037) |
Lettura RTC da modbus¶
Per la lettura dei registri del real time clock si utilizza il comando Read holding registers (Codice 0x03). Dovremo leggere 6 registri consecutivi a partire dall’indirizzo di allocazione, l’indirizzamento di modbus prevede un offset di 1, quindi 99 (0x0063).
Frames modbus RTU
Stringa di comando: `` 01 03 00 63 00 06 35 D6 ``
Stringa di risposta: `` 01 03 0C 00 1E 00 30 00 0B 00 1D 00 09 07 DA A2 `` 32**
Frames modbus TCP/IP
Stringa di comando: `` 00 00 00 00 00 06 01 03 00 63 00 06 ``
Stringa di risposta: `` 00 00 00 00 00 0F 01 03 0C 00 1E 00 30 00 0B 00 1D 00 09 07 DA ``
Come si vede dalla risposta il valore è:
Secondi: 30 (0x001E)
Minuti: 48 (0x0030)
Ora: 11 (0x000B)
Giorno: 29 (0x001D)
Mese: 9 (0x0009)
Anno: 2010 (0x07DA)
Scrittura RTC da modbus¶
Per la scrittura dei registri del real time clock si utilizza il comando Preset multiple registers (Codice 0x10). Dovremo scrivere 6 registri consecutivi a partire dall’indirizzo di allocazione, l’indirizzamento di modbus prevede un offset di 1, quindi 99 (0x0063). Ipotizziamo di dover impostare nel real time clock i valori:
Secondi: 30 (0x001E)
Minuti: 48 (0x0030)
Ora: 11 (0x000B)
Giorno: 29 (0x001D)
Mese: 9 (0x0009)
Anno: 2010 (0x07DA)
Frames modbus RTU
Stringa di comando: 01 10 00 63 00 06 08 00 1E 00 30 00 0B 00 1D 00 09 07 DA 5D C8
Stringa di risposta: 01 10 00 63 00 06 B0 15
Frames modbus TCP/IP
Stringa di comando: 00 00 00 00 00 13 01 10 00 63 00 06 08 00 1E 00 30
00 0B 00 1D 00 09 07 DA
Stringa di risposta: 00 00 00 00 00 06 01 10 00 63 00 06
Accesso Epoch time da modbus¶
E” allocato anche un registro a 32 bits per il valore di data/ora in Epoch time, l’acceso a questo registro in lettura e/o scrittura và sempre effettuato usando due registri a 16 bits.
Address | Register | Note |
150 | Epoch time | Epoch time |
Lettura Epoch time da modbus¶
Per la lettura dell’epoch time si utilizza il comando Read holding registers (Codice 0x03). Dovremo leggere 2 registri consecutivi a partire dall’indirizzo di allocazione, l’indirizzamento di modbus prevede un offset di 1, quindi 149 (0x0095).
Frames modbus RTU
Stringa di comando: `` 01 03 00 95 00 02 D4 27 ``
Stringa di risposta: `` 01 03 04 30 B5 4C A3 90 6C ``
Frames modbus TCP/IP
Stringa di comando: `` 00 00 00 00 00 06 01 03 00 95 00 02 ``
Stringa di risposta: `` 00 00 00 00 00 07 01 03 04 30 B5 4C A3 ``
Come si vede dalla risposta il valore è: 0x4CA330B5 → 1285763253 → GMT: Wed, 29 Sep 2010 12:27:33 UTC.
Scrittura Epoch time da modbus¶
Per la scrittura dell’epoch time si utilizza il comando Preset multiple registers (Codice 0x10). Dovremo scrivere 2 registri consecutivi a partire dall’indirizzo di allocazione, l’indirizzamento di modbus prevede un offset di 1, quindi 149 (0x0095). Ipotizziamo di dover impostare il valore:
GMT: Wed, 29 Sep 2010 12:27:33 UTC → 1285763253 → 0x4CA330B5
Frames modbus RTU
Stringa di comando: `` 01 10 00 95 00 02 04 30 B5 4C A3 50 A3 ``
Stringa di risposta: `` 01 10 00 95 00 02 51 E4 ``
Frames modbus TCP/IP
Stringa di comando: `` 00 00 00 00 00 0B 01 10 00 95 00 02 04 30 B5 4C A3 ``
Stringa di risposta: `` 00 00 00 00 00 06 01 10 00 95 00 02 ``