Interfaces de mesure

Dépannage Modbus : délais, exceptions et valeurs fausses

Diagnostiquez délais d’attente Modbus, exception 02, valeurs erronées ou figées avec trames RTU et temporisations à 9 600 bauds.

Avant de modifier un réglage, capturez les octets bruts. Un maître qui affiche seulement « délai d’expiration » ou « valeur incorrecte » masque les indices qui permettent de distinguer les causes ci-dessous. Voici une lecture de deux registres de maintien sur l’appareil 1 en Modbus RTU, avec deux réponses possibles :

TrameOctets (hex.)Signification
Requête01 03 00 00 00 02 C4 0BAppareil 1, fonction 03, adresse de départ 0, 2 registres, CRC
Réponse normale01 03 04 43 5C 80 00 4E 654 octets de données. Interprété comme flottant 32 bits dans l’ordre ABCD, 435C 8000 vaut 220,5
Réponse d’exception01 83 02 C0 F1Fonction 03 + 0x80, exception 02 (adresse de données illégale)

L’absence totale de réponse est le quatrième résultat possible. Chacun est traité dans une section ci-dessous.

1. Aucune réponse

Un délai d’expiration signifie qu’aucune réponse valide n’est arrivée. La requête n’a pas atteint l’appareil intacte, elle visait une adresse à laquelle personne ne répond, ou la réponse s’est perdue ou est arrivée après la fin de l’attente du maître. La spécification du protocole d’application (section 7) indique qu’un appareil qui détecte une erreur de parité, de LRC ou de CRC dans une requête ne répond pas. Un délai d’expiration peut donc signaler une requête corrompue aussi bien qu’un appareil absent.

Sur un bus série (Modbus RTU), vérifiez ces points dans l’ordre :

  1. Réglez le même débit en bauds, la même parité et le même nombre de bits d’arrêt sur tous les appareils. La spécification de la liaison série (section 2.5.1) prévoit par défaut une parité paire et exige 2 bits d’arrêt sans parité. Certains compteurs sont livrés sans parité avec 1 bit d’arrêt : réglez alors le maître comme le compteur.
  2. Attribuez à chaque appareil une adresse unique de 1 à 247. Deux appareils ayant la même adresse répondent simultanément et corrompent leurs deux réponses. L’adresse 0 est réservée à la diffusion : les appareils exécutent une écriture diffusée, mais n’y répondent jamais.
  3. Inversez les deux conducteurs de signal sur un appareil et refaites l’essai. Les fabricants ne désignent pas toujours A et B de la même manière.
  4. Assurez-vous qu’un seul maître interroge le bus. Un ordinateur portable ou un BMS qui interroge en même temps provoque des collisions.
  5. Vérifiez l’adaptateur. Un adaptateur USB à 2 fils sans suppression d’écho renvoie au maître sa propre requête, que certains maîtres prennent pour une réponse incorrecte. Si l’adaptateur désactive son pilote trop lentement après la requête, il tronque les premiers octets de la réponse.
  6. Vérifiez la terminaison et la polarisation. Des erreurs CRC qui augmentent avec le débit et la longueur du câble suggèrent une terminaison manquante. Des erreurs de trame ou un premier octet parasite après une période d’inactivité du bus suggèrent une polarisation manquante. Le guide de câblage RS-485 traite les deux cas.
  7. Prévoyez un délai d’attente couvrant la transmission de la réponse sur le bus et le temps de traitement de l’appareil. Le calcul figure plus bas.

En Modbus TCP, vérifiez l’adresse IP, le port (502 sauf indication contraire de l’appareil), les règles de pare-feu entre client et appareil, ainsi que l’identifiant d’unité. Le guide d’implémentation TCP (section 4.4.1.2) recommande l’identifiant 0xFF pour un appareil directement connecté au réseau et accepte également 0. Derrière une passerelle TCP vers RTU, cet identifiant sélectionne l’appareil série, de 1 à 247. Certains appareils TCP directs ne répondent qu’à une valeur précise : consultez leur manuel.

