Wat is Modbus TCP?

Modbus TCP is de variant van het industriële Modbus-protocol die Modbus-berichten via Ethernet en TCP/IP verstuurt op poort 502, in plaats van over een seriële verbinding zoals RS-485. Het protocol wordt veel gebruikt voor eenvoudige en betrouwbare communicatie tussen PLC’s, HMI’s, SCADA-systemen, sensoren, actuatoren, I/O-modules en energiemeters. Schneider Electric publiceerde de Open Modbus/TCP-specificatie in maart 1999; sinds 2007 is Modbus TCP ook opgenomen in IEC 61158 en IEC 61784-2 (communicatieprofiel CPF 15).


🧠 Wat doet Modbus TCP?

Modbus TCP:

  • Stuurt meet- en besturingsdata over standaard Ethernet
  • Gebruikt het Modbus-protocol als applicatielaag, met dezelfde functiecodes en hetzelfde datamodel als Modbus RTU
  • Verstuurt berichten via TCP-poort 502, de bij IANA geregistreerde poort voor Modbus
  • Werkt volgens het client/server-principe: een client (vroeger master) stelt vragen, een server (vroeger slave) antwoordt. De Modbus Organization verving de termen master en slave in 2020 officieel door client en server.

Anders dan bij seriële Modbus kan een client tegelijk met veel servers praten en kan een server verzoeken van meerdere clients afhandelen, bijvoorbeeld van een SCADA-server én een lokaal HMI-paneel.


🔧 Wat zijn de belangrijkste kenmerken?

Kenmerk Beschrijving
Protocoltype Open standaard, vrij te gebruiken zonder licentiekosten
Transportlaag TCP/IP (poort 502) over Ethernet
Structuur Client/server (voorheen master/slave)
Berichtformaat MBAP-header (7 bytes) plus Modbus PDU in de TCP-payload
Maximale berichtgrootte 260 bytes (7 bytes MBAP + maximaal 253 bytes PDU)
Schaalbaarheid Meerdere clients en servers mogelijk
Lees-/schrijfbewerkingen Coils, discrete inputs, input registers, holding registers
Beveiliging Geen; de beveiligde variant Modbus/TCP Security gebruikt poort 802

🗂️ Hoe ziet het datamodel van Modbus eruit?

Modbus kent vier datatabellen. Elke tabel heeft in het protocol adressen van 0 tot 65535. De bekende notatie met 00001, 10001, 30001 en 40001 is een documentatieconventie: holding register “40001” is in het bericht gewoon adres 0.

Tabel Type Toegang Conventionele notatie Typisch gebruik
Coils 1 bit Lezen en schrijven 0xxxx Digitale uitgangen, start/stop-commando’s
Discrete inputs 1 bit Alleen lezen 1xxxx Digitale ingangen, eindschakelaars
Input registers 16 bit Alleen lezen 3xxxx Meetwaarden zoals temperatuur of druk
Holding registers 16 bit Lezen en schrijven 4xxxx Setpoints, parameters, configuratie

Waarden groter dan 16 bits, zoals 32-bit floats of tellers van energiemeters, worden over twee opeenvolgende registers verdeeld. De woordvolgorde verschilt per fabrikant, een klassieke bron van verkeerde meetwaarden bij integratie.


🔍 Hoe werkt een Modbus TCP-bericht?

📤 1. Client stuurt een verzoek

De client bouwt een bericht (ADU) op met daarin:

  • Een Modbus Application Protocol (MBAP) header van 7 bytes:
  • Transaction identifier (2 bytes) - koppelt een antwoord aan het juiste verzoek
  • Protocol identifier (2 bytes) - altijd 0x0000 voor Modbus
  • Length (2 bytes) - aantal bytes dat nog volgt
  • Unit identifier (1 byte) - adres van een apparaat achter een gateway, anders 0xFF
  • Een PDU (Protocol Data Unit) met:
  • Function code (zoals ‘read holding registers’ = 0x03)
  • Startadres (0-gebaseerd: register “40001” is adres 0)
  • Aantal registers om te lezen of schrijven

Voorbeeld:

Lees 4 holding registers vanaf “40001”, dus adres 0 (function code 0x03).

Dit wordt verzonden via poort 502 over TCP/IP naar het IP-adres van het Modbus TCP-apparaat. De CRC-controle van Modbus RTU vervalt en het seriële slave-adres wordt vervangen door de unit identifier; TCP zorgt zelf voor foutdetectie en betrouwbare aflevering.


📥 2. Server ontvangt en verwerkt het bericht

De Modbus server ontvangt het bericht en voert het volgende uit:

  • Valideert de instructie (functiecode, adres, aantal)
  • Leest of schrijft de gevraagde registers of coils
  • Bouwt een antwoord op met de gevraagde data (of foutcode)

