Cours Modbus/TCP Soumis par DS 10-03-2006 Dernière mise à jour : 16-10-2006 Depuis l'introduction fulgurante des réseaux ethernet dans l'industrie, le protocole Modbus et notamment sa version Modbus/TCP sont couramment mis en oeuvre pour réaliser des supervisions de chaînes industrielles pilotées par des automates programmables. 1 - Introduction Le protocole MODBUS a été crée en 1979 par Modicon (Télémécanique, Schneider Automation) Ce document se veut comme une introduction aux 2 documents officiels qui définissent le protocole MODBUS : - Le protocole MODBUS (pdf) - Le protocole MODBUS et TCP/IP (pdf)d'ailleurs, toutes les illustrations de ce cours proviennent de ces 2 documents 2 - Le protocole MODBUS Le protocole MODBUS est couramment utilisé dans l'industrie, notamment pour dialoguer avec des automates programmables. 2.2 - MODBUS et modèle O.S.I. Le protocole MODBUS est un protocole de type applicatif situé sur la couche 7 du modèle OSI. En-dessous, il existe plusieures possibilités pour implémenter le protocole MODBUS : - via une liaison série (RS-232 ou RS-485) en fonctionnement Maître/Esclave - via un réseau (TCP/IP/Ethernet) en fonctionnement Client/Serveur 2.2 - Trame MODBUS Une trame MODBUS (version RS232/RS485) contient les champs suivants : ADU (Application Data Unit) : cette partie est fonction des couches de communications utilisées en dessous de la couche MODBUS. Par exemple
l'adu pour une liaison RS-232 sera différente de l'adu pour une liaison TCP/IP. PDU (Protocol Data Unit) : cette partie est indépendante des couches de communications utilisées en dessous de la couche MODBUS. Par exemple le PDU pour une liaison RS-232 est le même que pour une liaison TCP/IP. Le PDU est composé de deux champs : - Function code : il s'agit de codes de fonctions prédéfinis par le protocole MODBUS (voir chapitre 2.3) - Data : il s'agit des données échangées par le protocole. 2.3 - Les fonctions MODBUS Le protocole MODBUS repose sur des fonctions prédéfines et associées à un code particulier (sur 1 octet = de 0 à 255). Le tableau ci-après récapitule les différentes fonctions utilisables que l'on peut classer en 3 familles : - Data access : ces fonctions permettent d'accéder en lecture et/ou écriture à des bits, mots ou fichiers d'un équipement MODBUS - Diagnostics : ces fonctions permettent d'effectuer certains diagnostics sur un équipement MODBUS - Other : ces fonctions permettent l'encapsulation du protocole MODBUS avec un autre (ex: CANopen) 2.4 - Les exceptions (erreurs) Le protocole MODBUS définit en plus des fonctions classiques des fonctions et des codes d'exception destinés à la gestion des erreurs dans une communication. Communication MODBUS normale : Communication MODBUS avec erreur : 2.4.1 - Les fonctions d'exception Les fonction d'exception sont représentées comme les fonctions classiques par un code. Voici la règle à appliquer : Exception code = Function code + 0x80 2.4.2 - Les codes d'exception Le tableau ci-dessus récapitule les différents codes d'exception associés aux fonction d'exception : Code Nom 01 Illegal function
02 Illegal data address 03 Illegal data value 04 Slave device failure 05 Acknowledge 06 Slave device busy 08 Memory parity error 0a Gateway path unavailable 0b Gateway target device failed to respond 2.5 - Les données MODBUS Les données échangées avec le protocole MODBUS, avec un automate par exemple, sont principalement des bits et des mots (sur 16 bits). Suivant le type d'accès (lecture et/ou écriture) on distingue différents type de données comme dans le tableau ci-dessous : Ces données sont différement organisées dans la mémoire d'un equipement MODBUS. Dans tous les cas, un décodage est effectué pour chaque requête MODBUS : 3 - Le protocole MODBUS et TCP/IP Après avoir étudié le protocole MODBUS dans sa généralité, nous allons à présent voir comment on peut utiliser ce protocole au dessus d'un réseau TCP/IP/Ethernet. Dans la suite du document on utilisera la dénomination MODBUS/TCP pour ce type d'utilisation du protocole. 3.1 - L'encapsulation Le principe est simple, il s'agit d'encapsuler un message MODBUS dans une trame TCP/IP classique. 3.2 - Modèle client/serveur
Le protocole MODBUS/TCP fonctionne en mode client/serveur comme ci-dessous : Le client MODBUS effectue une requête et attend en retour une réponse du serveur MODBUS. Chaque équipement MODBUS/TCP qu'il soit client ou serveur sera identifié par 2 informations : - adresse IP (donc adresse Ethernet via le protocole ARP) = à définir par l'utilisateur - port TCP = 502 (port réservé pour les applications MODBUS) 3.3 - Trame MODBUS/TCP Pour rappel, voici la représentation d'une trame MODBUS RS232/RS485 : Et enfin la représentation d'une trame MODBUS/TCP : Comme on peut le voir le PDU est identique dans les 2 représentations. Pour ce qui est de l'adu le premier champ "Additional address" se traduit par un champ "MBAP Header" et le champ "Error check" disparait car les couches TCP/IP effectuent déjà un contrôle d'erreur (CRC). 3.4 - En-tête MBAP (ModBus Application Protocol header) L'en-tête MBAP d'une longueur de 7 octets se décompose comme suit : Voici la description des différents champs : - Transaction Identifier : il s'agit en fait du numéro d'un message MODBUS. Chaque message (requête+réponse) est identifié par un numero différent - Protocol Identifier : il s'agit du numéro du protocole pour les systèmes multiplexés qui en utilisent plusieurs (MODBUS = 0) - Length : il s'agit de la longueur du message à suivre (donc Unit Identifier + Data) - Unit Identifier : il s'agit de l'identiant d'un équipement généralement utilisé par une passerelle (TCP/IP <-> liaison série) 3.5 - Codage "Big endian" Attention, toutes les données doivent être codées en "Big endian". Rappel, 0x1234 est codée sur 2 octets MSB+LSB comme suit :
- 0x12 (MSB) et 0x34 (LSB) en "Big endian" (processeurs Motorola,...) - 0x34 (MSB) et 0x12 (LSB) en "Little endian" (processeurs Intel,...) 4 - Webographie Quelques liens pour aller plus loin : - http://www.modbus.org -> Le site officiel pour les réseaux industriels MODBUS (anglophone)