Le Modbus est un protocole de communication largement utilisé dans les systèmes industriels pour échanger des données entre des équipements comme les automates (PLC), capteurs, et interfaces homme-machine (IHM). Comprendre le décodage d’une trame Modbus est essentiel pour configurer et diagnostiquer correctement un système basé sur le protocole Modbus.
Cet article explore en détail le décodage trame Modbus RTU, trame Modbus ASCII et trame Modbus TCP/IP pour différents codes de fonctions.
Contenu de l'Article
Concepts de base du protocole Modbus
Architecture du Protocole
Le protocole Modbus repose sur une architecture client-serveur, conçue pour établir une communication fiable et structurée entre différents dispositifs industriels. Dans ce modèle, le client (aussi appelé Master) joue un rôle actif en initiant toutes les interactions. Il envoie des requêtes au serveur pour effectuer des opérations spécifiques telles que lire des données, écrire dans des registres ou contrôler des sorties. Les requêtes du client contiennent des informations essentielles comme l’adresse du dispositif cible, un code de fonction définissant l’opération à exécuter, et les paramètres requis (tels que les adresses des registres ou les valeurs à modifier).
Cette structure garantit un contrôle centralisé, souvent utilisé dans des systèmes d’automatisation où un automate ou un logiciel SCADA agit comme maître pour superviser plusieurs dispositifs.
De son côté, le serveur (appelé Slave) répond de manière passive aux requêtes du client. Chaque serveur est identifié par une adresse unique, lui permettant de recevoir et de traiter uniquement les messages qui lui sont destinés. Une fois la requête traitée, le serveur renvoie une réponse contenant les données demandées ou un accusé d’erreur si une anomalie est détectée (comme une adresse invalide ou une opération interdite). Cette architecture hiérarchique, combinée à un adressage simple, rend Modbus adapté à une grande variété d’applications, notamment dans les réseaux série (Modbus RTU/ASCII) ou Ethernet (Modbus TCP), facilitant la supervision des systèmes industriels complexes.
Types de Modbus
Modbus RTU est une version largement adoptée du protocole, conçue pour les communications série sur des interfaces telles que RS-232 ou RS-485. Ce format se distingue par son efficacité, grâce à un codage binaire compact qui minimise la taille des trames transmises. Les messages Modbus RTU utilisent un contrôle de redondance cyclique (CRC) pour assurer l’intégrité des données, ce qui en fait un choix idéal pour les systèmes industriels où la robustesse et la fiabilité sont essentielles. Avec RS-485, il permet la connexion de plusieurs appareils sur un même bus, jusqu’à 32 esclaves, avec une portée pouvant atteindre 1 200 mètres.
Modbus ASCII, quant à lui, utilise un encodage textuel pour représenter les données. Chaque octet est converti en une chaîne de caractères ASCII avant transmission, ce qui rend les trames plus faciles à lire et à déboguer par des humains. Cependant, ce format est moins efficace que Modbus RTU, car l’encodage textuel double la taille des trames et ralentit la communication. Il est surtout utilisé dans des applications où la simplicité de développement ou de diagnostic prime sur la vitesse, par exemple lors de configurations initiales ou dans des environnements où la surveillance en temps réel n’est pas critique.
Modbus TCP/IP exploite la puissance des réseaux Ethernet en encapsulant les messages Modbus dans des paquets TCP/IP. Cette variante permet une communication rapide et fiable entre des appareils connectés sur des réseaux locaux (LAN) ou étendus (WAN). Modbus TCP/IP élimine la nécessité d’un contrôle d’erreur spécifique (comme le CRC ou LRC) grâce aux mécanismes déjà intégrés dans la pile TCP/IP. Avec des capacités de connexion multipoint et une bande passante élevée, il est particulièrement adapté aux infrastructures modernes, telles que les systèmes SCADA ou les réseaux IoT, où de nombreux dispositifs interagissent simultanément.
Structure générale d’une trame Modbus
Une trame Modbus, quelle que soit la variante (RTU, ASCII ou TCP/IP), suit une structure spécifique :
- Adresse de l’esclave : Identifie le dispositif cible (1 octet pour RTU/ASCII, jusqu’à 2 octets pour TCP/IP).
- Code de fonction : Spécifie l’opération à effectuer (lecture, écriture, etc.).
- Données : Contient les paramètres ou les résultats de l’opération.
- Contrôle des erreurs : CRC (RTU) ou LRC (ASCII).
Codes de fonctions Modbus
Les codes de fonctions Modbus spécifient les actions que le maître (client) demande à l’esclave (serveur) d’exécuter. Voici un résumé des principaux codes et de leurs usages courants :
Lecture
- 01 : Lire les bobines (Coils) – Récupère l’état de plusieurs sorties binaires (ON/OFF).
- 02 : Lire les entrées discrètes – Récupère l’état de plusieurs entrées binaires.
- 03 : Lire les registres de maintien (Holding Registers) – Récupère des valeurs analogiques configurables.
- 04 : Lire les registres d’entrée – Récupère des valeurs analogiques provenant directement de capteurs.
Écriture
- 05 : Écrire une seule bobine – Change l’état d’une sortie binaire spécifique.
- 06 : Écrire dans un registre unique – Modifie la valeur d’un registre de maintien.
- 15 : Écrire plusieurs bobines – Change l’état de plusieurs sorties binaires en une seule requête.
- 16 : Écrire dans plusieurs registres – Modifie les valeurs de plusieurs registres de maintien.
Diagnostics et Utilitaires
- 07 : Lire le statut d’une exception – Récupère les erreurs spécifiques au serveur.
- 08 : Diagnostic – Utilisé pour vérifier les performances du réseau et des dispositifs.
- 17 : Lire les identifiants de l’appareil – Récupère les informations sur le modèle, le fabricant, et d’autres données spécifiques au dispositif.
Ces codes de fonctions permettent une grande flexibilité pour répondre à une variété de besoins industriels, de la surveillance des capteurs à la configuration dynamique des équipements. Pour chaque code, le format de la trame et les données échangées dépendent des adresses et des types de registres ou de bobines concernés.
Décodage d’une trame Modbus RTU
Exemple 01 : Lecture de 10 registres à partir de l’adresse 0x0064
Voici une trame typique pour cette opération :
01 03 00 64 00 0A C4 0B
Détails du décodage :
- 01 : Adresse de l’esclave (décimal : 1).
- 03 : Code de fonction pour lire les registres.
- 00 64 : Adresse de départ en hexadécimal (décimal : 100).
- 00 0A : Nombre de registres à lire (décimal : 10).
- C4 0B : Contrôle de redondance cyclique (CRC) calculé à l’aide d’un algorithme spécifique.
Réponse (Données fictives : 0x0001, 0x0002, …, 0x000A)
01 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A D4 C1
Détails :
- 01 : Adresse de l’esclave.
- 03 : Code de fonction (lecture de registres).
- 14 : Nombre d’octets de données (10 registres × 2 octets = 20 octets = 0x14 en hexadécimal).
- 00 01 00 02 … 00 0A : Valeurs des 10 registres.
- D4 C1 : CRC calculé pour cette réponse.
Comment calculer le CRC :
- Initialiser un registre CRC à 0xFFFF.
- Pour chaque octet de la trame (hors CRC), effectuer un XOR avec le registre CRC.
- Effectuer un décalage à droite (LSR) et ajouter 0xA001 si le bit de poids faible est 1.
- Répéter pour chaque bit de l’octet et pour chaque octet de la trame.
Exemple 02 : Écrire la valeur 0x000F dans un registre à l’adresse 0x0020 (décimal : 32)
Trame RTU :
01 06 00 20 00 0F 98 0B
Détails du décodage :
- 01 : Adresse de l’esclave (décimal : 1).
- 06 : Code de fonction pour écrire un registre unique.
- 00 20 : Adresse du registre à écrire (hexadécimal).
- 00 0F : Valeur à écrire dans le registre (hexadécimal).
- 98 0B : CRC, calculé sur tous les octets précédents.
Explication du CRC :
- Le CRC est calculé sur les octets 01 06 00 20 00 0F selon l’algorithme de redondance cyclique.
Décodage d’une trame Modbus ASCII
Exemple 01 : Lecture de 8 bobines à partir de l’adresse 0x0013
Voici une trame typique en Modbus ASCII :
:0101001300083DC9<CR><LF>
Détails du décodage :
- : : Délimiteur de début. Indique le début de la trame en Modbus ASCII.
- 01 : Adresse de l’esclave. L’identifiant de l’esclave concerné (1 en décimal).
- 01 : Code de fonction. Représente la lecture des bobines (lecture des états ON/OFF des sorties numériques).
- 0013 : Adresse de départ. Adresse de la première bobine à lire (hexadécimal : 0x0013, équivalent à 19 en décimal).
- 0008 : Nombre de bobines. Spécifie que 8 bobines consécutives doivent être lues à partir de l’adresse 0x0013.
- 3D : LRC (Longitudinal Redundancy Check). Contrôle d’intégrité de la trame, calculé en additionnant tous les octets (hors délimiteur
:
et<CR><LF>
) et en prenant le complément à deux. - <CR><LF> : Fin de la trame. Caractères spéciaux (Carriage Return et Line Feed) signalant la fin de la trame au format ASCII.
Calcul du LRC :
- Additionner tous les octets de la trame (excluant le délimiteur).
- Prendre le complément à deux (inverser les bits et ajouter 1).
- Convertir le résultat en hexadécimal sur un octet.
Réponse (Données fictives : états des bobines 1, 0, 1, 0, 0, 1, 1, 0)
:0101086BA4<CR><LF>
Détails :
- :0101 : Adresse de l’esclave (01) et code de fonction (01, lecture de bobines).
- 08 : Nombre d’octets contenant les états des bobines (1 octet suffit pour 8 bobines).
- 6B : Valeurs des bobines (en binaire : 01101011 → bobine 1 à 8 : 1, 0, 1, 0, 0, 1, 1, 0).
- A4 : LRC calculé pour cette réponse.
Exemple 02 : Écrire la valeur 0x00AA dans un registre à l’adresse 0x0040 (décimal : 64)
Trame ASCII :
:0106004000AA9B<CR><LF>
Détails du décodage :
- : : Délimiteur de début.
- 01 : Adresse de l’esclave (décimal : 1).
- 06 : Code de fonction pour écrire un registre unique.
- 0040 : Adresse du registre à écrire (hexadécimal).
- 00AA : Valeur à écrire dans le registre (hexadécimal).
- 9B : LRC (Longitudinal Redundancy Check).
Calcul du LRC :
- Additionner les octets 01 + 06 + 00 + 40 + 00 + AA en hexadécimal = 01F1.
- Ne garder que le dernier octet : F1.
- Calculer le complément à deux de F1 : 9B.
- Ajouter <CR><LF> pour signaler la fin de la trame.
Note : Lorsqu’un maître Modbus ASCII effectue une opération d’écriture, l’esclave (serveur) renvoie une réponse confirmant que l’opération a été correctement exécutée. La réponse reprend généralement les mêmes champs que la requête, mais avec une vérification d’intégrité (LRC).
Décodage d’une trame Modbus TCP/IP
Exemple 01 : Lecture de 5 registres à partir de l’adresse 0x000A
Voici une trame Modbus TCP :
00 01 00 00 00 06 01 03 00 0A 00 05
Détails du décodage :
- 00 01 : Identifiant de transaction (généralement incrémenté pour chaque requête).
- 00 00 : Protocole Modbus (toujours 0x0000).
- 00 06 : Longueur des données (6 octets suivants).
- 01 : Adresse de l’esclave.
- 03 : Code de fonction.
- 00 0A : Adresse de départ (décimal : 10).
- 00 05 : Nombre de registres à lire (décimal : 5).
Réponse (Données fictives : 0x00FF, 0x00AA, 0x00BB, 0x00CC, 0x00DD)
00 01 00 00 00 0D 01 03 0A 00 FF 00 AA 00 BB 00 CC 00 DD
Détails :
- 00 01 : Identifiant de transaction, identique à la requête.
- 00 00 : Protocole Modbus.
- 00 0D : Longueur totale des données (11 octets de charge utile + 2 octets d’en-tête).
- 01 : Adresse de l’esclave.
- 03 : Code de fonction (lecture de registres).
- 0A : Nombre d’octets de données (5 registres × 2 octets = 10 octets = 0x0A en hexadécimal).
- 00 FF 00 AA 00 BB 00 CC 00 DD : Valeurs des 5 registres.
Remarques importantes
- Lecture multiple : Les valeurs retournées sont toujours organisées en séquences de 2 octets (1 mot = 1 registre).
- Validation des réponses : Le maître doit vérifier que :
- L’adresse de l’esclave correspond.
- Le code de fonction est identique à celui de la requête.
- La longueur des données correspond au nombre de registres demandés.
En cas d’erreur : Si l’esclave détecte une anomalie (ex. adresse invalide ou nombre de registres hors limites), il renverra une réponse d’exception contenant un code d’erreur spécifique (ex. 0x83 pour une erreur avec la fonction 03).
Exemple 02 : Écrire la valeur 0x00FF dans un registre à l’adresse 0x0005 (décimal : 5)
Trame TCP :
00 01 00 00 00 06 01 06 00 05 00 FF
Détails du décodage :
- 00 01 : Identifiant de transaction (2 octets, souvent incrémenté automatiquement par le client).
- 00 00 : Protocole Modbus (2 octets, toujours 0x0000).
- 00 06 : Longueur des données (6 octets suivants).
- 01 : Adresse de l’esclave (décimal : 1).
- 06 : Code de fonction pour écrire un registre unique.
- 00 05 : Adresse du registre à écrire (hexadécimal).
- 00 FF : Valeur à écrire dans le registre.
Particularités TCP :
- Aucun CRC n’est requis, car la pile TCP/IP gère l’intégrité des données.
- La communication est plus rapide grâce à des trames plus grandes et une gestion fiable des erreurs.
Note : La réponse pour une opération d’écriture est toujours une copie exacte de la requête envoyée. Elle contient les mêmes champs, confirmant ainsi que la commande a été correctement reçue et exécutée par l’esclave.
Décodage pour différents codes de fonctions Modbus
1. Lecture de bobines (Code de fonction 01)
Exemple : Lire 8 bobines à partir de l’adresse 0x0013 :
01 01 00 13 00 08 3D C9
- 00 13 : Adresse de départ (décimal : 19).
- 00 08 : Nombre de bobines à lire (décimal : 8).
- 3D C9 : CRC.
2. Lecture des entrées discrètes (Code de fonction 02)
Exemple : Lire 16 entrées discrètes à partir de 0x0001 :
01 02 00 01 00 10 79 84
- 00 01 : Adresse de départ (décimal : 1).
- 00 10 : Nombre d’entrées à lire (décimal : 16).
- 79 84 : CRC.
3. Écriture multiple dans des registres (Code de fonction 16)
Exemple : Écrire deux valeurs (0x000A, 0x000B) dans les registres à partir de l’adresse 0x0010 :
01 10 00 10 00 02 04 00 0A 00 0B 8C 7F
- 00 10 : Adresse de départ (décimal : 16).
- 00 02 : Nombre de registres à écrire.
- 04 : Nombre d’octets dans les données.
- 00 0A 00 0B : Données (valeurs à écrire).
- 8C 7F : CRC.
Comment diagnostiquer une liaison Modbus
Diagnostiquer une liaison Modbus est une étape essentielle pour garantir une communication fluide et identifier les éventuels problèmes de configuration ou de fonctionnement. Voici les étapes principales à suivre pour diagnostiquer efficacement une liaison Modbus :
1. Vérification physique de la connexion
- Câblage : Assurez-vous que les câbles sont correctement connectés et en bon état. Pour RS-485, vérifiez les connexions A(-) et B(+) ainsi que la mise à la terre.
- Résistances de terminaison : Vérifiez la présence et la valeur des résistances de terminaison (souvent 120 Ω) aux extrémités du réseau, si nécessaire.
- Distance et interférences : Confirmez que la longueur des câbles respecte les limites (RS-485 : max. 1200 m) et qu’il n’y a pas d’interférences électromagnétiques (séparation des câbles d’alimentation et des câbles de communication).
2. Validation des paramètres de configuration
- Adresse de l’esclave : Vérifiez que chaque dispositif a une adresse unique dans le réseau.
- Vitesse de transmission : Assurez-vous que la vitesse en bauds (par ex. 9600, 19200) est identique pour tous les dispositifs.
- Format des données : Confirmez les paramètres tels que le nombre de bits de données, le bit de parité (aucune, paire, impaire), et les bits d’arrêt (souvent 8N1 : 8 bits de données, pas de parité, 1 bit d’arrêt).
- Code de fonction : Assurez-vous que les codes de fonction utilisés correspondent aux fonctionnalités prises en charge par l’esclave.
3. Utilisation d’outils de diagnostic
Les analyseurs de protocole sont des outils essentiels pour diagnostiquer une liaison Modbus, permettant d’envoyer des requêtes, d’analyser les réponses et de surveiller le trafic en temps réel pour identifier d’éventuelles anomalies. Des logiciels comme Axon Test ou Modbus Poll permettent de simuler un maître Modbus pour tester la communication avec un esclave, vérifier les paramètres de configuration (adresse, vitesse, parité) et interpréter les codes d’exception renvoyés par l’équipement.
Ces outils offrent une vue détaillée des trames envoyées et reçues, facilitant la détection de problèmes tels que des erreurs de CRC, des adresses invalides, ou des temps de réponse trop longs. En complément, des logiciels comme Wireshark peuvent être utilisés pour capturer le trafic Modbus TCP et analyser les échanges sur un réseau Ethernet, garantissant un diagnostic précis dans les environnements modernes.
4. Interprétation des erreurs
- Absence de réponse : Cela peut indiquer une adresse incorrecte, un problème de câblage, ou une vitesse de transmission non correspondante.
- Code d’exception Modbus : Si une réponse est reçue mais contient un code d’exception (ex. 01, 02, 03), cela signale une erreur spécifique :
- 01 : Fonction non supportée.
- 02 : Adresse invalide.
- 03 : Données invalides.
- Réponse incohérente ou CRC invalide : Cela peut être dû à une interférence ou à un problème matériel.
5. Tester un dispositif à la fois
Pour isoler les problèmes, déconnectez tous les dispositifs sauf un et testez la communication avec ce dernier. Cela permet de déterminer si un appareil particulier cause des problèmes.
En suivant ces étapes et en utilisant les bons outils, vous pouvez diagnostiquer et résoudre efficacement la majorité des problèmes liés à une liaison Modbus, garantissant ainsi un fonctionnement optimal de votre système industriel.
Conclusion
La maîtrise du décodage des trames Modbus est essentielle pour configurer et dépanner efficacement un système industriel. En comprenant la structure des trames et les particularités de chaque type de données, vous pouvez optimiser vos communications et garantir la fiabilité des échanges entre vos équipements. Si vous avez des questions ou des besoins spécifiques, n’hésitez pas à demander !