In deze les

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.

InstellingWaarde af fabriekWaar hij staat
Baudrate9600datasheetnummer 40029 (0x001C), waarde 2
Databits8ligt vast in RTU-modus
Pariteitgeendatasheetnummer 40019 (0x0012), waarde 0
Stopbits1datasheetnummer 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.

NotatieBitsStatus in de standaard
8E1, even pariteit, 1 stopbit11vereist, en de voorgeschreven default
8O1, odd pariteit, 1 stopbit11toegestaan, optioneel
8N2, geen pariteit, 2 stopbits11toegestaan, aanbevolen om te ondersteunen
8N1, geen pariteit, 1 stopbit10staat 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.

Baudrate1 karaktert1,5t3,5
96001,146 ms1,719 ms4,010 ms
192000,573 ms0,859 ms2,005 ms
384000,286 msvast 750 microsecondenvast 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.

Frame 1: verzoek FC03 aan server 1Frame 2: antwoord van server 11 karakter = 11 bits: start, 8 data, pariteit, stop12Tijd op de bus1t1,5: maximale gaping binnen een frame1,72 ms bij 9600 baud2t3,5: stilte die het frame afsluit4,01 ms bij 9600 baudBoven 19200 baud beveelt de standaard vastewaarden aan: 750 microseconden en 1,750 ms.
Zonder lengteveld is stilte de enige berichtgrens die Modbus RTU heeft.

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.

Baudrate tegen framing aflopen8N18E18O1115200384001920096002400Databits, pariteit, stopbitsBaudrateGeldige CRC, dus raak
Loop de combinaties systematisch af en stop bij de eerste die een geldige CRC oplevert.

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

    Reken t3,5 uit

    Vermenigvuldig de karaktertijd met 3,5. Bij 9600 baud komt daar 4,010 ms uit.

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

    Zet de pariteit expres verkeerd

    Herhaal met -P even terwijl het apparaat op none staat. Noteer wat je ziet: geen antwoord en geen foutmelding van het apparaat, alleen een timeout.

  6. 6

    Zet de baudrate expres verkeerd

    Herhaal met -b 19200 terwijl 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
Hoe lang duurt de verplichte stilte tussen twee Modbus RTU-frames bij 9600 baud?
Je client staat op 9600 8E1, het apparaat op 9600 8N1. Wat gebeurt er?
Waarom duurt een RTU-karakter ook zonder pariteitsbit 11 bits?
Je treft een apparaat aan waarvan niemand de instellingen kent. Wat is de efficientste aanpak?

Loopt het vast op een project?

Beschrijf wat je ziet en waar het misgaat. We kijken mee en zeggen wat we zouden doen.

Verder lezen in de kennisbank