Interfaces des compteurs

Table de registres Modbus : adresses, types et échelles

Lire une table Modbus : registres d’entrée et de maintien, adresses 40001 ou base zéro, valeurs 32/64 bits, ordre des mots et échelles.

Une table de registres Modbus répertorie les valeurs publiées par un appareil et leurs adresses. 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.

Les quatre tables de registres

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

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.

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 jusqu'à 30 registres et les transmet sur le réseau maillé Zigbee.

Questions fréquentes

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.

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.