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.

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

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.

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.

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.

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

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.

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.

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.

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.

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.

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.

alt text

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, REAL of IEEE-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.

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.

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.

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!

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.

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.

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.

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.

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:

  1. Leg IP-adres, subnetmasker/prefix en eventuele router (gateway) vast.
  2. Controleer link, switchpoort en VLAN-toewijzing volgens het netwerkontwerp.
  3. Sta alleen het benodigde verkeer tussen de aangewezen master en slave(s) toe.
  4. Configureer TCP-poort en Unit ID volgens apparaat- of gatewaydocumentatie.
  5. Begin het testen met slechts één bekend leesadres en één openstaande transactie.

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.

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.

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.

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.

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.
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.

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.

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.

  1. Fysiek: controleer voeding, poorttype, kabel, D0/D1, Common, afscherming, afsluitingen en bias.
  2. Transport: controleer bij RTU baudrate en karakterindeling; bij TCP IP-pad, poort en toegangsregels.
  3. Adressering: controleer slave-adres of Unit ID, tabel en zero-based adres.
  4. Functie en blok: vraag één bekend register op en vergroot pas daarna de aanvraag.
  5. Interpretatie: controleer datatype, woordvolgorde, schaling en terugmelding met een bekende waarde.
  6. Belasting: onderzoek pollfrequentie, time-outs, retries, wachtrijen en gelijktijdige clients.

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.

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.

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.

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.

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.
  • brmodbus/02a-wat_is_modbus/wat_is_modbus.txt
  • Laatst gewijzigd: 2026/11/03 06:30
  • door 127.0.0.1