Modbus est un protocole de communication non-propriétaire, créé en 1979 par Modicon (absorbée en 1996 par Schneider Electric), de la couche ISO applicatif. Il permet à des composants électroniques industriels de communiquer entre eux, souvent dans le cadre d'un SCADA. Il peut être utilisé dans le cas d'échange via des communications séries ou via un réseau TCP/IP.
Le protocole MODBUS est un protocole de type client/serveur[1]. Par exemple, une Interface Humain-Machine SCADA est connectée à une unité terminale distante (ou RTU) et communique par Modbus. Dans ce cas, la IHM est cliente et le RTU est serveur.
Il existe trois types de transmission Modbus :
Ces trois types de transmission sont incompatibles les uns avec les autres.
Le protocole MODBUS définit un « protocol data unit » (PDU) qui est indépendant de toute couche protocolaire sous-jacente. Le PDU est composé d’un code de fonction, permettant d’indiquer quel type d’actions le client cherche à réaliser, et de données[3]. Pour associer le protocole au bon élément, le protocole définit un « Application Data Unit », qui est composé d’une adresse (pour le protocole par défaut) ou une entête « MBAP » (pour Modbus/TCP), d’un PDU et de code de vérification d'intégrité. L’ADU est formé par le client qui initie la communication.
En résumé :
PDU =Code de fonction + Données
Pour Modbus générique :
ADU = Adresses + PDU + code d’erreur
Pour Modbus/TCP :
ADU = En-tête MBAP + PDU + code d’erreur
où l'entête MBAP est composée de :
Modbus définit 3 types de PDU (Protocol Data Unit) disctincts[4]:
Le procotole MODBUS définit 4 types de données :
Modèles | Type d’objet | Type |
---|---|---|
Discretes input | Un bit | Lecture uniquement |
Coils | Un bit | Lecture-Ecriture |
Input registers | Mots de 16-bits | Lecture uniquement |
Holding registers | Mots de 16-bits | Lecture-Ecriture |
Les codes de fonction permettent au client de dire au serveur quels types d’actions réaliser. Il en existe trois types :
Par exemple, le code "01" signifie que le client demande à lire un registre "Coils" à une adresse donnée.
Function type | Function name | Function code | Subcode | Comment | ||
---|---|---|---|---|---|---|
Data Access | Bit access | Physical Discrete Inputs | Read Discrete Inputs | 2 | ||
Internal Bits or Physical Coils | Read Coils | 1 | ||||
Write Single Coil | 5 | |||||
Write Multiple Coils | 15 | |||||
16-bit access | Physical Input Registers | Read Input Registers | 4 | |||
Internal Registers or Physical Output Registers | Read Multiple Holding Registers | 3 | ||||
Write Single Holding Register | 6 | |||||
Write Multiple Holding Registers | 16 | |||||
Read/Write Multiple Registers | 23 | |||||
Mask Write Register | 22 | |||||
Read FIFO Queue | 24 | |||||
File Record Access | Read File Record | 20 | ||||
Write File Record | 21 | |||||
Diagnostics | Read Exception Status | 7 | serial only | |||
Diagnostic | 8 | 00-18, 20 | serial only | |||
Get Com Event Counter | 11 | serial only | ||||
Get Com Event Log | 12 | serial only | ||||
Report Server ID | 17 | serial only | ||||
Read Device Identification | 43 | 14 | ||||
Other | Encapsulated Interface Transport | 43 | 13, 14 | |||
CANopen general Reference | 43 | 13 |
Le protocole Modbus peut être implémenté :
Modbus n'est pas sécurisé par défaut[5]. Cependant, Modbus Organization a spécifié une version sécurisée de Modbus/TCP, qui se base sur de l'encapsulation TLS : Modbus/TCP Security. Le protocole utilise par défaut le port TCP 802[6].
Le serveur et le client Modbus s'authentifient mutuellement par TLS. Les autorisations du client sont définis par rôle. Le rôle est écrit dans une extension « RoleOID » du certificat X.509 du client, qui permet au serveur de vérifier si le client est autorisée à réaliser l'action demandée sur la ressource. La base de données associant rôle et droit est spécifique au vendeur et peut-être hébergée localement sur le serveur ou bien sur un serveur distant.