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 EziwanSegnale RS-485Colore cavo consigliato
A (o D+)Positivo differenzialeBianco o rosso
B (o D-)Negativo differenzialeBlu o nero
GNDMassa di riferimentoVerde o grigio

Parametri di comunicazione RS-485

Le impostazioni devono essere identiche sul gateway e su tutti gli slave:

ParametroValori correntiValore predefinito Eziwan
Velocità (baudrate)1200, 2400, 4800, 9600, 19200, 38400, 57600, 1152009600
ParitàN (nessuna), E (pari), O (dispari)N
Bit di dati7, 88
Bit di stop1, 21
Intervallo tra i messaggi3,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 trasmissioneDistanza massimaNumero massimo di slave (elettrico)
9.600 bps1.200 m32 (carichi unitari)
19 200 bps800 m32
57 600 bps200 m32
115 200 bps50 m32

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.

ParametroValore
Porta TCP502 (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 consigliatoDa 500 ms a 2000 ms a seconda della rete
Keep-alive TCPConsigliato per connessioni di lunga durata

Configurazione di rete

Il gateway Eziwan deve poter comunicare con il PLC Modbus TCP tramite la rete Ethernet. Verificare:

  1. Il gateway e il PLC si trovano sulla stessa sottorete (o c'è un router tra di essi)
  2. Nessun firewall che blocchi la porta TCP 502 tra il gateway e il PLC
  3. 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:

TipoCodice ModbusIndirizziAccesso masterDimensioneDescrizione
Bobine0x (1x)00001–09999Lettura/Scrittura1 bitUscite digitali (relè, bobine)
Ingressi discreti1x (2x)10001–19999Solo lettura1 bitIngressi digitali (sensori digitali)
Registri di ingresso3x30001–39999Solo lettura16 bitValori misurati (sensori analogici)
Registri di mantenimento4x40001–49999Lettura/Scrittura16 bitParametri 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 funzioneNomeRegistri di destinazione
FC01Lettura bobineBobine (0x)
FC02Lettura ingressi discretiIngressi discreti (1x)
FC03Lettura registri di temporizzazioneRegistri di temporizzazione (4x)
FC04Lettura registri di ingressoRegistri di ingresso (3x)
FC05Scrittura bobina singolaBobine (0x)
FC06Scrittura bobina singolaRegistri di temporizzazione (4x)
FC15Scrittura bobine multipleBobine (0x)
FC16Scrittura registri multipliRegistri 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 JSONDescrizioneDimensione (registri)Esempio di valore
uint16Intero senza segno a 16 bit1da 0 a 65535
int16Intero con segno a 16 bit1da -32768 a 32767
uint32_abIntero a 32 bit, big-endian2da 0 a 4 294 967 295
uint32_baIntero a 32 bit, little-endian2
float32_abcdNumero in virgola mobile IEEE 754, ABCD223,456
float32_cdabNumero in virgola mobile IEEE 754, CDAB (Schneider)2
float32_badcNumero in virgola mobile IEEE 754, BADC2
float64_abcdefghDoppia precisione4
boolBooleano (Coil o Discrete Input)1vero/falso

Debug di Modbus

Strumento Modbus Poll (Windows)

Modbus Poll è lo strumento di riferimento per testare ed eseguire il debug delle connessioni Modbus:

  1. Scaricare da modbustools.com
  2. Versione di prova gratuita (30 giorni)
  3. Configurazione: Connection → Connect → Modbus TCP (IP + porta 502) o seriale (COM + baudrate)
  4. 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:

CausaDiagnosiSoluzione
ID slave erratoVerificare manualmente gli ID slave da 1 a 10Consultare la documentazione dell'apparecchiatura
Baudrate erratoTestare 9600, 19200, 57600 uno alla volta
Cablaggio A/B invertitoMisurare la tensione A-B: da +1,5 V a 5 V = correttoInvertire i fili A e B
Resistenza di terminazione mancanteMisurare R tra A e B a tensione zero: ~60 Ω se sono presenti 2 resistenzeAggiungere una resistenza da 120 Ω alla fine del bus
Cavo troppo lungoCalcolare la lunghezza totaleRidurre la velocità di trasmissione o aggiungere un ripetitore
Alimentazione RS-485 assenteMisurare la tensione di alimentazione dello slaveVerificare 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:

  1. Scollegare tutti gli slave dal bus tranne uno
  2. Eseguire una scansione del bus con Modbus Poll per individuare l'ID di tale slave
  3. Modificare l'ID in caso di conflitto (tramite l'interfaccia di configurazione dell'apparecchiatura)
  4. 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