Guida completa a Modbus
Presentazione
Modbus è il protocollo di comunicazione industriale più diffuso al mondo. Creato nel 1979, è utilizzato da milioni di PLC, azionamenti, regolatori, contatori e sensori industriali. Eziwan supporta nativamente Modbus RTU (su RS-485) e Modbus TCP (su Ethernet).
Modbus RTU su RS-485
Cablaggio RS-485: guida completa
RS-485 è un'interfaccia differenziale a due fili (A e B). La differenza di tensione tra A e B codifica il segnale, conferendogli un'eccellente immunità alle interferenze elettromagnetiche presenti negli ambienti industriali.
⚠️ Topologia in linea (A↔A, B↔B, GND comune). Resistenze di terminazione da 120 Ω solo alle due estremità del bus — già integrate sul lato Eziwan, da posizionare sull'ultimo slave. Non inserire mai una resistenza al centro della linea.
Tabella delle connessioni dei terminali Eziwan RS-485:
| Terminale Eziwan | Segnale RS-485 | Colore cavo consigliato |
|---|---|---|
| A (o D+) | Positivo differenziale | Bianco o rosso |
| B (o D-) | Negativo differenziale | Blu o nero |
| GND | Massa di riferimento | Verde o grigio |
Parametri di comunicazione RS-485
Le impostazioni devono essere identiche sul gateway e su tutti gli slave:
| Parametro | Valori correnti | Valore predefinito Eziwan |
|---|---|---|
| Velocità (baudrate) | 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 | 9600 |
| Parità | N (nessuna), E (pari), O (dispari) | N |
| Bit di dati | 7, 8 | 8 |
| Bit di stop | 1, 2 | 1 |
| Intervallo tra i messaggi | 3,5 tempi di carattere (Modbus standard) | Auto |
Configurazione standard più diffusa: 9600 8N1 (9600 baud, 8 bit di dati, nessuna parità, 1 bit di stop)
Distanza massima e numero di slave
| Velocità di trasmissione | Distanza massima | Numero massimo di slave (elettrico) |
|---|---|---|
| 9.600 bps | 1.200 m | 32 (carichi unitari) |
| 19 200 bps | 800 m | 32 |
| 57 600 bps | 200 m | 32 |
| 115 200 bps | 50 m | 32 |
Per superare i 32 slave o i 1 200 m, utilizzare un ripetitore RS-485.
Modbus TCP
Connessione Ethernet
Modbus TCP incapsula il protocollo Modbus in frame TCP/IP. La connessione avviene direttamente tramite Ethernet RJ45.
| Parametro | Valore |
|---|---|
| Porta TCP | 502 (standard), a volte 503 o altro a seconda del produttore |
| ID unità | Indirizzo dello slave (da 1 a 247) o 255 per l'accesso diretto |
| Timeout consigliato | Da 500 ms a 2000 ms a seconda della rete |
| Keep-alive TCP | Consigliato per connessioni di lunga durata |
Configurazione di rete
Il gateway Eziwan deve poter comunicare con il PLC Modbus TCP tramite la rete Ethernet. Verificare:
- Il gateway e il PLC si trovano sulla stessa sottorete (o c'è un router tra di essi)
- Nessun firewall che blocchi la porta TCP 502 tra il gateway e il PLC
- Il PLC Modbus TCP è configurato per accettare le connessioni (PUT/GET attivati su Siemens)
I quattro tipi di registri Modbus
La specifica Modbus definisce quattro spazi dati distinti:
| Tipo | Codice Modbus | Indirizzi | Accesso master | Dimensione | Descrizione |
|---|---|---|---|---|---|
| Bobine | 0x (1x) | 00001–09999 | Lettura/Scrittura | 1 bit | Uscite digitali (relè, bobine) |
| Ingressi discreti | 1x (2x) | 10001–19999 | Solo lettura | 1 bit | Ingressi digitali (sensori digitali) |
| Registri di ingresso | 3x | 30001–39999 | Solo lettura | 16 bit | Valori misurati (sensori analogici) |
| Registri di mantenimento | 4x | 40001–49999 | Lettura/Scrittura | 16 bit | Parametri e setpoint |
Nota importante: gli indirizzi Modbus partono da 1 nella notazione "funzionale" (da 40001 a 49999), ma le funzioni Modbus utilizzano indirizzi a base 0 (la richiesta FC03 per il registro 40001 utilizza l'indirizzo 0x0000). Eziwan supporta entrambe le notazioni.
Funzioni Modbus standard
| Codice funzione | Nome | Registri di destinazione |
|---|---|---|
| FC01 | Lettura bobine | Bobine (0x) |
| FC02 | Lettura ingressi discreti | Ingressi discreti (1x) |
| FC03 | Lettura registri di temporizzazione | Registri di temporizzazione (4x) |
| FC04 | Lettura registri di ingresso | Registri di ingresso (3x) |
| FC05 | Scrittura bobina singola | Bobine (0x) |
| FC06 | Scrittura bobina singola | Registri di temporizzazione (4x) |
| FC15 | Scrittura bobine multiple | Bobine (0x) |
| FC16 | Scrittura registri multipli | Registri di temporizzazione (4x) |
Configurazione del mapping in Eziwan
Interfaccia di configurazione JSON
Il mapping Modbus definisce le modalità di acquisizione e pubblicazione dei registri del PLC:
{
"device": {
"name": "Compresseur_Atlas_GA75",
"description": "Compresseur d'air atelier principal",
"protocol": "modbus_rtu",
"connection": {
"port": "/dev/ttyS0",
"baudrate": 9600,
"parity": "N",
"databits": 8,
"stopbits": 1,
"slave_id": 1
}
},
"polling": {
"interval_ms": 5000,
"timeout_ms": 500,
"retry_count": 3,
"retry_delay_ms": 200
},
"registers": [
{
"name": "Pression_Service",
"address": "3x0001",
"count": 1,
"type": "uint16",
"scale_factor": 0.1,
"unit": "bar",
"description": "Pression de service sortie compresseur",
"alarm_low": 6.0,
"alarm_high": 12.0,
"publish_on_change": true
},
{
"name": "Temperature_Huile",
"address": "3x0002",
"count": 1,
"type": "uint16",
"scale_factor": 0.1,
"unit": "°C",
"alarm_high": 95.0
},
{
"name": "Heures_Fonctionnement",
"address": "4x0010",
"count": 2,
"type": "uint32_ab",
"unit": "h",
"description": "Compteur d'heures moteur"
},
{
"name": "Debit_Air",
"address": "3x0005",
"count": 2,
"type": "float32_abcd",
"unit": "m³/h"
},
{
"name": "Alarme_Active",
"address": "1x0001",
"count": 1,
"type": "bool",
"description": "Au moins une alarme active"
},
{
"name": "Code_Alarme",
"address": "4x0020",
"count": 1,
"type": "uint16",
"description": "Code alarme (voir tableau constructeur)"
}
]
}
Esempio completo: 10 registri di temperatura, 5 registri di stato
Ecco una mappatura tipica per una linea di produzione con 10 punti di temperatura e 5 stati della macchina:
{
"registers": [
{ "name": "Temp_Zone1", "address": "4x0001", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone2", "address": "4x0003", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone3", "address": "4x0005", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone4", "address": "4x0007", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone5", "address": "4x0009", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone6", "address": "4x0011", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone7", "address": "4x0013", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone8", "address": "4x0015", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone9", "address": "4x0017", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone10", "address": "4x0019", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Etat_EnMarche", "address": "1x0001", "count": 1, "type": "bool" },
{ "name": "Etat_EnChauffe", "address": "1x0002", "count": 1, "type": "bool" },
{ "name": "Etat_Production", "address": "1x0003", "count": 1, "type": "bool" },
{ "name": "Etat_Defaut", "address": "1x0004", "count": 1, "type": "bool" },
{ "name": "Etat_ArretUrgence", "address": "1x0005", "count": 1, "type": "bool" }
]
}
Tipi di dati supportati da Eziwan
| Tipo JSON | Descrizione | Dimensione (registri) | Esempio di valore |
|---|---|---|---|
uint16 | Intero senza segno a 16 bit | 1 | da 0 a 65535 |
int16 | Intero con segno a 16 bit | 1 | da -32768 a 32767 |
uint32_ab | Intero a 32 bit, big-endian | 2 | da 0 a 4 294 967 295 |
uint32_ba | Intero a 32 bit, little-endian | 2 | — |
float32_abcd | Numero in virgola mobile IEEE 754, ABCD | 2 | 23,456 |
float32_cdab | Numero in virgola mobile IEEE 754, CDAB (Schneider) | 2 | — |
float32_badc | Numero in virgola mobile IEEE 754, BADC | 2 | — |
float64_abcdefgh | Doppia precisione | 4 | — |
bool | Booleano (Coil o Discrete Input) | 1 | vero/falso |
Debug di Modbus
Strumento Modbus Poll (Windows)
Modbus Poll è lo strumento di riferimento per testare ed eseguire il debug delle connessioni Modbus:
- Scaricare da modbustools.com
- Versione di prova gratuita (30 giorni)
- Configurazione: Connection → Connect → Modbus TCP (IP + porta 502) o seriale (COM + baudrate)
- Definire i registri da leggere: Setup → Read/Write Definition
Modbus Poll - Configurazione di lettura
─────────────────────────────────────
Slave ID: 1
Function: 03 Read Holding Registers
Address: 0 (= registre 40001)
Quantity: 10
Scan Rate: 1000 ms
Log di Eziwan per il debug Modbus
Nel portale Eziwan → Gateway → Log → Modbus:
2026-06-04 14:32:00.123 [[INFO] Modbus RTU: richiesta FC03 slave=1 addr=0 count=10
2026-06-04 14:32:00.145 [[INFO] Modbus RTU: risposta ricevuta in 22 ms, 10 registri
2026-06-04 14:32:00.145 [DATA] Reg[0001]=0x4529 (23.4°C FLOAT32), Reg[0003]=0x42C6 (99.2 rpm)
2026-06-04 14:32:01.123 [[WARN] Modbus RTU: timeout dopo 500 ms, slave=2 (tentativo 1/3)
2026-06-04 14:32:01.623 [[AVVISO] Modbus RTU: timeout dopo 500 ms, slave=2 (tentativo 2/3)
2026-06-04 14:32:02.123 [[ERRORE] Modbus RTU: slave 2 non raggiungibile dopo 3 tentativi
Attivare il livello di log DEBUG per ottenere i frame esadecimali grezzi:
2026-06-04 14:32:00.100 [DEBUG] TX: 01 03 00 00 00 0A C5 CD
│ │ ├──────┤ ├──────┤ └── CRC16
│ │ addr=0 count=10
│ FC03
slave=1
2026-06-04 14:32:00.122 [DEBUG] RX: 01 03 14 45 29 ... (20 octets + 2 CRC)
Risoluzione dei problemi
Problema 1: Timeout Modbus RTU
Sintomi: messaggi timeout, nessuna risposta dallo slave.
Cause e soluzioni:
| Causa | Diagnosi | Soluzione |
|---|---|---|
| ID slave errato | Verificare manualmente gli ID slave da 1 a 10 | Consultare la documentazione dell'apparecchiatura |
| Baudrate errato | — | Testare 9600, 19200, 57600 uno alla volta |
| Cablaggio A/B invertito | Misurare la tensione A-B: da +1,5 V a 5 V = corretto | Invertire i fili A e B |
| Resistenza di terminazione mancante | Misurare R tra A e B a tensione zero: ~60 Ω se sono presenti 2 resistenze | Aggiungere una resistenza da 120 Ω alla fine del bus |
| Cavo troppo lungo | Calcolare la lunghezza totale | Ridurre la velocità di trasmissione o aggiungere un ripetitore |
| Alimentazione RS-485 assente | Misurare la tensione di alimentazione dello slave | Verificare la presenza di 24 V CC sullo slave |
Problema 2: Errori CRC
Sintomi: CRC error nei log di Eziwan, dati errati.
Cause:
- Interferenze elettromagnetiche sul cavo RS-485 (posare il cavo lontano dai cavi di alimentazione)
- Cavo non schermato (utilizzare un cavo schermato, con la schermatura collegata a terra solo sul lato gateway)
- Scarsa qualità del cavo (utilizzare un cavo conforme alle specifiche RS-485, con impedenza di 120 Ω)
- Velocità di trasmissione troppo elevata rispetto alla lunghezza del cavo (ridurre la velocità di trasmissione)
Problema 3: Conflitto di ID slave
Sintomi: uno slave risponde al posto di un altro, dati confusi.
Causa: due slave hanno lo stesso ID slave sullo stesso bus RS-485.
Soluzione:
- Scollegare tutti gli slave dal bus tranne uno
- Eseguire una scansione del bus con Modbus Poll per individuare l'ID di tale slave
- Modificare l'ID in caso di conflitto (tramite l'interfaccia di configurazione dell'apparecchiatura)
- Ricollegare i dispositivi slave uno alla volta
Problema 4: Registro illeggibile (Codice di eccezione 02)
Sintomo: Illegal Data Address (Exception Code 02).
Causa: l'indirizzo richiesto non esiste nel PLC o non è accessibile tramite Modbus.
Soluzioni:
- Verificare la documentazione del produttore per gli indirizzi supportati
- Alcune apparecchiature espongono solo un intervallo limitato di registri
- Su Siemens, verificare che l'area di memoria si trovi effettivamente nel datablock esposto tramite PUT/GET
Lista di controllo per una diagnosi rapida
□ Tensione di alimentazione 24 V CC presente sui morsetti di alimentazione di Eziwan
□ Il LED RS-485 Eziwan lampeggia durante la trasmissione (TX)
□ Cablaggio A/B: A=positivo, B=negativo (non invertito)
□ Resistenze da 120 Ω solo alle due estremità del bus
□ ID slave corretto (verificare sul display dell'apparecchiatura o nella documentazione)
□ Velocità di trasmissione identica sul gateway e sull'apparecchiatura
□ Parità identica su gateway e apparecchiatura (N, E o O)
□ Indirizzo IP e porta 502 corretti per Modbus TCP
□ PUT/GET attivato su S7-1500/1200, se necessario
□ Nessun firewall che blocchi la porta 502 sulla rete locale OT
Domande frequenti
Modbus RTU o Modbus TCP: quale scegliere?
RTU se le vostre apparecchiature sono collegate tramite bus seriale RS-485 (sensori, contatori, vecchi PLC); TCP se le apparecchiature sono già collegate via Ethernet. Il gateway Eziwan gestisce entrambe le modalità contemporaneamente e funge da ponte tra RTU e TCP.
Quali funzioni Modbus vengono utilizzate per il monitoraggio?
Principalmente FC03 (lettura dei registri di holding) e FC04 (registri di input) per la raccolta dei dati; FC06/FC16 per la scrittura dei setpoint. I codici di eccezione (02 indirizzo non valido, 0B destinazione non raggiungibile) guidano la procedura di risoluzione dei problemi.
Come si legge un valore a 32 bit o un numero in virgola mobile?
Su due registri consecutivi, specificando l'ordine delle parole (big/little endian, word swap) nella mappatura del gateway. Uno stesso dispositivo può utilizzare convenzioni miste: consultate la documentazione del produttore registro per registro.
Modbus può transitare su Internet?
Mai in chiaro: il protocollo non prevede né autenticazione né crittografia. Il gateway limita il Modbus alla rete locale e trasporta i dati verso il cloud attraverso un tunnel VPN crittografato.
Risorse correlate
- Da Modbus al cloud — la soluzione di raccolta dati
- Da Modbus RTU al cloud — il caso dei bus seriali
- Da Modbus TCP al cloud — il caso delle reti Ethernet
- Modbus RTU vs TCP — il confronto dettagliato
- RS485 / Modbus RTU — cablaggio e polling in dettaglio