Registre Modbus : word, bit, real, et l'erreur Illegal Data Address
Un point Modbus est configuré. L'adresse est la bonne, le câblage fonctionne, l'automate répond aux autres requêtes. Et pourtant, ce point ne remonte jamais rien. Pas d'erreur affichée à l'opérateur, pas d'alarme. Juste une valeur qui reste vide.
C'est le symptôme le plus trompeur de Modbus TCP : une mauvaise lecture ne casse rien de façon bruyante. Elle échoue en silence, au niveau du protocole, et le silence est facile à confondre avec un problème de câblage ou d'automate.
Les 4 tables, et pourquoi ça ne pardonne pas
Modbus organise sa mémoire en quatre tables distinctes. Chacune a son propre espace d'adressage et son propre code fonction :
| Table | Code fonction | Accès | Contenu | |---|---|---|---| | Coil | 01 (lecture), 05/15 (écriture) | Lecture/écriture | Un bit, sortie tout ou rien | | Input status (discrete input) | 02 | Lecture seule | Un bit, entrée tout ou rien | | Holding register | 03 (lecture), 06/16 (écriture) | Lecture/écriture | Un mot de 16 bits | | Input register | 04 | Lecture seule | Un mot de 16 bits |
Deux tables partagent le même type de donnée (Holding et Input register sont toutes les deux des mots de 16 bits), et deux partagent le même mode d'accès (Coil et Holding sont toutes les deux modifiables). Rien n'empêche de se tromper de table pour une adresse qui, par ailleurs, existe bel et bien sur l'automate.
Le résultat de cette confusion est une erreur Illegal Data Address. Elle dit une seule chose : « cette table, à cette adresse, pour ce code fonction, n'existe pas ». Elle ne dit pas quelle table utiliser à la place. Et sur beaucoup d'implémentations côté maître, cette erreur est journalisée dans un log technique que personne ne consulte au quotidien. L'opérateur, lui, voit simplement un champ vide sur son tableau de bord.
La documentation constructeur ne suffit pas toujours à trancher : deux automates de la même gamme peuvent exposer une variable identique sur des tables différentes selon la version de firmware. La méthode fiable reste de tester les quatre codes fonction sur l'adresse suspecte avant de conclure à une panne.
Un flottant qui tient sur deux registres
Un registre Modbus fait 16 bits. Un flottant IEEE754 simple précision en fait 32. La conséquence est mécanique : toute valeur décimale (une température, une puissance, un débit) occupe deux registres consécutifs, jamais un seul.
Sur une table de registres réelle vue lors d'un échange technique, une
valeur d'énergie produite en kWh était répartie ainsi : le registre 40010
portait les 16 bits de poids fort, le registre 40011 les 16 bits de poids
faible. Lire seulement 40010 et l'interpréter comme un entier donnait un
nombre sans rapport avec la mesure réelle.
Ce découpage porte un nom : le word order (ou byte order selon les implémentations), et il n'est pas normalisé de façon universelle. Deux conventions coexistent sur le terrain :
- high-first (big-endian au niveau des mots) : le premier registre lu porte les bits de poids fort.
- low-first (little-endian au niveau des mots) : c'est l'inverse, le second registre porte le poids fort.
Aucune des deux n'est plus « standard » que l'autre. Chaque automate impose la sienne, et rien dans une lecture Modbus brute ne permet de la deviner sans le documenter ou le tester : une valeur mal recomposée reste un nombre parfaitement plausible, juste faux.
Un bit isolé dans un mot entier
Troisième piège, plus discret : un registre de 16 bits ne porte pas toujours
une seule valeur. Sur la même table de registres, un mot unique regroupait
plusieurs statuts logiques, chacun sur un bit distinct. Par exemple, le bit
3 du registre 30 correspond à un état « vanne DP-101 ouverte ».
Lire ce registre comme un mot entier renvoie un nombre (disons 8) qui n'a aucun sens tant qu'il n'est pas décomposé en bits. Deux points de mesure différents peuvent ainsi partager exactement la même adresse Modbus, avec un bit différent chacun. Un outil qui ne gère qu'un seul format par adresse en perd la moitié.
Nodal traite ces trois cas comme trois formats de lecture différents pour
un même point : word (le registre entier, le comportement par défaut),
bit (un bit précis d'un mot), et real (un flottant sur deux registres,
avec le choix de l'ordre des mots). Le format se configure une fois par
point, et l'agent applique le bon décodage à chaque lecture.
Vérifier avant de soupçonner le matériel
Face à un point Modbus muet, l'ordre de vérification qui évite de perdre du temps sur le mauvais suspect :
- Confirmer que l'adresse existe réellement dans la table visée, pas seulement dans la documentation, dans la réponse de l'automate.
- Tester les quatre codes fonction sur cette adresse plutôt que de partir du principe que la documentation constructeur est à jour.
- Si la valeur revient mais semble incohérente, vérifier s'il s'agit d'un flottant sur deux registres avant de suspecter un problème de calibrage.
- Si un nombre revient mais ne colle à rien de connu, vérifier si le registre encode plusieurs bits distincts plutôt qu'une valeur unique.
Dans la grande majorité des cas, un point Modbus qui ne remonte rien n'a pas de défaut matériel. Il a une adresse envoyée à la mauvaise table, ou une valeur mal recomposée. Le diagnostic prend cinq minutes une fois qu'on sait où regarder.
Nodal gère ces trois formats (word, bit, real) au niveau de la passerelle, avec le bon ordre des mots configuré une fois par point.
Questions fréquentes
- Que signifie "Illegal Data Address" en Modbus ?
- Le maître Modbus a demandé une adresse ou une table que l'automate ne reconnaît pas pour la fonction utilisée. C'est une erreur protocole, pas un défaut matériel : la cause la plus fréquente est un code fonction qui ne correspond pas à la table réelle du point (par exemple lire en Holding register une adresse qui n'existe qu'en Input register).
- Comment lire un flottant 32 bits sur un registre Modbus ?
- Un flottant IEEE754 32 bits occupe deux registres consécutifs (16 bits chacun). Il faut recomposer les deux moitiés dans le bon ordre : high-first si le premier registre porte les bits de poids fort, low-first dans le cas contraire. Les automates ne s'accordent pas tous sur cet ordre, il se détermine au cas par cas.

Dayen Driss
CEO, Nodal
Fondateur de Nodal, où il développe la passerelle Edge et la plateforme cloud.