Modbus TCP
Des registres et des bobines Modbus sur TCP/IP, avec un adressage typé, la maîtrise de l'ordre des octets et un balayage réseau borné.
Le pilote Modbus TCP lit et écrit des registres et des bobines Modbus sur TCP/IP : automates, compteurs, passerelles et tout serveur qui parle Modbus/TCP. L'adressage est entièrement typé : vous choisissez une classe de registre et un numéro de registre à partir de 0, et l'application assemble la requête ; il n'y a aucune adresse en texte libre à rater.
Équipement
| Champ | Sens | Défaut |
|---|---|---|
| Hôte | Le nom DNS, l'adresse IPv4 ou IPv6 du serveur ou de la passerelle Modbus. | localhost quand il est laissé vide |
| Port réseau | Le port TCP. | 502 (un 0 configuré retombe sur 502) |
| ID d'unité | L'ID d'unité (esclave) Modbus porté par chaque requête : ce qu'une passerelle emploie pour router vers l'équipement derrière elle. De 0 à 255. | 1 |
| Intervalle minimal entre transactions (ms) | Un cadencement de compatibilité : le silence minimal après la fin d'une transaction avant que la suivante ne commence, de 0 à 1000. Zéro n'ajoute aucun délai artificiel. | 0 |
| Période de scrutation (ms) | La cadence de scrutation par défaut des tags qui ne la remplacent pas. | 1000 |
L'URI de base affichée dans l'en-tête du volet est
modbus+tcp://host:port/unitID, plus ?minimumTransactionIntervalMs=n quand
l'intervalle est réglé.
Les équipements qui partagent un hôte et un port partagent aussi une seule barrière de transaction : les requêtes vers le même point de terminaison ne se chevauchent jamais, et le plus grand intervalle minimal configuré parmi les équipements activés de ce point de terminaison les cadence tous. Le volet le dit quand un autre équipement élève l'intervalle effectif au-dessus de celui configuré ici. L'intervalle ne gouverne que le trafic que cette application émet : c'est une aide à la compatibilité pour un serveur ou une passerelle lents, pas une réparation des défauts de réseau.
La connexion attend 5 secondes au plus ; une réponse est attendue 10 secondes au plus ; il n'y a aucune reprise au niveau du protocole. La boucle de reprise en arrière-plan possède la reconnexion, si bien qu'un équipement éteint ne coûte rien de plus qu'une lecture de mauvaise qualité.
Adressage des tags
| Champ | Sens | Défaut |
|---|---|---|
| Classe de registre | Quelle entité Modbus le tag adresse : HoldingRegister, InputRegister, Coil ou DiscreteInput. |
Déduite du type et de l'accès : les tags booléens reçoivent DiscreteInput (lecture seule) ou Coil (inscriptible) ; tous les autres types reçoivent InputRegister (lecture seule) ou HoldingRegister (inscriptible). |
| Numéro de registre (à partir de 0) | L'adresse brute du protocole. C'est l'adresse à partir de 0 sur le bus, pas la notation classique 4xxxx : le registre de maintien « 40001 » est le numéro de registre 0. Le registre voyage sur le bus en nombre de 16 bits, si bien que le champ prend de 0 à 65535 et refuse tout ce qui est plus large là où il est saisi. | 0 |
| Quantité (registres, vide = automatique) | Combien de registres de 16 bits la valeur occupe. La zone n'est dessinée que sur les tags String : tous les autres types ont une largeur fixe, il n'y a donc rien à remplacer. | Par type : Boolean 1, Int32 et Float 2, String 4 |
| Octet de poids fort en premier | Quel octet de chaque registre de 16 bits passe en premier sur le bus. Tags numériques seulement. | coché (ce que demande la spécification Modbus) |
| Mot de poids fort en premier | Quel registre d'une valeur sur deux registres porte la moitié haute. Tags numériques seulement. | coché |
La carte Source montre l'adresse de bus assemblée (par exemple 100?quantity=2)
en aperçu de lecture seule, si bien que ce que le volet affiche est exactement ce que la requête
porte.
Types de valeur et quantités
Quatre types de valeur sont proposés, et la largeur de protocole de chacun est fixée :
| Type de donnée | Registres | Forme sur le bus |
|---|---|---|
| Boolean | 1 | Sur une classe de registre : tout registre non nul se lit vrai, et une écriture envoie 1 ou 0. Sur Coil/DiscreteInput : le bit lui-même. |
| Int32 | 2 | Un entier signé de 32 bits sur une paire de registres. |
| Float | 2 | Une simple précision IEEE 754 sur une paire de registres. |
| String | 1 ou plus (4 par défaut) | Des octets UTF-8 empaquetés deux par registre. Une lecture s'arrête au premier octet NUL ; une écriture doit tenir dans la quantité déclarée (2 octets par registre) et est complétée par des zéros. |
Un tag String est lu et écrit dans l'ordre où l'équipement porte les octets, et une écriture envoie toujours de l'UTF-8. Des octets qui ne sont pas de l'UTF-8 valide, ce à quoi ressemblent une plage que l'équipement n'a jamais initialisée ou du texte écrit dans un autre encodage, se lisent en caractère de remplacement Unicode plutôt que d'échouer : le tag montre quelque chose de visiblement faux, et tous les autres tags de cet équipement continuent de se lire.
La quantité n'est demandée que sur les tags String. Les largeurs Boolean, Int32 et Float sont fixes, si bien que la zone n'est dessinée sur aucun de ces points, ni dans le volet du tag ni dans la grille des tags ; le remplacement existe pour dimensionner les tags String.
Ordre des octets et des mots
Les deux cases d'ordre sont dessinées sur les tags numériques. Ce sont deux questions indépendantes :
quel octet mène à l'intérieur de chaque registre, et quel registre mène sur une paire.
Modbus n'en définit aucun pour le texte, si bien qu'un tag String ne se les voit pas proposer : ses octets
voyagent dans l'ordre où l'équipement les porte. Pour la valeur 0x01020304,
avec A pour l'octet de poids fort, les quatre dispositions sont :
| Octet de poids fort en premier | Mot de poids fort en premier | Octets sur le bus |
|---|---|---|
| coché | coché | AB CD (le défaut de la spécification) |
| coché | décoché | CD AB (l'échange de mots classique) |
| décoché | coché | BA DC |
| décoché | décoché | DC BA |
Les lectures et les écritures appliquent les deux mêmes réponses dans le même ordre, si bien qu'une écriture pose exactement les octets qu'une lecture aurait repris.
Codes de fonction
| Classe de registre | Lecture | Écriture |
|---|---|---|
| HoldingRegister | 3 (Read Holding Registers) | 6 (registre unique) ou 16 (registres multiples) |
| InputRegister | 4 (Read Input Registers) | lecture seule ; une écriture est refusée |
| Coil | 1 (Read Coils) | 5 (Force Single Coil, une seule bobine) |
| DiscreteInput | 2 (Read Discrete Inputs) | lecture seule ; une écriture est refusée |
Une écriture ne rapporte un succès que lorsque la réponse de protocole du serveur confirme l'acceptation ; la valeur en cache n'avance qu'à ce moment-là.
Découverte
Le balayage est explicite et borné : l'application ne déduit ni ne parcourt jamais votre sous-réseau local. Le formulaire de portée prend :
| Champ | Sens | Défaut |
|---|---|---|
| Hôte IPv4 ou CIDR | Une adresse (192.168.1.10) ou un sous-réseau pas plus large que /24 (192.168.1.0/24). Les adresses de réseau et de diffusion sont sautées. |
obligatoire |
| Port réseau | Le port à sonder. | 502 |
| ID d'unité | Des valeurs, des listes séparées par des virgules ou des plages croissantes : 1, 1,5,9, 1, 3, 8-16 (de 0 à 255). |
1 |
| Intervalle minimal entre transactions (ms) | Le cadencement entre deux sondages terminés sur le même hôte, de 0 à 1000. | 0 |
Un seul balayage envoie 256 sondages au plus (hôtes × ID d'unité) ; un plan plus grand est refusé avant l'ouverture de la moindre prise. La seule requête envoyée est Read Basic Device Identification (fonction 43/14) : la découverte ne lit jamais de registres et ne devine jamais de plan de registres. Une réponse d'exception Modbus entièrement valide prouve qu'une unité est présente sans prétendre à son identité ; la joignabilité TCP, les délais dépassés et les trames malformées, non. Quatre hôtes au plus sont balayés en parallèle, séquentiellement à l'intérieur de chaque hôte, avec des délais de connexion et de sondage de 750 ms.
Les résultats portent le point de terminaison complet et un nom proposé, construit depuis le fabricant et le code produit quand l'équipement les rapporte. Les candidats ont zéro tag : les registres se configurent après Ajouter. Une unité déjà configurée est marquée comme telle et propose Ouvrir au lieu de créer un doublon.
Des limites à connaître
- Les types entiers larges (Int64, les largeurs non signées) et Double ne sont pas proposés : le codec de bus fait l'aller-retour exact sur les quatre types ci-dessus.
- Une seule requête est en cours par point de terminaison à la fois ; les nombreux équipements derrière une passerelle partagent cette sérialisation par construction.
- Les écritures adressent une bobine ou une suite de registres à la fois ; il n'y a pas d'écriture multibobine.