Interfaces des compteurs

Table de registres Modbus : adresses, types et échelles

Ce que contient une table de registres Modbus et comment la lire : quatre types de registres, une ligne d’exemple, adresses 40001, valeurs 32 bits.

Modbus est un protocole de communication ouvert pour les compteurs, automates et capteurs : un maître (le client en Modbus TCP) interroge des valeurs que chaque appareil publie dans des registres numérotés. Une table de registres Modbus est le tableau de la documentation d’un appareil qui répertorie chaque valeur publiée et l’endroit où la lire. Pour chaque valeur, elle doit préciser la table de registres, l'adresse, le type de données, l'ordre des mots, le facteur d'échelle et l'unité. La plupart des valeurs Modbus erronées proviennent de l'un de ces six paramètres, plutôt que de la connexion. Ce guide explique chacun d'eux et montre comment vérifier le décodage.

Ce guide fait partie de la série Modbus et RS-485. Les mêmes règles s'appliquent à Modbus RTU et à Modbus TCP.

Pour le protocole autour de la table, ses requêtes, ses codes de fonction et ses exceptions, voir Qu’est-ce que Modbus ?.

Lire une table de registres : une ligne d’exemple

Le document de protocole d’Eastron pour le compteur triphasé SDM630 commence sa table de registres d’entrée par la tension phase 1-neutre à la référence 30001, adresse de départ 00 00 en hexadécimal, en volts, et précise que chaque valeur est un flottant IEEE 754 occupant deux registres. Détaillée champ par champ, cette ligne se lit ainsi :

ChampDans la ligneCe qu’il indique
NomTension phase 1-neutreLa mesure
Référence30001Table 3, registres d’entrée, registre 1
Code de fonction04, lecture des registres d’entréeLa fonction qui lit cette table
Adresse dans la requête0 (0x0000)L’adresse de protocole en base zéro
Type et longueurfloat32, 2 registresLire les deux registres et les décoder ensemble
Ordre des motsNormal ou inversé, réglé sur le compteurÀ vérifier sur une valeur réelle, pas d’après le réglage par défaut
Unité et échelleV, sans facteur d’échelleLe flottant décodé est déjà en volts

La requête est donc la fonction 04, adresse 0, quantité 2. Une réponse 4366 0000, mot de poids fort en premier, donne 230,0 V. Comparez-la avec l’afficheur du compteur avant de lire le reste de la table. La page du SDM630-Modbus présente davantage de cette table et un modèle Edge pour le compteur.

Les quatre types de registres Modbus

Le protocole applicatif Modbus définit quatre tables, chacune associée à ses propres codes de fonction :

TableTailleAccèsLecture avecÉcriture avecRéférence classique
Bobines1 bitLecture et écriture0105, 150xxxx
Entrées discrètes1 bitLecture seule02Aucune1xxxx
Registres d'entrée16 bitsLecture seule04Aucune3xxxx
Registres de maintien16 bitsLecture et écriture0306, 164xxxx

Chaque registre fait 16 bits, soit deux octets transmis octet de poids fort en premier ; les bobines et les entrées discrètes sont des bits. Chaque table va de l'adresse 0 à 65 535 dans la requête. Les compteurs d'énergie publient généralement leurs mesures dans les registres d'entrée ou de maintien, et leurs réglages dans les registres de maintien. Utilisez le code de fonction indiqué par la table. Lire un registre d'entrée avec la fonction 03 renvoie une autre valeur ou une exception.

Conventions d'adressage

Une même adresse peut être écrite de plusieurs façons dans une table de registres. La requête transmise utilise toujours une adresse qui commence à zéro :

Notation dans la tableSignificationAdresse dans la requête
40001Référence classique à cinq chiffres : table 4, registre 10
400001Référence étendue à six chiffres0
1 (numérotation à partir de 1)Registre 1 de la table indiquée0
0 ou 0x0000 (numérotation à partir de 0)Adresse du protocole0

Si une table mélange plusieurs conventions ou si l'outil de configuration en attend une autre, une erreur de décalage d'une position apparaît : chaque valeur provient du registre voisin. Vérifiez d'abord la convention sur une valeur connue. Le convertisseur d'adresses Modbus permet de passer d'une notation à l'autre :

Types de données

Un registre contient 16 bits. La table précise le type représenté par ces bits :

TypeRegistresPlage ou précision
uint1610 à 65 535
int161−32 768 à 32 767
uint32, int322Environ ±2,1 milliards (signé) ou 0 à 4,29 milliards
float32 (IEEE 754)2Environ 7 chiffres significatifs
uint64, int644Entiers exacts d'au moins 18 chiffres
float644Environ 15 à 16 chiffres significatifs

