Modbus et IPX800 V5
changes à faire : traitement des valeurs négatives par complément ????
Introduction
| |||
---|---|---|---|
Nom | Modbus | ||
Famille | IPX800 V5 | ||
Wiki créé le | 11/09/2024 | ||
Wiki mis à jour le | 11/09/2024 | ||
Auteur | fgtoul |
Nous allons explorer un sujet technique qui pourrait sembler intimidant pour certains. Hier encore, j'étais dans le même bateau, jusqu'à ce qu'un véritable chevalier blanc vienne chez moi pour me donner quelques leçons et m'aider à y voir plus clair. Un grand merci à @Jweb pour son aide précieuse !
Aujourd'hui, je ne prétends pas être un expert en la matière, mais je souhaite partager ce que j'ai appris pour vous aider à l'intégration de ces appareils dans votre installation sans vous laisser décourager par le protocole Modbus.
Ce qui va suivre n'est pas un guide exhaustif sur le protocole Modbus, mais plutôt une explication simplifiée adaptée à nos configurations utilisant les IPX800 V5.
Historique
Modicon, une entreprise américaine, a introduit le protocole Modbus il y a 45 ans pour permettre aux automates programmables et aux dispositifs industriels de communiquer entre eux. En 1996, Schneider Electric a racheté Modicon. Sous la marque Modicon, l’entreprise française a développé et commercialisé une large gamme de contrôleurs et de solutions utilisant Modbus.
En 2004, Schneider Electric a transféré les droits à l’organisation [Modbus.org]. Depuis lors, les spécifications sont disponibles gratuitement et il n’y a pas de frais de licence pour l’utilisation des protocoles Modbus et Modbus TCP.
À l’origine, Modbus permettait les communications sur un bus filaire série. Cependant, les contraintes de ce mode de communication ont conduit à des évolutions telles que Modbus TCP, qui permet des communications sur des distances beaucoup plus longues et avec un nombre de périphériques théoriquement illimité.
RTU vs TCP
Modbus RTU
Modbus RTU (Remote Terminal Unit) : Utilise une communication série (RS232, RS485) avec une transmission binaire compacte. C’est le mode le plus couramment utilisé dans les environnements industriels.
RS232 est sensible aux parasitages, ne permet que de courtes distances. Il est également très limité en nombre d'esclaves.
La communication Modbus sur notre IPX800 utilise l'interface RS485 en architecture maître/esclave, avec 1 seul maître sur le réseau (dans notre cas l'IPX étant le maître).
Dans ce système, le maître prend l'initiative et interroge les esclaves, qui attendent les requêtes du maître pour fournir des informations. Les dispositifs esclaves ne peuvent pas envoyer de données de manière autonome.
Le maître a la possibilité d'écrire ou de lire des données dans les registres des périphériques esclaves.
Modbus RTU sur RS485 fonctionne généralement en mode half-duplex, ce qui signifie que les données peuvent être envoyées dans les deux sens, mais pas simultanément. Dans ce cas, le bus utilise 2 fils au lieu de quatre.
Avantages :
Simplicité : Facile à implémenter et à configurer.
Coût : Moins coûteux en termes de matériel et de mise en œuvre.
Fiabilité : Utilise une communication série (RS485), qui est robuste et fiable pour les environnements industriels.
Efficacité : Optimise l’utilisation de la bande passante grâce à une transmission binaire compacte.
Inconvénients :
Distance limitée : La distance maximale sans répéteur est d’environ 1200 mètres.
Nombre limité d’appareils : Peut connecter jusqu’à 32 appareils sur une seule ligne sans répéteur (247 avec répéteurs).
Débit de données : Plus lent par rapport à Modbus TCP, avec des taux de transfert de données limités par la vitesse de la communication série (9600 ou 115200 Bauds)
1 seul maître sur le réseau, ce qui interdit la communication avec certains appareils comme des onduleurs photovoltaïques souvent maîtres eux-mêmes.
Modbus TCP/IP
Modbus TCP/IP fonctionne sur des réseaux Ethernet, permettant une communication plus rapide et une intégration facile avec les réseaux informatiques existants.
Cette architecture Maître/Esclaves fonctionne en mode full-duplex, permettant l’envoi et la réception de données simultanément dans les deux sens. Cela améliore la vitesse et l’efficacité de la communication.
Avantages :
Vitesse : Offre des taux de transfert de données plus rapides grâce à l’utilisation des réseaux Ethernet.
Scalabilité : Peut gérer un nombre théoriquement illimité d’appareils sur un réseau IP.
Flexibilité : Permet des connexions filaires et sans fil, facilitant l’intégration avec les infrastructures réseau existantes.
Installation facile : Utilise du matériel Ethernet standard, ce qui simplifie l’installation et la configuration.
Inconvénients :
Coût : Plus coûteux en termes de matériel et de mise en œuvre par rapport à Modbus RTU.
Latence : Peut avoir une latence plus élevée en raison de la surcharge du protocole TCP/IP4.
Complexité : Plus complexe à configurer et à maintenir, nécessitant une connaissance des réseaux IP4.
Conclusion
Modbus RTU est idéal pour les systèmes plus petits et moins complexes où la simplicité et le coût sont des facteurs importants.
Modbus TCP est mieux adapté aux systèmes plus grands et plus complexes nécessitant une communication rapide et une grande scalabilité.
Modbus RTU
Le maître
Notre IPX800 V5 possède tous les outils pour interroger ou piloter des dispositifs sur son réseau Modbus.
Un maître peut envoyer des requêtes de lecture ou d'écriture de données vers un dispositif particulier grâce à l'adresse unique qui identifie chaque esclave (1 à 247). L'esclave répond à la requête.
Il peut également s'adresser à tous les esclaves simultanément en envoyant un Broadcast sur l'adresse 0 ou 254. Les esclaves ne répondent pas.
Vu que tous les esclaves ne peuvent pas répondre simultanément, le broadcast est utilisé pour l'envoi de commandes d'écriture.
NB : L'IPX800 est maître et doit être le seul maître sur le bus série.
L'esclave
Chaque esclave est identifié par son adresse réseau unique. L'esclave, comme nous l'avons abordé plus haut, ne peut prendre aucune initiative. Il reste en veille jusqu'à réception d'une requête émise par le maître. Si la requête lui est bien adressée (son adresse réseau unique correspond), il traite la demande et renvoie une réponse au maître. Il traitera également la demande dans le cas d'un Broadcast.
Les requêtes
En Modbus RTU, les messages sont encapsulés dans un format binaire compact et transmis via des interfaces série (RS485 pour notre IPX).
Chaque message contient une adresse d’esclave, un code de fonction, des données et un CRC (Cyclic Redundancy Check) pour la vérification des erreurs.
Chaque octet de la trame RTU est codé sur 2 caractères hexadécimaux. La trame sera composée de 256 octets maximum.
Silence | Adresse | Fonction | Données | CRC | Silence |
---|---|---|---|---|---|
Début | 1 octet | 1 octet | n octets | 2 octets | Fin |
0 à 247 | 1 à 127 | Données à envoyer | Contrôle |
Pour connaître les requêtes utilisables sur votre appareil esclave, vous devrez vous référer à la documentation du fabricant.
Remarque :
Vous remarquerez que l’esclave détermine le début et la fin d’une trame grâce à deux silences. Ces silences doivent chacun avoir une durée équivalente à celle de la transmission de 3,5 caractères (1 caractère = 11 bits).
Avec une vitesse de transmission de 9600 bauds, le silence doit donc durer 3,5 * 11 * (1/9600) secondes, soit environ 4 millisecondes.
C’est pourquoi, lors de la programmation de l’IPX800, il faut éviter de traiter plus de deux requêtes dans une même règle. De même, il est préférable de ne pas lier plus de deux requêtes à une même ressource ou événement. Par défaut, l’IPX800 insère des silences de 5 ms permettant d’écouter le bus et peut stocker jusqu’à deux trames sans problème. Cependant, si vous surchargez la règle avec plus de deux requêtes, l’IPX pourrait envoyer les trames trop rapprochées les unes des autres, ce qui risquerait de provoquer une perte d’informations. Il devient alors judicieux d’ajouter des objets “Délais” entre les émissions de trames afin de permettre l’écoute du bus et le traitement des réponses.
les différents codes de fonction
Il y a 19 fonctions en tout, voici les principales prises en charge par l'ipx800 V5
Requêtes de lecture
Lecture des bits de sortie (coils) 0x01 :
La fonction 01 en Modbus RTU est utilisée pour lire l’état des bobines (coils) d’un dispositif esclave. Les bobines sont des éléments binaires qui peuvent être soit activés (1) soit désactivés (0). Cette fonction permet au maître Modbus de vérifier l’état de ces bobines pour des opérations de contrôle et de surveillance.
Détails de la Fonction 1
- Code de Fonction: 01 (0x01 en hexadécimal)
- Description: Lecture de l’état des bobines
- Utilisation: Permet au maître de lire l’état de plusieurs bobines dans l’esclave.
Structure de la Trame de Requête
Adresse de l'esclave | code fonction | Adresse 1ere bobine
(bit fort) |
Adresse 1ere bobine
(bits faibles ) |
Nombre de bobines à lire
(bits forts) |
nombre de registres à lire
(bits faibles) |
CRC
(bits forts) |
CRC
(bits faibles) |
---|---|---|---|---|---|---|---|
1 octet | 01 | 1 octet | 1 octet | 1 octet | 1 octet | 1 octet | 1 octet |
Exemple de Trame de Requête
Supposons que nous voulons lire l’état de 10 bobines à partir de l’adresse 0x0013 de l’esclave avec l’adresse 0x01.
- Adresse de l’esclave: 0x01
- Code de fonction: 0x01
- Adresse de la première bobine: 0x0013
- Nombre de bobines: 0x000A
La trame de requête serait :
01 01 00 13 00 0A
Structure de la Trame de Réponse.
Adresse de l'esclave | code fonction | Nombre d'octets à suivre | Valeurs des bobines lues | CRC (bits forts) | CRC (Bits faibles) |
---|---|---|---|---|---|
1 octet | 01 | 1 octet | n octets | 1 octet | 1 octet |
Exemple de Trame de Réponse
Pour la trame de requête ci-dessus, si les 10 bobines ont les états suivants : 11001101 01, la trame de réponse serait :
01 01 02 CD 01
où CD
représente les 8 premières bobines (11001101 en binaire) et 01
les 2 dernières (01 en binaire).
Ces trames montrent comment la fonction 1 est utilisée pour lire l’état des bobines dans un appareil esclave en Modbus RTU
Lecture des entrées discrètes :0x02
Description : Lire l’état des entrées discrètes (discrete inputs) des esclaves.
La fonction 02 en Modbus RTU est utilisée pour lire l’état des entrées discrètes (input status) d’un dispositif esclave. Les entrées discrètes sont des éléments binaires similaires aux bobines, mais elles sont généralement utilisées pour lire des états de capteurs ou d’autres dispositifs d’entrée.
Détails de la Fonction 2
- Code de Fonction: 02 (0x02 en hexadécimal)
- Description: Lecture de l’état des entrées discrètes
- Utilisation: Permet au maître de lire l’état de plusieurs entrées discrètes dans l’esclave.
Structure de la Trame de Requête
Adresse de l'esclave | code fonction | Adresse 1ere entrée
(bit fort) |
Adresse 1ere entrée
(bits faibles ) |
Nombre d'entrées à lire
(bits forts) |
nombre d'entrées à lire
(bits faibles) |
CRC
(bits forts) |
CRC
(bits faibles) |
---|---|---|---|---|---|---|---|
1 octet | 02 | 1 octet | 1 octet | 1 octet | 1 octet | 1 octet | 1 octet |
Exemple de Trame de Requête
Supposons que nous voulons lire l’état de 10 entrées discrètes à partir de l’adresse 0x0013 de l’esclave avec l’adresse 0x01.
- Adresse de l’esclave: 0x01
- Code de fonction: 0x02
- Adresse de la première entrée: 0x0013
- Nombre d’entrées: 0x000A
La trame de requête serait :
01 02 00 13 00 0A
Structure de la Trame de Réponse
Adresse de l'esclave | code fonction | Nombre d'octets à suivre | Valeurs des entrées lues | CRC (bits forts) | CRC (Bits faibles) |
---|---|---|---|---|---|
1 octet | 02 | 1 octet | n octets | 1 octet | 1 octet |
Exemple de Trame de Réponse
Pour la trame de requête ci-dessus, si les 10 entrées discrètes ont les états suivants : 11001101 01, la trame de réponse serait :
01 02 02 CD 01
où CD
représente les 8 premières entrées (11001101 en binaire) et 01
les 2 dernières (01 en binaire).
Cette fonction est couramment utilisée dans les systèmes d’automatisation industrielle pour surveiller des capteurs et d’autres dispositifs d’entrée
Lecture des registres de maintien : 0x03
La fonction 03 en Modbus RTU est utilisée pour lire les registres de maintien (holding registers) d’un dispositif esclave. Les registres de maintien sont des emplacements de mémoire utilisés pour stocker des données telles que des paramètres de configuration ou des valeurs de processus.
Détails de la Fonction 3
- Code de Fonction: 03 (0x03 en hexadécimal)
- Description: Lecture des registres de maintien
- Utilisation: Permet au maître de lire les valeurs de plusieurs registres de maintien dans l’esclave.
Structure de la Trame de Requête
- Adresse de l’esclave (1 octet)
- Code de fonction (1 octet) : 03
- Adresse du premier registre (2 octets) : Adresse du premier registre à lire
- Nombre de registres (2 octets) : Nombre de registres à lire
Exemple de Trame de Requête
Supposons que nous voulons lire les valeurs de 3 registres à partir de l’adresse 0x0001 de l’esclave avec l’adresse 0x01.
- Adresse de l’esclave: 0x01
- Code de fonction: 0x03
- Adresse du premier registre: 0x0001
- Nombre de registres: 0x0003
La trame de requête serait :
01 03 00 01 00 03
Structure de la Trame de Réponse
- Adresse de l’esclave (1 octet)
- Code de fonction (1 octet) : 03
- Nombre d’octets de données (1 octet) : Nombre d’octets de données à suivre
- Valeurs des registres (N octets) : Valeurs des registres lues
Exemple de Trame de Réponse
Pour la trame de requête ci-dessus, si les valeurs des 3 registres sont 0x000A, 0x000B, et 0x000C, la trame de réponse serait :
01 03 06 00 0A 00 0B 00 0C
où 06
représente le nombre d’octets de données (3 registres x 2 octets chacun).
Cette fonction est couramment utilisée dans les systèmes d’automatisation industrielle pour lire des paramètres de configuration, des valeurs de capteurs, ou d’autres données importantes stockées dans les registres de maintien
Le format de la requête émise par le maître est standardisé, la trame est donc toujours construite de la même façon.
Adresse de l'esclave | code fonction | Adresse 1er registre
(bit fort) |
Adresse 1er registre
(bits faibles ) |
Nombre de registres à lire
(bits forts) |
nombre de registres à lire
(bits faibles) |
CRC
(bits forts) |
CRC
(bits faibles) |
---|---|---|---|---|---|---|---|
1 octet | 03 | 1 octet | 1 octet | 1 octet | 1 octet | 1 octet | 1 octet |
La réponse émise par l'esclave lors de la réception de cette requête est également formatée, mais en partie seulement. En effet, le champ "Données" n'a pas de format imposé. Le fabricant peut adapter le message à son produit.
Le fabricant doit alors documenter la construction de trame adoptée, le format de chaque registre et son adresse, afin que l'utilisateur final puisse lire et convertir ces variables en grandeurs réelles.
Adresse de l'esclave | code fonction | Nombre d'octets | Données lues | CRC (bits forts) | CRC (Bits faibles) |
---|---|---|---|---|---|
1 octet | 03 | 1 octet | n octets | 1 octet | 1 octet |
Lecture des registres d’entrée : 0x04
La fonction 04 en Modbus RTU est utilisée pour lire les registres d’entrée (input registers) d’un dispositif esclave. Les registres d’entrée sont des emplacements de mémoire utilisés pour stocker des valeurs analogiques ou des données de capteurs.
Voici comment cela fonctionne :
- Requête du maître : Le maître envoie une requête à l’esclave en spécifiant l’adresse de départ et le nombre de registres d’entrée à lire.
- Réponse de l’esclave : L’esclave répond avec les valeurs des registres demandés, chaque registre étant représenté par deux octets (16 bits).
Par exemple, si le maître demande la lecture de 3 registres d’entrée à partir de l’adresse 0x0001, l’esclave pourrait répondre avec 6 octets de données représentant les valeurs des trois registres.
Cette fonction est couramment utilisée dans les systèmes d’automatisation industrielle pour lire des valeurs de capteurs, des mesures de température, de pression, ou d’autres données analogiques12.
Requêtes d’écriture
Écriture d’un bit de sortie unique : 0x05
La fonction 05 en Modbus RTU est utilisée pour forcer une bobine (write single coil) d’un dispositif esclave. Cette fonction permet au maître de définir l’état d’une bobine spécifique à 1 (activé) ou à 0 (désactivé).
Voici comment cela fonctionne :
- Requête du maître : Le maître envoie une requête à l’esclave en spécifiant l’adresse de la bobine à forcer et l’état désiré (0xFF00 pour activé, 0x0000 pour désactivé).
- Réponse de l’esclave : L’esclave répond en renvoyant l’adresse de la bobine et l’état qui a été défini, confirmant ainsi que l’opération a été effectuée.
Par exemple, pour forcer la bobine à l’adresse 0x0001 à l’état activé, la trame de requête serait :
- Adresse de l’esclave : 0x01
- Code de fonction : 0x05
- Adresse de la bobine : 0x0001
- Valeur à écrire : 0xFF00
- CRC : Calculé en fonction des données précédentes
La trame complète serait donc : 01 05 00 01 FF 00 CRC
.
Cette fonction est couramment utilisée dans les systèmes d’automatisation industrielle pour contrôler des relais, des interrupteurs, ou d’autres dispositifs binaires12.
Écriture d’un registre de maintien unique : 0x06
La fonction 06 en Modbus RTU est utilisée pour écrire une valeur dans un registre de maintien (holding register) d’un appareil esclave. Voici quelques détails supplémentaires et des exemples de trames pour illustrer son utilisation.
Détails de la Fonction 06
- Code de Fonction: 06
- Description: Écriture d’un seul registre de maintien
- Utilisation: Permet au maître de modifier la valeur d’un registre spécifique dans l’esclave.
Structure de la Trame de Requête
- Adresse de l’esclave (1 octet)
- Code de fonction (1 octet) : 06
- Adresse du registre (2 octets) : Adresse du registre à écrire
- Valeur à écrire (2 octets) : Nouvelle valeur pour le registre
Exemple de Trame de Requête
Supposons que nous voulons écrire la valeur 0x00FF dans le registre à l’adresse 0x0001 de l’esclave avec l’adresse 0x01.
- Adresse de l’esclave: 0x01
- Code de fonction: 0x06
- Adresse du registre: 0x0001
- Valeur à écrire: 0x00FF
La trame de requête serait :
01 06 00 01 00 FF
Structure de la Trame de Réponse
- Adresse de l’esclave (1 octet)
- Code de fonction (1 octet) : 06
- Adresse du registre (2 octets) : Adresse du registre écrit
- Valeur écrite (2 octets) : Valeur écrite dans le registre
Exemple de Trame de Réponse
Pour la trame de requête ci-dessus, la trame de réponse serait identique :
01 06 00 01 00 FF
Adresse de l'esclave | code fonction | Bit fort adresse registre | Bit faible adresse registre | valeur à écrire dans le registre
(bits forts) |
valeur à écrire dans le registre
(bits faibles) |
CRC (bits forts) | CRC (bits faibles) |
---|---|---|---|---|---|---|---|
1 octet | 06H | 1 octet | 1 octet | 1 octet | 1 octet | 1 octet | 1 octet |
Écriture de plusieurs bits de sortie : 0x0F
La fonction 0F en Modbus RTU est utilisée pour écrire plusieurs bobines (coils) dans un appareil esclave1. Cette fonction permet au maître de définir l’état (ON ou OFF) de plusieurs bobines en une seule commande.
Détails de la Fonction 0F
- Code de Fonction: 0F (15 en décimal)
- Description: Écriture de plusieurs bobines
- Utilisation: Permet au maître de modifier l’état de plusieurs bobines dans l’esclave.
Structure de la Trame de Requête
- Adresse de l’esclave (1 octet)
- Code de fonction (1 octet) : 0F
- Adresse de la première bobine (2 octets) : Adresse de la première bobine à écrire
- Nombre de bobines (2 octets) : Nombre de bobines à écrire
- Nombre d’octets de données (1 octet) : Nombre d’octets de données à suivre
- Valeurs des bobines (N octets) : Valeurs des bobines à écrire
Exemple de Trame de Requête
Supposons que nous voulons écrire les valeurs 0xCD (11001101 en binaire) dans 8 bobines à partir de l’adresse 0x0013 de l’esclave avec l’adresse 0x01.
- Adresse de l’esclave: 0x01
- Code de fonction: 0x0F
- Adresse de la première bobine: 0x0013
- Nombre de bobines: 0x0008
- Nombre d’octets de données: 0x01
- Valeurs des bobines: 0xCD
La trame de requête serait :
01 0F 00 13 00 08 01 CD
Structure de la Trame de Réponse
- Adresse de l’esclave (1 octet)
- Code de fonction (1 octet) : 0F
- Adresse de la première bobine (2 octets) : Adresse de la première bobine écrite
- Nombre de bobines écrites (2 octets) : Nombre de bobines écrites
Exemple de Trame de Réponse
Pour la trame de requête ci-dessus, la trame de réponse serait :
01 0F 00 13 00 08
Ces trames montrent comment la fonction 0F est utilisée pour écrire plusieurs bobines dans un appareil esclave en Modbus RTU.
Écriture de plusieurs registres de maintien : 0x10
La fonction 10 en Modbus RTU, également connue sous le code 0x10, est utilisée pour écrire plusieurs registres de maintien (holding registers) dans un appareil esclave1. Cette fonction permet au maître de modifier les valeurs de plusieurs registres en une seule commande.
Détails de la Fonction 10
- Code de Fonction: 10 (16 en décimal)
- Description: Écriture de plusieurs registres de maintien
- Utilisation: Permet au maître de modifier les valeurs de plusieurs registres dans l’esclave.
Structure de la Trame de Requête
- Adresse de l’esclave (1 octet)
- Code de fonction (1 octet) : 10
- Adresse du premier registre (2 octets) : Adresse du premier registre à écrire
- Nombre de registres (2 octets) : Nombre de registres à écrire
- Nombre d’octets de données (1 octet) : Nombre d’octets de données à suivre
- Valeurs des registres (N octets) : Valeurs des registres à écrire
Exemple de Trame de Requête
Supposons que nous voulons écrire les valeurs 0x000A et 0x000B dans deux registres à partir de l’adresse 0x0010 de l’esclave avec l’adresse 0x01.
- Adresse de l’esclave: 0x01
- Code de fonction: 0x10
- Adresse du premier registre: 0x0010
- Nombre de registres: 0x0002
- Nombre d’octets de données: 0x04
- Valeurs des registres: 0x000A 0x000B
La trame de requête serait :
01 10 00 10 00 02 04 00 0A 00 0B
Structure de la Trame de Réponse
- Adresse de l’esclave (1 octet)
- Code de fonction (1 octet) : 10
- Adresse du premier registre (2 octets) : Adresse du premier registre écrit
- Nombre de registres écrits (2 octets) : Nombre de registres écrits
Exemple de Trame de Réponse
Pour la trame de requête ci-dessus, la trame de réponse serait :
01 10 00 10 00 02
Ces trames montrent comment la fonction 10 est utilisée pour écrire plusieurs registres de maintien dans un appareil esclave en Modbus RTU.
Requêtes de diagnostic
Diagnostic : 0x08 Description : Effectuer des tests de diagnostic sur les esclaves.
Logiciel Modbus
Pour lire les trames sur le bus RTU, vous pouvez utiliser divers logiciels gratuits disponibles sur le Web (Modbus Doctor, Simply Modbus Master, Open ModScan, ModRSsim)
Ces logiciels vous permettront de dialoguer avec votre dispositif esclave et de comprendre son mode de communication.
Cela vous sera très utile pour programmer l’IPX800 V5 par la suite.
De plus, vous aurez besoin d’un adaptateur USB pour interfacer votre PC. Vous pouvez en trouver pour moins de 20 €.
Consultez la documentation de votre adaptateur pour son installation et son branchement. En général, seules deux bornes (A et B) seront utilisées pour la communication, tandis que la borne GND servira à mettre en commun les masses entre l’alimentation du port USB et celle de l’esclave.
Cet adaptateur crée un port série virtuel qu’il faudra configurer avec les paramètres requis par l’esclave.
voici un exemple de configuration :
- Vitesse : 9600 ou 115200 Bauds
- Nombre de Bits : 8
- Bit de parité : N
- Bit de STOP : 1
En ce qui concerne le logiciel, j'utilise Modbus Doctor.
Voilà, vous êtes prêt à communiquer en Modbus RTU entre votre PC (maître) et l'esclave.
Exemples d'utilisation
Capteur de conductivité Modbus RTU
J'ai acquis un capteur de conductivité (EC) qui me permettra de mesurer et réguler le taux de nutriments dans la solution qui nourrira le jardin hydroponique. Cette installation fera sans doute l'objet d'un autre article, mais je ne rentrerai pas dans les détails ici.
La conductivité d'un liquide varie avec sa température, ce capteur mesure donc les 2 grandeurs afin de permettre le calcul du facteur de correction.
Chaque grandeur pourra alors être demandée par le maître.
Branchement sur l'adaptateur USB
Les premiers tests de communication
À partir de la documentation du produit, nous pouvons configurer les communications, exploiter les réponses sur le bus, ...
je vous épargne les pages en mandarin qui accompagnaient mon capteur. Heureusement, Google Lens permet des traductions instantanées à partir de documents au format image.
Configuration du port
Pour communiquer avec le produit, il faut d'abord configurer le port COM via le logiciel que vous aurez choisi.
Voici ce que dit la documentation :
Vitesse en Bauds | Bit de parité | Bits de données | Bit d'arrêt |
---|---|---|---|
9600 | N | 8 | 1 |
Ce sont donc les paramètres de la configuration du port série virtuel créé par l'adaptateur. Ces paramètres doivent être appliqués dans le logiciel Modbus.
Voilà ce que cela donne dans Modbus Doctor :
Liste des registres accessibles
La documentation doit impérativement lister les adresses et formats des données pour que vous puissiez exploiter votre appareil.
Adresse | Valeur | Plage | Lecture/Ecriture | Fonction supportées |
---|---|---|---|---|
0x 00 00 | Température en °C | 0 à 80.0 | Lecture seule | 03 |
0x 00 01 | Conductivité en µS/cm | 0 à 4000 | Lecture seule | 03 |
0x 00 03 | ID Esclave | 1 à 247 | Lecture/Ecriture | 03/06 |
Ce sont donc les adresses des registres qu'il sera possible de lire ou écrire, ainsi que leur description. Comme nous l'avons vu plus haut, cette partie de documentation est indispensable pour l'interprétation des données du fabricant contenues dans les réponses du capteur.
Attention : un esclave ne peut pas avoir un ID 0.
La documentation du capteur indique que l’ID peut être 0, bien que cette valeur soit strictement réservée aux messages de diffusion (Broadcasts).
Si par erreur vous configurez votre appareil avec un ID à 0, il deviendra alors injoignable. Cette mésaventure m'est arrivée pendant mon apprentissage du logiciel Modbus Doctor. Une écriture malencontreuse de la valeur 0 dans le registre 3, et hop, matériel à la poubelle.
Autre souci dans la documentation : il est mentionné que l'ID par défaut du matériel est 0 alors qu'il est de 1.
Le matériel Made in China est donc d'un rapport qualité/prix excellent, mais il faut très souvent s'attendre à galérer un peu pour la mise en œuvre.
Format d'une requête "Lecture" de registre
La réponse émise par l'esclave lors de la réception de cette requête est également formatée, mais en partie seulement. En effet, le champ "Données" n'a pas de format imposé. Le fabricant peut alors adapter le message à son produit.
Le fabricant doit alors documenter la construction de trame adoptée, le format de chaque registre et son adresse, afin que l'utilisateur final puisse lire et convertir ces variables en grandeurs réelles.
Adresse de l'esclave | code fonction | Nombre d'octets | Données lues | CRC (bits forts) | CRC (Bits faibles) |
---|---|---|---|---|---|
1 octet | 03 | 1 octet | N * 2 octets de données | 1 octet | 1 octet |
Nous pouvons constater que les données du capteur sont constituées de paires d'octets, dont le nombre dépend de la requête d'interrogation reçue.
Lecture de la valeur de conductivité
- émission de la requête du maître vers l'esclave : Selon les standards de la fonction 03, construisons la requête de type 03 à destination de l'esclave #1 pour récupérer la valeur de la conductivité avec notre logiciel. Réglez le logiciel pour un affichage en hexadécimal.
01 | 03 | 00 | 01 | 00 | 01 | xx | yy |
---|
Cette trame émise par le maître est donc construite comme suit :
01 (1 octet) : ID unique de l'esclave destinataire
03 (1 octet) : Fonction lecture de registres contigus
00 01 (2 octets) : Adresse de début de lecture, ici : 1 qui correspond bien à la conductivité
00 01 (2 octets) : Nombre de registres à lire, ici 1. Nous demandons donc seulement la valeur de la conductivité.
xx yy (2 octets) : CRC. Je remplace la valeur hexadécimale par XX dans chaque octet car le code de vérification est calculé automatiquement par le logiciel et n'est pas utile à la compréhension.
Emettons la trame avec notre logiciel Modbus;
- Réponse de L'esclave ID 1 :
01 | 03 | 02 | 06 | FA | 3B | A7 |
---|
Cette réponse émise par l'esclave se décompose comme ceci:
01 (1 octet) : ID de l'esclave
03 (1 octet) : la commande reçue
02 (1 octet) : le nombre d'octets qui constituent les données incluses dans la réponse, ici il y aura 2 octets
Du coup on récupère les 2 octets suivants pour connaître la valeur de la réponse :
06 FA (2 octets) : ces 2 octets, qui constituent la valeur de conductivité, devront être interprétés conformément à la doc.
3B A7 (2 octets) : CRC
La documentation donne la formule à appliquer pour obtenir la valeur de conductivité.
Soit A la valeur contenue dans l'octet de poids fort, et B celle de l'octet de poids faible.
La formule est A* 256 + B
Nous obtenons après conversion hexadécimale vers décimal : 6*256 + 250 = 1786 µS/cm
Lecture de la température
- émission de la requête du maître vers l'esclave :
Sur le même principe, émettons une requête de lecture du registre température.
Émettons la trame suivante pour interroger le registre à l'adresse 0 qui correspond à la température.
01 | 03 | 00 | 00 | 00 | 01 | xx | xx |
---|
01 (1 octet) : ID unique de l'esclave destinataire
03 (1 octet) : Fonction lecture de registres
00 00 (2 octets) : Adresse de début de lecture, ici : 0 qui correspond bien à la température
00 01 (2 octets) : Nombre de registres à lire, ici 1. Nous demandons donc seulement la valeur de la température
Réponse de L'esclave ID 1 :
Voici la réponse de L'esclave ID 1 :
01 | 03 | 02 | 00 | C6 | 38 | 16 |
---|
Au regard de la documentation, cette réponse émise par l'esclave se décompose comme ceci:
01 (1 octet) : ID de l'esclave
03 (1 octet) : la commande reçue
02 (1 octet) : le nombre d'octets qui constituent les données incluses dans la réponse, ici il y aura 2 octets
Du coup on récupère les 2 octets suivants pour connaître la valeur de la réponse :
00 C6 (2 octets) : ces 2 octets, qui constituent la valeur de température, devront être interprétés conformément à la doc.
38 16 (2 octets) : CRC
Si nous appliquons la formule donnée par la documentation, la température est ((0x00 * 256) + 0xC6 )/10 soit 19.8°C
Requête "Écriture" de registre
Pour rappel de format de la requête est standardisé. Voir plus haut.
- Émission de la requête Émettons la requête suivante qui permet de modifier l'ID à 2.
FE | 06 | 00 | 03 | 00 | 02 | xx | xx |
---|
La demande d'écriture se décompose ainsi :
FE : adresse de l'esclave. 254 correspond à un message de diffusion.
06 : Fonction Écriture
00 03 : Adresse du registre à modifier
00 02 : valeur à écrire
NB : dans cet exemple, nous modifions l'ID de l'esclave via un message de diffusion. Cela est possible uniquement parce que nous n'avons qu'un seul esclave connecté, l'ID devant être unique.
A faire :Vérifier si réponse de l'esclave. commenter ici.
Capteur EC sur IPX800 V5
Le schéma de connexion
L’IPX800 V5 propose des objets “Modbus Read” pour les requêtes de lecture et des objets “Modbus Write” pour les fonctions d’écriture sur les registres.
Ces objets peuvent être liés à des ressources ou à des événements, et il est également possible de créer des scénarios personnalisés.
Chaque valeur de registre lue peut être utilisée comme variable dans les automatismes, offrant ainsi une grande flexibilité dans la gestion de vos systèmes.
Configuration du mode de communication
La configuration du mode de communication série (RTU) se fait de manière centrale sur la page SYSTEM via la tuile MODBUS.
Il suffit de reporter les paramètres documentés par le fabricant du capteur.
Si vous avez plusieurs esclaves, il faudra veiller à les configurer pour utiliser la même vitesse de communication. Si vous ne pouvez pas, sachez qu'il existe des convertisseurs (Baud rate converters) qui vous permettront d'harmoniser les vitesses entre l'IPX800 (maître) et les esclaves.
Création d'un objet Lecture
La création d'un objet "Modbus read" nécessite la connaissance du format de la trame RTU.
Si vous vous rappelez bien, nous avons vu que la réponse de l'esclave à une requête de Lecture comportait une séquence d'octets que le fabricant pouvait adapter à son produit. Il va donc falloir donner la structure de ces données afin que l'ipx800 puisse interpréter les réponses du capteur.
Pour ce faire, nous allons reconstituer la séquence à l'aide de tuiles IO ou analogiques que nous glissons dans la zone "Modbus Frame".
Pour notre exemple, nous souhaitons lire la température à l'adresse 0.
La réponse de l'esclave contient les données sur 2 octets comme nous avons pu le tester précédemment.
Nous pourrions récupérer ces 2 octets dans une variable 16 bits mais pour l'exemple nous allons utiliser 2 analogiques 8 bits.
Lorsque l'on dépose une tuile, il est immédiatement demandé d'associer une ressource (source de données).
Il est alors possible d'associer une variable existante ou en créer une nouvelle.
Vous pouvez tester la requête avec le bouton envoi et vérifier si les variables analogiques récupèrent les bonnes valeurs.
L'ipx800 affiche les valeurs en décimal.
Création d'un objet Écriture
Notre capteur accepte les requêtes Écriture sur le registre en adresse 3, ce qui permet l'affectation d'un ID unique.
Créons un objet "Modbus Write" qui attribue l'ID 4.
Nous avons vu précédemment que la valeur à écrire se composait de 2 octets. Notre cas permet l'utilisation d'une variable analogique 16 bits qui pourra contenir la valeur 4 à envoyer au registre.
Glissons une tuile de type A16 et nommons la.
Vous pouvez tester la requête avec le bouton d'envoi.
Exemple d'utilisation
Notre capteur ne nécessite pas l'automatisation des requêtes d'écriture. En effet, seul le changement d'ID est possible, et celui-ci ne se fait qu'une fois en théorie, à la mise en œuvre du dispositif.
Cependant il est utile de mémoriser cette requête car au moment du remplacement du capteur en cas de panne, il suffira d'envoyer la requête pour lui réaffecter le bon ID. Si vos capteurs permettaient la modification d'autres paramètres comme la vitesse, une commande de réinitialisation, mémorisez ces requêtes qui pourront vous faire gagner du temps en cas de problème.
Nous allons donc automatiser la lecture de la température à intervalle régulier à l'aide d'un objet clignotant. Nous opterons pour une fréquence raisonnable pour ne pas saturer notre bus RTU. J'ai très peu de capteurs sur mon installation, je me décide pour un refresh toutes les 6 secondes, c'est suffisant pour suivre une température en cas de régulation.
Créons un clignotant et lions le à l'entrée "Départ" de l'objet Modbus Read. Désormais, la valeur des 2 octets correspondant à la température mesurée par le capteur remontera toutes les 3 secondes dans nos 2 variables analogiques 8 bits.
Il ne reste plus qu'à créer un objet fonction qui calculera la grandeur réelle via la formule communiquée par le fabricant.
Comme je l'ai écrit plus haut, j'ai utilisé volontairement 2 variables de 8 bits afin de vous montrer une utilisation avancée des objets fonctions : les variables.
Nous allons donc créer une formule utilisant les variables sous la forme $id$.
J'ai dû en fait créer 2 fonctions pour que les calculs réalisés par l'IPX800 V5 soient juste.
J'ai donc lié la variable représentant l'octet de poids fort à cette fonction
puis j'ai lié la variable représentant l'octet de poids faible à cet objet. Sa formule reprend le résultat de la fonction précédente pour l'obtention du résultat final.
Pour plus d'informations concernant l'usage des variables dans les formules, veuillez vous référer à cet article.
Le traitement de la valeur de l'octet de poids fort et de l'octet de poids faible de conductivité par les objets fonctions est bâti de la même manière.
La formule diffère un peu vu que je corrige la valeur EC selon la température. Je n'entrerai pas dans les détails ici.
Remarque : si nous avions glissé une tuile analogique 16 bits dans l'objet Modbus Read au lieu des 2 tuiles 8 bits, la formule de l'objet fonction serait plus simple et deviendrait X/10. Cela n'imposerait pas le découpage de la formule sur 2 fonctions.
Capteur de dioxyde de carbone
Connexion à l'IPX800
Adresses des données
Adresse de registre
(Hex) |
nom du registre | Nombre d'octets | Contenu | Fonction supportée |
---|---|---|---|---|
0000 | Humidité | 2 | 0.1%RH | Lecture |
0001 | Température | 2 | 0.1°C | Lecture |
0002 | CO2 | 2 | 1 ppm | Lecture |
0033 | Valeur de calibration température | 2 | 0.1 | Lecture/écriture |
0038 | Valeur de calibration Humidité | 2 | 0.1 | Lecture/écriture |
003D | Valeur de calibration CO2 | 2 | 1 ppm | Lecture/écriture |
Adresse de registre
(Hex) |
nom du registre | Nombre d'octets | Contenu | Fonction supportée |
---|---|---|---|---|
07D0 | ID esclave | 2 | 1-254 | Lecture/écriture |
07D1 | Baud Rate | 2 | 0:2400
1:4800* 2:9600 |
Lecture/écriture |
requêtes de lecture
Nous avons pu voir plus haut avec le capteur de conductivité que le format des requêtes est standardisé.
Nous appliquerons donc le même standard ici.
Exemple 1 : l'humidité
L'adresse du registre contenant la valeur du taux d'humidité est 00 00. Nous souhaitons lire 1 registre.
L'ID du capteur est 1.
Constituons la requête avec la fonction 03
01 : ID
03 : Fonction de lecture
00 00 : adresse du 1er registre à lire sur 2 octets
00 01 : nombre de registres consécutifs à lire (2 octets)
xx xx : CRC code calculé par le logiciel
01 | 03 | 00 | 00 | 00 | 01 | xx | xx |
---|
Le capteur répond avec cette trame :
01 | 03 | 02 | 00 | D5 | 79 | DB |
---|
01 : ID
03 : Fonction de lecture
02 : nombre d'octets constituant la réponse
00 D5 : valeur de l'humidité
79 DB : CRC
La valeur d'humidité est donc ((00 * 256) + 213)/10 = 21.3%RH
Exemple 2 : le CO2
L'adresse du registre pour le CO2 est 00 02.
01 | 03 | 00 | 02 | 00 | 01 | xx | xx |
---|
01 : ID
03 : Fonction lecture
00 02 : adresse 1er registre à lire
00 01 : nombre de registres à lire
xx xx : CRC
Le capteur envoie cette réponse
01 | 03 | 02 | 0B | B8 | BF | 06 |
---|
01 : ID
03 : Fonction de lecture
02 : nombre d'octets constituant la réponse
0B B8 : valeur de l'humidité
BF 06 : CRC
La quantité de CO2 est donc ((11* 256) + 184) = 3000 ppm
Exemple 3 : lecture humidité, température et CO2 ensemble
L'adresse du premier registre à lire est 00 00
01 | 03 | 00 | 00 | 00 | 03 | xx | xx |
---|
01 : ID
03 : Fonction lecture
00 00 : adresse 1er registre à lire
00 03 : nombre de registres à lire
xx xx : CRC
Le capteur envoie cette réponse
01 | 03 | 06 | 01 | 67 | FF | 85 | 0B | B8 | 33 | DC |
---|
01 : ID
03 : Fonction lecture
06 : nombre d'octets dans les données
01 67 : valeur d'humidité. L'humidité est de 359/10=35.9 %RH
FF 85 : valeur de température. Quand elle est négative, elle remonte comme complément. Ici, la température vaut -7.5°C
0B B8 : Valeur CO2. Le CO2 est de 3000 ppm
33 BC : CRC
Requêtes d'écriture
Appliquons les standards aux requêtes d'écriture
Exemple : calibration de l'humidité
Conclusion
Modbus est une compétence importante de l’IPX800 V5.
L’utilisation de Modbus RTU nous ouvre les portes de l’intégration d’objets intelligents et communicants dans notre domotique.
Pour ma part, je peux désormais envisager mon futur projet : un système de dosage automatique des engrais liquides dans la solution nutritive d’un mini potager hydroponique, avec régulation du taux de CO2 pour la santé des plants.
Amis débutants, j’espère que cet article vous aura permis de découvrir et mieux comprendre le protocole Modbus, peut-être en aurez vous besoin au sein de votre installation. Même si nous n’avons pas abordé des sujets complexes comme la gestion d’appareils technologiques sophistiqués tels que les climatiseurs gainables, ne vous découragez pas !
Modbus étant open-source, il existe d'innombrables bibliothèques prêtes à l'emploi permettant aux non-initiés de concevoir leurs propres appareils communicants à base de SBC (ESP8266, ESP32, RPI, ...).
La communauté du forum regorge d’experts en Modbus qui seront ravis de vous guider dans les cas plus complexes. N’hésitez pas à poser vos questions et à partager vos expériences !