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 EziwanSignal RS-485Couleur câble recommandé
A (ou D+)Positif différentielBlanc ou rouge
B (ou D-)Négatif différentielBleu ou noir
GNDMasse de référenceVert ou gris

Paramètres de communication RS-485

Les paramètres doivent être identiques sur la gateway et tous les esclaves :

ParamètreValeurs courantesValeur par défaut Eziwan
Vitesse (baudrate)1200, 2400, 4800, 9600, 19200, 38400, 57600, 1152009600
ParitéN (aucune), E (paire), O (impaire)N
Bits de données7, 88
Bits d'arrêt1, 21
Délai inter-message3.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

BaudrateDistance maximaleEsclaves max (électrique)
9 600 bps1 200 m32 (unit loads)
19 200 bps800 m32
57 600 bps200 m32
115 200 bps50 m32

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ètreValeur
Port TCP502 (standard), parfois 503 ou autre selon constructeur
Unit IDAdresse de l'esclave (1 à 247), ou 255 pour accès direct
Timeout recommandé500 ms à 2000 ms selon réseau
Keep-alive TCPRecommandé 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 :

  1. La gateway et l'automate sont sur le même sous-réseau (ou un routeur entre eux)
  2. Pas de firewall bloquant le port TCP 502 entre gateway et automate
  3. 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 :

TypeCode ModbusAdressesAccès maîtreTailleDescription
Coils0x (1x)00001–09999Lecture/Écriture1 bitSorties digitales (relais, bobines)
Discrete Inputs1x (2x)10001–19999Lecture seule1 bitEntrées digitales (capteurs TOR)
Input Registers3x30001–39999Lecture seule16 bitsValeurs mesurées (capteurs analogiques)
Holding Registers4x40001–49999Lecture/Écriture16 bitsParamè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 FonctionNomRegistres ciblés
FC01Read CoilsCoils (0x)
FC02Read Discrete InputsDiscrete Inputs (1x)
FC03Read Holding RegistersHolding Registers (4x)
FC04Read Input RegistersInput Registers (3x)
FC05Write Single CoilCoils (0x)
FC06Write Single RegisterHolding Registers (4x)
FC15Write Multiple CoilsCoils (0x)
FC16Write Multiple RegistersHolding 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 JSONDescriptionTaille (registres)Exemple de valeur
uint16Entier non signé 16 bits10 à 65535
int16Entier signé 16 bits1-32768 à 32767
uint32_abEntier 32 bits, big-endian20 à 4 294 967 295
uint32_baEntier 32 bits, little-endian2
float32_abcdFlottant IEEE 754, ABCD223.456
float32_cdabFlottant IEEE 754, CDAB (Schneider)2
float32_badcFlottant IEEE 754, BADC2
float64_abcdefghDouble précision4
boolBooléen (Coil ou Discrete Input)1true/false

Debugging Modbus

Outil Modbus Poll (Windows)

Modbus Poll est l'outil de référence pour tester et déboguer les connexions Modbus :

  1. Télécharger sur modbustools.com
  2. Version d'évaluation gratuite (30 jours)
  3. Configuration : Connection → Connect → Modbus TCP (IP + Port 502) ou Serial (COM + baudrate)
  4. 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 :

CauseDiagnosticSolution
Mauvais slave IDTester slave ID 1 à 10 manuellementVérifier documentation équipement
Baudrate incorrectTester 9600, 19200, 57600 tour à tour
Câblage A/B inverséMesurer tension A-B : +1.5V à 5V = correctInverser les fils A et B
Résistance terminaison manquanteMesurer R entre A et B hors tension : ~60Ω si 2 résistancesAjouter résistance 120Ω en fin de bus
Câble trop longCalculer longueur totaleRéduire baudrate ou ajouter répéteur
Alimentation RS-485 absenteMesurer tension alimentation esclaveVé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 :

  1. Déconnecter tous les esclaves du bus sauf un
  2. Scanner le bus avec Modbus Poll pour trouver l'ID de cet esclave
  3. Changer l'ID si conflit (via l'interface de configuration de l'équipement)
  4. 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