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
Meerdere Modbus apparaten op een bus zetten
Meerdere Modbus apparaten op een bus vraagt om unieke adressen, een doordachte pollcadans en realistische timeouts. Zo voorkom je botsingen en stille gaten.
Wat deze les behandelt
- Het adresplan: adres 0, het gereserveerde bereik en de 247 bruikbare
- Waarom een dubbel adres de hele bus platlegt en niet een apparaat
- Pollvolgorde, timeouts en hoeveel apparaten er op een segment passen
Lees eerst: RS485 uitgelegd: A, B, common en terminatie, Baudrate en pariteit: waarom 8E1 de default is
Meerdere Modbus apparaten op een bus werken zonder problemen zolang elk apparaat een uniek serveradres heeft en de client ze een voor een aanspreekt. Zit er twee keer hetzelfde adres in, dan ligt niet dat ene apparaat plat maar je hele bus. Na deze les maak je een adresplan, laat je zelf zien wat een dubbel adres doet, en reken je uit hoeveel apparaten er op je segment passen en hoe lang een pollcyclus dan duurt.
Hoe de client weet wie er antwoordt
Aan het eerste byte van elk frame. Stel: twee energiemeters op een RS485-lijn, de ene op serveradres 1, de andere op serveradres 3. In datasheets en tools heet dat adres vaak "slave ID" of device_address. De client vraagt drie holding registers op vanaf PDU-adres 107, in een datasheet meestal geschreven als 40108:
01 03 00 6B 00 03 74 17
| Byte | Waarde | Betekenis |
|---|---|---|
| 1 | 01 | serveradres: dit verzoek is voor server 1 |
| 2 | 03 | FC03, lees holding registers |
| 3 en 4 | 00 6B | startadres, PDU-adres 107 |
| 5 en 6 | 00 03 | aantal registers: 3 |
| 7 en 8 | 74 17 | CRC-16, low byte eerst |
Server 1 antwoordt, server 3 blijft stil:
01 03 06 02 2B 00 00 00 64 05 7A
| Byte | Waarde | Betekenis |
|---|---|---|
| 1 | 01 | de server zet zijn eigen adres in het antwoord |
| 2 | 03 | dezelfde function code als in het verzoek |
| 3 | 06 | byte count: 6 databytes volgen |
| 4 tot 9 | 02 2B 00 00 00 64 | de waarden 555, 0 en 100 |
| 10 en 11 | 05 7A | CRC-16 over het hele antwoord |
De regel eronder is kort: de client zet het adres van de gewenste server vooraan, en de server plakt datzelfde adres voor zijn antwoord zodat de client weet wie er praat. De client zelf heeft geen adres. Een "master-adres" instellen in software is een begripsfout.
Wil je hetzelfde uit server 3 lezen, dan verandert er precies een ding aan de voorkant: het eerste byte wordt 03. De CRC verandert wel mee, want die rekent over het complete bericht inclusief dat adresbyte. De volledige frameopbouw als naslag staat in de uitleg over Modbus RTU.
Welke adressen mag je gebruiken?
1 tot en met 247. De adresruimte is 256 breed, maar je mag er maar een deel van uitdelen.
| Adres | Betekenis |
|---|---|
| 0 | broadcast, alle servers luisteren |
| 1 tot en met 247 | individuele serveradressen |
| 248 tot en met 255 | gereserveerd, niet gebruiken |
Broadcast is de bijzondere: alle servers voeren het commando uit, maar niemand antwoordt. Dat kan ook niet, want dan zouden ze allemaal tegelijk zenden. Een broadcast-schrijfactie ziet er zo uit:
00 06 00 01 00 03 99 DA
Dat is FC06, schrijf waarde 3 naar PDU-adres 1, gericht aan iedereen. Je krijgt er niets op terug, en dat is normaal. Lezen met adres 0 heeft daarom geen zin: er komt per definitie geen antwoord.
Wat er gebeurt bij twee keer hetzelfde adres
Beide apparaten voelen zich aangesproken en gaan tegelijk zenden. Hun signalen liggen over elkaar heen op dezelfde twee draden, en wat de client binnenkrijgt is een mengsel waarvan de CRC vrijwel nooit klopt.
De standaard voor Modbus op seriële lijnen schrijft fabrikanten letterlijk voor om in hun handleiding te waarschuwen dat twee apparaten met hetzelfde adres abnormaal gedrag van de hele seriële bus kunnen veroorzaken, waarbij de client met geen enkele aangesloten server meer kan communiceren. Dat is de kern van deze les: een dubbel adres is geen lokaal probleem.
Het foutbeeld lijkt sprekend op een kabelprobleem: willekeurige CRC-fouten, soms wel een antwoord, soms niet. Het onderscheid maak je in een minuut. Koppel een van de twee verdachte apparaten los. Wordt het meteen rustig op dat adres, dan had je een adresconflict en geen bekabelingsprobleem.
Een apparaat vinden waarvan je het adres niet weet
Met een adressweep (address scan): je stuurt een klein leesverzoek naar adres 1, dan naar 2, en zo door tot 247, en noteert welke adressen antwoorden.
Twee voorwaarden maken het verschil tussen een sweep die iets oplevert en een sweep die je op een dwaalspoor zet. Ten eerste moeten baudrate en pariteit al kloppen, anders blijft elk adres stil; die combinatie zoek je eerst op zoals in de les over baudrate en pariteit. Ten tweede hang je maar een apparaat tegelijk aan de lijn. Zit er al een dubbel adres in je installatie, dan geeft een sweep over de volledige bus onbetrouwbare uitkomsten op precies het adres dat je zoekt. De gestructureerde aanpak staat in de handleiding voor een Modbus-netwerkscan.
Hoeveel apparaten passen er op een segment?
Elektrisch: 32 zonder repeater. Dat aantal is altijd toegestaan, ongeacht merk. Heb je biasing (line polarization) nodig omdat de lijn in rust anders zweeft, dan levert dat vier apparaten in en houd je er 28 over.
Dat er 247 adressen beschikbaar zijn, is dus geen belofte over je bus. Het adresbereik en de elektrische belasting zijn twee losse grenzen, en de elektrische knelt als eerste. Meer dan 32 kan wel, maar alleen als elk apparaat een fractionele unit load heeft en dat ook zo in zijn datasheet staat: met transceivers van een achtste unit load kun je tot 256 apparaten aansluiten, en met externe fail-safe biasing zakt dat naar 96. Zit je aan je grens, dan is een repeater de oplossing. Die maakt van een lange bus twee segmenten die elk hun eigen aantal mogen tellen, elk met terminatie aan de twee uiteinden. Welke kabel en welke terminatie daarbij horen, staat in de gids voor RS485-bekabeling.
In welke volgorde poll je?
In een volgorde die je zelf kiest, want een client praat altijd met een apparaat tegelijk en wacht op het antwoord voordat hij het volgende verzoek stuurt. De cyclustijd is daarmee de som van alle transacties.
Reken het na voor tien energiemeters op 9600 baud, waarbij je per meter 24 registers in een blok ophaalt. Het verzoek is 8 bytes, het antwoord 53 bytes, en voor en na het frame staat 3,5 karaktertijd stilte, samen 7. Dat is 68 karaktertijden, en bij 9600 baud duurt een karakter 1,1458 ms:
- 68 x 1,1458 ms = 77,92 ms zendtijd op de bus per meter
- plus een aangenomen verwerkingstijd van 20 ms bij de server: 97,92 ms per meter
- tien meters: 979,2 ms, ofwel ongeveer 1 seconde per cyclus
Die 20 ms is een aanname en geen specificatie, dus meet hem bij je eigen apparaten na. Wat wel hard is: de traagste deelnemer bepaalt het tempo van iedereen. Vraag je dezelfde 24 registers per meter in twaalf losse leesacties op, dan loopt die cyclus op naar 5,7 seconden, bijna zes keer zo traag. Welk pollinterval daarbij past en hoeveel busbelasting verantwoord is, werk je uit in de les over pollen en busbelasting. Hoe snel meters zelf antwoorden verschilt per fabrikant; de vergelijking van Modbus-energiemeters zet dat naast elkaar.
Timeouts en retries die je installatie niet slopen
Kort: zet de response timeout zo laag als je traagste apparaat toestaat. De standaard noemt als indicatie 1 seconde tot enkele seconden bij 9600 bps, met een turnaround delay van 100 tot 200 ms na een broadcast. Dat zijn ruime marges, en veel clients staan standaard nog ruimer ingesteld.
Wat dat kost bij uitval, reken je door met de cyclus hierboven. Valt meter 7 uit, dan wacht de client daar de volle timeout af: negen werkende meters van 97,92 ms is 881 ms, plus 1000 ms wachten geeft 1.881 ms. Je cyclus verdubbelt bijna door een enkel apparaat. Doet je client drie pogingen voordat hij opgeeft, dan wacht hij drie keer 1000 ms op datzelfde apparaat: 881 ms plus 3000 ms, dus 3.881 ms. Dan lopen al je andere meetwaarden achter.
Veelgemaakte fouten
Adressen uitdelen zonder plan. Twee apparaten op 1 omdat ze allebei af fabriek op 1 staan, is de meest voorkomende variant. Configureer elk apparaat los voordat je het aan de bus hangt, en schrijf het adres op.
Sweepen met alles aangesloten. Zit er al een conflict in, dan geeft de sweep juist op dat adres onbetrouwbare uitkomsten. Sweep met een apparaat tegelijk aan de lijn.
Adres 0 of 250 gebruiken. 0 is de broadcast en 248 tot 255 zijn gereserveerd. Sommige apparaten accepteren zo'n adres gewoon, maar je bouwt er een tijdbom mee in voor de volgende monteur.
Een dood apparaat in de pollcyclus laten staan. Met een timeout van 1 seconde en drie pogingen kost een uitgevallen apparaat drie seconden per cyclus, meer dan de negen werkende meters samen. Dat is de gebruikelijke verklaring voor de klacht dat sinds vorige week alles traag is.
Aan de slag
Maak eerst het adresplan, en lok daarna bewust het foutbeeld uit dat je later moet herkennen.
- 1
Teken je bus op papier
Zet op papier welk apparaat waar in de lijn zit en welk serveradres het krijgt. Gebruik alleen adressen tussen 1 en 247.
- 2
Markeer de twee uiteinden
Teken de twee fysieke uiteinden van de lijn in en zet daar de terminatie bij. Alleen op die twee plekken.
- 3
Sluit de apparaten een voor een aan
Hang een apparaat aan de bus, lees er een bekend register uit, en pas daarna hang je het volgende erbij. Zo sluit je adres en bekabeling tegelijk uit als foutbron.
- 4
Maak bewust een dubbel adres
Zet twee apparaten op hetzelfde adres en lees dat adres uit. Noteer wat je ziet: geen antwoord, of afwisselend goede en foute frames.
- 5
Maak het weer uniek
Zet de adressen terug, lees alles opnieuw uit en controleer of elk apparaat terugkomt. Nu weet je hoe het foutbeeld eruitziet en hoe je het opheft.
- 6
Reken je cyclus na
Tel je apparaten, neem het aantal registers per apparaat en reken de cyclustijd uit met de som uit de sectie over pollvolgorde. Kies je pollinterval ruim boven die uitkomst.
- 7
Label de klemmenstrook
Plak er baudrate, pariteit en adres op. De volgende monteur hoeft dan niet opnieuw te sweepen.
Maak daarna dit paar zelf af. De bovenste regel is het gecontroleerde verzoek aan server 1, de onderste gaat naar server 3:
Verzoek aan server 1: 01 03 00 6B 00 03 74 17
Verzoek aan server 3: 03 03 00 6B 00 03 __ __
De laatste twee bytes zijn niet 74 17, want de CRC rekent ook over het adresbyte. Hoe je die uitrekent staat in de les over het RTU-frame en de CRC.
Zonder hardware. Start twee pymodbus-simulatorinstanties op verschillende TCP-poorten en poll ze om beurten. Pymodbus 3.15.0 is gratis te gebruiken, ook zakelijk. De meegeleverde configuratie luistert op poort 5020; voor de tweede instantie kopieer je het setup-bestand en zet je in server_list een andere poort:
pymodbus.simulator --modbus_server server --modbus_device device --http_port 8081
pymodbus.simulator --json_file bus2.json --modbus_server server --modbus_device device --http_port 8082
Een dubbel adres kun je op TCP niet nabootsen: daar onderscheidt het IP-adres de apparaten, niet het adresbyte. Dat verschil is meteen een goed bruggetje naar Modbus TCP.
Verwacht resultaat: een adresplan op papier, een uitgerekende cyclustijd, en het foutbeeld van een dubbel adres met eigen ogen gezien.
Samenvatting
- Elk apparaat op een Modbus RTU-bus heeft een uniek serveradres tussen 1 en 247; adres 0 is de broadcast en 248 tot 255 zijn gereserveerd.
- De client zet het serveradres vooraan in het verzoek en de server herhaalt zijn eigen adres in het antwoord, zodat de client weet wie er praat; de client zelf heeft geen adres.
- Twee apparaten op hetzelfde adres antwoorden tegelijk en kunnen volgens de standaard de hele bus onbruikbaar maken, niet alleen dat ene apparaat.
- Elektrisch passen er 32 apparaten op een segment zonder repeater, en met biasing zijn dat er 28, ongeacht hoeveel adressen er nog vrij zijn.
- De cyclustijd is de som van alle transacties, dus een dood apparaat met een timeout van 1 seconde vertraagt alle andere waarden mee.
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.