🔁 3. Antwoord terug naar de client

De server stuurt een antwoord (response) terug via dezelfde TCP-verbinding. Deze bevat:

  • De MBAP-header met dezelfde transaction identifier en unit identifier
  • Function code (mogelijk met foutbit)
  • Gelezen waarden of bevestiging van succesvolle actie

Bij fouten wordt een exception response teruggestuurd met het hoogste bit van de function code op 1 (bijv. 0x83 = fout bij 0x03) plus een exception code, zoals 01 (ongeldige functie), 02 (ongeldig data-adres), 03 (ongeldige waarde), 04 (storing in het apparaat), 0A (gateway-pad niet beschikbaar) of 0B (doelapparaat achter gateway reageert niet).


🧪 Voorbeeldverloop

  1. Client stuurt: “Lees 2 holding registers vanaf 40001”
  2. Server antwoordt: “Register 40001 = 123, Register 40002 = 456”
  3. Client verwerkt deze data voor monitoring of sturing

🧠 Veelgebruikte function codes

Function code Beschrijving Maximum per verzoek
0x01 Lees coils (discrete outputs) 2000 coils
0x02 Lees discrete inputs 2000 inputs
0x03 Lees holding registers 125 registers
0x04 Lees input registers 125 registers
0x05 Schrijf één coil 1 coil
0x06 Schrijf één register 1 register
0x0F Schrijf meerdere coils 1968 coils
0x10 Schrijf meerdere registers 123 registers
0x17 Lees en schrijf meerdere registers in één verzoek 125 lezen / 121 schrijven

Modbus TCP kent geen authenticatie: elk apparaat dat het netwerk bereikt, mag deze functiecodes gebruiken, ook de schrijfopdrachten. Dat dit risico reëel is, liet FrostyGoop zien: malware die in januari 2024 via Modbus TCP de verwarming van ruim 600 flatgebouwen in Lviv uitschakelde.


🔌 Wat is het verschil tussen Modbus TCP en Modbus RTU?

Aspect Modbus TCP Modbus RTU
Fysieke laag Ethernet (RJ45, glasvezel) Serieel (RS-232 / RS-485)
Snelheid Hoog (10/100/1000 Mbit/s) Lager (9.6–115.2 kbit/s typisch)
Topologie Ster of geswitcht netwerk Busstructuur
Compatibiliteit Modernere netwerken en IT-integratie Eenvoudige legacy-systemen
Adressering IP-adressen (plus unit identifier achter gateways) Slave-adressen 1–247
Foutcontrole Door TCP CRC-16 per bericht
Gelijktijdigheid Meerdere clients en verzoeken tegelijk Eén master, één verzoek tegelijk

🌉 Hoe koppelt u seriële Modbus aan Modbus TCP?

Veel installaties combineren beide varianten via een Modbus-gateway. De gateway heeft één IP-adres en vertaalt verzoeken naar het seriële netwerk. De unit identifier in de MBAP-header bepaalt welk RTU-apparaat (adres 1–247) het verzoek krijgt. Typische toepassingen zijn het ontsluiten van oudere energiemeters, frequentieregelaars en O voor een nieuw SCADA- of edge-platform.

Let op twee valkuilen: een gateway verwerkt seriële verzoeken meestal één voor één, dus te veel clients of een te korte polltijd leveren timeouts op. En bij rechtstreeks verbonden TCP-apparaten adviseert de specificatie unit identifier 0xFF, zodat een verkeerd gerouteerd verzoek na een IP-wijziging niet bij een willekeurig serieel apparaat terechtkomt.


🏭 Waar wordt Modbus TCP gebruikt?

Modbus TCP-apparaten worden geleverd door onder meer Siemens, Schneider Electric, ABB, WAGO, Beckhoff, Advantech en Phoenix Contact: PLC’s, HMI-panelen met Ethernet, I/O-modules en slimme energie- en flowmeters.

✅ Voordelen

  • Simpel en robuust protocol
  • Breed ondersteund door fabrikanten
  • Open standaard zonder licentiekosten
  • Makkelijk te implementeren in SCADA of softwareplatforms

🔒 Hoe beveiligt u Modbus TCP?

Modbus TCP zelf biedt geen ingebouwde beveiliging: geen authenticatie, geen versleuteling en geen integriteitscontrole. Wie poort 502 bereikt, kan registers lezen en schrijven, en verkeer kan worden afgeluisterd of opnieuw afgespeeld (replay-aanval). Naast FrostyGoop bevatte ook de PIPEDREAM-toolkit uit 2022 modules om eigen Modbus-commando’s naar PLC’s te sturen.

