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
| Broche | Signal | Description |
|---|---|---|
| A | RS485+ | Ligne différentielle positive |
| B | RS485− | Ligne différentielle négative |
| GND | Masse | Référence commune |
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
| Format | Description | Registres |
|---|---|---|
int16 | Entier signé 16 bits | 1 |
uint16 | Entier non signé 16 bits | 1 |
int32_abcd | Entier signé 32 bits, big-endian | 2 |
int32_cdab | Entier signé 32 bits, little-endian | 2 |
uint32_abcd | Entier non signé 32 bits, big-endian | 2 |
float32_abcd | Float IEEE 754, big-endian | 2 |
float32_cdab | Float IEEE 754, little-endian (Schneider) | 2 |
float32_badc | Float IEEE 754, mid-big-endian | 2 |
coil | Bobine Modbus (1 bit) | 1 coil |
bit | Extraction d'un bit dans un registre uint16 | 1 |
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
| Fabricant | Modèle | Protocole | Notes |
|---|---|---|---|
| Schneider Electric | PM2100, PM2200 | Modbus RTU | Compteur énergie — float32 |
| Schneider Electric | TM3, TM2 | Modbus RTU | Automate — coils + holdings |
| Siemens | SENTRON PAC 3200 | Modbus RTU | Compteur énergie |
| Carlo Gavazzi | EM24, EM340 | Modbus RTU | Compteur tri/mono |
| ABB | B23, B24 | Modbus RTU | Compteur énergie |
| Wago | 750-xxx | Modbus RTU | Coupleur bus I/O |
| Phoenix Contact | ILB ETH 2TX | Modbus TCP | Via bridge TCP |
| Hager | ECR380D | Modbus RTU | Compteur énergie |
| Eastron | SDM630 | Modbus RTU | Compteur tri-phasé |
| Generic | Tout Modbus RTU | Modbus RTU | Slave 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
| Code | Signification | Solution |
|---|---|---|
TIMEOUT | Esclave ne répond pas | Vérifier câblage, baud rate, slave ID, terminaison |
01 | Fonction non supportée | Utiliser holding au lieu de input (ou inversement) |
02 | Adresse registre invalide | Vérifier le registre dans la documentation de l'équipement |
03 | Valeur de données invalide | Valeur hors plage autorisée |
04 | Défaut interne esclave | Consulter 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)
Vous avez des équipements en Modbus TCP (sur réseau Ethernet) ? Eziwan supporte également le bridge Modbus TCP → MQTT. Voir la documentation Modbus TCP →
- Email : support@eziwan.com — réponse < 4h ouvrées
- Configuration guidée : Planifier un onboarding technique →
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
- Passerelle RS485 vers le cloud — la page solution
- RS485 / Modbus sur 4G — collecter un bus série via cellulaire
- Modbus vers le cloud — la vue d'ensemble
- Guide Modbus complet — registres, fonctions et dépannage
- MQTT et RS-485 en pratique — l'article de fond