Guide Modbus Complet
Présentation
Modbus est le protocole de communication industrielle le plus répandu au monde. Créé en 1979, il équipe des millions d'automates, variateurs, régulateurs, compteurs et capteurs industriels. Eziwan supporte nativement Modbus RTU (sur RS-485) et Modbus TCP (sur Ethernet).
Modbus RTU sur RS-485
Câblage RS-485 : guide complet
RS-485 est une interface différentielle à deux fils (A et B). La différence de tension entre A et B encode le signal, ce qui lui confère une excellente immunité aux perturbations électromagnétiques des environnements industriels.
⚠️ Topologie en ligne (A↔A, B↔B, GND commun). Résistances de terminaison 120 Ω uniquement aux deux extrémités du bus — déjà intégrée côté Eziwan, à placer sur le dernier esclave. Jamais de résistance au milieu de la ligne.
Tableau des connexions bornes Eziwan RS-485 :
| Borne Eziwan | Signal RS-485 | Couleur câble recommandé |
|---|---|---|
| A (ou D+) | Positif différentiel | Blanc ou rouge |
| B (ou D-) | Négatif différentiel | Bleu ou noir |
| GND | Masse de référence | Vert ou gris |
Paramètres de communication RS-485
Les paramètres doivent être identiques sur la gateway et tous les esclaves :
| Paramètre | Valeurs courantes | Valeur par défaut Eziwan |
|---|---|---|
| Vitesse (baudrate) | 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 | 9600 |
| Parité | N (aucune), E (paire), O (impaire) | N |
| Bits de données | 7, 8 | 8 |
| Bits d'arrêt | 1, 2 | 1 |
| Délai inter-message | 3.5 temps de caractère (Modbus standard) | Auto |
Configuration standard la plus répandue : 9600 8N1 (9600 bauds, 8 bits de données, Pas de parité, 1 bit d'arrêt)
Distance maximale et nombre d'esclaves
| Baudrate | Distance maximale | Esclaves max (électrique) |
|---|---|---|
| 9 600 bps | 1 200 m | 32 (unit loads) |
| 19 200 bps | 800 m | 32 |
| 57 600 bps | 200 m | 32 |
| 115 200 bps | 50 m | 32 |
Pour dépasser 32 esclaves ou 1 200 m, utiliser un répéteur RS-485.
Modbus TCP
Connexion Ethernet
Modbus TCP encapsule le protocole Modbus dans des trames TCP/IP. La connexion est directe via Ethernet RJ45.
| Paramètre | Valeur |
|---|---|
| Port TCP | 502 (standard), parfois 503 ou autre selon constructeur |
| Unit ID | Adresse de l'esclave (1 à 247), ou 255 pour accès direct |
| Timeout recommandé | 500 ms à 2000 ms selon réseau |
| Keep-alive TCP | Recommandé pour connexions longue durée |
Configuration réseau
La gateway Eziwan doit pouvoir joindre l'automate Modbus TCP via le réseau Ethernet. Vérifiez :
- La gateway et l'automate sont sur le même sous-réseau (ou un routeur entre eux)
- Pas de firewall bloquant le port TCP 502 entre gateway et automate
- L'automate Modbus TCP est configuré pour accepter les connexions (PUT/GET activé sur Siemens)
Les quatre types de registres Modbus
La spécification Modbus définit quatre espaces de données distincts :
| Type | Code Modbus | Adresses | Accès maître | Taille | Description |
|---|---|---|---|---|---|
| Coils | 0x (1x) | 00001–09999 | Lecture/Écriture | 1 bit | Sorties digitales (relais, bobines) |
| Discrete Inputs | 1x (2x) | 10001–19999 | Lecture seule | 1 bit | Entrées digitales (capteurs TOR) |
| Input Registers | 3x | 30001–39999 | Lecture seule | 16 bits | Valeurs mesurées (capteurs analogiques) |
| Holding Registers | 4x | 40001–49999 | Lecture/Écriture | 16 bits | Paramètres et setpoints |
Note importante : les adresses Modbus commencent à 1 dans la notation "fonctionnelle" (40001 à 49999) mais les fonctions Modbus utilisent des adresses 0-based (la requête FC03 pour le registre 40001 utilise l'adresse 0x0000). Eziwan accepte les deux notations.
Fonctions Modbus standard
| Code Fonction | Nom | Registres ciblés |
|---|---|---|
| FC01 | Read Coils | Coils (0x) |
| FC02 | Read Discrete Inputs | Discrete Inputs (1x) |
| FC03 | Read Holding Registers | Holding Registers (4x) |
| FC04 | Read Input Registers | Input Registers (3x) |
| FC05 | Write Single Coil | Coils (0x) |
| FC06 | Write Single Register | Holding Registers (4x) |
| FC15 | Write Multiple Coils | Coils (0x) |
| FC16 | Write Multiple Registers | Holding Registers (4x) |
Configuration du mapping dans Eziwan
Interface de configuration JSON
Le mapping Modbus définit comment les registres de l'automate sont collectés et publiés :
{
"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)"
}
]
}
Exemple complet : 10 registres température, 5 registres état
Voici un mapping typique pour une ligne de production avec 10 points de température et 5 états machine :
{
"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" }
]
}
Types de données supportés par Eziwan
| Type JSON | Description | Taille (registres) | Exemple de valeur |
|---|---|---|---|
uint16 | Entier non signé 16 bits | 1 | 0 à 65535 |
int16 | Entier signé 16 bits | 1 | -32768 à 32767 |
uint32_ab | Entier 32 bits, big-endian | 2 | 0 à 4 294 967 295 |
uint32_ba | Entier 32 bits, little-endian | 2 | — |
float32_abcd | Flottant IEEE 754, ABCD | 2 | 23.456 |
float32_cdab | Flottant IEEE 754, CDAB (Schneider) | 2 | — |
float32_badc | Flottant IEEE 754, BADC | 2 | — |
float64_abcdefgh | Double précision | 4 | — |
bool | Booléen (Coil ou Discrete Input) | 1 | true/false |
Debugging Modbus
Outil Modbus Poll (Windows)
Modbus Poll est l'outil de référence pour tester et déboguer les connexions Modbus :
- Télécharger sur modbustools.com
- Version d'évaluation gratuite (30 jours)
- Configuration : Connection → Connect → Modbus TCP (IP + Port 502) ou Serial (COM + baudrate)
- Définir les registres à lire : Setup → Read/Write Definition
Modbus Poll - Configuration de lecture
─────────────────────────────────────
Slave ID: 1
Function: 03 Read Holding Registers
Address: 0 (= registre 40001)
Quantity: 10
Scan Rate: 1000 ms
Logs Eziwan pour le debugging Modbus
Dans le portail Eziwan → Gateway → Logs → Modbus :
2026-06-04 14:32:00.123 [INFO] Modbus RTU: requête FC03 slave=1 addr=0 count=10
2026-06-04 14:32:00.145 [INFO] Modbus RTU: réponse reçue en 22ms, 10 registres
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 après 500ms slave=2 (essai 1/3)
2026-06-04 14:32:01.623 [WARN] Modbus RTU: timeout après 500ms slave=2 (essai 2/3)
2026-06-04 14:32:02.123 [ERROR] Modbus RTU: esclave 2 inaccessible après 3 tentatives
Activer le niveau de log DEBUG pour obtenir les trames hexadécimales brutes :
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)
Troubleshooting
Problème 1 : Timeout Modbus RTU
Symptômes : messages timeout, pas de réponse de l'esclave.
Causes et solutions :
| Cause | Diagnostic | Solution |
|---|---|---|
| Mauvais slave ID | Tester slave ID 1 à 10 manuellement | Vérifier documentation équipement |
| Baudrate incorrect | — | Tester 9600, 19200, 57600 tour à tour |
| Câblage A/B inversé | Mesurer tension A-B : +1.5V à 5V = correct | Inverser les fils A et B |
| Résistance terminaison manquante | Mesurer R entre A et B hors tension : ~60Ω si 2 résistances | Ajouter résistance 120Ω en fin de bus |
| Câble trop long | Calculer longueur totale | Réduire baudrate ou ajouter répéteur |
| Alimentation RS-485 absente | Mesurer tension alimentation esclave | Vérifier 24VDC esclave |
Problème 2 : Erreurs CRC
Symptômes : CRC error dans les logs Eziwan, données incorrectes.
Causes :
- Perturbations électromagnétiques sur le câble RS-485 (passer le câble loin des câbles de puissance)
- Câble non blindé (utiliser un câble blindé, blindage connecté à la terre côté gateway uniquement)
- Mauvaise qualité du câble (utiliser du câble spécifié RS-485, impédance 120Ω)
- Vitesse de transmission trop élevée pour la longueur du câble (réduire le baudrate)
Problème 3 : Slave ID conflict
Symptômes : un esclave répond à la place d'un autre, données mélangées.
Cause : deux esclaves ont le même slave ID sur le même bus RS-485.
Solution :
- Déconnecter tous les esclaves du bus sauf un
- Scanner le bus avec Modbus Poll pour trouver l'ID de cet esclave
- Changer l'ID si conflit (via l'interface de configuration de l'équipement)
- Reconnecter les esclaves un par un
Problème 4 : Registre illisible (Exception Code 02)
Symptôme : Illegal Data Address (Exception Code 02).
Cause : l'adresse demandée n'existe pas dans l'automate ou n'est pas accessible en Modbus.
Solutions :
- Vérifier la documentation du fabricant pour les adresses supportées
- Certains équipements n'exposent qu'une plage limitée de registres
- Sur Siemens, vérifier que la zone mémoire est bien dans le datablock exposé via PUT/GET
Checklist de diagnostic rapide
□ Tension alimentation 24VDC présente sur les bornes d'alimentation Eziwan
□ LED RS-485 Eziwan clignote lors de l'émission (TX)
□ Câblage A/B : A=positif, B=négatif (non inversé)
□ Résistances 120Ω aux deux extrémités du bus uniquement
□ Slave ID correct (vérifier sur l'écran de l'équipement ou documentation)
□ Baudrate identique sur gateway et équipement
□ Parité identique sur gateway et équipement (N, E ou O)
□ Adresse IP et port 502 corrects pour Modbus TCP
□ PUT/GET activé sur S7-1500/1200 si nécessaire
□ Pas de firewall bloquant le port 502 sur le réseau local OT
Questions fréquentes
Modbus RTU ou Modbus TCP : lequel utiliser ?
RTU si vos équipements sont sur bus série RS-485 (capteurs, compteurs, anciens automates) ; TCP si les équipements sont déjà en Ethernet. La gateway Eziwan gère les deux simultanément et fait le pont RTU ↔ TCP.
Quelles fonctions Modbus sont utilisées pour la supervision ?
Principalement FC03 (lecture de holding registers) et FC04 (input registers) pour la collecte ; FC06/FC16 pour l'écriture de consignes. Les codes d'exception (02 adresse illégale, 0B cible injoignable) guident le dépannage.
Comment lire une valeur 32 bits ou un flottant ?
Sur deux registres consécutifs, en précisant l'ordre des mots (big/little endian, word swap) dans le mapping de la gateway. Un même équipement peut mélanger les conventions : vérifiez la documentation du fabricant registre par registre.
Modbus peut-il transiter sur Internet ?
Jamais en clair : le protocole n'a ni authentification ni chiffrement. La gateway confine le Modbus au réseau local et transporte les données vers le cloud dans un tunnel VPN chiffré.
Ressources associées
- Modbus vers le cloud — la solution de collecte
- Modbus RTU vers le cloud — le cas des bus série
- Modbus TCP vers le cloud — le cas des réseaux Ethernet
- Modbus RTU vs TCP — le comparatif détaillé
- RS485 / Modbus RTU — câblage et polling en détail