RS485 / Modbus RTU

L'Eziwan Gateway dispone di una porta RS485/RS232 nativa su morsettiera. Questa interfaccia consente di raccogliere i dati dai vostri sensori, PLC e contatori tramite il protocollo Modbus RTU e di inviarli al cloud senza bisogno di un gateway separato.


Connessione fisica

Cablaggio della morsettiera RS485

Pin della morsettiera

PinSegnaleDescrizione
ARS485+Linea differenziale positiva
BRS485−Linea differenziale negativa
GNDMassaRiferimento comune
Verifica polarità A/B

Un'inversione di A/B provoca errori di comunicazione senza danneggiare l'apparecchiatura. Se nessun dispositivo risponde, provare a invertire A e B.

Resistenze di terminazione

Su un bus RS485 con più dispositivi slave:

  • 120 Ω sul primo e sull’ultimo dispositivo del bus
  • L’Eziwan Gateway dispone di un jumper interno per attivare la terminazione (documentazione hardware)
  • Sulle apparecchiature intermedie: terminazione disattivata

Configurazione del polling Modbus

Tramite la dashboard di Eziwan

Dispositivo → Configurazione → RS485 / Modbus

Interfaccia grafica: aggiungere ogni slave, ogni registro, definire l'intervallo di polling e il topic MQTT di destinazione.

Tramite l'API / YAML

# Configuration RS485 + Modbus RTU
rs485:
enabled: true
baud_rate: 9600 # 1200, 2400, 4800, 9600, 19200, 38400, 115200
parity: none # none, even, odd
data_bits: 8 # 7 ou 8
stop_bits: 1 # 1 ou 2
polling_interval_sec: 10 # Intervallo di polling complessivo (secondi)

modbus:
slaves:
- slave_id: 1
name: "Compteur énergie Schneider PM2200"
timeout_ms: 1000
retries: 3
registers:
- address: "0x0048"
type: holding # holding, input, coil, discrete_input
format: float32_abcd
tag: active_power
unit: kW
scale: 1.0
mqtt_topic: "site/usine-01/energie/puissance_active"

- address: "0x004A"
type: holding
format: float32_abcd
tag: reactive_power
unit: kVAr
scale: 1.0
mqtt_topic: "site/usine-01/energie/puissance_reactive"

- address: "0x0156"
type: holding
format: float32_abcd
tag: energy_total_kwh
unit: kWh
scale: 1.0
mqtt_topic: "site/usine-01/energie/index_kwh"

- slave_id: 2
name: "Capteur température / humidité"
timeout_ms: 500
registers:
- address: "0x0001"
type: input
format: int16
tag: temperature
unit: "°C"
scale: 0.1 # Valeur brute 245 → 24,5°C
mqtt_topic: "site/usine-01/environnement/temperature"

- address: "0x0002"
type: input
format: uint16
tag: humidity
unit: "%RH"
scale: 0.1
mqtt_topic: "site/usine-01/environnement/humidite"

- slave_id: 3
name: "Automate Schneider TM3 — Station de pompage"
polling_interval_sec: 30 # Sovrascrittura dell'intervallo globale
registers:
- address: "0x0000"
type: holding
format: uint16
tag: pump_status
unit: ""
# 0=spento, 1=acceso, 2=guasto
mqtt_topic: "site/pompe-01/etat/pompe"

- address: "0x0001"
type: holding
format: int16
tag: pressure_bar
unit: bar
scale: 0.01
mqtt_topic: "site/pompe-01/mesures/pression"

- address: "0x0002"
type: holding
format: uint16
tag: flow_m3h
unit: "m³/h"
scale: 0.1
mqtt_topic: "site/pompe-01/mesures/debit"

Formati di registro supportati

FormatoDescrizioneRegistri
int16Intero con segno a 16 bit1
uint16Intero senza segno a 16 bit1
int32_abcdIntero con segno a 32 bit, big-endian2
int32_cdabIntero con segno a 32 bit, little-endian2
uint32_abcdIntero senza segno a 32 bit, big-endian2
float32_abcdNumero in virgola mobile IEEE 754, big-endian2
float32_cdabNumero in virgola mobile IEEE 754, little-endian (Schneider)2
float32_badcNumero in virgola mobile IEEE 754, mid-big-endian2
coilBobina Modbus (1 bit)1 bobina
bitEstrazione di un bit da un registro uint161
Endianness

Se i valori letti sembrano incoerenti (ad es.: 1234 letto come 12340000), provate a utilizzare float32_cdab al posto di float32_abcd. La convenzione varia a seconda dei produttori.


Pubblicazione MQTT

I dati Modbus vengono pubblicati automaticamente sul broker MQTT Eziwan:

Struttura dell'argomento

eziwan/{device_id}/modbus/{slave_id}/{tag_name}

