Codes Exception Modbus : Liste et Causes Réelles

Par | juillet 28, 2026

Une exception Modbus n’est pas une panne. C’est une réponse.

L’esclave a reçu votre requête, l’a comprise, et vous dit poliment qu’il refuse de l’exécuter. La liaison fonctionne. Le CRC est bon. Le problème est dans la requête, ou dans ce que vous supposez de l’équipement.

C’est une bonne nouvelle en mise en service : une exception vous donne bien plus d’information qu’un silence.

Comment reconnaître une exception

Deux marqueurs.

Le code fonction est augmenté de 0x80. Une requête FC 03 refusée revient avec 0x83. Une requête FC 10 refusée revient avec 0x90.

La PDU ne fait que deux octets : le code fonction modifié, puis le code d’exception.

01  83  02  C0 F1
│   │   │   └── CRC
│   │   └────── Code d'exception 02
│   └────────── 0x03 + 0x80
└────────────── Adresse esclave
Code fonctionRéponse d’exception
0x010x81
0x020x82
0x030x83
0x040x84
0x050x85
0x060x86
0x0F0x8F
0x100x90
0x160x96

Si votre logiciel affiche « erreur 0x83 » ou « erreur 131 », c’est de ça qu’il parle.

Tableau des codes

CodeNom normaliséEn clair
01Illegal FunctionCe code fonction n’est pas implémenté
02Illegal Data AddressCette adresse ou cette plage n’existe pas
03Illegal Data ValueCette valeur ou cette quantité est refusée
04Server Device FailureErreur interne pendant le traitement
05AcknowledgeAccepté, traitement long en cours
06Server Device BusyOccupé, réessayez plus tard
08Memory Parity ErrorErreur mémoire sur accès fichier
0AGateway Path UnavailableLa passerelle ne sait pas où router
0BGateway Target Device Failed to RespondL’équipement derrière la passerelle est muet

Les codes 07 et 09 ne sont pas utilisés.

Code 01 — Illegal Function

Ce que dit l’esclave : je ne sais pas faire cette opération.

Le code fonction n’est pas implémenté dans cet équipement, ou pas dans son état actuel.

Causes les plus probables

Le constructeur n’a implémenté qu’une partie des codes. C’est parfaitement conforme. Beaucoup de capteurs simples ne connaissent que 0x03 et 0x04.

Vous utilisez 0x04 alors que l’équipement n’expose ses mesures que sur 0x03. Très fréquent. Essayez l’autre code avec la même adresse.

Vous envoyez un code de diagnostic série — 0x07, 0x08, 0x0B, 0x0C, 0x11 — sur du Modbus TCP. Ces codes n’existent pas sur Ethernet.

Vous utilisez 0x16 ou 0x17, peu implémentés.

À faire : consultez la liste des codes supportés dans la documentation. Si elle n’existe pas, testez 0x03 en premier.

Code 02 — Illegal Data Address

Le plus fréquent de tous, et celui qui piège le plus souvent.

Ce que dit l’esclave : cette adresse, ou une adresse de la plage demandée, n’existe pas chez moi.

Attention à la subtilité : l’exception porte sur toute la plage, pas seulement sur l’adresse de départ. Une lecture de 10 registres à partir de l’adresse 95 échoue si l’équipement s’arrête à l’adresse 99.

Causes par ordre de fréquence

  1. Décalage de base. La documentation indique 40001, vous devez demander l’adresse 0. Symptôme voisin : une lecture qui fonctionne mais renvoie des valeurs décalées d’un cran.
  2. Plage qui déborde la fin d’un bloc. Réduisez la quantité et réessayez.
  3. Trou dans la cartographie. L’équipement définit les registres 0 à 9 et 20 à 29. La lecture de 0 à 29 est refusée, alors que chaque adresse existe individuellement. Découpez vos groupes de poll selon les blocs réels.
  4. Mauvaise table. L’adresse existe en holding register mais pas en input register.

Méthode de recherche rapide : lisez un seul registre à l’adresse 0, puis 1, puis 10, puis 100. Vous identifiez la base et les limites du bloc en moins d’une minute.

Code 03 — Illegal Data Value

Ce que dit l’esclave : la valeur contenue dans la requête ne me convient pas.

Attention : ce code concerne la structure de la requête, pas la plausibilité physique de la valeur. Un esclave qui refuse une consigne hors de sa plage de fonctionnement renvoie plutôt le code 04, ou accepte et écrête silencieusement.

Causes les plus probables

Quantité invalide. Vous demandez 0 registre, ou plus que le maximum : 126 registres avec 0x03, 124 avec 0x10, 2001 bits avec 0x01.

Valeur interdite avec le code 0x05. Seuls 0xFF00 et 0x0000 sont valides pour écrire un bit. La valeur 0x0001 doit être refusée.

Incohérence dans une écriture multiple. Le champ « nombre d’octets » ne correspond pas au double de la quantité annoncée.

Limite interne plus basse que la norme. Beaucoup d’équipements plafonnent bien en dessous des 125 registres autorisés. Un compteur qui refuse 125 mais accepte 30 est courant.

À faire : divisez la taille du groupe de lecture par deux et réessayez. Si ça passe, vous avez trouvé une limite constructeur.