Les mêmes bits produisent des nombres différents selon le type choisi. La valeur de registre 0xFFF6 correspond à 65 526 en uint16 et à −10 en int16. Déterminez le signe à partir de la table, pas de la valeur affichée. Les régulateurs frigorifiques en sont un cas fréquent : un congélateur à −18,0 °C transmet −180 dixièmes, qui se lisent 65 356 si le registre est décodé comme non signé. Le guide des régulateurs frigorifiques répertorie les registres de température signés des régulateurs Danfoss, Carel et Dixell.

Un float32 conserve environ sept chiffres significatifs. Un index d'énergie stocké en float32 à 12 345 678,9 kWh ne peut plus représenter une variation de 0,1 kWh. C'est pourquoi de nombreux compteurs publient aussi l'énergie comme entier sur 32 ou 64 bits.

Ordre des mots dans les valeurs sur 32 ou 64 bits

La spécification Modbus définit l'ordre des octets dans un registre : octet de poids fort en premier. Elle ne définit pas l'ordre des registres d'une valeur qui en occupe plusieurs ; les fabricants peuvent donc différer. On décrit l'ordre à l'aide des octets de la valeur, A étant le plus significatif :

OrdreRegistres lusDésignation courante
ABCDMot de poids fort, puis mot de poids faibleBig-endian, mot de poids fort en premier
CDABMot de poids faible, puis mot de poids fortMots permutés
BADCMot de poids fort en premier, octets permutésOctets permutés
DCBAMot de poids faible en premier, octets permutésLittle-endian

Un ordre incorrect donne une valeur apparemment aléatoire, plutôt qu'une valeur légèrement décalée. Un compteur uint32 à 100 000 est lu sous forme des mots 0x0001 puis 0x86A0 dans l'ordre ABCD. Interprétés dans le mauvais ordre, les mêmes mots donnent 2 258 632 705 :

Le décodeur de registres Modbus présente les quatre ordres côte à côte. Le convertisseur IEEE 754 montre l'encodage d'un nombre flottant.

Échelles et unités

De nombreux compteurs transmettent un entier et un facteur d'échelle. La table peut exprimer ce facteur de trois façons :

  • Facteur fixe. « Tension, uint16, 0,1 V » : une valeur brute de 2 305 correspond à 230,5 V.
  • Puissance de dix. « Énergie, int32, 10−2 kWh » : une valeur brute de 1 234 567 correspond à 12 345,67 kWh.
  • Registre de facteur d'échelle. Les modèles SunSpec employés par de nombreux onduleurs publient un registre distinct contenant la puissance de dix d'un groupe de valeurs. Lisez le facteur dans la même requête que la valeur, car il peut changer.

Appliquez les étapes dans l'ordre : décodez le type, appliquez l'échelle, puis l'unité. Notez à quel endroit se fait la mise à l'échelle. Si l'appareil, un Gateway et la plateforme de destination appliquent chacun un facteur, la valeur est multipliée plusieurs fois. Une valeur 10 ou 1 000 fois trop élevée en est un signe habituel.

Pour les index d'énergie, notez aussi la valeur maximale avant retour à zéro et le comportement de l'appareil lors d'un dépassement ou d'une remise à zéro. Le guide de mise en service des compteurs à impulsions traite le même problème pour les compteurs d'impulsions.

Mots d'état et champs de bits

Un registre d'état regroupe des indicateurs dans les 16 bits d'un registre. Le bit 0 est celui de poids faible. La valeur d'état 0x0025 s'écrit 0000 0000 0010 0101 en binaire : les bits 0, 2 et 5 sont donc actifs. La table précise la signification de chaque bit et indique si 1 signifie actif ou bon état.

Deux règles sécurisent le traitement des champs de bits :

  • Consultez la table pour connaître la signification. La position d'un bit ne définit pas une alarme. Notez ce que signifient 0 et 1 pour chaque bit utilisé.
  • N'écrivez pas un mot d'état ou de commande entier pour changer un seul bit. Vous écraseriez les autres bits avec les dernières valeurs lues par votre logiciel. Utilisez la méthode documentée pour l'appareil : registre de commande distinct, fonction 22 (écriture masquée) si elle est prise en charge, ou séquence de lecture, modification et écriture approuvée par le responsable de l'équipement.

Valeurs indisponibles et invalides

De nombreux appareils renvoient un code fixe lorsque la mesure est indisponible, par exemple 0xFFFF, 0x8000 ou un NaN flottant. SunSpec définit ces codes pour ses modèles ; les autres tables indiquent leurs propres codes. Si la table en fournit, traitez-les avant la mise à l'échelle et enregistrez la mesure comme manquante, pas comme un nombre. Une valeur de −32 768 V est un code, pas une mesure.

