Struttura dati dei messaggi Modbus
Relativamente all’ordine di trasmissione del messaggio Modbus, quando i singoli dati da trasmettere nella frame sono composti da più bytes (16 bit e oltre), viene applicato il seguente formato:
Standard Modbus transmission order:
-—————MSByte–LSByte—-(next data)—————————CRC–>
time:t0 —————————————————————— time:tN
L’ordine di trasmissione dei dati contenuti nella Frame del messaggio è conforme allo standard Modbus, con il byte piu significativo trasmesso prima, seguito dai byte meno significativi.
N.B. il CRC costituisce un’eccezione, in quanto nella sequenza temporale di trasmissione viene trasmesso prima il byte meno significativo, seguito dal byte più significativo, come anche illustrato negli esempi dei successivi paragrafi.
Formato del dato a 32 bits, quando è utilizzato il bit di segno
Modbus lower index | Next higher index | ||||
---|---|---|---|---|---|
MSB | SXXX XXXX | XXXX XXXX | XXXX XXXX | XXXX XXXX | LSB |
Byte 0 | Byte 1 | Byte 2 | Byte 3 |
Formato del dato a 32 bits, senza segno
Modbus lower index | Next higher index | ||||
---|---|---|---|---|---|
MSB | XXXX XXXX | XXXX XXXX | XXXX XXXX | XXXX XXXX | LSB |
Byte 0 | Byte 1 | Byte 2 | Byte 3 |
Formato del dato a 32 bits di tipo ‘float’ con segno = S, esponente = X, mantissa = M
Modbus lower index | Next higher index | ||||
---|---|---|---|---|---|
MSB | SXXX XXXX | XMMM MMMM | MMMM MMMM | MMMM MMMM | LSB |
Byte 0 | Byte 1 | Byte 2 | Byte 3 |
Ulteriori tipi di dato gestiti dall’interfaccia Modbus non sono utilizzati e non vengono quindi descritti .
Mappa dei registri Modbus della scheda
I registri Modbus illustrati nella memory-map e nei paragrafi che seguono sono dettagliati anche rispetto agli attributi di accesso:
RO: Read Only RW: Read and Write WO: Write Only
N.B: Nella mappa registri che segue sono contenuti alcuni registri non supportati, non disponibili, e sono segnati con ‘N’ nella colonna ‘Supported’. Alcuni di questi registri sono stati previsti per utilizzi futuri: se indirizzati torneranno dati non validi, ulteriori dettagli verranno forniti dove necessario.
Alcuni registri della scheda illustrati nella mappa di memoria che segue, sono mappati su risorse Hardware della scheda e riferite ai connettori di I/O. Tali riferimenti sono illustrati nello specifico documento relativo alle connessioni scheda. Nella mappa di registri che segue la dicitura ‘Y’ nella colonna ‘HW I/O ref.’ identifica quindi una risorsa HW associata al registro.
La mappa dei registri sotto parte dall’offset ‘0’ . L’offset del registro presente nella mappa è quello da utilizzare nella compilazione del messaggio Modbus.
Modbus input register (16bit)
Modbus Register Offset (word 16bit) | Data size | Description | HW I/O | Access | Supported |
---|---|---|---|---|---|
0…23 | Uint8[48] | Device Identification | RO | N | |
24..27 | Uint8[8] | Spare[reserved] | |||
28 | Uint8[2] | Device error flags (bit-mapped:errors ,flag == 1) | RO | N | |
29 | Uint8[2] | Device status flags (bit-mapped: ,flag status) | RO | N | |
30..31 | Uint8[4] | Spare[reserved] | |||
32 | Uint8[2] | Digital Inputs bank#1 | Y | RO | |
33…35 | Uint8[6] | Spare[reserved] | |||
36 | Uint8[2] | Analog #0 (press. sens) | Y | RO | |
37 | Uint8[2] | Analog #1 (temp. sens) | Y | RO | |
38 | Uint8[2] | Analog #2 (temp. sens aux) | Y | RO | |
39 | Uint8[2] | Analog #3 (temp. sens aux) | Y | RO | |
40…47 | Uint8[16] | Spare[reserved] |
Modbus coils (bitmapped) <-> anche come holding regs
Modbus coils or holding registers : tab_registers[]
Modbus Register Offset (word 16bit) | Data size | Description | HW I/O | Access | Supported |
---|---|---|---|---|---|
48 | Uint8[2] | coil bank#1(coils:K1-K8) only Lbyte | Y | RW | |
49 | Uint8[2] | coil bank#2(coils: K9-K16) only Lbyte | Y | RW | |
50 | Uint8[2] | Digital Outputs bank#1 only Lbyte | Y | RW | Note(2) |
50 | Uint8[2] | coil bank#3(coils: K17-K24) only Lbyte | Y | RW | Note(2) |
51 | Uint8[2] | Spare[reserved] | |||
52 | Uint8[2] | PWM #0 cfg | RW | N | |
53 | Uint8[2] | PWM #1 cfg | RW | N | |
54 | Uint8[2] | PWM #2 cfg | RW | N | |
55 | Uint8[2] | PWM #3 cfg | RW | N |
Modbus holding register(16bit)
Modbus Register Offset (word 16bit) | Data size | Description | HW I/O | Access | Supported |
---|---|---|---|---|---|
56 | Uint8[2] | PWM #0 | RW | ||
57 | Uint8[2] | PWM #1 | RW | ||
58 | Uint8[2] | PWM #2 | RW | ||
59 | Uint8[2] | PWM #3 | RW | ||
60 | Uint8[2] | Spare[reserved] | |||
61 | Uint8[2] | Spare[reserved] | |||
62 | Uint8[2] | Aux bank #1 | Y | WO | |
63 | Uint8[2] | Spare[reserved] | |||
64…79 | Uint8[32] | Protocol configuration (Modbus: Slave ID, speed.. ) | RW | N | |
80…87 | Uint8[32] | Spare[reserved] | |||
88 | Uint8[2] | command flags | WO | Note(3) | |
89…95 | Uint8[32] | Spare[reserved] |
Note(2)
Questo registro , a seconda della configurazione hardware della scheda, potrebbe essere inutilizzato, oppure:
- se la scheda è equipaggiata con 24 rele, fa riferimento ai rele da K17 a K24
- se la scheda è equipaggiata con uscite digitali optoisolate fa riferimento alle uscite da OT0 a OT7
Note(3)
Questo registro quando scritto con un valore non-zero verrà effettuato il reset della scheda. La funzione di lettura non è supportata.
messagi Modbus supportati
Il protocollo Modbus supportato è il Modbus RTU.
I messaggi supportati sono i seguenti:
- 0x01 (01d) Read Coil Status
- 0x02 (02d) Read Input Status
- 0x03 (03d) Read Holding Registers
- 0x05 (05d) Force Single Coil
- 0x06 (06d) Preset Single register
- 0x0F (15d) Force multiple Coil
- 0x10 (16d) Write Holding Registers
I messaggi elencati sopra possono essere utilizzati su qualunque registro della mappa, se congruenti con l’attributo di accesso.
Esempi di messaggi
CRC
Nell’esempio che segue viene mostrato il CRC che verra’ aggiunto in coda ad ogni messaggio. Il CRC è del tipo MODBUS 16, ed è calcolato con il polinomio di valore esadecimale ‘0xA001’ come definito dallo standard Modbus RTU.
0x03 (03d) Read Holding Registers
Questa funzione permette di leggere i registri . La struttura del messaggio è come segue:
Indirizzo Modbus | Codice Funzione | Indirizzo di inizio, high-byte | Indirizzo di inizio low-byte | numero di registri high-byte | numero di registri low-byte | CRC low | CRC high |
---|---|---|---|---|---|---|---|
01 | 03 | 00 | 38 | 00 | 04 | xx | xx |
Con l’esempio del messaggio sopra, verrano letti i registri con offset 38, 39, 40, 41 .
0x10 (16d) Write Holding Registers
Questa funzione permette di scrivere i registri (verificare la colonna ‘Access’ per la possibilita’ di scrittura)
Il messaggio è strutturato come segue:
Indirizzo Modbus | Codice Funzione | Indirizzo di inizio, high-byte | Indirizzo di inizio low-byte | numero di registri high-byte | numero di registri low-byte | numero di bytes | Data high | Data low | Data high | Data low | CRC high | CRC low |
---|---|---|---|---|---|---|---|---|---|---|---|---|
01 | 16 | 00 | 56 | 00 | 02 | 04 | 00 | 127 | 00 | 64 | xx | xx |
Nello schema del messaggio sopra, insieme all’indirizzo Modbus e al codice funzione, ci devono essere l’indirizzo di inizio del primo registro ed il numero di registri, oltre al numero di bytes ( 2xN registri) da scrivere
Nell’esempio del messaggio sopra, verra scritto il valore ‘127’ su PWM#0 e ‘64’ su PWM#1
Per ulteriori dettagli su esempi di messaggi Modbus RTU vedere anche la documentazione sul web.
Descrizione registri Modbus
Error flags (non supportato)
E15 | to be defined | |
---|---|---|
Error flags, 2 byte: | ||
bits 0…15 | Valore: condizione di errore | note |
0 | E0 | da definire per tutti i bit del registro |
1 | E1 | |
2 | E2 | |
3 | E3 | |
4 | E4 | |
5 | E5 | |
6 | E6 | |
7 | E7 | |
n | En | |
15 |
Status flags (non supportato)
Status flags, 2 byte: | ||
---|---|---|
bits 0…15 | Valore: stato dispositivo | note |
0 | Stat_0 | Reset Ongoing = 1 , No reset state( Running ) = 0 |
1 | Stat_1 | to be defined |
2 | Stat_2 | to be defined |
3 | Stat_3 | to be defined |
4 | Stat_4 | to be defined |
5 | Stat_5 | to be defined |
6 | Stat_6 | to be defined |
7 | Stat_7 | to be defined |
n | Stat_n | to be defined |
15 | Stat_15 | to be defined |
Digital inputs bank #1
Digital input bank #1, 1 byte : | ||
---|---|---|
bits 0…7 | ingresso digitale di riferimento | note |
0 | INS0 | per tutti i bit(ingressi digitali ) del registro, il valore ‘0’ corrisponde all’ingresso alimentato, ‘1’ ingresso non alimentato . |
1 | INS1 | |
2 | INS2 | |
3 | INS3 | |
4 | INS4 | |
5 | INS5 | |
6 | INS6 | |
7 | INS7 |
Analog #0 input
Analog 0, 2 byte : | ||
---|---|---|
byte | Value: function | comment |
0:1 | 0 – 255 (LByte) | 8 bit A/D input 0-255 ( 0-FF hex) |
Analog #1 input
Analog 1, 2 byte : | ||
---|---|---|
byte | Value: function | comment |
0:1 | 0 – 255 (LByte) | 8 bit A/D input 0-255 ( 0-FF hex) |
Analog #2 input
Analog 2, 2 byte : | ||
---|---|---|
byte | Value: function | comment |
0:1 | 0 – 255 (LByte) | 8 bit A/D input 0-255 ( 0-FF hex) |
Analog #3 input
Analog 3, 2 byte : | ||
---|---|---|
byte | Value: function | comment |
0:1 | 0 – 255 (LByte) | 8 bit A/D input 0-255 ( 0-3FF hex) |
Rele(Coils) o holding regs
Coil bank #1
Coil bank #1, 1 byte : | ||
---|---|---|
bits 0…7 | _ rele di riferimento: _ | note |
0 | K1 | per ciascun rele del registro : ‘1’ alimentato, contatto chiuso, ‘0’ disattivo |
1 | K2 | |
2 | K3 | |
3 | K4 | |
4 | K5 | |
5 | K6 | |
6 | K7 | |
7 | K8 |
Coil bank #2
Coil bank #2, 1 byte : | ||
---|---|---|
bits 0…7 | rele di riferimento: | note |
0 | K9 | per ciascun rele del registro : ‘1’ alimentato, contatto chiuso, ‘0’ disattivo |
1 | K10 | |
2 | K11 | |
3 | K12 | |
4 | K13 | |
5 | K14 | |
6 | K15 | |
7 | K16 |
Coil bank #3 (se supportato dall’hardware)
Coil bank #3, 1 byte : | ||
---|---|---|
bits 0…7 | rele di riferimento: | note |
0 | K17 | per ciascun rele del registro : ‘1’ alimentato, contatto chiuso, ‘0’ disattivo |
1 | K18 | |
2 | K19 | |
3 | K20 | |
4 | K21 | |
5 | K22 | |
6 | K23 | |
7 | K24 |
Digital output bank #1 (se supportato dall’hardware)
Digital output bank #1, 1 byte : | ||
---|---|---|
bits 0…7 | output digitale di riferimento | note |
0 | OT0 | per tutti i bit(uscite digitali ,open-collector) del registro, il valore ‘0’ corrisponde ai terminali di uscita ‘aperti’ ‘1’ corrisponde ai terminali di uscita ‘chiusi’ |
1 | OT1 | |
2 | OT2 | |
3 | OT3 | |
4 | OT4 | |
5 | OT5 | |
6 | OT6 | |
7 | OT7 |
Aux bank #1
Aux bank #1, 1 byte | ||
---|---|---|
bits 0…7 | Funzione | note |
0 | Buzzer | 0 = Off, 1 = On(suono) |
1 | non definito | |
2 | non definito | |
3 | non definito | |
4 | non definito | |
5 | non definito | |
6 | non definito | |
7 | non definito |
Command flags
Command flags, 2 byte | ||
---|---|---|
bits 0…15 | Funzione | note |
0 | Reset | comando di Reset: 0 = Off, 1 = On(reset dispositivo) |
1 | Cmd _1 | |
2 | Cmd _2 | |
3 | Cmd _3 | |
4 | Cmd _4 | |
5 | Cmd _5 | |
6 | Cmd _6 | |
7 | Cmd _7 | |
n | Cmd _n | |
15 | Cmd _15 |
Holding register
Protocol configuration (non supportato)
PWM #0 Cfg (non supportato)
PWM #1 Cfg (non supportato)
PWM #2 Cfg (non supportato)
PWM #3 Cfg (non supportato)
PWM #0 Setup
PWM 0, 2 byte | ||
---|---|---|
byte | Valore | note |
0:1 | 0 – 255 (LByte) | 8 bit PWM (D/A) output 0-255 ( 0-FF hex) |
PWM #1 Setup
PWM 1, 2 byte | ||
---|---|---|
byte | Valore | note |
0:1 | 0 – 255 (LByte) | 8 bit PWM (D/A) output 0-255 ( 0-FF hex) |
PWM #2 Setup
PWM 2, 2 byte | ||
---|---|---|
byte | Valore | note |
0:1 | 0 – 255 (LByte) | 8 bit PWM (D/A) output 0-255 ( 0-FF hex) |
PWM #3 Setup
PWM 3, 2 byte | ||
---|---|---|
byte | Valore | note |
0:1 | 0 – 255 (LByte) | 8 bit PWM (D/A) output 0-255 ( 0-FF hex) |