Comment fonctionne le décodeur de registres Modbus
Modbus transporte les données dans des registres de 16 bits, et chaque registre voyage octet de poids fort en premier. C’est tout ce que fixe le protocole. Une température envoyée en flottant 32 bits, ou un compteur d’énergie en entier 64 bits, se répartit sur deux ou quatre registres, et l’ordre de ces registres est choisi par le fabricant. La plupart des appareils envoient d’abord le registre de poids fort, certains celui de poids faible, et quelques-uns inversent aussi les deux octets de chaque registre.
Le décodeur prend les registres exactement tels que votre maître, passerelle ou outil de test les affiche, et les décode dans les quatre ordres à la fois. L’ordre s’écrit avec les lettres des octets de la valeur, A étant le plus significatif : ABCD est big-endian, CDAB l’inversion de mots courante, BADC inverse les octets de chaque registre, DCBA est entièrement little-endian.
Trouver le bon ordre d’octets
Lisez une paire de registres en sachant à peu près ce que l’appareil devrait indiquer, et cherchez la ligne qui a du sens. Les registres 0x4120 0x0000 valent 10,0 en ABCD. Lus en CDAB, ils donnent 2,3 × 10⁻⁴¹, une valeur qu’aucun capteur n’indique ; le décodeur grise ces lignes. Si l’appareil envoie d’abord le registre de poids faible, vous verrez 0x0000 0x4120, et la ligne CDAB affiche le 10.
Une fois l’ordre connu pour une valeur, il est le même pour toutes les valeurs de cet appareil et de ce type. Inscrivez-le dans la configuration du maître plutôt que d’inverser des octets dans le programme de l’automate.
Mise à l’échelle et types de données
Beaucoup d’appareils envoient des entiers avec une échelle implicite : une pression de 1234 qui signifie 12,34 bar, ou une température en dixièmes de degré. Saisissez le facteur d’échelle et le décalage de la table des registres, et le décodeur affiche la valeur physique à côté de la valeur brute ; la valeur vaut brut × facteur d’échelle + décalage. Le même facteur s’applique en sens inverse quand vous encodez une valeur à écrire.
INT16 et UINT16 ne diffèrent que par la lecture du bit de poids fort : 0xFFFF vaut 65535 non signé et −1 signé. La plupart des tables de registres indiquent le type de chaque adresse ; sinon, une valeur qui ne devrait jamais être négative est en général non signée.
Numéros de registre et adresses
Les manuels listent souvent les registres sous la forme 40001, 30001 ou 400001. C’est la convention Modicon : le premier chiffre désigne la table (4 pour les registres de maintien, 3 pour les registres d’entrée, 0 pour les bobines, 1 pour les entrées TOR) et le reste compte à partir de 1. La requête sur la ligne porte l’adresse comptée à partir de 0 : 40001 est donc l’adresse 0 des registres de maintien, lue avec le code fonction 03. Saisissez la référence pour voir l’adresse protocole, les codes fonction et les registres qu’occupe une valeur sur plusieurs registres.
Un décalage d’une unité est ici la cause la plus fréquente d’une valeur plausible mais fausse : le maître lit la seconde moitié d’une valeur et la première moitié de la suivante.
Questions fréquentes
Pourquoi certaines lignes affichent-elles NaN ?
Un flottant dont les bits d’exposant sont tous à un n’est pas un nombre, ou est infini. Un mauvais ordre d’octets produit souvent ce motif ; un appareil qui signale volontairement un défaut capteur par NaN aussi. Pour ce second cas, consultez le manuel de l’appareil.
Puis-je saisir les registres en une seule chaîne hexadécimale ?
Oui. Huit ou seize chiffres hexadécimaux sans espace sont découpés en registres de quatre chiffres : 41200000 est lu comme 0x4120 0x0000.
Et Modbus TCP ?
La disposition des registres est la même en TCP et en RTU ; seule la trame diffère. L’ordre des octets des valeurs sur plusieurs registres dépend de l’appareil, pas du transport.