e!COCKPIT : Modbus - Généralités

Préambule

Modbus est un protocole de communication non-propriétaire, créé en 1979 par Modicon (absorbée en 1996 par Schneider Electric), utilisé pour des réseaux d'automates programmables, relevant du niveau applicatif, c'est-à-dire du niveau 7 du Modèle OSI. Ce protocole basé sur une structure hiérarchisée entre un client unique et plusieurs serveurs est dans le domaine public et sa spécification est publique.

 

Généralités

En mode RTU : (RS232, RS422, RS485)

Il fonctionne sur le mode maître-esclave. Seul le maître est actif, les esclaves sont complètement passifs.

C'est le maître qui doit lire et écrire dans chaque esclave de la boucle sérielle.

Il est constitué de trames contenant le numéro de l'esclave concerné, la fonction à traiter (écriture, lecture), la donnée et le code de vérification d'erreur appelé contrôle de redondance cyclique sur 16 bits ou CRC16.

 

En mode TCP : (Ethernet, wifi, fibre...)

Il fonctionne sur le mode client-serveur. Seuls les clients sont actifs, le serveur est complètement passif.

Ce sont les clients qui doivent lire et écrire dans le serveur Modbus.

Chaque client doit se connecter au serveur en protocole TCP (adresse IP du serveur, port 502).

Le serveur est identifié par :

  1. son adresse IP
  2. le numéro du port sur lequel il attend les demandes de connexion (port 502 par défaut).

Il est constitué de trames contenant la fonction à traiter (écriture, lecture) et la donnée.

Ce protocole a rencontré beaucoup de succès depuis sa création du fait de sa simplicité et de sa bonne fiabilité. Un regain d'intérêt lui confère un certain avenir depuis son encapsulation dans les trames Ethernet grâce à Modbus over TCP/IP.

 

Couche physique

Le protocole Modbus peut être implémenté :

  • sur une liaison série asynchrone de type RS-232, RS-422 ou RS-485 ou TTY (boucle de courant), avec des débits et sur des distances variables ; on parle alors de Modbus over Serial Line;
  • via TCP/IP sur Ethernet ; on parle alors de Modbus over TCP/IP ; le port logiciel 502 est destiné à ce protocole
  • via Modbus Plus. Modbus Plus est un réseau à passage de jetons à 1 Mb/s, pouvant transporter les trames Modbus et d'autres services propre à ce réseau.

Une liaison multipoints de type RS-485 relie client et serveurs via une paire différentielle qui permet un débit élevé (jusqu'à 10 méga-bits par seconde) sur une distance importante (jusqu'à 1 200 m). Elle ne dispose que de 2 bornes qui alternativement passent les données dans un sens puis dans l'autre.

(source : https://fr.wikipedia.org/wiki/Modbus)

 

Coté Maître / Client :

La trame de base Modbus est définie par le PDU (Protocole Data Unit) qui est indépendant du support physique utilisé pour la communication

Le PDU est composé de :

  • 1 Octet pour le code fonction : ce code permet de définir le type d'action qui doit être réalisé
  • n Octets de données : par exemple l'adresse de lecture et la quantité de données à lire, l'adresse d'écriture et les données à écrire...

Le PDU est ensuite encapsulé dans la trame physique :

  • RTU : 
    • 1 Octet pour l'adresse de l'esclave
    • n Octets pour le PDU
    • 2 Octets pour le CRC
  • TCP :
    • 22 Octets pour l'entête Ethernet
    • 12 Octets pour l'entête IP
    • 24 Octets pour l'entête TCP
    • 6 Octets pour l'entête Modbus
    • 1 Octet pour l'adresse de l'esclave
    • n Octets pour le PDU
    • 4 Octets pour le CRC

 

Coté Esclave/ Serveur :

Sans erreur :

  • RTU / TCP (à encapsuler dans les trames physique comme pour le maitre)
    • 1 Octet pour l'adresse de l'esclave/ serveur
    • 1 Octet pour le code fonction (identique au code fonction reçu par le maitre / client)
    • n Octets de données

En cas d'erreur :

  • Le code fonction est remplacé par un code d'exception
  • 1 Octet pour les données d'exception

 

Définition des codes fonctions

Les accès aux données peuvent se faire de deux manières :

  • Accès bit : les données lues ou écrites sont des booléens
  • Accès mot : les données lues ou écrites sont sous forme de mots de 16 bits

Les principaux codes fonctions utilisés sont les suivants :

 
Code Explication Type d'accès
01 Read Coils Bit
02 Read Discrete Inputs Bit
03 Read Multiple Registers Mot
04 Read Input Registers Mot
05 Write Single Coil Bit
06 Write Single Register Mot
15 Write Multiple Coils Bit
16 Write Multiple Registers Mot
22 Mask Write Register Mot
23 Read / Write Multiple Registers Mot