Modbus — Protocol voor industriële communicatie
Definitie en geschiedenis
Modbus is een industrieel communicatieprotocol dat in 1979 door Modicon (tegenwoordig Schneider Electric) werd geïntroduceerd om communicatie mogelijk te maken tussen zijn programmeerbare logische controller (PLC) en veldapparatuur. Modbus werd in 2002 een open en royaltyvrije standaard en is vandaag de dag het meest gebruikte protocol in de industrie, dat wereldwijd op honderden miljoenen apparaten wordt gebruikt.
De populariteit ervan berust op drie fundamentele eigenschappen: eenvoud (gemakkelijk te implementeren, goed gedocumenteerd), robuustheid (werkt ook bij verbindingen van slechte kwaliteit) en interoperabiliteit (open standaard, ondersteund door vrijwel alle industriële apparatuur — PLC's, frequentieregelaars, energiemeters, sensoren, regelaars).
Ondanks zijn leeftijd blijft Modbus onmisbaar, met name in bestaande installaties (brownfield) en voor goedkope apparatuur. Het grootste nadeel is het ontbreken van ingebouwde beveiliging (geen authenticatie, geen versleuteling), waardoor het achter een VPN moet worden beschermd wanneer het via een niet-beheerd netwerk wordt verzonden.
Modbus RTU versus Modbus TCP
Er zijn twee belangrijke varianten van het Modbus-protocol:
Modbus RTU (serieel)
- Fysieke laag: RS-232 (punt-tot-punt) of RS-485 (multi-drop-bus met maximaal 32 apparaten, maximale afstand 1 200 m bij 9 600 baud).
- Overdracht: binair, compact. Elk bericht bevat het adres van de slave, de functiecode, de gegevens en een CRC-16-integriteitscontrole.
- Topologie: master-slave (één master, maximaal 247 slave-apparaten, adresseerbaar van 1 tot 247).
- Toepassingen: energiemeters, frequentieregelaars, industriële sensoren met RS-485-uitgang, oudere PLC’s.
Modbus TCP (Ethernet)
- Fysieke laag: Ethernet (10/100/1000 Mbps), IP-protocol, TCP-poort 502.
- Inkapseling: het Modbus RTU-frame wordt ingekapseld in een MBAP-header (Modbus Application Protocol) van 7 bytes die de CRC vervangt (Ethernet zorgt zelf voor de integriteit).
- Topologie: client-server (de client, voorheen ‘master’, vraagt informatie op bij de server, voorheen ‘slave’). Meerdere clients kunnen tegelijkertijd informatie opvragen bij dezelfde server.
- Toepassing: PLC’s met Ethernet-poort (Siemens S7, Schneider M340/M580, Allen-Bradley), HMI/SCADA, cloud-gateways.
| Criterium | Modbus RTU | Modbus TCP |
|---|---|---|
| Fysieke laag | RS-232 / RS-485 | Ethernet / TCP-IP |
| Typische snelheid | 9.600 tot 115.200 baud | 10/100 Mbps |
| Afstand | Tot 1.200 m (RS-485) | Standaard Ethernet-netwerk |
| Aantal slaves | 1 tot 247 | Onbeperkt (IP-adressering) |
| Integriteitscontrole | CRC-16 | TCP-checksum |
| Ingebouwde beveiliging | Geen | Geen (gebruik VPN) |
Opbouw van een Modbus-bericht
Modbus RTU — Frame
| Slave-adres (1 byte) | Functiecode (1 byte) | Gegevens (N bytes) | CRC-16 (2 bytes) |
Voorbeeld van een FC03-opdracht waarmee 2 registers vanaf adres 0x0000 op slave 1 worden uitgelezen:
01 03 00 00 00 02 C4 0B
Modbus TCP — Frame (met MBAP-header)
| Transactie-ID (2 bytes) | Protocol-ID (2 bytes, = 0x0000) | Lengte (2 bytes) | Eenheid-ID (1 byte) | Functiecode | Gegevens |
Modbus-registers
Modbus verdeelt de gegevens over vier soorten registers, die worden aangeduid met hun referentieadres:
| Type | Adres | Toegang | Beschrijving |
|---|---|---|---|
| Coils (spoelen) | 0x0001–0xFFFF (basis 1) | Lezen / Schrijven | Digitale digitaal-analoge uitgangen (bit) — status van een klep, een relais |
| Discrete Inputs | 0x1001–0xFFFF | Alleen lezen | Digitale digitaal-of-digitaal-ingangen (bit) — status van een digitaal-of-digitaal-sensor |
| Holding Registers | 0x4001–0xFFFF | Lezen / Schrijven | 16-bits registers voor lezen/schrijven — setpoints, parameters, meetwaarden |
| Input Registers | 0x3001–0xFFFF | Alleen-lezen | 16-bits registers (alleen-lezen) — sensormetingen, proceswaarden |
Opmerking: de daadwerkelijke adressering in de frames begint bij 0 (een offset van -1 ten opzichte van de gedocumenteerde referenties). Het Holding Register met referentie 40001 wordt dus in het frame geadresseerd als 0x0000.
Veelgebruikte functiecodes (Function Codes)
| Code | Hex | Naam | Beschrijving |
|---|---|---|---|
| FC01 | 0x01 | Read Coils | De status van N spoelen (digitale uitgangen) lezen |
| FC02 | 0x02 | Read Discrete Inputs | De status van N digitale ingangen lezen |
| FC03 | 0x03 | Read Holding Registers | N 16-bits registers lezen en schrijven — meest gebruikt |
| FC04 | 0x04 | Read Input Registers | N 16-bits registers lezen (alleen-lezen) |
| FC05 | 0x05 | Write Single Coil | Eén digitale uitgang schrijven (0x0000 = UIT, 0xFF00 = AAN) |
| FC06 | 0x06 | Write Single Register | Eén enkel 16-bits holdingregister schrijven |
| FC16 | 0x10 | Write Multiple Registers | Meerdere opeenvolgende registers in één transactie schrijven |
FC03 is veruit de meest gebruikte code voor monitoring: hiermee kunnen de meetwaarden, statussen en tellerstanden van een apparaat worden uitgelezen.
Slave-adressering (Unit ID)
In Modbus RTU heeft elk apparaat op de RS-485-bus een uniek adres tussen 1 en 247. Adres 0 is gereserveerd voor broadcast — alleen schrijfopdrachten kunnen via broadcast worden verzonden.
In Modbus TCP wordt het veld Unit ID (voorheen Slave ID genoemd) in de MBAP-header bewaard. Dit veld is doorgaans ingesteld op 1 of 255 voor PLC's met één entiteit, maar kan worden gebruikt om verschillende RS-485-bussen achter één en dezelfde Modbus TCP/RTU-gateway te adresseren.
Modbus-configuratie op de Eziwan-gateway
De Eziwan-gateway ondersteunt standaard Modbus RTU (via RS-485) en Modbus TCP (via Ethernet). De configuratie gebeurt via de webinterface van de gateway:
- Het protocol selecteren: kies "Modbus RTU" of "Modbus TCP" in het menu "Gegevensbron".
- Seriële instellingen (alleen RTU): baudrate (9.600, 19.200, 38.400, 57.600 of 115.200), pariteit (Geen/Even/Oneven), stopbits (1 of 2).
- Slave-adres: voer het adres van het apparaat in (1 tot 247).
- Gegevenspunten definiëren: geef voor elke uit te lezen waarde de functiecode (FC01 tot FC04), het registeradres en het gegevenstype (INT16, UINT16, INT32, FLOAT32, BOOL) op.
- Verzamelinterval: pollingfrequentie (van 1 seconde tot meerdere minuten, afhankelijk van de behoefte).
- De verbinding testen: gebruik de functie „Leestest“ om te controleren of de gegevens correct worden gelezen voordat u de gegevensoverdracht naar de cloud activeert.
Gerelateerde bronnen
- Volledige handleiding RS-485 en Modbus
- Een PLC aansluiten op het Eziwan-platform
- Blogartikel: Modbus TCP versus RTU — wanneer gebruik je welke?
- PLC / API — Programmeerbare industriële besturing
Veelgestelde vragen
Wat is het verschil tussen Modbus RTU en Modbus TCP?
Modbus RTU wordt verzonden via een seriële RS-485-verbinding (multi-slave-bus, tot 1 200 m); Modbus TCP verpakt dezelfde verzoeken in een Ethernet/IP-frame op poort 502. Een gateway vormt de brug tussen beide systemen.
Wat is een Modbus-register?
Een 16-bits geheugencel die door een adres wordt aangeduid. De holdingregisters (FC03/FC06/FC16) bevatten de proceswaarden; de 32-bits grootheden (drijvende-kommagetallen, tellers) nemen twee opeenvolgende registers in beslag.
Is Modbus veilig?
Nee: het protocol biedt geen authenticatie of versleuteling. Het mag nooit op het internet worden blootgesteld — de regel is om het binnen het lokale netwerk te houden en de gegevens via een versleutelde VPN-tunnel naar de cloud te verzenden.
Hoeveel apparaten kunnen er op een Modbus RTU-bus worden aangesloten?
Maximaal 32 slaves zonder repeater (247 mogelijke logische adressen). Bij meer dan dat, of om verschillende pollingfrequenties te combineren, wordt het systeem opgesplitst in meerdere bussen via afzonderlijke RS-485-poorten.
Gerelateerde bronnen
- Modbus naar de cloud — uw Modbus-apparatuur verzamelen en bewaken
- Modbus RTU/TCP-gateway — de brug tussen serieel en IP
- Modbus RTU versus TCP — de gedetailleerde vergelijking
- Volledige Modbus-handleiding — configuratie en probleemoplossing
- Industriële protocollen — het knooppunt voor OT-protocollen