RS485 / Modbus RTU

Le Eziwan Gateway dispose d'un port RS485/RS232 natif sur bornier terminal. Cette interface permet de collecter des données de vos capteurs, automates et compteurs en protocole Modbus RTU — et de les publier vers le cloud sans passerelle séparée.


Connexion physique

Câblage du bornier RS485

Broches du bornier

BrocheSignalDescription
ARS485+Ligne différentielle positive
BRS485−Ligne différentielle négative
GNDMasseRéférence commune
Polarité A/B

Une inversion A/B provoque des erreurs de communication sans endommager l'équipement. Si aucun appareil ne répond, testez en inversant A et B.

Résistances de terminaison

Sur un bus RS485 avec plusieurs esclaves :

  • 120Ω sur le premier et le dernier équipement du bus
  • Le Eziwan Gateway dispose d'un jumper interne pour activer la terminaison (document hardware)
  • Sur les équipements intermédiaires : terminaison désactivée

Configuration du polling Modbus

Via le dashboard Eziwan

Dispositif → Configuration → RS485 / Modbus

Interface graphique : ajoutez chaque esclave, chaque registre, définissez l'intervalle de polling et le topic MQTT cible.

Via 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 # Intervalle global de polling (secondes)

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 # Override de l'intervalle global
registers:
- address: "0x0000"
type: holding
format: uint16
tag: pump_status
unit: ""
# 0=arrêt, 1=marche, 2=défaut
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"

Formats de registres supportés

FormatDescriptionRegistres
int16Entier signé 16 bits1
uint16Entier non signé 16 bits1
int32_abcdEntier signé 32 bits, big-endian2
int32_cdabEntier signé 32 bits, little-endian2
uint32_abcdEntier non signé 32 bits, big-endian2
float32_abcdFloat IEEE 754, big-endian2
float32_cdabFloat IEEE 754, little-endian (Schneider)2
float32_badcFloat IEEE 754, mid-big-endian2
coilBobine Modbus (1 bit)1 coil
bitExtraction d'un bit dans un registre uint161
Endianness

Si les valeurs lues semblent incohérentes (ex : 1234 lu comme 12340000), essayez float32_cdab au lieu de float32_abcd. La convention varie selon les fabricants.


Publication MQTT

Les données Modbus sont automatiquement publiées sur le broker MQTT Eziwan :

Structure du topic

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

Exemple :

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"
}

Le champ "quality" prend les valeurs :

  • "good" — lecture réussie
  • "timeout" — esclave n'a pas répondu
  • "error" — erreur Modbus (code inclus dans "error_code")

S'abonner depuis votre système

# Abonnement à tous les tags d'un site
mosquitto_sub -h mqtt.eziwan.com -p 8883 \
--cert client.crt --key client.key --cafile ca.crt \
-t "eziwan/d_a1b2c3d4/modbus/#"

# Abonnement à un tag spécifique
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"

Équipements testés

FabricantModèleProtocoleNotes
Schneider ElectricPM2100, PM2200Modbus RTUCompteur énergie — float32
Schneider ElectricTM3, TM2Modbus RTUAutomate — coils + holdings
SiemensSENTRON PAC 3200Modbus RTUCompteur énergie
Carlo GavazziEM24, EM340Modbus RTUCompteur tri/mono
ABBB23, B24Modbus RTUCompteur énergie
Wago750-xxxModbus RTUCoupleur bus I/O
Phoenix ContactILB ETH 2TXModbus TCPVia bridge TCP
HagerECR380DModbus RTUCompteur énergie
EastronSDM630Modbus RTUCompteur tri-phasé
GenericTout Modbus RTUModbus RTUSlave ID 1–247

Dépannage

Test de communication depuis Eziwan

Dashboard → Dispositif → Outils → Test Modbus

Entrez le slave ID, le type et l'adresse du registre → Eziwan envoie une requête de lecture et affiche la réponse brute en temps réel. Idéal pour diagnostiquer sans avoir accès physique au site.

Codes d'erreur Modbus

CodeSignificationSolution
TIMEOUTEsclave ne répond pasVérifier câblage, baud rate, slave ID, terminaison
01Fonction non supportéeUtiliser holding au lieu de input (ou inversement)
02Adresse registre invalideVérifier le registre dans la documentation de l'équipement
03Valeur de données invalideValeur hors plage autorisée
04Défaut interne esclaveConsulter le journal de l'équipement

Checklist de câblage

Si aucun esclave ne répond :

  • Vérifier la polarité A/B (essayer d'inverser)
  • Vérifier le baud rate (9600 est le plus courant)
  • Vérifier que les slave IDs sont bien uniques sur le bus
  • Activer la terminaison 120Ω sur le premier et le dernier équipement
  • Tester avec un seul esclave (isoler le problème)
  • Mesurer la tension différentielle A−B : doit être > 200 mV en veille

Tension différentielle de référence

Bus en repos (aucune transmission) :
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

Vous avez des équipements en Modbus TCP (sur réseau Ethernet) ? Eziwan supporte également le bridge Modbus TCP → MQTT. Voir la documentation Modbus TCP →

Support

Questions fréquentes

Combien d'équipements sur un même bus RS-485 ?

32 esclaves par segment sans répéteur, sur une longueur maximale d'environ 1 200 m à 9 600 bauds. Au-delà, segmentez en plusieurs bus ou ajoutez des répéteurs.

La résistance de terminaison est-elle indispensable ?

Sur les bus longs ou rapides, oui : 120 Ω à chaque extrémité évite les réflexions qui corrompent les trames. Sur un bus court (quelques mètres, 9 600 bauds), son absence passe souvent inaperçue — jusqu'au jour où elle ne passe plus.

Quelle vitesse de polling choisir ?

Adaptez la fréquence à la dynamique du process : toutes les 10 à 60 s pour des mesures d'énergie ou de niveau, 1 à 5 s pour un suivi machine. Un polling trop agressif sur un bus lent crée des timeouts en cascade.

Comment mélanger des équipements de vitesses différentes ?

On ne mélange pas les paramètres série sur un même bus : tous les esclaves doivent partager vitesse, parité et bits de stop. Sinon, répartissez-les sur les différents ports RS-485 de la gateway.

Ressources associées