Modbus est un protocole requête-réponse qui sert à lire et à écrire des nombres dans des appareils de terrain. Un client, par exemple une passerelle, un automate ou un système SCADA, envoie une requête à un seul serveur, par exemple un compteur d’énergie. La requête désigne une table, une adresse de départ et une quantité, et le serveur répond par les valeurs ou par une erreur. Modicon a publié Modbus en 1979 pour ses automates ; la Modbus Organization tient aujourd’hui les spécifications à jour et les met gratuitement à disposition. Modbus fonctionne sur liaison série en Modbus RTU et sur Ethernet en Modbus TCP, et reste le moyen le plus courant de lire des compteurs, des onduleurs, des variateurs et des régulateurs d’installation.
Le fonctionnement de Modbus en un coup d’œil
| Élément | Ce que c’est | Exemple |
|---|---|---|
| Client (maître) | L’appareil qui envoie toutes les requêtes et interroge en boucle | Une passerelle, un automate ou un serveur SCADA |
| Serveur (esclave) | L’appareil qui détient les données et répond quand il est adressé | Un compteur d’énergie ou un onduleur |
| Adresse | Le serveur auquel la requête est destinée | 1 à 247 sur une liaison série ; adresse IP et identifiant d’unité en TCP |
| Code de fonction | Ce que fait la requête | 04, lecture des registres d’entrée |
| Adresse de données et quantité | Quelles entrées de la table, et combien | À partir de 0, lire 2 registres |
| Table de registres | La liste du fabricant indiquant ce que signifie chaque adresse | Registre d’entrée 0 : tension L1, flottant 32 bits, volts |
| Contrôle d’erreur | La preuve que la trame est arrivée intacte | Un CRC de 16 bits en RTU ; les contrôles de TCP en Modbus TCP |
La spécification distingue l’unité de données de protocole (PDU), c’est-à-dire le code de fonction et ses données, de l’unité de données d’application (ADU), qui ajoute l’adresse et le contrôle d’erreur propres à un support. La PDU est identique sur tous les supports : c’est pourquoi une passerelle peut transmettre une requête de Modbus TCP à Modbus RTU sans en changer le sens. Le comparatif Modbus TCP et RTU détaille les deux variantes.
Le modèle de données Modbus : quatre tables
Un serveur Modbus expose quatre tables. Chaque entrée a une adresse de 0 à 65 535, et chaque table a ses propres codes de fonction :
| Table | Taille d’une entrée | Accès | Lecture avec | Écriture avec |
|---|---|---|---|---|
| Bobines | 1 bit | Lecture et écriture | 01 | 05, 15 |
| Entrées discrètes | 1 bit | Lecture seule | 02 | Aucune |
| Registres d’entrée | 16 bits | Lecture seule | 04 | Aucune |
| Registres de maintien | 16 bits | Lecture et écriture | 03 | 06, 16 |
Un registre contient un mot de 16 bits. Toute valeur plus grande s’étend sur des registres consécutifs : un flottant ou un entier de 32 bits en occupe deux, un compteur d’énergie de 64 bits en occupe quatre. Le protocole ne dit pas quel mot vient en premier, et les fabricants de compteurs utilisent les deux ordres. Les valeurs sont aussi souvent des entiers mis à l’échelle : un registre qui lit 2302 peut signifier 230,2 V. Le guide des tables de registres explique comment lire une ligne de table, les conventions 30001 et 40001 et l’ordre des mots.
C’est le fabricant qui choisit la table. Beaucoup de compteurs placent les mesures dans les registres d’entrée et les réglages dans les registres de maintien. D’autres placent tout dans les registres de maintien, si bien que la fonction 03 lit aussi les mesures. Seule la table de registres du modèle et du firmware exacts fait foi.
Les codes de fonction Modbus
Le code de fonction est le premier octet de chaque PDU. Voici ceux que l’on rencontre sur les compteurs et les régulateurs :
| Code | Nom | Usage courant |
|---|---|---|
| 01 (0x01) | Lecture des bobines | États des relais et des sorties |
| 02 (0x02) | Lecture des entrées discrètes | États des contacts et des alarmes |
| 03 (0x03) | Lecture des registres de maintien | Réglages, et mesures sur de nombreux compteurs |
| 04 (0x04) | Lecture des registres d’entrée | Mesures sur de nombreux compteurs |
| 05 (0x05) | Écriture d’une bobine | Fermer ou ouvrir un relais |
| 06 (0x06) | Écriture d’un registre | Modifier une consigne |
| 15 (0x0F) | Écriture de plusieurs bobines | Positionner plusieurs sorties à la fois |
| 16 (0x10) | Écriture de plusieurs registres | Écrire une consigne de 32 bits ou un bloc de réglages |
| 23 (0x17) | Lecture/écriture de plusieurs registres | Écrire et relire en une transaction |
| 43/14 (0x2B/0x0E) | Lecture de l’identification | Fabricant, code produit et version du firmware |
Une lecture renvoie au plus 125 registres ou 2 000 bobines, et une écriture porte au plus 123 registres. Ces limites découlent de la PDU de 253 octets. Lire un bloc de registres voisins en une requête est bien plus rapide que de les lire un par un, mais de nombreux compteurs refusent un bloc qui enjambe un trou dans leur table.
Quand un serveur reçoit une trame valide qu’il ne peut pas exécuter, il répond par une exception : le code de fonction avec son bit de poids fort à 1 (0x83 pour une fonction 03 en échec) et un code d’exception. La référence des codes de fonction et d’exception les donne tous.
| Exception | Signification | Cause habituelle sur site |
|---|---|---|
| 01 Fonction illégale | Le serveur ne prend pas en charge ce code de fonction | Fonction 03 envoyée à un compteur qui utilise la 04 |
| 02 Adresse de données illégale | L’adresse ou le bloc sort de la table | Une adresse décalée d’une unité, ou un bloc qui enjambe un trou |
| 03 Valeur de données illégale | La quantité ou la valeur n’est pas admise | Trop de registres dans une requête |
| 04 Défaillance du serveur | Le serveur a échoué pendant l’exécution | Un défaut de l’appareil |
| 0A, 0B Chemin ou cible de passerelle en échec | Une passerelle n’a pas pu joindre l’appareil série | Mauvais identifiant d’unité ou bus série hors service |
L’absence totale de réponse n’est pas une exception. Un dépassement de délai signifie que la requête n’a jamais atteint le serveur ou que la réponse n’est jamais revenue : câblage, paramètres série, adresse ou problème réseau. Le guide de dépannage Modbus traite les deux cas.
Modbus RTU, ASCII et TCP
| Modbus RTU | Modbus ASCII | Modbus TCP | |
|---|---|---|---|
| Support | Liaison série, le plus souvent RS-485 | Liaison série | Ethernet ou tout réseau IP |
| Codage | Binaire | Caractères hexadécimaux | Binaire |
| Début et fin de trame | Silence de 3,5 temps caractère | Deux-points, puis CR LF | Champ de longueur de l’en-tête MBAP |
| Contrôle d’erreur | CRC-16 | LRC | Aucun dans Modbus ; TCP et Ethernet vérifient les données |
| Adressage | Adresse de serveur 1 à 247 | Adresse de serveur 1 à 247 | Adresse IP, plus un identifiant d’unité |
| Clients | Un par bus | Un par bus | Plusieurs, si le serveur les accepte |
| Réglages par défaut | 19 200 bauds, parité paire, 1 bit de stop | 19 200 bauds, 7 bits de données, parité paire | Port TCP 502 |
Modbus RTU est de loin le plus courant sur les compteurs. Modbus ASCII est rare dans les équipements récents. Modbus TCP enveloppe la même PDU dans un en-tête MBAP de 7 octets : un identifiant de transaction, un identifiant de protocole à 0, une longueur et l’identifiant d’unité. Sur un appareil lui-même raccordé à Ethernet, l’identifiant d’unité est en général ignoré ou fixé à 1 ou 255. Sur une passerelle TCP vers RTU, il sélectionne l’appareil série. Le guide RS-485 et Modbus explique pourquoi RTU et RS-485 sont deux couches et non deux noms pour la même chose.
Exemple chiffré : lire la tension d’un compteur
La table de registres de l’Eastron SDM630 place la tension phase 2-neutre dans le registre d’entrée 30003, en flottant de 32 bits exprimé en volts. 30003 est le troisième registre d’entrée : la requête porte donc l’adresse 2 et demande deux registres (un flottant). Pour un compteur à l’adresse 1, la requête Modbus RTU compte huit octets :
| Octet | Valeur | Signification |
|---|---|---|
| 1 | 01 | Adresse du serveur : 1 |
| 2 | 04 | Fonction 04, lecture des registres d’entrée |
| 3 et 4 | 00 02 | Adresse de départ 2 (registre 30003) |
| 5 et 6 | 00 02 | Quantité : 2 registres |
| 7 et 8 | D0 0B | CRC-16, octet de poids faible en premier |
Le compteur répond 01 04 04 43 67 99 9A B5 E4 : adresse 1, fonction 04, 4 octets de données, les deux registres 0x4367 et 0x999A, puis le CRC. Décodé en flottant IEEE 754, mot de poids fort en premier, 0x4367999A vaut 231,6 V. Le calculateur de CRC vérifie le CRC de n’importe quelle trame :
La même lecture en Modbus TCP n’a pas de CRC. Le client envoie 00 01 00 00 00 06 01 04 00 02 00 02 : transaction 1, protocole 0, 6 octets à suivre, identifiant d’unité 1 et la même PDU. Le compteur répond 00 01 00 00 00 07 01 04 04 43 67 99 9A : la même transaction, 7 octets à suivre (l’identifiant d’unité et la PDU de 6 octets) et les mêmes données. Si le compteur avait répondu 01 84 02, il s’agirait de l’exception 02 : l’adresse ne figure pas dans sa table.
Ce que Modbus ne fait pas
Modbus transporte des nombres. Il ne transporte pas :
- Les unités et l’échelle. 2302 ne veut rien dire sans le « V × 0,1 » de la table de registres.
- L’horodatage. Une mesure a l’âge de l’interrogation qui l’a lue. Le client doit noter l’heure de réception de chaque valeur.
- La qualité. Un compteur qui a perdu son entrée de tension peut renvoyer 0 V sans erreur. Certaines tables prévoient des mots d’état ou des valeurs « non disponible » comme 0xFFFF ou NaN ; le client doit les contrôler.
- Les événements. Un serveur ne peut rien envoyer de lui-même. Un changement n’apparaît qu’à l’interrogation suivante : la période d’interrogation fixe la latence.
- La sécurité. Le Modbus de base n’a ni identification ni chiffrement. Ne l’utilisez que sur un réseau où chaque appareil raccordé est de confiance, et séparez-le du trafic bureautique et Internet.
C’est pour ces raisons qu’une passerelle qui lit du Modbus ajoute en général l’heure, l’unité et un indicateur de qualité avant de transmettre la mesure, par exemple en MQTT ou OPC UA. C’est aussi pourquoi les mêmes appareils figurent souvent dans le comparatif BACnet et Modbus : les objets BACnet portent des unités et des indicateurs d’état que les registres Modbus n’ont pas.
Interrogation et temps de cycle
Sur un bus série, une seule transaction peut être en cours. À 9 600 bauds, chaque caractère de 11 bits dure environ 1,15 ms. Une requête de 8 octets et une réponse de 40 registres de 85 octets occupent la ligne environ 106,6 ms, et les deux silences de 3,5 caractères portent ce temps à 114,6 ms. Avec le temps de réponse du compteur, en général 20 à 50 ms, chaque transaction prend 135 à 165 ms. Dix compteurs de trois blocs chacun demandent environ 4 à 5 secondes par cycle. Un débit plus élevé et des blocs moins nombreux mais plus grands raccourcissent le cycle. Le calculateur de temps RTU donne les valeurs pour n’importe quel réglage, et le guide de mise en service calcule un budget d’interrogation pour un bus réel.
Modbus TCP est plus rapide par transaction, mais une passerelle placée devant un bus série n’envoie toujours qu’une requête à la fois côté série. Plusieurs clients TCP qui interrogent la même passerelle se partagent son cycle série.
Modbus avec EpiSensor
Edge, sur la Gateway ZGW-20, est un client Modbus. Il lit les appareils Modbus TCP du réseau du site, et les appareils Modbus RTU sur l’entrée RS-485 de la carte d’E/S de la version Industrial de la Gateway, ou sur un adaptateur série USB. Il enregistre chaque valeur avec son heure, son unité et son état, et peut mettre des valeurs choisies à disposition d’un BMS ou d’un système SCADA sous forme de registres Modbus TCP. Quand un compteur est loin de la Gateway, l’interface Modbus ZMB le lit sur un court bus RS-485 local et transmet les registres par le réseau maillé Zigbee. L’annuaire des appareils recense des compteurs et des régulateurs avec leurs tables de registres et leurs modèles Edge, et le guide des passerelles Modbus et BACnet compare la Gateway aux convertisseurs de protocole.
Questions fréquentes
À quoi sert Modbus ?
Modbus relie un automate, une passerelle ou un système SCADA à des appareils de terrain : compteurs d’énergie, onduleurs, variateurs, automates et régulateurs de pompes à chaleur. Le système qui interroge lit dans les registres de l’appareil des valeurs comme la tension, la puissance et l’énergie totale, et peut écrire des consignes ou des commandes si l’appareil l’autorise.
Modbus est-il un protocole série ou Ethernet ?
Les deux. Modbus RTU et Modbus ASCII fonctionnent sur une liaison série, le plus souvent RS-485. Modbus TCP fonctionne sur les réseaux Ethernet et IP, sur le port TCP 502. Les codes de fonction et le modèle de données sont les mêmes dans les trois cas ; seuls la trame et l’adressage changent.
Que sont les codes de fonction Modbus ?
Le code de fonction est l’octet qui indique ce que fait la requête. Les plus courants sont 01 lecture des bobines, 02 lecture des entrées discrètes, 03 lecture des registres de maintien, 04 lecture des registres d’entrée, 05 écriture d’une bobine, 06 écriture d’un registre, 15 écriture de plusieurs bobines et 16 écriture de plusieurs registres. Un serveur qui ne peut pas exécuter la requête répond avec le code de fonction plus 0x80 et un code d’exception.
Quelle est la différence entre maître et esclave Modbus ?
Ce sont les anciens noms du client et du serveur. Le maître (client) envoie toutes les requêtes, l’esclave (serveur) ne fait que répondre. La Modbus Organization parle aujourd’hui de client et de serveur, mais de nombreuses fiches techniques et outils de configuration disent encore maître et esclave.
Combien d’appareils peut-on mettre sur un réseau Modbus ?
Sur une liaison série, un client peut adresser les serveurs 1 à 247. Un segment RS-485 accepte 32 charges unitaires sans répéteur, davantage avec des émetteurs-récepteurs à charge fractionnaire. En Modbus TCP, chaque appareil a sa propre adresse IP, et une passerelle peut atteindre jusqu’à 247 appareils série derrière une seule adresse IP grâce à l’identifiant d’unité.
Modbus est-il sécurisé ?
Le Modbus de base n’a ni authentification ni chiffrement : tout client qui atteint un appareil peut le lire et, si l’appareil accepte les écritures, le modifier. Gardez Modbus TCP sur un réseau séparé ou derrière une passerelle. La Modbus Organization publie aussi Modbus/TCP Security, qui ajoute TLS sur le port 802, mais peu d’appareils de terrain le prennent en charge.