3 Wat is Modbus?
Modbus is een communicatieprotocol waarmee apparaten gegevens opvragen en wijzigen, bijvoorbeeld tussen een BRControls controller, een meetinstrument en een bedienpaneel. Het protocol beschrijft vooral welke gegevens worden benaderd, welke bewerking wordt gevraagd en hoe het antwoord eruitziet.
De basis is request/response: een master stelt een vraag en een slave geeft antwoord. Dat kan bijvoorbeeld een verzoek zijn om twee meetwaarden te lezen of een instelwaarde te schrijven.
Modbus is niet hetzelfde als RS-485 of Ethernet: RS-485 beschrijft elektrische signaaloverdracht, terwijl Modbus de berichten en bewerkingen definieert. Modbus TCP gebruikt TCP/IP als transport, doorgaans via Ethernet.
Belangrijk: Modbus standaardiseert de toegang tot bits en registers, maar niet automatisch hun technische betekenis. Een registeradres vertelt op zichzelf niet of de inhoud een temperatuur, een statusmelding, een setpoint of een toerental is; daarvoor is de registermapping van BRControls nodig. In dit document worden de diverse registermappings beschreven.
3.1 Digitale techniek in het kort
De eenvoudigste manier om digitale techniek te begrijpen: stel je computergeheugen voor als een rij schakelaartjes. Elk schakelaartje kan alleen uit (0) of aan (1) staan. Eén zo’n schakelaartje heet een bit. Groepjes bits vormen onder andere een nibble, byte of word.
Daarbij is één onderscheid belangrijk: bit en byte vertellen hoeveel ruimte iets inneemt; een datatype zoals integer vertelt hoe je de opgeslagen bits moet interpreteren.
1. Van bit naar byte en word
| Begrip | Aantal bits | Eenvoudige uitleg | Mogelijke waarden als positief geheel getal |
|---|---|---|---|
| Bit | 1 | Eén schakelaartje | 0 of 1 |
| Nibble | 4 | Een halve byte | 0 t/m 15 |
| Byte | 8 | Acht schakelaartjes bij elkaar | 0 t/m 255 |
| Word | 16* | Twee bytes | 0 t/m 65.535 |
Double word (DWORD) | 32* | Vier bytes | 0 t/m 4.294.967.295 |
Long word (LWORD) | 64* | Acht bytes | 0 t/m 18.446.744.073.709.551.615 |
Een nibble bevat 4 bits en een byte 8 bits. De genoemde WORD-, DWORD- en LWORD-groottes zijn gangbaar in PLC-programmering.
Let op: WORD is in PLC-systemen zoals CODESYS en TwinCAT 16 bits. Het algemene computerbegrip ‘word’ is niet universeel 16 bits: de betekenis hangt af van het systeem of de processorarchitectuur.
Waarom loopt een byte maar tot 255?
Elke bit heeft twee mogelijkheden, 0 of 1. Met 8 bits krijg je dus:
2^8 = 256 verschillende combinaties
Omdat je bij nul begint, zijn dat de getallen 0 tot en met 255. Er zijn dus 256 mogelijkheden, maar het hoogste getal is 255.
Zo ziet een byte eruit:
Bits: 0 0 0 0 1 1 0 1 Bitwaarde: 128 64 32 16 8 4 2 1 Tel alleen de waarden bij de enen op: 8 + 4 + 1 = 13
De byte 00001101 stelt als positief geheel getal dus 13 voor. Elke positie vertegenwoordigt een macht van twee.
2. Wat is dan een integer?
Een integer is een geheel getal: bijvoorbeeld 0, 25 of -100, zonder cijfers achter de komma.
‘Integer’ is dus geen vaste datagrootte. Er bestaan integers van bijvoorbeeld 8, 16, 32 en 64 bits. Binnen PLC-programmering hebben de specifieke typenamen doorgaans de volgende betekenis:
| Datatype | Grootte | Bereik | Betekenis |
|---|---|---|---|
SINT | 8 bits / 1 byte | −128 t/m 127 | Kleine integer met negatieve waarden |
USINT | 8 bits / 1 byte | 0 t/m 255 | Kleine integer zonder negatieve waarden |
INT | 16 bits / 2 bytes | −32.768 t/m 32.767 | Integer met negatieve waarden |
UINT | 16 bits / 2 bytes | 0 t/m 65.535 | Integer zonder negatieve waarden |
DINT | 32 bits / 4 bytes | −2.147.483.648 t/m 2.147.483.647 | Grotere integer met negatieve waarden |
UDINT | 32 bits / 4 bytes | 0 t/m 4.294.967.295 | Grotere integer zonder negatieve waarden |
Deze groottes en bereiken gelden voor de hier beschreven PLC-datatypen; ga er niet van uit dat een type met de naam int in iedere programmeertaal hetzelfde is.
De U betekent unsigned: zonder teken, dus geen negatieve waarden. Zonder die U zijn deze typen signed: ze kunnen ook negatieve waarden bevatten. Je houdt evenveel bitcombinaties, maar verdeelt ze anders over het bereik.
3. Wat is het verschil tussen WORD en INT?
Ze nemen in deze PLC-systemen allebei 16 bits in beslag, maar je gebruikt ze met een andere bedoeling:
WORD: een verzameling van 16 losse bits, bijvoorbeeld voor aan/uit-statussen.INT: één geheel getal, bijvoorbeeld een teller of een meetwaarde.UINT: ook één geheel getal, maar uitsluitend nul of positief.
Een statuswoord kan bijvoorbeeld zo zijn ingedeeld:
Bit 0 = pomp draait Bit 1 = storing aanwezig Bit 2 = handbediening actief Bit 3 = thermische beveiliging actief Bit 4 = onderhoud nodig Bit 5 t/m 15 = reserve
Hetzelfde geheugenpatroon kan dus verschillende betekenissen hebben. Bijvoorbeeld:
| Opgeslagen bits | Interpretatie | Betekenis |
|---|---|---|
11111111 11111111 | WORD | Alle 16 bits staan aan |
11111111 11111111 | UINT | Het getal 65.535 |
11111111 11111111 | INT | Het getal −1 |
Bij de signed integers die hier worden bedoeld, gebruikt het systeem de zogeheten tweecomplementnotatie om negatieve getallen op te slaan. Het datatype bepaalt dus hoe de bits worden gelezen.
4. Andere veelgebruikte datatypen
Naast gehele getallen en bitverzamelingen kom je deze typen vaak tegen:
| Datatype | Bedoeling | Voorbeeld | Gebruikelijke grootte in PLC-systemen |
|---|---|---|---|
BOOL | Waar of onwaar | Pomp draait: TRUE | Twee logische toestanden; daadwerkelijke opslag kan een byte zijn |
REAL | Getal met komma | Temperatuur: 21,5 | 32 bits / 4 bytes |
LREAL | Getal met komma, met meer precisie | Nauwkeurige berekening | 64 bits / 8 bytes |
BOOL beschrijft een logische toestand. REAL en LREAL zijn drijvendekommagetallen: ze kunnen getallen met een komma voorstellen, maar niet elke decimale waarde exact opslaan. LREAL biedt meer precisie dan REAL. Deze datatypen worden verderop in dit document nog verder beschreven en voorzien van voorbeelden.
5. En kilobyte, megabyte en gigabyte?
Dit zijn grotere hoeveelheden bytes, bijvoorbeeld voor bestandsgrootte of opslagcapaciteit:
| Eenheid | Aantal bytes |
|---|---|
| 1 kB — kilobyte | 1.000 |
| 1 MB — megabyte | 1.000.000 |
| 1 GB — gigabyte | 1.000.000.000 |
| 1 TB — terabyte | 1.000.000.000.000 |
Let ook op de letter: kleine b betekent bit, hoofdletter B betekent byte. Daarom is 8 Mb aan gegevens evenveel als 1 MB.
Ezelsbruggetje
4 bits = 1 nibble 8 bits = 1 byte 2 bytes = 1 WORD ┐ 4 bytes = 1 DWORD ├─ in de genoemde PLC-systemen 8 bytes = 1 LWORD ┘
En voor de betekenis: een WORD is een groep schakelaartjes, een integer is een geheel getal en een REAL is een getal met een komma. Ze kunnen evenveel ruimte innemen, terwijl ze iets heel anders voorstellen. cs.sjsu
3.2 RTU en TCP
| Eigenschap | Modbus RTU | Modbus TCP |
|---|---|---|
| Gebruikelijke verbinding | RS-485, meestal tweedraads; RS-232 is ook mogelijk. | TCP/IP, doorgaans Ethernet. |
| Topologie | Doorgaande bus met korte aftakkingen. | Ethernet-switchinfrastructuur; IP-routering is mogelijk. |
| Communicatieregeling | Eén actieve master en één transactie tegelijk. | Meerdere clients en openstaande transacties mogelijk, binnen apparaatcapaciteit. |
| Doelapparaat | Serieel adres 1–247. | IP-adres en TCP-poort; Unit ID voor interne adressering of een gateway. |
| Broadcast | Adres 0, schrijfverzoeken zonder antwoord. | Geen algemene TCP-netwerkbroadcast; eventuele doorzetting naar RTU is gatewayafhankelijk. |
| Berichtgrenzen | Stille intervallen tussen frames. | Lengteveld in de MBAP-header. |
| Foutcontrole | CRC-16 over adres en PDU. | Geen Modbus-CRC; foutcontrole via onderliggende communicatielagen. |
| Maximale ADU | 256 bytes. | 260 bytes, exclusief TCP/IP- en Ethernet-overhead. |
| Aanvullende instellingen | Baudrate, databits, pariteit, stopbits en adres. | IP-configuratie, TCP-poort en eventueel Unit ID. |
| Ingebouwde cryptografische beveiliging | Niet aanwezig in klassiek RTU. | Niet aanwezig in klassiek TCP; Modbus/TCP Security is een aparte variant. |
3.3 ADU en PDU
In Modbus is de PDU de inhoud van een bericht en de ADU het volledige Modbus-bericht, inclusief de extra velden voor de gebruikte verbinding. De ADU bevat dus de PDU.
| Afkorting | Betekenis | Wat zit erin? |
|---|---|---|
| PDU | Protocol Data Unit | Functiecode + bijbehorende data |
| ADU | Application Data Unit | De PDU + de transportafhankelijke velden, zoals adressering, een header en eventueel een foutcontrole |
De PDU is onafhankelijk van de transportvariant; de verpakking eromheen verschilt tussen bijvoorbeeld Modbus RTU en Modbus TCP.
3.3.1 Verschil tussen RTU en TCP
Bij Modbus RTU ziet het bericht er zo uit:
Slave-adres Functiecode Data CRC
└────── PDU ─────────┘
└──────────────── ADU ───────────────────┘
Het slave-adres identificeert het apparaat; de CRC dient voor foutdetectie. Beide vallen buiten de PDU, maar binnen de ADU.
Bij Modbus TCP is de opbouw:
MBAP-header Functiecode Data
└────── PDU ─────────┘
└────────────── ADU ───────────────┘
De MBAP-header (Modbus Application Protocol) is 7 bytes en bevat onder meer een transactie-ID, lengteveld en Unit Identifier. Modbus TCP voegt geen Modbus-CRC toe. De TCP/IP- en Ethernet-headers vallen buiten deze Modbus-ADU.
3.3.2 Keuze RTU / TCP
RTU ligt voor de hand bij apparaten met een seriële interface en een overzichtelijke busstructuur; TCP past bij een bestaande industriële Ethernet-infrastructuur en meerdere gegevensafnemers (Masters). Toets die keuze altijd aan gewenste cyclustijd, isolatie, onderhoud en de werkelijke apparaatcapaciteit.
Modbus ASCII is een andere seriële berichtcodering, met ASCII-hextekens en LRC-foutcontrole; het is niet hetzelfde als RTU. Ook een product dat “RTU over TCP” noemt, hoeft geen standaard Modbus TCP te gebruiken: controleer of het MBAP-berichten of ongewijzigde RTU-frames in een TCP-tunnel verwacht. BRControls ondersteunt deze laatste 2 uitvoeringen NIET
3.4 Datamodel en adressering
3.4.1 Vier gegevenstabellen
Het standaarddatamodel kent vier logisch gescheiden tabellen; de koppeling aan het interne geheugen en aan de procesgegevens is apparaatspecifiek.
| Tabel | Grootte per element | Protocoltoegang | Gebruikelijke referentienotatie |
|---|---|---|---|
| Coils | 1 bit | Lezen en schrijven. | 0xxxx, bijvoorbeeld 00001. |
| Discrete inputs | 1 bit | Alleen lezen. | 1xxxx, bijvoorbeeld 10001. |
| Input registers | 16 bits | Alleen lezen. | 3xxxx, bijvoorbeeld 30001. |
| Holding registers | 16 bits | Lezen en schrijven volgens het model; een apparaat kan afzonderlijke adressen beperken. | 4xxxx, bijvoorbeeld 40001. |
Een coil hoeft geen fysieke relaisuitgang te zijn en een input register hoeft geen directe analoge ingang te bevatten: ook interne status- en meetgegevens passen in dit model. De tabelnaam bepaalt dus niet automatisch het fysieke gedrag. Zo kan een 16 bits input register bijvoorbeeld ook 16 aparte status/storingsmeldingen bevatten.
3.4.2 Registernummer versus protocoladres
In een bericht wordt een zero-based adres van 0 tot en met 65535 verzonden. Het bekende nummer 40001 is een referentienotatie voor het eerste holding register en wordt niet standaard letterlijk als 40001 in het adresveld gezet.
| Referentie | Tabel | PDU-adres decimaal | PDU-adres hex | Leesfunctie |
|---|---|---|---|---|
40001 | Holding register | 0 | 0x0000 | FC03. |
40002 | Holding register | 1 | 0x0001 | FC03. |
40108 | Holding register | 107 | 0x006B | FC03. |
30001 | Input register | 0 | 0x0000 | FC04. |
De functiecode selecteert de tabel; het adres selecteert het element binnen die tabel. Daardoor kunnen holding register adres 0 en input register adres 0 verschillende gegevens bevatten.
Softwarepakketten verschillen in de gewenste invoer: het ene verwacht een protocoladres, het andere een referentienummer of een instelling voor zero-based adressering. Ook zes-cijferige referenties zoals 400001 komen voor; leg daarom altijd tabel + PDU-adres + nummerbasis vast. BRModbus gebruikt eigen referentienummers in de registermappings.
Veelvoorkomende fout: bij een onjuist ingestelde nummerbasis lees je één register te vroeg of te laat. Corrigeer niet op goed geluk: vergelijk de BRControls registermappings, de driverinstelling van de Master en het werkelijk verzonden adres.
3.4.3 Adresruimte en implementatie
Per tabel zijn theoretisch 65536 elementen adresseerbaar; dat is niet het aantal registers dat BRControls verplicht moet aanbieden. Een aanvraag over niet-geïmplementeerde adressen zal een exception opleveren, ook als het beginadres wel bestaat!
Voor projectcontrole geldt: het laatste adres is het startadres plus het aantal elementen min één. Laat een blok nooit voorbij adres 65535 lopen en controleer bovendien of het volledige blok in de BRModbus registermapping bestaat.
3.5 Functiecodes en transacties
3.5.1 Veelgebruikte functiecodes
De onderstaande aantallen zijn protocolmaxima per verzoek zoals in de Modbusdefinitie is beschreven, geen garantie dat BRControls ze volledig ondersteunt.
| Decimaal | Hex | Functie | Maximum per verzoek |
|---|---|---|---|
| 1 | 0x01 | Read Coils | 2000 bits. |
| 2 | 0x02 | Read Discrete Inputs | 2000 bits. |
| 3 | 0x03 | Read Holding Registers | 125 registers. |
| 4 | 0x04 | Read Input Registers | 125 registers. |
| 5 | 0x05 | Write Single Coil | 1 bit. |
| 6 | 0x06 | Write Single Register | 1 register. |
| 15 | 0x0F | Write Multiple Coils | 1968 bits. |
| 16 | 0x10 | Write Multiple Registers | 123 registers. |
| 22 | 0x16 | Mask Write Register | 1 register met AND-/OR-maskers. |
| 23 | 0x17 | Read/Write Multiple Registers | 125 lezen en 121 schrijven. |
| 43/14 | 0x2B/0x0E | Read Device Identification | Apparaatidentificatie via MEI-subfunctie. |
3.6 Datatypen en interpretatie
3.6.1 Meer dan zestien bits
Een Modbus-register transporteert 16 bits (= 2 bytes), maar bevat op protocolniveau geen algemeen datatypeveld voor signed integer, float, eenheid of schaalfactor. Die interpretatie volgt uit de datadefinitie van de BRModbus registermappings.
| Gegevenstype | Registergebruik | Controlepunt |
|---|---|---|
INT16 / UINT16 | Eén register | Signed/unsigned-interpretatie is onderdeel van de registermapping, zie volgende paragraaf. |
32-bit integer of float | Twee registers | Woordvolgorde en datatype moeten overeenkomen. |
| 64-bit waarde | Meerdere registers | Indeling moet expliciet door de leverancier zijn vastgelegd. |
| Bitveld | Eén of meer registers | Bitnummering en betekenis zijn apparaatspecifiek. |
| Tekst | Reeks registers | Codering, tekenvolgorde, lengte en opvulling controleren. |
| Geschaalde meetwaarde | Volgens de registermap | Schaalfactor, offset, eenheid en ongeldige waarden documenteren. |
3.6.2 32-Bit Float
Een 32-bit float wordt in Modbus doorgaans opgeslagen als een IEEE-754-getal, verdeeld over twee opeenvolgende registers van elk 16 bits. Je moet daarbij twee dingen onderscheiden: de bitopbouw van het getal en de volgorde waarin de registers worden aangeboden. Modbus definieert zelf namelijk geen afzonderlijk float-datatype.
1. Bitopbouw van de float
De 32 bits zijn als volgt verdeeld:
Bit: 31 30 23 22 0
┌───┬──────────────────────┬──────────────────────────────┐
│ S │ Exponent (8) │ Fractie (23 bits) │
└───┴──────────────────────┴──────────────────────────────┘
| Onderdeel | Aantal bits | Betekenis |
|---|---|---|
| Teken S | 1 | 0 = positief, 1 = negatief |
| Exponent E | 8 | Macht van twee, opgeslagen met een offset van 127 |
| Fractie F | 23 | Het fractionele deel van de significand, vaak mantisse genoemd |
Voor normale getallen wordt de waarde berekend als onderstaande formule. De voorste 1 wordt niet opgeslagen, maar is impliciet aanwezig. Speciale bitpatronen voor onder andere nul, subnormale getallen en oneindig vallen buiten deze formule.
2. Verdeling over Modbus-registers
Neem als voorbeeld de waarde 50,0. Het bijbehorende 32-bit patroon is 0x42480000. Bij de volgorde waarbij het hoogste woord eerst komt (standaard in BRModbus), ziet dat er zo uit:
32-bit float: 0x42480000 Register n: 0x4248 → hoogste 16 bits Register n+1: 0x0000 → laagste 16 bits Bytes: 42 48 00 00
De twee registers vormen samen één getal. Het zijn dus niet afzonderlijk het gehele deel en het gedeelte achter de komma. Je voegt de bits samen en interpreteert dat bitpatroon als float, in plaats van het samengestelde gehele getal numeriek naar float te converteren.
3. Let op de woord- en bytevolgorde
Binnen een Modbus-register wordt de hoogste byte eerst verstuurd. De volgorde van de twee woorden van een 32-bit waarde is echter niet universeel vastgelegd: daarvoor moet je de registerdocumentatie van het apparaat volgen. In apparatuur en software kom je deze vier indelingen tegen; hieronder staan ze toegepast op hetzelfde voorbeeld 50,0.
| Volgorde | Gebruikelijke benaming | Register n | Register n+1 |
|---|---|---|---|
| ABCD | Hoogste woord eerst | 0x4248 | 0x0000 |
| CDAB | Word swap, laagste woord eerst | 0x0000 | 0x4248 |
| BADC | Byte swap binnen de woorden | 0x4842 | 0x0000 |
| DCBA | Word swap én byte swap | 0x0000 | 0x4842 |
BRModbus gebruikt standaard ABCD (= Big Endian). In voorkomende gevallen kan er worden gekozen voor Word Swap en dan dienen de BRModbus registers te worden gelezen als CDAB.
Hierbij zijn A, B, C en D de bytes van het oorspronkelijke IEEE-754-patroon, van meest naar minst significant. Benamingen als big-endian en little-endian kunnen in software verwarrend zijn; de expliciete aanduidingen ABCD en CDAB maken duidelijker welke volgorde bedoeld wordt.
Praktisch bij het uitlezen
- Lees voor één float twee opeenvolgende registers, bij voorkeur in één Modbus-transactie.
- Stel de interpretatie in op
FLOAT32,REALofIEEE-754 single precision, afhankelijk van de gebruikte software. - Controleer de register- en bytevolgorde in de apparaathandleiding. Een verkeerde volgorde kan een heel kleine, heel grote of anderszins onlogische meetwaarde opleveren.
Weergave negatieve getallen
Het gegevenstype INT16 kan negatieve en positieve gehele getallen bevatten; UINT16 alleen nul en positieve gehele getallen. Beide gebruiken één Modbus-register van 16 bits (2 bytes). De U staat voor unsigned, oftewel zonder teken.
| Eigenschap | INT16 | UINT16 |
|---|---|---|
| Type | Geheel getal met teken (signed) | Geheel getal zonder teken (unsigned) |
| Bereik | −32.768 t/m +32.767 | 0 t/m 65.535 |
| Aantal registers | 1 | 1 |
Deze bereiken horen bij dezelfde opslaggrootte van 16 bits; alleen de interpretatie verschilt.
Dezelfde bits, een andere waarde
Modbus verstuurt de registerinhoud als 16 bits. De registerdocumentatie van het apparaat bepaalt of je die als INT16 of UINT16 moet interpreteren. Voor negatieve INT16-waarden wordt de two’s complement-notatie gebruikt.
| Ontvangen registerwaarde (hex) | Als UINT16 | Als INT16 |
|---|---|---|
0x0000 | 0 | 0 |
0x0001 | 1 | 1 |
0x7FFF | 32.767 | 32.767 |
0x8000 | 32.768 | −32.768 |
0xFFFF | 65.535 | −1 |
Bij waarden tot en met 32.767 zie je dus geen verschil. Vanaf 32.768 wordt dezelfde bitcombinatie bij INT16 als negatief geïnterpreteerd: trek dan 65.536 van de unsigned waarde af.
Wat betekent dit praktisch?
Krijg je bijvoorbeeld 65535 binnen terwijl het apparaat −1 bedoelt, dan lees je waarschijnlijk een INT16 ten onrechte als UINT16. Kies het datatype volgens de registerlijst van de fabrikant, niet alleen op basis van de waarde die je verwacht. Een verkeerd datatype kan anders lange tijd onopgemerkt blijven, zolang de waarden tussen 0 en 32.767 liggen.
3.6.3 Schaling
Als een registermapping een factor 0,1 °C per 'tel' voorschrijft, betekent een ruwe waarde 253 een temperatuur van 25,3 °C. Zonder een duidelijke mapping van de fabrikant is die omrekening niet uit het Modbus-bericht af te leiden.
3.7 Berichtopbouw
3.7.1 RTU-frame
Een RTU-frame bevat een apparaatadres van één byte, een functiecode van één byte, functieafhankelijke gegevens en een CRC van twee bytes. De CRC wordt berekend over het adres en de PDU; start-, pariteits- en stopbits tellen niet mee.
[Adres: 1 byte][Functie: 1 byte][Gegevens: 0–252 bytes][CRC: 2 bytes]
Bijvoorbeeld: Master leest twee holding registers vanaf PDU-adres 0 bij apparaat 1; alle bytes hieronder zijn hexadecimaal en de CRC-waarden zijn voor deze voorbeeldframes berekend.
Verzoek: 01 03 00 00 00 02 C4 0B Antwoord: 01 03 04 00 E6 00 64 1A 2F
| Veld | Verzoek | Betekenis |
|---|---|---|
| Adres | 01 | Apparaat 1 |
| Functie | 03 | Holding registers lezen |
| Startadres | 00 00 | PDU-adres 0 |
| Aantal | 00 02 | Twee registers |
| CRC | C4 0B | Lage CRC-byte eerst |
De antwoordbyte 04 geeft vier gegevensbytes aan; de twee registerwaarden zijn 0x00E6 en 0x0064, oftewel 230 en 100. Hun eenheid of eventuele schaling is zonder registermap onbekend.
3.7.2 TCP-header
Modbus TCP zet een MBAP-header van zeven bytes vóór dezelfde PDU en voegt geen RTU-CRC toe.
| Veld | Grootte | Functie |
|---|---|---|
| Transaction Identifier | 2 bytes | Koppelt antwoord aan verzoek binnen de TCP-verbinding. |
| Protocol Identifier | 2 bytes | 0x0000 voor Modbus. |
| Length | 2 bytes | Aantal volgende bytes, inclusief Unit ID en PDU. |
| Unit Identifier | 1 byte | Onder andere routering naar een apparaat achter een gateway. |
Hetzelfde leesverzoek via een TCP/RTU-gateway, met Transaction ID 1 en Unit ID 1:
Verzoek: 00 01 00 00 00 06 01 03 00 00 00 02
Antwoord: 00 01 00 00 00 07 01 03 04 00 E6 00 64
----- ----- ----- -- --------------------
TID PID LEN UID PDU
Bij dit verzoek is Length zes: één byte Unit ID plus vijf bytes PDU. Bij het antwoord is de lengte zeven: Unit ID, functiecode, byte count en vier gegevensbytes.
Voor programmeurs:
TCP levert een bytestroom, geen afzonderlijke Modbus-berichten per recv()-aanroep. Buffer de ontvangen bytes, gebruik het MBAP-lengteveld en verwerk volledige ADU's; één bericht kan in delen binnenkomen en één socket-read kan meer dan één bericht bevatten!
3.8 RTU aansluiten
3.8.1 Tweedraads RS-485
De gebruikelijke RTU-verbinding is tweedraads RS-485: één differentieel aderpaar wordt afwisselend voor zenden en ontvangen gebruikt. De Modbus-richtlijn voorziet daarnaast in een Common-geleider; “tweedraads” betekent dus niet dat elke installatie uitsluitend twee verbindingen nodig heeft.
| Signaal | Functie | Aanduiding volgens de Modbus-richtlijn |
|---|---|---|
| D1 | Differentieel datasignaal | B/B', vaak +. |
| D0 | Differentieel datasignaal | A/A', vaak −. |
| Common | Signaalreferentie | C/C', signal common. |
| Shield | Kabelafscherming | Niet hetzelfde als Common. |
Let op A/B: fabrikanten gebruiken de letters A en B niet overal op dezelfde manier. Verbind daarom op basis van de gedocumenteerde signaalfunctie; uitsluitend “A op A” is geen betrouwbare universele instructie.
3.8.2 Bustopologie
Gebruik een doorlopende hoofdkabel met korte aftakkingen en plaats afsluitingen aan de twee fysieke kabeluiteinden. De master hoeft niet aan een uiteinde te staan: zijn positie bepaalt niet waar de bus elektrisch eindigt.
[Afsluiting] ======= hoofdkabel ======= [Afsluiting]
| |
| |
| |
Master Slave 1 Slave 2 Slave 3
Een passieve ster met lange takken veroorzaakt ongunstige transmissielijnvertakkingen; gebruik voor noodzakelijke vertakkingen een daarvoor ontworpen actieve RS-485-oplossing. De seriële richtlijn noemt maximaal 20 m voor een aftakking, maar bij snelle signaalflanken kunnen veel kortere aftakkingen nodig zijn.
3.8.3 Kabel en afsluiting
De Modbus-seriële richtlijn schrijft afgeschermde kabel voor met een getwist paar voor D0/D1 en een extra geleider voor Common. Kabeldoorsnede, capaciteit, impedantie, lengte en baudrate moeten bij elkaar passen.
Afsluitweerstanden beperken reflecties en worden tussen D0 en D1 geplaatst, niet standaard van beide signalen naar aarde. Plaats geen extra afsluitingen bij tussenliggende deelnemers of op aftakkingen.
120 ohm is niet de enige mogelijke uitvoering:
De Modbus-richtlijn noemt een weerstand van 150 ohm of, bij geschikte polarisatie, een serieschakeling van 120 ohm en 1 nF. Kies de afsluiting op basis van kabel, interface en fabrikantvoorschrift; kopieer niet blind een weerstandswaarde uit een ander bussysteem.
BRControls gebruikt in de regel afsluitweerstanden van 120 ohm bij Modbus
Meetcontrole:
Twee zuiver resistieve afsluitingen van 120 ohm geven idealiter ongeveer 60 ohm tussen de datalijnen; twee van 150 ohm ongeveer 75 ohm. Meet alleen spanningsloos en houd rekening met biasweerstanden, aangesloten elektronica en RC-afsluitingen; deze controle is geen universele goed/fout-test.
3.8.4 Connectoren
Modbus RTU heeft niet één verplichte connectorvorm; schroefklemmen, RJ45 en D-sub komen in de seriële richtlijn voor. De volgende pinnen gelden voor de daar gespecificeerde tweedraads Modbus-pinout, niet automatisch voor elk product.
| Signaal | RJ45-pin | 9-polige D-sub-pin |
|---|---|---|
| D1 | 4 | 5. |
| D0 | 5 | 9. |
| Common | 8 | 1. |
Waarschuwing:
Een RJ45-bus kan seriële signalen en optionele voedingsaansluitingen voeren. Sluit hem niet op een Ethernet-switch aan voordat de poortfunctie en pinbezetting zijn vastgesteld; dezelfde stekkervorm betekent geen elektrische compatibiliteit!
RS-232 is een andere elektrische interface voor korte punt-tot-puntverbindingen; een passieve verloopkabel maakt daar geen RS-485 van. Vierdraads RS-485 is eveneens beschreven, maar vraagt een eigen aansluit- en afsluitplan.
3.9 TCP aansluiten
Modbus TCP gebruikt normaal TCP-poort 502; beide apparaten moeten daarnaast een passende IP-configuratie en een toegestaan netwerkpad hebben. Een geslaagde netwerkverbinding zegt nog niets over de juistheid van Unit ID, functiecode of registeradres.
Aanbevolen aansluitvolgorde:
- Leg IP-adres, subnetmasker/prefix en eventuele router (gateway) vast.
- Controleer link, switchpoort en VLAN-toewijzing volgens het netwerkontwerp.
- Sta alleen het benodigde verkeer tussen de aangewezen master en slave(s) toe.
- Configureer TCP-poort en Unit ID volgens apparaat- of gatewaydocumentatie.
- Begin het testen met slechts één bekend leesadres en één openstaande transactie.
3.9.1 Unit ID (Slave ID)
Bij een TCP/RTU-gateway identificeert het IP-adres de gateway en selecteert de Unit ID het seriële apparaat, gewoonlijk adres 1–247. Bij een directe TCP-server adviseert de TCP-gids 0xFF als niet-significante Unit ID; volg de apparaathandleiding als de server een specifieke waarde controleert.
Unit ID 0 betekent niet automatisch “alle TCP-apparaten”. De TCP-gids accepteert 0 ook voor directe TCP-communicatie, terwijl 0 op de seriële bus broadcast betekent; eventueel vertalen naar een RTU-broadcast moet dus expliciet uit de gatewaydocumentatie blijken.
3.9.2 Ethernetafstand
Voor gebruikelijk koper-Ethernet zoals 100BASE-TX en 1000BASE-T is 100 m de theoretische kanaalgrens per verbinding, niet de maximale afstand van de gehele Modbus-installatie. Switches, repeaters en geschikte glasvezelverbindingen maken grotere netwerkafstanden mogelijk; de grens volgt uit de gekozen Ethernetvariant en componenten, niet uit Modbus.
3.10 Timing en prestaties
3.10.1 Seriële instellingen
Alle apparaten op één RTU-bus moeten dezelfde baudrate, databits, pariteit, stopbits en transmissiemodus gebruiken. De standaard-RTU-karakterindeling bestaat uit één startbit, acht databits, één pariteitsbit en één stopbit; bij geen pariteit gebruikt de richtlijn twee stopbits.
| Instelling | Betekenis | Aandachtspunt |
|---|---|---|
8E1 | 8 databits, even parity, 1 stopbit | Standaardpariteit in de richtlijn. |
8N2 | 8 databits, geen parity, 2 stopbits | Standaardindeling zonder pariteit. |
8O1 | 8 databits, odd parity, 1 stopbit | Alleen gebruiken wanneer alle deelnemers dit ondersteunen. |
Andere indeling, bijvoorbeeld 8N1 | Afwijkende karakterindeling | Niet zonder controle als universele RTU-instelling gebruiken. |
De richtlijn noemt 9600 en 19200 bit/s als vereiste snelheden in de algemene aanbevelingen, met verschillen per implementatieklasse. Er is geen universele hoge maximumbaudrate voor elk Modbus-apparaat: de gemeenschappelijk ondersteunde instellingen zijn bepalend.
3.10.2 Frame-intervallen
RTU gebruikt stilte als begrenzing: minimaal 3,5 karaktertijden tussen frames en maximaal 1,5 karaktertijd stilte binnen een frame. Een langere onderbreking binnen een frame maakt het frame onvolledig.
Voor snelheden tot en met 19200 bit/s worden deze karaktertijden toegepast; daarboven adviseert de richtlijn vaste waarden van 750 microseconden voor t1.5 en 1,750 ms voor t3.5. De onderstaande waarden zijn berekend met 11 bits per karakter.
| Baudrate | Karaktertijd | t1.5 | t3.5 |
|---|---|---|---|
| 9600 bit/s | 1,146 ms | 1,719 ms | 4,010 ms. |
| 19200 bit/s | 0,573 ms | 0,859 ms | 2,005 ms. |
| Boven 19200 bit/s | Afhankelijk van baudrate | Aanbevolen vast: 0,750 ms | Aanbevolen vast: 1,750 ms. |
Een response-time-out is iets anders dan de framepauze: daarin moet ook verwerkingstijd van het apparaat en eventuele wachttijd in een gateway passen. De specificatie geeft geen geschikte universele instelling voor iedere installatie.
3.10.3 Cyclustijd berekenen
De cyclustijd ontstaat uit aanvraagduur, antwoordduur, verplichte busstilte en extra verwerking of wachttijd. Ook fouten, retries en niet-bereikbare deelnemers beïnvloeden de totale pollcyclus.
Berekend rekenvoorbeeld, geen prestatietest:
Het eerdere RTU-verzoek heeft 8 bytes en het antwoord 9 bytes. Bij 9600 bit/s en 11 bits per karakter is de zuivere overdrachtstijd samen ongeveer 19,48 ms; met twee pauzes van 3,5 karaktertijden is een repeterend cyclusslot ongeveer 27,5 ms, exclusief extra verwerking en softwarevertraging.
Ontwerpaanbevelingen:
- Combineer aaneengesloten leesadressen binnen de ondersteunde blokgrootte, zonder niet-bestaande adressen te overschrijden.
- Geef snelle en langzame gegevens verschillende pollintervallen op basis van de procesbehoefte.
- Beperk retries en plan uitgevallen apparaten zodanig dat hun time-outs de overige communicatie niet onbeheerst vertragen.
- Houd TCP-verbindingen normaal geopend in plaats van ze voor iedere meting opnieuw op te bouwen.
3.11 Systeemgrenzen
3.11.1 Grenzen op drie niveaus
| Onderwerp | Protocol- of richtlijngrens | Praktische betekenis |
|---|---|---|
| Seriële adressen | 1–247; 0 broadcast; 248–255 gereserveerd. | 247 adressen is geen garantie voor 247 deelnemers op één elektrisch segment. |
| RS-485-deelnemers | De richtlijn noemt 32 apparaten als uitgangspunt, met uitbreidingen afhankelijk van unit load en polarisatie. | Tel ook master/gateway en controleer belasting en fabrikantlimieten. |
| Extra bias | De beschreven polarisatie vermindert het toegestane aantal deelnemers volgens de richtlijn met vier. | “Altijd 32” is dus te grof; ontwerp op de concrete interface. |
| Hoofdkabellengte | 1000 m bij maximaal 9600 baud en AWG26 of dikker, onder de beschreven voorwaarden. | Geen garantie voor 1000 m op hoge baudrate of elke kabel. |
| Aftakking | Nooit meer dan 20 m; bij een meerpoorts tap bovendien maximaal 40 m gedeeld door het aantal aftakkingen. | Houd aftakkingen bij voorkeur veel korter en volg interfacevoorschriften. |
| Adresruimte | 65536 elementen per tabel. | Alleen werkelijk geïmplementeerde adressen zijn bruikbaar. |
| PDU | Maximaal 253 bytes. | Geldt voor de standaardberichtstructuur bij RTU en TCP. |
| ADU | RTU 256 bytes; TCP 260 bytes. | Niet hetzelfde als maximale netwerkframegrootte. |
| Registerblok | FC03/04: 125 lezen; FC16: 123 schrijven. | Apparaat of gateway kan een lagere limiet hebben. |
| TCP-verbindingen | Geen vast universeel aantal in de TCP-gids. | Controleer gelijktijdige clients, sockets en transacties per apparaat. |
| Tijdgarantie | Afhankelijk van lijn, verwerking, time-outs en netwerk. | Modbus alleen levert geen algemene harde bovengrens voor de procesreactietijd. |
3.11.2 Functionele beperkingen
Het basisprotocol bevat geen algemene zelfbeschrijvende taglijst met eenheden, kwaliteit en tijdstempels voor iedere meetwaarde.
Ook update-atomiciteit over meerdere registers, eigenaarschap van instelwaarden bij meerdere clients en veilig gedrag na communicatieverlies moeten in de applicatie of het apparaat worden geregeld. Ze volgen niet vanzelf uit een geldig Modbus-antwoord.
3.12 Fouten en diagnose
3.12.1 Exception versus time-out
Een exception is een geldig antwoord waarin de server meldt dat hij een verzoek niet kan uitvoeren. De antwoordfunctiecode heeft dan het hoogste bit gezet; op FC03 wordt dat bijvoorbeeld 0x83.
Voorbeeld
01 83 02 C0 F1 is een RTU-exception van apparaat 1 voor FC03, met code 0x02 en berekende CRC. Een time-out betekent juist dat binnen de ingestelde tijd geen bruikbaar antwoord is ontvangen; dat is geen Modbus-exceptioncode.
| Code hex | Betekenis | Eerste controle |
|---|---|---|
0x01 | Illegal Function | Ondersteuning en toegestane apparaatstatus. |
0x02 | Illegal Data Address | Tabel, startadres, nummerbasis en volledige bloklengte. |
0x03 | Illegal Data Value | Ongeldige verzoekstructuur of functieparameters; niet algemeen “proceswaarde buiten bereik”. |
0x04 | Server Device Failure | Interne fout tijdens uitvoering. |
0x05 | Acknowledge | Geaccepteerd, langdurige verwerking; gespecialiseerd gebruik. |
0x06 | Server Device Busy | Server bezig; herhaal volgens toepassingsbeleid. |
0x08 | Memory Parity Error | Consistentiefout bij het gespecialiseerde bestandsgeheugengebruik. |
0x0A | Gateway Path Unavailable | Gatewayconfiguratie, beschikbare route of overbelasting. |
0x0B | Gateway Target Device Failed to Respond | Achterliggend apparaat en seriële verbinding. |
Een RTU-frame met CRC- of karakterfouten wordt gewoonlijk verworpen zonder exceptionantwoord. Dat verklaart waarom een elektrisch probleem zich aan clientzijde vaak als time-out presenteert.
3.12.2 Diagnosevolgorde
- Fysiek: controleer voeding, poorttype, kabel, D0/D1, Common, afscherming, afsluitingen en bias.
- Transport: controleer bij RTU baudrate en karakterindeling; bij TCP IP-pad, poort en toegangsregels.
- Adressering: controleer slave-adres of Unit ID, tabel en zero-based adres.
- Functie en blok: vraag één bekend register op en vergroot pas daarna de aanvraag.
- Interpretatie: controleer datatype, woordvolgorde, schaling en terugmelding met een bekende waarde.
- Belasting: onderzoek pollfrequentie, time-outs, retries, wachtrijen en gelijktijdige clients.
3.12.3 TCP-verkeer analyseren
Wireshark heeft afzonderlijke protocolfilters voor Modbus TCP en voor de Modbus-inhoud; gebruik bijvoorbeeld de volgende displayfilters.
mbtcp modbus tcp.port == 502 mbtcp.trans_id == 1
Controleer Transaction ID, Unit ID, functiecode, startadres, byte count en exceptioncode naast elkaar. Gebruik bij een afwijkende TCP-poort zo nodig de juiste protocoldecodering en maak captures uitsluitend met toestemming binnen het OT-onderhoudsbeleid.
Een verdere beschrijving van Wireshark valt buiten de scope van dit document.
3.13 Beveiliging en veiligheid
3.13.1 Klassieke Modbus
Klassiek Modbus heeft geen ingebouwde cryptografische authenticatie, vertrouwelijkheid of berichtintegriteitsbeveiliging tegen een aanvaller. Een CRC of TCP-controle beschermt niet tegen iemand die bewust een geldig nieuw commando samenstelt; een Unit ID is evenmin een identiteitsbewijs.
Aanbevolen maatregelen:
- Publiceer Modbus-poorten niet rechtstreeks op internet; beperk bereikbaarheid tot noodzakelijke systemen.
- Segmenteer OT en kantoor-IT en pas toegangsregels toe op de overgangen; een VLAN-nummer zonder afdwinging is geen volledig beveiligingsbeleid.
- Beperk schrijfrechten en schrijfverkeer waar apparaat, gateway of industriële firewall dit ondersteunt.
- Gebruik gecontroleerde externe toegang met versleuteling, sterke authenticatie en logging.
- Houd configuraties, firmwareversies, communicatieafspraken en herstelprocedures beheerd.
3.13.2 Modbus/TCP Security
Modbus/TCP Security transporteert de ongewijzigde Modbus TCP-berichten in TLS en gebruikt standaard TCP-poort 802. De specificatie vereist wederzijdse authenticatie met X.509v3-certificaten en TLS 1.2 of hoger; rolgebaseerde autorisatie is een aanvullende, productafhankelijke mogelijkheid.
TLS kan vertrouwelijkheid en integriteit bieden, maar controleer ook de feitelijk geconfigureerde cipher suites: het profiel bevat een authenticatie-zonder-versleuteling-optie. Gewenste versleuteling mag dus niet alleen uit het gebruik van poort 802 worden afgeleid.
Een klassiek apparaat op poort 502 ondersteunt niet automatisch dit beveiligingsprofiel. Een VPN of TLS-tunnel kan transport beschermen, maar is niet vanzelf hetzelfde als native Modbus/TCP Security met de bijbehorende certificaat- en autorisatieafspraken.
BRControls biedt vooralsnog geen ondersteuning voor Modbus/TCP Security.
3.13.3 Functionele veiligheid
BELANGRIJK: Gebruik standaard Modbus nooit als zelfstandige veiligheidsfunctie voor noodstoppen of persoonsbeveiliging.
De beschreven Modbus-controles vormen geen bewijs van een vereiste veiligheidsintegriteit; veiligheidsfuncties vragen een afzonderlijk ontworpen en gevalideerde veiligheidsarchitectuur.
Definieer voor iedere besturingsfunctie wat er bij communicatieverlies, verouderde data en een herstart moet gebeuren. Een succesvol schrijfantwoord bewijst alleen niet dat een machine veilig beweegt of dat een klep de bedoelde stand heeft bereikt.
3.14 Begrippenlijst
| Begrip | Betekenis |
|---|---|
| ADU | Compleet Modbus-bericht inclusief transportafhankelijke omhulling. |
| PDU | Functiecode plus functieafhankelijke gegevens. |
| Coil | Logisch adresseerbaar bit met lees-/schrijfmodel. |
| Register | 16-bit gegevenselement. |
| CRC | Cyclische redundantiecontrole voor het detecteren van overdrachtsfouten bij RTU. |
| MBAP | Header van Modbus TCP met onder andere Transaction ID en Unit ID. |
| Unit ID | Identificatie voor interne routering, bijvoorbeeld achter een gateway. |
| Polling | Periodiek opvragen door de client. |
| Exception | Geldig protocolantwoord dat een uitvoeringsprobleem meldt. |
| Time-out | Verlopen wachttijd zonder bruikbaar antwoord. |
| Bias | Elektrische polarisatie voor een gedefinieerde rusttoestand. |
| Terminatie | Afsluiting van de transmissielijn om reflecties te beperken. |
| Zero-based | Adressering waarbij het eerste element adres 0 heeft. |
| Woordvolgorde | Volgorde van meerdere 16-bit registers voor één grotere waarde. |
