{{tag>dev iot modbus tp}} ====== TP1.2 Introduction à Modbus ====== Modbus est apparu en 1979 à une époque où l’internet n’existait pas encore et est toujours très populaire dans l’industrie. À l’origine, Modbus était construit sur un bus série qui connectait différents équipements appelé secondaires ou slaves et un primaire ou master qui gère les communications. Chaque secondaire a un numéro unique ou adresse. Les adresses sont comprises entre 1 et 247. Le primaire n’a pas besoin d’une adresse puisque toutes les communications ont lieu avec lui. Le primaire envoie une requête au secondaire et le secondaire répond au primaire. Des communications directes entre deux secondaires ne sont pas possibles. Un équipement Modbus gère l'information sous forme de registres: * les registres qui peuvent prendre une simple valeur binaire ( on/off, true/false). Si le master peut modifier l’état et, bien sûr, le lire, est appelé un **coil**. Si la valeur binaire peut être uniquement lue, il s'agit d'un **discrete input**. les registres sur 16 bits. Ils sont utilisés pour représenter une valeur comme un courant électrique, une température, une vitesse de rotation… De même, si leur valeur ne peut être que lue par le primaire, il s'agit d'un input register sinon, si elle peut être également modifiée par le primaire, il est appelé holding register. Un équipement Modbus peut avoir jusqu’à 9999 registres de ces 4 catégories. ^ Type de Registre ^ Plage d'adresse ^ Code fonction ^ Description | | Coil | 00001 - 09999 | 01 (read) 05 (write) | Donnée binaires désignées Discrete Ouputs ou Coils. Accessibles en lecture/écriture. | | Input status | 10001 - 19999 | 02 | Données binaires en lecture seule désignée Discrete Inputs ou Input status. | | Input Register | 30001 - 39999 | 04 | Données analogiques numérisées sur 16bits en lecture seule. | | Holding Register | 40001 - 49999 | 03 (read) 06 (write) | Données analogiques numérisées sur 16bits en lecture/écriture. | Modbus est un protocole requête/réponse. Le primaire envoie une requête à l’adresse d’un équipement pour lire ou écrire un de ses registres. Une trame Modbus est une séquence de caractères commençant par un octet avec l’adresse du secondaire, suivi d’une commande (ou code de fonction). La suite de la trame contient les données, puis un CRC pour valider qu’il n’y a pas d’erreur de transmission dans la trame. La partie donnée peut être différente dans la requête et la réponse. Par exemple, pour lire un holding register, la requête contient l’adresse du premier registre à lire, et le nombre de registres à lire. La réponse contient le nombre d’octets transmis suivi de leur valeur. Pour écrire sur un registre, les données de la trame seront l’adresse du registre et les données à écrire. La réponse est le même message. Pour cet exercice le schéma d' architecture présente deux types de réseaux. Le réseau Internet en bas à gauche de la figure et le réseau Modbus qui contrôle une pompe pour l'eau et un équipement de mesure du niveau d'eau dans la cuve. Une passerelle (GW pour gateway) interconnecte les deux réseaux. Elle possède une adresse IP sur le réseau et si l'on émet des requêtes Modbus sur le bon port, elles seront transmises sur le bus RS-485 via son port USB. La réponse sera retournée à l'émetteur toujours encapsulée dans la connexion TCP/IP. Cela permet d'accéder à distance à des bus Modbus et de centraliser le traitement de l'information sur des serveurs. Plus précisément, la passerelle Modbus (ModbusGW) à l'adresse IPv4: 192.168.3.36/24. Pour communiquer avec la passerelle depuis le réseau Internet on peut utiliser un programme en Python s’appuyant sur le module **pymodbus**. Pour écrire le programme, interpréter correctement les valeurs des capteurs et configurer les actionneurs on a besoin de la documentation constructeur. De cet exercice, on peut tirer des leçons sur l'**interopérabilité**. Sans la documentation constructeur, nous n'aurions pas pu résoudre le problème. Bien sûr, il fallait connaître l'adresse IP de la passerelle Modbus et les numéros des équipements sur le bus et leur registre associés, mais la documentation doit également nous donner le format de stockage des données dans les registres et les unités utilisés.