Codes Fonction Modbus : Liste Complète et Exemples

Par | juillet 28, 2026

Le code fonction est le premier octet de la PDU. Il indique au serveur quelle opération effectuer. La spécification en définit une vingtaine, mais six suffisent pour presque tout le travail de terrain.

Cette page est une référence. Le tableau complet d’abord, le détail des trames ensuite.

Tableau de référence

DécHexNomTable viséeQuantité maxSérie uniquement
10x01Read CoilsCoils2000 bits
20x02Read Discrete InputsDiscrete inputs2000 bits
30x03Read Holding RegistersHolding registers125 registres
40x04Read Input RegistersInput registers125 registres
50x05Write Single CoilCoils1 bit
60x06Write Single RegisterHolding registers1 registre
70x07Read Exception StatusOui
80x08DiagnosticsOui
110x0BGet Comm Event CounterOui
120x0CGet Comm Event LogOui
150x0FWrite Multiple CoilsCoils1968 bits
160x10Write Multiple RegistersHolding registers123 registres
170x11Report Server IDOui
200x14Read File RecordFichiers
210x15Write File RecordFichiers
220x16Mask Write RegisterHolding registers1 registre
230x17Read/Write Multiple RegistersHolding registers125 lus / 121 écrits
240x18Read FIFO QueueRegistres31 registres
430x2BEncapsulated Interface Transport

Les plages 65 à 72 et 100 à 110 sont réservées aux codes fonction propriétaires. Un constructeur peut y placer ce qu’il veut. Aucune interopérabilité n’est garantie sur ces codes.

Les six codes que vous utiliserez vraiment

0x03 — Read Holding Registers

Le code le plus utilisé de tout le protocole. Lit une plage contiguë de registres 16 bits en lecture/écriture.

Requête — lire 2 registres à partir de l’adresse 0, esclave 1 : 01 03 00 00 00 02 C4 0B

ChampHexValeurRôle
Adresse esclave011Esclave interrogé
Code fonction033Read Holding Registers
Adresse de départ00 000Premier registre lu, plage 0 à 65535
Quantité00 022Nombre de registres, 1 à 125
CRCC4 0BPoids faible transmis en premier

Réponse : 01 03 04 00 6E 00 05 5B ED

ChampHexValeurRôle
Adresse esclave011Esclave qui répond
Code fonction033Écho du code demandé
Nombre d’octets0442 × quantité
Registre 000 6E110Première valeur
Registre 100 055Seconde valeur
CRC5B ED

Le champ « nombre d’octets » vaut toujours le double de la quantité demandée. S’il ne correspond pas, l’équipement a un défaut d’implémentation.

0x04 — Read Input Registers

Structure de trame strictement identique à 0x03, seul le code fonction change. La différence est la table visée : registres en lecture seule.

Beaucoup d’équipements exposent les mêmes données sur 0x03 et 0x04. D’autres n’implémentent que 0x03. Si une lecture 0x04 renvoie l’exception 01, essayez 0x03 avec la même adresse.

0x01 — Read Coils

Lit des bits. La réponse les emballe huit par octet, bit de poids faible en premier.

Requête — lire 19 bits à partir de l’adresse 0 : 01 01 00 00 00 13 7D C7

ChampHexValeurRôle
Adresse esclave011
Code fonction011Read Coils
Adresse de départ00 000Premier bit lu
Quantité00 1319Nombre de bits, 1 à 2000
CRC7D C7

Réponse : 01 01 03 CD 6B 05 42 82

ChampHexValeurRôle
Adresse esclave011
Code fonction011
Nombre d’octets033⌈19 / 8⌉ arrondi au supérieur
Octet 1CDBits 0 à 7
Octet 26BBits 8 à 15
Octet 305Bits 16 à 18, plus 5 bits de bourrage à 0
CRC42 82

L’octet CD vaut 1100 1101 en binaire. En lecture de poids faible vers poids fort, cela donne les bits 0 à 7 : 1, 0, 1, 1, 0, 0, 1, 1. L’ordre est contre-intuitif la première fois. Le bit 0 est celui le plus à droite.