Een praktische aanpak in stappen:

  1. Breng de Modbus-communicatie in kaart - welke clients praten met welke servers, met welke functiecodes en registerbereiken? Een asset-inventarisatie en een verkeersanalyse met Wireshark vormen de basis.
  2. Stel poort 502 nooit bloot aan internet - gebruik voor beheer op afstand een VPN of een beheerde remote access-oplossing via een DMZ.
  3. Segmenteer het netwerk - plaats Modbus-apparaten in een eigen Zone volgens het zones-en-conduits-model van IEC 62443, gescheiden via VLAN’s en een firewall.
  4. Filter op protocolniveau - een industriële firewall met DPI kan via protocolfiltering alleen leesopdrachten toestaan, schrijfopdrachten beperken tot één engineeringstation en registerbereiken afbakenen.
  5. Monitor het verkeer - passieve monitoring en een OT-IDS signaleren onverwachte schrijfopdrachten, nieuwe clients of ongebruikelijke functiecodes. Open-source tools als Zeek en Suricata hebben ingebouwde Modbus-ondersteuning.
  6. Gebruik waar mogelijk Modbus/TCP Security - deze variant van de Modbus Organization verpakt hetzelfde Modbus-bericht in TLS (gebaseerd op TLS 1.2) op poort 802. Client en server authenticeren elkaar met X.509v3-certificaten en een rol in het certificaat bepaalt welke functiecodes zijn toegestaan.

Voor organisaties onder NIS2, in Nederland uitgewerkt in de Cyberbeveiligingswet, horen segmentatie, toegangsbeheer en monitoring van zulke onbeveiligde protocollen bij de verplichte maatregelen voor netwerk- en informatiebeveiliging.


❓ Veelgestelde vragen

Welke poort gebruikt Modbus TCP?

Modbus TCP gebruikt standaard TCP-poort 502, die bij IANA voor Modbus is geregistreerd. Een server moet op poort 502 luisteren, ook als een fabrikant een extra poort configureerbaar maakt. De beveiligde variant Modbus/TCP Security gebruikt poort 802.

Is Modbus TCP hetzelfde als Modbus RTU over TCP?

Modbus TCP is niet hetzelfde als Modbus RTU over TCP. Modbus TCP gebruikt de MBAP-header en laat de CRC weg, terwijl “RTU over TCP” het complete seriële RTU-frame inclusief CRC ongewijzigd in een TCP-verbinding verpakt. Beide varianten zijn onderling niet uitwisselbaar, dus de client moet hetzelfde formaat gebruiken als het apparaat.

Wat is de unit identifier in Modbus TCP?

De unit identifier is de laatste byte van de MBAP-header in Modbus TCP. Achter een gateway bepaalt die waarde welk serieel apparaat (adres 1–247) het verzoek ontvangt. Bij een apparaat dat rechtstreeks op het IP-netwerk zit, adviseert de specificatie de waarde 0xFF; 0 wordt ook geaccepteerd.

Is Modbus TCP versleuteld?

Standaard Modbus TCP is niet versleuteld en kent geen authenticatie. Alle registerwaarden en schrijfopdrachten gaan onversleuteld over het netwerk. Versleuteling en wederzijdse authenticatie zijn alleen beschikbaar met Modbus/TCP Security over TLS op poort 802, en die variant wordt door nog weinig apparaten ondersteund.

Waarom begint een Modbus-adres soms bij 40001 en soms bij 0?

Modbus TCP gebruikt in het bericht zelf altijd 0-gebaseerde adressen van 0 tot 65535 per datatabel. De notatie 40001 is een documentatieconventie waarbij het eerste cijfer de tabel aangeeft (4 = holding registers) en de telling bij 1 begint. Register 40001 is dus adres 0 met function code 0x03; een verschuiving van één register is een veelvoorkomende integratiefout.

Hoe snel is Modbus TCP?

Modbus TCP draait op Ethernet van 10, 100 of 1000 Mbit/s en is daardoor veel sneller dan seriële Modbus RTU. De werkelijke cyclustijd wordt meestal bepaald door de polltijd van de client en de verwerkingstijd van het apparaat, typisch tientallen tot honderden milliseconden. Voor harde realtime-besturing kiest men eerder voor ProfiNET of EtherCAT.


📌 Samengevat

Modbus TCP is een eenvoudig en veelgebruikt Ethernet-protocol voor communicatie tussen industriële apparaten. Het combineert de eenvoud van het Modbus-protocol en zijn datamodel van coils en registers met de snelheid en flexibiliteit van moderne Ethernet-netwerken, maar heeft geen eigen beveiliging. Segmentatie, protocolfiltering, monitoring en waar mogelijk Modbus/TCP Security op poort 802 zijn daarom onmisbaar.