Vérifier chaque point

Une réponse sans erreur prouve la connexion, pas la signification de la valeur. Pour chaque point :

  1. Notez les mots bruts du registre, la valeur décodée et la valeur mise à l'échelle.
  2. Comparez-les à l'affichage de l'appareil ou à un instrument de référence au même instant.
  3. Répétez l'opération dans un second état de fonctionnement : charge activée puis désactivée, ou consigne modifiée.
  4. Vérifiez une valeur négative si le point peut devenir négatif, comme une puissance exportée.
  5. Conservez toutes ces données dans le procès-verbal de réception.

Le guide de mise en service Modbus RS-485 donne la procédure complète. Le guide de dépannage Modbus couvre les réponses d'exception et les valeurs plausibles mais erronées.

Tables de registres dans le répertoire des appareils et Edge

Le répertoire des appareils rassemble les tables de registres de compteurs Modbus courants, avec le type de données et l'ordre des mots de chaque point. Edge lit les appareils Modbus TCP et Modbus RTU depuis le Gateway. Pour chaque point, définissez le code de fonction, l'adresse à partir de zéro, le type de données sur 16 ou 32 bits, l'ordre des octets et des mots, puis un multiplicateur et un décalage. Edge traite un NaN flottant comme une valeur indisponible. Un code entier comme 0xFFFF reste un nombre : si la table en définit un, traitez-le au moyen d'un point calculé. Pour un compteur éloigné du Gateway, une interface Modbus ZMB lit localement de nombreux registres, 8 ou plus et jusqu'à 16 ou plus selon le modèle, et les transmet sur le réseau maillé Zigbee.

Questions fréquentes

Qu’est-ce qu’une table de registres Modbus ?

Le tableau de la documentation Modbus d’un appareil qui répertorie chaque valeur publiée. Chaque ligne donne le nom de la valeur, la table de registres, l’adresse, le type de données et le nombre de registres, ainsi que l’unité ou le facteur d’échelle. Certaines tables indiquent aussi l’ordre des mots, l’accès (lecture ou écriture) et le code d’une valeur indisponible. Chaque fabricant rédige sa propre table, qui peut changer d’un modèle ou d’une version de micrologiciel à l’autre.

Quels sont les types de registres Modbus ?

Modbus comporte quatre tables de données. Les bobines sont des bits en lecture et écriture, les entrées discrètes des bits en lecture seule. Les registres d’entrée sont des mots de 16 bits en lecture seule, lus avec la fonction 04. Les registres de maintien sont des mots de 16 bits lus avec la fonction 03 et, si l’appareil le permet, écrits avec les fonctions 06 et 16. Les mesures des compteurs se trouvent en général dans les registres d’entrée ou de maintien.

Quelle est la différence entre les registres de maintien et les registres d’entrée ?

Tous deux contiennent des valeurs sur 16 bits. Les registres d’entrée sont en lecture seule et se lisent avec la fonction 04. Les registres de maintien se lisent avec la fonction 03 et, lorsque l’appareil le permet, s’écrivent avec les fonctions 06 et 16. Beaucoup de compteurs placent les mesures dans les registres d’entrée et les réglages dans ceux de maintien, mais certains utilisent uniquement les registres de maintien.

Que signifie l’adresse Modbus 40001 ?

C’est le premier registre de maintien dans la notation de référence classique : le chiffre initial 4 désigne la table des registres de maintien. La requête transmise utilise l’adresse 0 avec la fonction 03. Certaines tables utilisent une notation à six chiffres (400001) ou de simples nombres commençant à 0 ou à 1.

Quelle est la taille d’un registre Modbus ?

16 bits, soit deux octets, transmis octet de poids fort en premier. Un entier ou un flottant sur 32 bits occupe deux registres consécutifs, une valeur sur 64 bits quatre. Chacune des quatre tables va de l’adresse 0 à 65 535 dans la requête, mais un appareil ne publie que les adresses de sa propre table.

Qu’est-ce que l’ordre des mots en Modbus ?

Une valeur sur 32 bits occupe deux registres de 16 bits. La spécification Modbus ne précise pas lequel contient la moitié de poids fort : l’ordre dépend donc du fabricant. Si le décodage donne une valeur incohérente, essayez de permuter les deux mots (ABCD devient CDAB).

Combien de registres peut-on lire dans une requête ?

La spécification du protocole applicatif Modbus autorise jusqu’à 125 registres avec la fonction 03 ou 04. De nombreux appareils en acceptent moins ; certains renvoient une exception si un bloc traverse une zone vide de leur table.