Les bits de bourrage du dernier octet sont toujours à zéro. Ne les interprétez pas.

0x02 — Read Discrete Inputs

Identique à 0x01 dans la structure. Vise les discrete inputs en lecture seule.

0x06 — Write Single Register

Écrit une valeur dans un holding register. La réponse est un écho exact de la requête.

Requête et réponse sont identiques : 01 06 00 01 00 03 98 0B

ChampHexValeurRôle
Adresse esclave011
Code fonction066Write Single Register
Adresse00 011Registre visé
Valeur00 033Valeur écrite
CRC98 0B

L’écho est la confirmation. Si vous recevez un écho, l’écriture est acceptée — mais cela ne garantit pas que l’équipement a agi sur le procédé, seulement qu’il a accepté la valeur.

0x10 — Write Multiple Registers

Écrit une plage contiguë. Jusqu’à 123 registres.

Requête — écrire 10 puis 258 aux adresses 1 et 2 : 01 10 00 01 00 02 04 00 0A 01 02 92 30

ChampHexValeurRôle
Adresse esclave011
Code fonction1016Write Multiple Registers
Adresse de départ00 011Premier registre écrit
Quantité00 022Nombre de registres, 1 à 123
Nombre d’octets0442 × quantité
Registre 100 0A10Première valeur
Registre 201 02258Seconde valeur
CRC92 30

Réponse — courte, elle ne renvoie pas les données : 01 10 00 01 00 02 10 08

ChampHexValeurRôle
Adresse esclave011
Code fonction1016
Adresse de départ00 011Confirme la plage écrite
Quantité00 022Confirme le nombre écrit
CRC10 08

C’est le code à privilégier pour écrire une valeur 32 bits ou un flottant : les deux registres sont écrits dans la même transaction, l’équipement ne voit jamais un état intermédiaire incohérent. Deux écritures 0x06 successives, elles, laissent une fenêtre où la valeur lue est fausse.

Les codes utiles mais moins connus

0x05 — Write Single Coil

La valeur n’est pas 0 ou 1. C’est 0xFF00 pour activer et 0x0000 pour désactiver. Toute autre valeur doit produire l’exception 03.

Requête et réponse sont identiques : 01 05 00 AC FF 00 4C 1B

ChampHexValeurRôle
Adresse esclave011
Code fonction055Write Single Coil
Adresse du bit00 AC172Bit visé
ValeurFF 00ONFF 00 = ON, 00 00 = OFF, rien d’autre
CRC4C 1B

Comme pour 0x06, la réponse est un écho.

0x0F — Write Multiple Coils

Écrit jusqu’à 1968 bits. Même emballage que pour la lecture : huit bits par octet, poids faible en premier.

Requête : 01 0F 00 00 00 0A 02 CD 01 70 68

ChampHexValeurRôle
Adresse esclave011
Code fonction0F15Write Multiple Coils
Adresse de départ00 000Premier bit écrit
Quantité00 0A10Nombre de bits, 1 à 1968
Nombre d’octets022⌈10 / 8⌉
Octet 1CDBits 0 à 7
Octet 201Bits 8 et 9, plus 6 bits de bourrage à 0
CRC70 68

0x16 — Mask Write Register

Le code que trop peu d’ingénieurs connaissent, et qui résout un vrai problème.

Pour changer un seul bit dans un mot de commande, le réflexe est de lire le registre, modifier le bit, réécrire le tout. Entre la lecture et l’écriture, un autre client peut avoir modifié un bit voisin. Vous l’écrasez.

Le code 0x16 fait l’opération dans l’équipement, de façon atomique :

Résultat = (Valeur_actuelle ET Masque_ET) OU (Masque_OU ET NON Masque_ET)

Requête et réponse sont identiques : 01 16 00 04 00 F2 00 25 67 EE

ChampHexValeurRôle
Adresse esclave011
Code fonction1622Mask Write Register
Adresse00 044Registre visé
Masque ET00 F2Bits conservés
Masque OU00 25Bits forcés à 1
CRC67 EE