Code 04 — Server Device Failure

Ce que dit l’esclave : j’ai essayé, quelque chose s’est mal passé chez moi.

C’est un code fourre-tout. La requête était valide, mais le traitement a échoué.

Causes

Défaut interne de l’équipement : capteur en défaut, mémoire, autodiagnostic.

Écriture dans un registre verrouillé, ou tentative de modification d’un paramètre pendant que l’équipement est en marche. De nombreux variateurs refusent la modification de certains paramètres hors arrêt.

Valeur hors plage physique acceptable.

Chez certains constructeurs, code utilisé par défaut pour toute erreur qu’ils n’ont pas voulu qualifier.

À faire : vérifiez l’état de l’équipement en local. Si l’exception ne concerne qu’une écriture précise, cherchez une condition de verrouillage dans la documentation.

Code 05 — Acknowledge

Ce que dit l’esclave : j’ai accepté votre requête, mais ça va prendre du temps.

Ce n’est pas une erreur. C’est une réponse d’attente, prévue pour éviter que le maître ne déclenche un timeout pendant une opération longue — écriture en mémoire non volatile, redémarrage, changement de configuration.

À faire : ne réémettez pas la requête. Interrogez l’état avec le code 0x0B pour savoir quand le traitement est terminé. Beaucoup de pilotes traitent ce code comme une erreur et relancent la requête, ce qui peut interrompre l’opération en cours.

Code 06 — Server Device Busy

Ce que dit l’esclave : je suis occupé, je n’ai pas pris votre requête.

Différence importante avec le code 05 : ici, la requête n’a pas été acceptée. Il faut la réémettre.

Causes

Cadence d’interrogation trop élevée pour cet équipement. Certains capteurs bon marché ne suivent pas au-delà de quelques requêtes par seconde.

Traitement long en cours issu d’une requête précédente.

Plusieurs clients TCP interrogent le même équipement simultanément et saturent sa file.

À faire : ralentissez la cadence, ajoutez un délai entre requêtes, et implémentez une réémission avec temporisation croissante plutôt qu’une relance immédiate en boucle.

Codes 0A et 0B — les passerelles

Ces deux codes ne viennent jamais d’un équipement terminal. Ils viennent d’une passerelle Modbus TCP/RTU.

0A — Gateway Path Unavailable. La passerelle ne sait pas vers quel port série router la requête. Configuration de routage absente ou incorrecte, ou identifiant d’unité non déclaré.

0B — Gateway Target Device Failed to Respond. La passerelle a bien transmis la requête sur le bus série, mais aucun esclave n’a répondu dans le délai imparti.

Le code 0B est une information précieuse, et souvent mal exploitée : il vous dit que le réseau Ethernet et la passerelle fonctionnent. Le problème est en aval, sur le bus série. Adresse esclave incorrecte, équipement hors tension, paramètres série non concordants, ou défaut de câblage.

Sans ce code, vous chercheriez côté réseau. Avec lui, vous savez qu’il faut ouvrir l’armoire.

Exception n’est pas timeout

Distinction essentielle, souvent brouillée par les messages d’erreur des logiciels.

ExceptionAbsence de réponse
L’esclave a reçuOuiInconnu
L’esclave a réponduOuiNon
Le lien physiqueFonctionneSuspect
Le CRCCorrectSans objet
Où chercherRequête, cartographieCâblage, adresse, paramètres série

Une exception prouve que la chaîne complète fonctionne dans les deux sens. C’est un point de départ confortable.

Un timeout ne prouve rien. L’esclave peut être hors tension, mal adressé, réglé sur un autre débit, ou le bus peut être coupé.

Beaucoup de logiciels affichent les deux cas sous le libellé « erreur de communication ». Regardez la trame brute pour savoir laquelle des deux situations vous avez.

Questions fréquentes

Que signifie l’erreur Modbus 0x83 ?

C’est une réponse d’exception à une requête de lecture de holding registers (0x03). L’octet suivant précise la cause.

Pourquoi j’obtiens l’exception 02 alors que le registre existe ?

Trois causes habituelles : adressage à base 1 non converti, plage de lecture qui déborde la fin d’un bloc, ou trou dans la cartographie au milieu de la plage demandée.

Quelle différence entre l’exception 05 et l’exception 06 ?

Le code 05 signifie que la requête est acceptée et en cours de traitement. Le code 06 signifie qu’elle a été rejetée et doit être réémise.

Un équipement peut-il ne pas répondre du tout au lieu d’envoyer une exception ?

Oui. En diffusion, aucun esclave ne répond. Et un esclave qui ne reconnaît pas son adresse, ou dont le CRC échoue, reste silencieux par conception.

L’exception 0B veut-elle dire que la passerelle est en panne ?

Non, l’inverse. Elle prouve que la passerelle fonctionne et qu’elle a bien émis sur le bus série. Le problème est côté esclave série.

Comment savoir quels codes fonction un équipement supporte ?

La documentation en premier. À défaut, le code 0x2B sous-fonction 0x0E donne l’identification de l’équipement, et un balayage des codes fonction révèle ceux qui renvoient l’exception 01.