Bekijk alle lessen
Deel 1
Basis
Deel 2
Modbus RTU
- Les 5RS485 uitgelegd: A, B, common en terminatie20 min
- Les 6Baudrate en pariteit: waarom 8E1 de default is16 min
- Les 7Het Modbus RTU frame byte voor byte, plus CRC18 min
- Les 8Meerdere Modbus apparaten op een bus zetten16 min
- Les 9Je eerste Modbus apparaat uitlezen met mbpoll22 min
- Les 10Modbus RTU storing zoeken: symptoom en oorzaak20 min
Deel 3
Modbus TCP
Deel 4
Gevorderd
- Les 16Veilig naar een Modbus apparaat schrijven18 min
- Les 17Word order en float: dezelfde bytes, andere waarde22 min
- Les 18Pollinterval en busbelasting zelf berekenen18 min
- Les 19Modbus beveiligen: het protocol doet het niet16 min
- Les 20Modbus integreren: PLC, Home Assistant of cloud20 min
- Les 21Modbus checklist voor oplevering en overdracht18 min
Baudrate en pariteit: waarom 8E1 de default is
Modbus baudrate en pariteit moeten op elk apparaat gelijk staan. Leer waarom de spec 19200 8E1 voorschrijft en wat 3,5 karaktertijden stilte precies doet.
Wat deze les behandelt
- De vier instellingen die op elk apparaat gelijk moeten staan
- Elf bits per karakter, en de stilte van 3,5 tekens als berichtgrens
- Een apparaat terugvinden waarvan niemand de instellingen kent
Lees eerst: RS485 uitgelegd: A, B, common en terminatie
Baudrate en pariteit zijn twee van de vier seriele instellingen die op een Modbus RTU-bus op elk apparaat exact gelijk moeten staan, want er wordt niets onderhandeld. Zet er een verkeerd en je krijgt geen foutmelding terug, maar stilte. Na deze les lees je die vier instellingen uit een datasheet, reken je de karaktertijd en de verplichte stiltes zelf uit, en vind je een apparaat terug waarvan niemand de instellingen meer kent.
Vier instellingen die overal gelijk moeten staan
Baudrate, databits, pariteit en stopbits: dat zijn de vier, en in elk configuratiescherm staan ze bij elkaar. Ze gelden voor de hele RS485-lijn, niet per apparaat. Neem een Eastron SDM630 energiemeter zoals hij uit de doos komt: zijn instellingen zitten in holding registers die je gewoon kunt uitlezen.
| Instelling | Waarde af fabriek | Waar hij staat |
|---|---|---|
| Baudrate | 9600 | datasheetnummer 40029 (0x001C), waarde 2 |
| Databits | 8 | ligt vast in RTU-modus |
| Pariteit | geen | datasheetnummer 40019 (0x0012), waarde 0 |
| Stopbits | 1 | datasheetnummer 40019 (0x0012), waarde 0 |
Kort genoteerd: 9600 8N1. Zet je je client op 19200 8E1 omdat de standaard dat voorschrijft, dan gebeurt er niets. Geen antwoord, geen exception, alleen een timeout.
De regel erachter staat letterlijk in de Modbus-standaard voor seriele lijnen: de transmissiemodus en de seriele poortparameters moeten voor alle apparaten op een Modbus-lijn hetzelfde zijn. Er is geen autobaud en geen handshake. Het complete RTU-verhaal als naslag staat in de uitleg over Modbus RTU.
Twee dingen hoef je niet te kiezen: RTU gebruikt altijd 8 databits, en RTU is de modus die elk apparaat moet ondersteunen. Kom je in een menu ASCII-modus tegen, laat die dan staan.
Waarom een karakter altijd 11 bits duurt
Elke byte die over de lijn gaat, zit verpakt in een karakterframe van 11 bits: 1 startbit, 8 databits (die gaan least significant bit eerst), 1 pariteitsbit en 1 stopbit. Optellen geeft 11.
Zonder pariteit valt dat negende bit weg, maar de standaard schrijft er een tweede stopbit voor terug: "the use of no parity requires 2 stop bits". Het karakterframe blijft dus 11 bits, en daarmee blijft de timing bij elke pariteitsinstelling identiek. Dat is geen detail: de hele framedetectie van RTU hangt aan die karaktertijd.
8E1, 8O1, 8N2 en de vreemde eend 8N1
Drie van de vier gangbare notaties komen op 11 bits uit, en een niet.
| Notatie | Bits | Status in de standaard |
|---|---|---|
| 8E1, even pariteit, 1 stopbit | 11 | vereist, en de voorgeschreven default |
| 8O1, odd pariteit, 1 stopbit | 11 | toegestaan, optioneel |
| 8N2, geen pariteit, 2 stopbits | 11 | toegestaan, aanbevolen om te ondersteunen |
| 8N1, geen pariteit, 1 stopbit | 10 | staat niet in de standaard |
8N1 kom je veel tegen, en de SDM630 hierboven laat zien waarom: hij staat er af fabriek op. Maar de standaard eist bij geen pariteit die extra stopbit, dus een 8N1-karakter duurt tien bits in plaats van elf. Apparaten die hun timers uit de baudrate afleiden, rekenen dan met een andere karaktertijd. Formuleer het voor jezelf als "komt veel voor, staat niet in de spec", niet als "mag ook".
Welke baudrate kies je, en waarom niet de hoogste
9600 en 19200 zijn allebei verplicht, en 19200 is de voorgeschreven default. Tegelijk noemt de standaard 9600 zelf als de gangbare praktijk, en dat is ook wat je op de meeste bussen aantreft. Dat verschil tussen voorschrift en veld is precies waarom je bij een onbekend apparaat begint met 9600 en 19200, en niet met 115200.
Hoger mag: 38400, 57600 en 115200 kom je tegen. Het levert alleen minder op dan je hoopt. Hoe hoger de snelheid, hoe korter de maximale kabellengte en hoe kleiner de marge op ruis. Welke kabel je nodig hebt en hoe lang die mag zijn staat in de bekabelingsgids. Kies de laagste snelheid waarmee je je cyclustijd nog haalt; die som maak je in de les over pollinterval en busbelasting.
Let ook op de tolerantie: elke baudrate die een apparaat aanbiedt, moet bij zenden binnen 1 procent kloppen en bij ontvangen 2 procent afwijking accepteren.
Hoe lang duurt een karakter bij jouw baudrate?
Een som, en de rest volgt eruit. Een karakter is 11 bits, dus de karaktertijd is 11 gedeeld door de baudrate. Bij 9600 baud: 11 / 9600 = 0,0011458 seconde, oftewel 1,1458 ms. Dat is de eenheid waarin Modbus RTU denkt.
Bij 19200 baud verandert er precies een ding, de baudrate verdubbelt: 11 / 19200 = 0,573 ms. Alles wat daaruit volgt, halveert mee.
| Baudrate | 1 karakter | t1,5 | t3,5 |
|---|---|---|---|
| 9600 | 1,146 ms | 1,719 ms | 4,010 ms |
| 19200 | 0,573 ms | 0,859 ms | 2,005 ms |
| 38400 | 0,286 ms | vast 750 microseconden | vast 1,750 ms |
Zet daar een echt verzoek op. Een FC03-leesverzoek is 8 bytes op de lijn: serveradres, function code, twee adresbytes, twee bytes voor het aantal en twee CRC-bytes. Bij 9600 baud is dat 8 x 1,1458 = 9,17 ms zendtijd, plus tweemaal de verplichte stilte t3,5, samen 8,02 ms. Er gaat dus 17,19 ms voorbij voordat het antwoord mag beginnen. Bij 19200 baud is dat 8,59 ms. Daarom lees je registers in blokken: de bytes zijn goedkoop, de stiltes niet.
t1,5 is anderhalve karaktertijd, t3,5 is drieënhalve. Waar die twee voor staan, lees je hieronder.
Waarom de stilte tussen frames de berichtgrens is
Een RTU-frame heeft geen lengteveld en geen startteken. De ontvanger weet alleen waar een bericht begint en ophoudt doordat het ervoor en erna stil is op de lijn. Daar komen die twee tijden vandaan.
t3,5 is de minimale stilte tussen twee frames: 3,5 karaktertijden, bij 9600 baud dus 4,010 ms. Is de lijn langer dan dat stil geweest, dan geldt het volgende karakter als het begin van een nieuw bericht. t1,5 is de maximale gaping binnen een frame: 1,5 karaktertijd, bij 9600 baud 1,719 ms. Valt er een groter gat tussen twee opeenvolgende karakters, dan verklaart de ontvanger het frame incompleet en gooit hij het weg.
Boven 19200 baud wordt dat rekenwerk onpraktisch, want de timers vuren dan zo vaak dat de processor eronder lijdt. De standaard beveelt daarom vaste waarden aan: 750 microseconden voor t1,5 en 1,750 ms voor t3,5. Die grens ligt boven 19200 en niet vanaf 19200, dus op precies 19200 baud reken je nog. En de vaste 1,750 ms is korter dan de berekende 2,005 ms bij 19200 baud, dus het is geen voortzetting van de formule maar een ondergrens op de processorbelasting.
Een onbekend apparaat vinden zonder te gokken
Een apparaat waarvan de instellingen kwijt zijn, vind je door systematisch te zoeken. Begin bij de combinaties die je het vaakst tegenkomt, in deze volgorde: 9600 8N1, 9600 8E1, 19200 8E1. Pas daarna loop je de rest af.
De regel eronder is simpel: verander nooit twee dingen tegelijk. Loop eerst alle baudrates af op een framing, ga dan pas naar de volgende framing. Hetzelfde geldt voor het serveradres. Fabrieksinstellingen staan meestal op 1, en geldige adressen lopen van 1 tot en met 247, want 0 is de broadcast en 248 tot 255 zijn gereserveerd. Hoe je zo'n sweep gestructureerd aanpakt, staat in de aanpak voor een Modbus-netwerkscan.
Veelgemaakte fouten
Aannemen dat je de default kent. De standaard schrijft 19200 8E1 voor, terwijl veel apparaten af fabriek op 9600 8N1 staan. Beide aannames gaan te vaak mis. Lees het uit de datasheet of loop de combinaties af.
Twee dingen tegelijk veranderen. Baudrate en pariteit samen aanpassen maakt het resultaat onbruikbaar: werkt het, dan weet je niet waarom, en werkt het niet, dan weet je niet welke van de twee fout stond. Verander een ding, test, ga pas dan door.
De hoogste baudrate kiezen omdat het kan. Meer snelheid betekent kortere maximale kabellengte en minder ruismarge. Kies de laagste snelheid die je cyclus haalt.
Denken dat een verkeerde parameter een foutmelding geeft. Dat gebeurt niet. Het apparaat ziet een verminkt frame, verwerpt het en zwijgt. Je krijgt een timeout, en die lijkt precies op een kabelbreuk. Het onderscheid tussen stilte, een CRC-fout en een exception maak je in de les over storingzoeken op RTU.
Aan de slag
- 1
Reken je eigen karaktertijd uit
Neem de baudrate die op jouw bus staat en deel 11 daardoor. Bij 9600 baud is dat 1,1458 ms.
- 2
Reken t3,5 uit
Vermenigvuldig de karaktertijd met 3,5. Bij 9600 baud komt daar 4,010 ms uit.
- 3
Herhaal de som voor 19200 baud
Doe dezelfde twee berekeningen voor 19200 baud en constateer dat beide getallen halveren: 0,573 ms per karakter en 2,005 ms stilte.
- 4
Lees een register met de juiste parameters
Draai
mbpoll -m rtu -a 1 -b 9600 -P none -t 4 -r 1 -c 2 -1 /dev/ttyUSB0. Mbpoll is gratis te gebruiken, ook zakelijk. De adapter, de poortnaam en de schakelaars staan stap voor stap in de les over je eerste apparaat uitlezen. - 5
Zet de pariteit expres verkeerd
Herhaal met
-P eventerwijl het apparaat op none staat. Noteer wat je ziet: geen antwoord en geen foutmelding van het apparaat, alleen een timeout. - 6
Zet de baudrate expres verkeerd
Herhaal met
-b 19200terwijl het apparaat op 9600 staat. Zelfde beeld. Dat is de les van vandaag: een verkeerde parameter geeft stilte, geen net foutbericht.
Zonder hardware. Draai de pymodbus-simulator over TCP (ook gratis te gebruiken, ook zakelijk) en constateer dat baudrate en pariteit daar geen rol spelen, want Modbus TCP kent geen seriele parameters. Op Linux en macOS kun je met socat een virtueel seriepaar maken en de oefening wel volledig doen:
socat -d -d PTY,link=/tmp/ptyp0,raw,echo=0,ispeed=9600 PTY,link=/tmp/ttyp0,raw,echo=0,ospeed=9600
Verwacht resultaat: twee uitgerekende tijden, en twee mislukte pogingen die allebei hetzelfde beeld geven.
Samenvatting
- Baudrate, databits, pariteit en stopbits moeten op elk apparaat van een Modbus RTU-bus identiek staan, want het protocol onderhandelt niets en corrigeert niets.
- Een RTU-karakter is altijd 11 bits, want zonder pariteitsbit schrijft de standaard een tweede stopbit voor; daardoor blijft de timing bij elke pariteitsinstelling gelijk.
- De standaard vereist even pariteit en 19200 baud als default, terwijl 8N1 op 9600 baud veel voorkomt in het veld en op tien bits uitkomt.
- De karaktertijd is 11 gedeeld door de baudrate, dus 1,1458 ms bij 9600 baud, en daaruit volgen t1,5 (1,719 ms) en t3,5 (4,010 ms).
- Een verkeerde baudrate of pariteit levert een timeout op en geen exception, dus zoek systematisch en verander nooit twee dingen tegelijk.
Controleer jezelf
Vier vragen over deze les. Je krijgt bij elk antwoord uitleg.
Vraag 1 van 4
Zelf zien hoe het werkt?
De ModbusCloud Gateway leest de apparaten uit deze cursus uit zonder dat je registers hoeft te programmeren.