Avec une valeur courante de 0x12, le résultat vaut 0x17. La réponse est un écho de la requête.

Tous les équipements ne l’implémentent pas. Testez avant de bâtir votre logique dessus.

0x17 — Read/Write Multiple Registers

Lecture et écriture dans une seule transaction. L’écriture est effectuée avant la lecture.

Intéressant sur un bus série chargé : vous divisez par deux le nombre d’échanges pour un schéma commande/retour d’état. Peu implémenté en pratique.

0x2B / 0x0E — Read Device Identification

Sous-fonction du transport encapsulé. Retourne des chaînes de caractères : nom du constructeur, code produit, version du micrologiciel, et parfois le nom du modèle et l’URL du constructeur.

Très utile en recensement de parc. Une passe de 0x2B/0x0E sur toutes les adresses vous donne un inventaire sans ouvrir une armoire. Support inégal selon les gammes.

Les codes de diagnostic série

Ces codes ne fonctionnent que sur liaison série. Sur Modbus TCP, ils retournent l’exception 01.

0x08 — Diagnostics porte des sous-fonctions sur 2 octets. Les plus utilisées :

Sous-codeFonction
0x0000Renvoie les données de la requête, test de boucle
0x0001Redémarre l’option de communication
0x0004Force le mode écoute seule
0x000BCompteur de messages sur le bus
0x000CCompteur d’erreurs de communication
0x000DCompteur d’erreurs d’exception
0x000ECompteur de messages destinés à ce serveur
0x000FCompteur de non-réponses
0x0012Compteur de dépassements de caractères

Le sous-code 0x0000 est un excellent test de liaison. Si l’écho revient correct, la couche physique et la temporisation sont bonnes. Le problème est alors ailleurs.

Le compteur 0x0012 est un indicateur direct de problème de câblage ou de temporisation.

0x11 — Report Server ID renvoie une identification propre au constructeur, plus un octet d’état marche/arrêt. Le format n’est pas normalisé.

Ce que la spécification ne garantit pas

Trois écarts à connaître avant de déclarer un équipement défectueux.

Le support des codes n’est pas obligatoire. Un équipement peut n’implémenter que 0x03 et 0x10. C’est conforme. L’exception 01 en réponse à 0x04 n’est pas un défaut.

Les limites de quantité sont des maximums théoriques. Beaucoup d’équipements plafonnent bien en dessous. Un compteur qui refuse une lecture de 125 registres mais accepte 30 est courant. Réduisez la taille du groupe avant de conclure.

Les plages contiguës ne le sont pas toujours. Une lecture couvrant un trou dans la cartographie renvoie l’exception 02, même si toutes les adresses demandées existent individuellement. Découpez vos groupes de poll selon les blocs réellement définis dans la documentation.

Questions fréquentes

Quelle est la différence entre le code fonction 03 et le code 04 ?

La table visée. Le 03 lit les holding registers, en lecture/écriture. Le 04 lit les input registers, en lecture seule. La trame est identique par ailleurs.

Pourquoi ma requête renvoie-t-elle le code fonction 0x83 ?

C’est une réponse d’exception. Le serveur ajoute 0x80 au code fonction pour signaler une erreur. L’octet suivant donne le code d’exception.

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

125 au maximum avec les codes 03 et 04, à cause de la limite de 253 octets pour la PDU. En écriture avec le code 16, la limite descend à 123.

Le code fonction 05 accepte-t-il la valeur 0x0001 ?

Non. Seules les valeurs 0xFF00 et 0x0000 sont valides. Toute autre valeur doit produire l’exception 03.

Comment écrire un flottant en Modbus ?

Avec le code 16 sur deux registres consécutifs, en une seule transaction. Vérifiez l’ordre des mots attendu par l’équipement avant d’écrire.

Les codes fonction sont-ils les mêmes en RTU et en TCP ?

Oui, à l’exception des codes de diagnostic série (07, 08, 11, 12, 17) qui ne sont pas disponibles sur Modbus TCP.