Le guide TCP ne fixe pas de limite de connexions ; chaque appareil a la sienne. Certains compteurs n’acceptent qu’une connexion à la fois. Si un client disparaît sans fermer sa connexion, après une coupure de courant par exemple, celle-ci reste semi-ouverte et occupe sa place (section 4.2.2). Avec les temporisations TCP keepalive par défaut citées dans le guide (section 4.3.2), la première sonde part après 2 heures d’inactivité, puis la pile abandonne après 8 sondes supplémentaires espacées de 75 s. La place peut donc rester bloquée plus de 2 heures. Pendant ce temps, l’appareil refuse les nouvelles connexions ou n’y répond pas. Le guide recommande qu’un serveur ferme sa connexion la plus ancienne lorsque le nombre maximal est atteint et qu’un nouveau client arrive (section 4.2.1.1), mais tous les appareils ne le font pas. Redémarrez l’appareil ou consultez son manuel pour réduire le délai d’inactivité.

Essayez la plus petite requête qui devrait fonctionner : un registre dont l’existence est confirmée par la table, avec la fonction (03 ou 04) qu’elle indique. Utilisez le calculateur CRC et LRC Modbus pour vérifier une trame RTU capturée.

Calcul du délai d’attente

En mode RTU, chaque octet occupe 11 bits sur le fil : un bit de départ, 8 bits de données, un bit de parité (ou un deuxième bit d’arrêt) et un bit d’arrêt. À 9 600 bauds, un octet prend 1,15 ms. La lecture maximale porte sur 125 registres (fonction 03 ou 04) et sa réponse compte 255 octets : adresse, fonction, nombre d’octets, 250 octets de données et CRC sur 2 octets. Cette réponse met 292 ms à circuler sur le fil. La requête ajoute 9 ms, et l’appareil doit préparer sa réponse. Un délai d’attente de 200 ms échoue donc sur toute lecture d’un bloc complet, même si l’appareil répond correctement.

La spécification de la liaison série (section 2.4.1) donne un délai de réponse typique de 1 s à plusieurs secondes à 9 600 bauds. Commencez à 1 s, mesurez le temps réel de réponse, puis réduisez le délai si le budget d’interrogation l’exige.

La temporisation des trames compte aussi. Une trame RTU se termine après un silence de 3,5 temps de caractère, soit 4,0 ms à 9 600 bauds. Un intervalle supérieur à 1,5 temps de caractère à l’intérieur d’une trame conduit le récepteur à l’écarter comme incomplète. Au-dessus de 19 200 bauds, la spécification recommande des valeurs fixes de 1,75 ms entre trames et de 750 µs à l’intérieur d’une trame (section 2.5.1.1). Un maître ou convertisseur qui marque une pause dans une trame provoque un délai d’expiration sans autre symptôme. Le calculateur de temporisation Modbus RTU calcule ces valeurs pour d’autres débits et tailles de bloc.

2. Une réponse d’exception

Une réponse d’exception prouve que l’appareil a reçu la requête intacte et l’a rejetée. La réponse contient le code de fonction augmenté de 0x80, puis un code d’exception. Une réponse 83 02 signifie « fonction 03, exception 02 » :

CodeNomCause habituelle
01Fonction illégaleL’appareil n’implémente pas ce code de fonction. Certains appareils n’implémentent que 03 ou que 04 pour les lectures. Si 03 renvoie 01, essayez 04
02Adresse de données illégaleL’adresse n’existe pas, ou le bloc dépasse la fin de la table ou traverse une lacune. Un appareil qui implémente 03 et 04, mais conserve la valeur dans l’autre table, renvoie aussi 02
03Valeur de données illégaleLa requête est mal formée, par exemple une lecture de plus de 125 registres. Selon la spécification, 03 ne signifie pas qu’une valeur écrite sort de la plage admissible de l’application
04Défaillance de l’appareil serveurL’appareil a échoué pendant le traitement de la requête
06Appareil serveur occupéL’appareil exécute une opération longue. Renvoyez la requête plus tard
0AChemin de passerelle indisponibleLa passerelle n’a pas pu acheminer la requête. Elle est généralement mal configurée ou surchargée
0BAbsence de réponse de l’appareil cible de la passerelleLa passerelle a envoyé la requête, mais l’appareil série en aval n’a pas répondu

