Interfaces de comptage

Qu’est-ce que Modbus ? Le fonctionnement du protocole Modbus

Modbus est un protocole requête-réponse : un client lit et écrit les registres d’un serveur. Modèle de données, codes de fonction, trames RTU et TCP.

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émentCe que c’estExemple
Client (maître)L’appareil qui envoie toutes les requêtes et interroge en boucleUne 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
AdresseLe serveur auquel la requête est destinée1 à 247 sur une liaison série ; adresse IP et identifiant d’unité en TCP
Code de fonctionCe que fait la requête04, 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 registresLa liste du fabricant indiquant ce que signifie chaque adresseRegistre d’entrée 0 : tension L1, flottant 32 bits, volts
Contrôle d’erreurLa preuve que la trame est arrivée intacteUn 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 :

TableTaille d’une entréeAccèsLecture avecÉcriture avec
Bobines1 bitLecture et écriture0105, 15
Entrées discrètes1 bitLecture seule02Aucune
Registres d’entrée16 bitsLecture seule04Aucune
Registres de maintien16 bitsLecture et écriture0306, 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 :

CodeNomUsage 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 maintienRéglages, et mesures sur de nombreux compteurs
04 (0x04)Lecture des registres d’entréeMesures sur de nombreux compteurs
05 (0x05)Écriture d’une bobineFermer ou ouvrir un relais
06 (0x06)Écriture d’un registreModifier une consigne
15 (0x0F)Écriture de plusieurs bobinesPositionner 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’identificationFabricant, 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.

ExceptionSignificationCause habituelle sur site
01 Fonction illégaleLe serveur ne prend pas en charge ce code de fonctionFonction 03 envoyée à un compteur qui utilise la 04
02 Adresse de données illégaleL’adresse ou le bloc sort de la tableUne adresse décalée d’une unité, ou un bloc qui enjambe un trou
03 Valeur de données illégaleLa quantité ou la valeur n’est pas admiseTrop de registres dans une requête
04 Défaillance du serveurLe serveur a échoué pendant l’exécutionUn défaut de l’appareil
0A, 0B Chemin ou cible de passerelle en échecUne passerelle n’a pas pu joindre l’appareil sérieMauvais 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 RTUModbus ASCIIModbus TCP
SupportLiaison série, le plus souvent RS-485Liaison sérieEthernet ou tout réseau IP
CodageBinaireCaractères hexadécimauxBinaire
Début et fin de trameSilence de 3,5 temps caractèreDeux-points, puis CR LFChamp de longueur de l’en-tête MBAP
Contrôle d’erreurCRC-16LRCAucun dans Modbus ; TCP et Ethernet vérifient les données
AdressageAdresse de serveur 1 à 247Adresse de serveur 1 à 247Adresse IP, plus un identifiant d’unité
ClientsUn par busUn par busPlusieurs, si le serveur les accepte
Réglages par défaut19 200 bauds, parité paire, 1 bit de stop19 200 bauds, 7 bits de données, parité pairePort 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 :

OctetValeurSignification
101Adresse du serveur : 1
204Fonction 04, lecture des registres d’entrée
3 et 400 02Adresse de départ 2 (registre 30003)
5 et 600 02Quantité : 2 registres
7 et 8D0 0BCRC-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.