Esempio:

eziwan/d_a1b2c3d4/modbus/1/active_power

Payload JSON

{
"value": 42.7,
"unit": "kW",
"timestamp": "2025-06-15T14:23:45.123Z",
"slave_id": 1,
"register": "0x0048",
"quality": "good"
}

Il campo "quality" può assumere i seguenti valori:

  • "good" — lettura riuscita
  • "timeout" — lo slave non ha risposto
  • "error" — errore Modbus (codice incluso in "error_code")

Iscriviti dal tuo sistema

# Iscrizione a tutti i tag di un sito
mosquitto_sub -h mqtt.eziwan.com -p 8883 \
--cert client.crt --key client.key --cafile ca.crt \
-t "eziwan/d_a1b2c3d4/modbus/#"

# Iscrizione a un tag specifico
mosquitto_sub -h mqtt.eziwan.com -p 8883 \
--cert client.crt --key client.key --cafile ca.crt \
-t "eziwan/d_a1b2c3d4/modbus/1/active_power"

Apparecchiature testate

ProduttoreModelloProtocolloNote
Schneider ElectricPM2100, PM2200Modbus RTUContatore di energia — float32
Schneider ElectricTM3, TM2Modbus RTUPLC — bobine + holding
SiemensSENTRON PAC 3200Modbus RTUContatore di energia
Carlo GavazziEM24, EM340Modbus RTUContatore trifase/monofase
ABBB23, B24Modbus RTUContatore di energia
Wago750-xxxModbus RTUAccoppiatore bus I/O
Phoenix ContactILB ETH 2TXModbus TCPTramite bridge TCP
HagerECR380DModbus RTUContatore di energia
EastronSDM630Modbus RTUContatore trifase
GenericoQualsiasi Modbus RTUModbus RTUID slave 1–247

Risoluzione dei problemi

Test di comunicazione da Eziwan

Dashboard → Dispositivo → Strumenti → Test Modbus

Inserisci l'ID dello slave, il tipo e l'indirizzo del registro → Eziwan invia una richiesta di lettura e visualizza la risposta grezza in tempo reale. Ideale per effettuare diagnosi senza avere accesso fisico al sito.

Codici di errore Modbus

CodiceSignificatoSoluzione
TIMEOUTLo slave non rispondeVerificare il cablaggio, la velocità di trasmissione, l'ID dello slave e la terminazione
01Funzione non supportataUtilizzare holding al posto di input (o viceversa)
02Indirizzo registro non validoVerificare il registro nella documentazione dell'apparecchiatura
03Valore dati non validoValore fuori dall'intervallo consentito
04Errore interno dello slaveConsultare il registro dell'apparecchiatura

Lista di controllo per il cablaggio

Se nessuno degli slave risponde:

  • Verificare la polarità A/B (provare a invertirla)
  • Verificare la velocità di trasmissione (9600 è la più comune)
  • Verificare che gli ID degli slave siano effettivamente univoci sul bus
  • Attivare la terminazione da 120 Ω sul primo e sull'ultimo dispositivo
  • Effettuare un test con un solo slave (per isolare il problema)
  • Misurare la tensione differenziale A−B: deve essere > 200 mV in standby

Tensione differenziale di riferimento

Autobus in sosta (senza trasmissione):
V(A−B) > +200 mV → polarisation correcte

Pendant transmission :
V(A−B) > +1.5V → signal dominant (1 logique)
V(A−B) < −1.5V → signal récessif (0 logique)

Modbus TCP

Avete apparecchiature Modbus TCP (su rete Ethernet)? Eziwan supporta anche il bridge Modbus TCP → MQTT. Vedi la documentazione Modbus TCP →

Assistenza

Domande frequenti

Quanti dispositivi possono essere collegati allo stesso bus RS-485?

32 slave per segmento senza ripetitore, su una lunghezza massima di circa 1.200 m a 9.600 baud. Oltre tale limite, suddividere in più bus o aggiungere ripetitori.

La resistenza di terminazione è indispensabile?

Sui bus lunghi o veloci, sì: 120 Ω a ciascuna estremità evitano le riflessioni che danneggiano i frame. Su un bus corto (pochi metri, 9.600 baud), la sua assenza spesso passa inosservata — fino al giorno in cui non passa più.

Quale frequenza di polling scegliere?

Adattare la frequenza alla dinamica del processo: ogni 10-60 s per le misurazioni di energia o di livello, da 1 a 5 s per il monitoraggio delle macchine. Un polling troppo aggressivo su un bus lento provoca timeout a catena.

Come combinare attrezzature con velocità diverse?

Non si devono mescolare i parametri seriali sullo stesso bus: tutti gli slave devono condividere velocità, parità e bit di stop. In caso contrario, distribuirli sulle diverse porte RS-485 del gateway.

Risorse correlate