La spécification fournit un exemple d’exception 02. Un appareil doté de 100 registres (adresses 0 à 99) accepte la lecture de 4 registres à partir de l’adresse 96. Il refuse la lecture de 5 registres à partir de cette adresse, car le registre 100 n’existe pas. Vérifiez d’abord la convention d’adressage (le registre 40001 correspond à l’adresse de protocole 0), puis la longueur du bloc. De nombreux compteurs rejettent aussi un bloc qui traverse une lacune dans leur table. Scindez alors le bloc à cet endroit.

Ne renvoyez pas la même requête en boucle. L’appareil donnera chaque fois la même réponse. L’exception est le code 06 : l’appareil est occupé et la même requête peut réussir plus tard.

Une écriture peut réussir au niveau du protocole sans modifier l’appareil. Pour la fonction 06, une réponse normale répète la requête ; pour la fonction 16 (0x10), elle contient l’adresse de départ et le nombre de registres. Aucune de ces réponses ne confirme que l’appareil a appliqué la valeur. Relisez le registre après l’écriture.

3. Une valeur plausible, mais fausse

Une réponse valide prouve seulement que la liaison fonctionne. Elle ne prouve pas que la valeur est décodée correctement. Si une valeur plausible ne correspond pas à l’afficheur de l’appareil, comparez les mots bruts des registres à la table des registres :

SymptômeCause probable
Les valeurs correspondent au registre voisinConvention d’adressage : confusion entre adresses commençant à un et à zéro
Un nombre très élevé ou un flottant proche de zéroOrdre des mots inversé pour une valeur 32 bits
65 526 au lieu de −10Valeur signée lue comme non signée
Valeur 10, 100 ou 1 000 fois trop grande ou trop petiteFacteur d’échelle absent ou appliqué deux fois
Grandeur correcte, signe incorrectConvention de signe pour importation et exportation
Valeur figée à 65 535, −1, 32 768 ou −32 768, ou NaN pour un flottantCode « non disponible » (0xFFFF, 0x8000 ou 0x7FC00000) interprété comme donnée

La trame en tête de ce guide montre pourquoi une inversion de mots est facile à manquer. Les mots 435C 8000 donnent 220,5 dans l’ordre ABCD. Dans l’ordre CDAB (mots inversés), ils donnent −2,4 × 10⁻⁴¹, que la plupart des afficheurs montrent comme 0. Une tension nulle ressemble à un compteur non alimenté. Pour un entier, l’erreur est évidente : la valeur 10 avec les mots inversés se lit 655 360.

Le décodeur de registres Modbus affiche une paire de registres dans les quatre ordres d’octets (ABCD, CDAB, BADC et DCBA). Le guide des tables de registres explique chaque champ d’une table.

Confirmez la correction dans un deuxième état de fonctionnement, par exemple en allumant puis éteignant une charge, ou avec une valeur qui devient négative. Une lecture de 0 exactement se décode de la même façon dans tous les ordres d’octets : elle ne prouve rien quant à l’ordre.

4. Valeurs figées ou erratiques

Si la liaison et le décodage sont corrects, mais que les valeurs se figent, sautent ou manquent, cherchez du côté de l’interrogation.

Une passerelle peut renvoyer la dernière valeur lue lorsque l’appareil en aval cesse de répondre. Vérifiez son délai d’invalidation des valeurs périmées. Consultez aussi le manuel pour connaître la fréquence de mise à jour de l’appareil. Si un registre s’actualise une fois par seconde, une interrogation plus rapide renvoie plusieurs fois la même valeur.

Un compteur 32 bits lu par deux requêtes distinctes peut combiner le mot de poids fort d’un instant avec le mot de poids faible de l’instant suivant. Le total saute alors de 65 536 avant de revenir. Lisez les deux registres dans une seule requête.

En Modbus TCP, l’identifiant de transaction MBAP associe chaque réponse à sa requête. Le guide TCP (section 4.4.1.3) demande au client d’écarter une réponse dont l’identifiant ne correspond à aucune requête en attente. Un client qui ignore cet identifiant peut attribuer une réponse tardive à sa requête suivante. La valeur d’un point apparaît alors de temps en temps dans un autre point.

Des lacunes régulières apparaissent lorsque le cycle d’interrogation dépasse l’intervalle de transmission des mesures. Un appareil hors ligne aggrave la situation : chaque interrogation de cet appareil attend le délai complet, ainsi que chaque nouvelle tentative. Par exemple, 10 compteurs sur un bus à 9 600 bauds, chacun lu par une requête de 60 registres, prennent environ 210 ms chacun. Ce temps comprend 143 ms pour la réponse, 9 ms pour la requête, les intervalles entre trames et une hypothèse de 50 ms pour le traitement par l’appareil. Le cycle dure environ 2,1 s. Si un compteur devient indisponible avec un délai de 1 s et 2 nouvelles tentatives, il ajoute 3 s. Le cycle atteint 5,1 s ; un intervalle de transmission de 5 s comporte alors des lacunes pour les 10 compteurs. Le guide d’interrogation et de nouvelles tentatives explique comment dimensionner ce budget.

Les enregistrements dupliqués ou tardifs proviennent généralement de la chaîne de données après la passerelle. Comparez l’enregistrement local de la passerelle à celui du système récepteur. Une nouvelle tentative peut également dupliquer une lecture côté Modbus si la réponse initiale arrive après le délai d’attente.

Clore le défaut avec des preuves

Une fois le défaut corrigé, consignez :

  • le symptôme, avec la requête et la réponse brutes ;
  • la cause trouvée et l’unique modification apportée ;
  • l’essai réussi ensuite, dans deux états de fonctionnement ;
  • un essai avec un appareil éteint, montrant que les autres continuent à transmettre leurs mesures.

Conservez ces éléments dans le dossier de réception décrit par le guide de mise en service Modbus RS-485.

Diagnostics dans Edge

Edge teste une connexion Modbus par étapes. Pour Modbus TCP, le test de connexion envoie un ping à l’hôte, résout son nom et ouvre une connexion TCP vers le port. Il affiche le résultat et la latence de chaque étape. Le ping est indicatif, car beaucoup d’appareils et de pare-feu bloquent ICMP. Le test réussit lorsque la connexion TCP s’ouvre. Pour une connexion série, il vérifie que le port série existe et correspond à un périphérique série. Cela ne prouve pas qu’un appareil sur le bus répond. C’est le rôle du test de capteur : il envoie une véritable requête de lecture avec l’identifiant d’unité, le code de fonction (01 à 04) et l’adresse saisis, puis attend la réponse pendant 5 s. Il applique ensuite les options d’inversion des mots et des octets et affiche la valeur décodée, pour comparer les ordres d’octets à l’afficheur de l’appareil. Après l’ajout de l’appareil, chaque capteur présente un indicateur de qualité des données : le pourcentage de lectures attendues reçues au cours des 15 dernières minutes. Utilisez ces trois tests dans cet ordre. Le premier qui échoue indique où se situe le défaut.

Ce guide fait partie de la série Modbus et RS-485.

Questions fréquentes

Pourquoi mon appareil Modbus ne répond-il pas ?

Sur un bus série, les causes habituelles sont un débit en bauds, une parité ou des bits d’arrêt incorrects, une mauvaise adresse, des conducteurs A/B inversés, un deuxième maître ou une trame corrompue : un appareil qui reçoit une trame avec une erreur CRC ne répond pas. Un délai d’attente du maître plus court que la transmission de la réponse donne aussi l’impression d’un silence. En Modbus TCP, vérifiez l’adresse IP, le port 502, les règles de pare-feu, l’identifiant d’unité et la limite de connexions de l’appareil.

Que signifie le code d’exception Modbus 02 ?

Adresse de données illégale. L’appareil ne possède pas de registre à l’adresse demandée, ou le bloc demandé dépasse la fin de sa table de registres ou traverse une lacune. Vérifiez la convention d’adressage (le registre 40001 correspond à l’adresse de protocole 0) et le nombre de registres demandé.

Que signifie l’exception Modbus 0B ?

Absence de réponse de l’appareil cible de la passerelle. La passerelle a reçu votre requête, mais l’appareil série en aval n’a pas répondu. Examinez le côté série : adresse, réglages et câblage.

Pourquoi ma valeur Modbus semble-t-elle fausse ?

La liaison fonctionne, mais le décodage ne correspond pas à la table des registres. Comparez les mots bruts à la table : convention d’adressage, type de données, ordre des mots et facteur d’échelle.