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
Je eerste Modbus apparaat uitlezen met mbpoll
Een Modbus apparaat uitlezen in acht stappen: adapter, seriele parameters, adres, register, controle. Ook met een versie zonder hardware via een simulator.
Wat deze les behandelt
- De USB-naar-RS485-adapter aansluiten en de poortnaam vinden
- Het mbpoll-commando, argument voor argument
- Na elke stap een controle, en terugrekenen naar volt of ampère
Lees eerst: Een Modbus registerkaart lezen zonder gokken, RS485 uitgelegd: A, B, common en terminatie, Baudrate en pariteit: waarom 8E1 de default is
Een Modbus apparaat uitlezen doe je met vier gegevens uit de datasheet en een commando van een regel: serveradres, baudrate, pariteit en het register dat je wilt zien. Deze les zet die stappen in een volgorde waarin je na elke handeling precies een foutbron uitsluit. Na afloop heb je met mbpoll twee registers gelezen, teruggerekend naar een eenheid en vastgelegd op een label aan de kast.
Wat je nodig hebt voordat je begint
Drie stukken hardware en vier gegevens. De hardware is een USB-naar-RS485-adapter, een afgeschermd getwist paar met een derde ader voor de common, en het apparaat met spanning erop. De vier gegevens wegen zwaarder: zonder die vier is de rest gokwerk.
| Gegeven | Voorbeeld: Eastron SDM630 |
|---|---|
| Serveradres, 1 tot en met 247 | af fabriek 1 |
| Baudrate van de hele bus | 9600 |
| Pariteit en stopbits | geen pariteit, 1 stopbit |
| Register plus datatype | netfrequentie, input register, PDU-adres 0x0046, float32 over twee registers |
Adres 0 is de broadcast en 248 tot 255 zijn gereserveerd, dus alleen 1 tot 247 blijft over. Baudrate, pariteit en stopbits moeten op elk apparaat van de bus identiek staan; die kies je in de les over baudrate en pariteit. Als naslag staat het protocol compleet in de uitleg over Modbus RTU.
De adapter aansluiten en de poort vinden
Je adapter wordt een poortnaam op je besturingssysteem, en die naam typ je straks letterlijk in.
| Systeem | Poortnaam | Zo vind je hem |
|---|---|---|
| Linux | /dev/ttyUSB0 | ls /dev/ttyUSB* |
| Windows | COM3 | Apparaatbeheer, onder Poorten |
| macOS | /dev/cu.usbserial-XXXXXXXX | ls /dev/cu.* |
Op macOS verschijnen twee namen voor dezelfde adapter: tty.* en cu.*. Neem cu.*. De tty.*-variant wacht op een carrier detect die een RS485-adapter nooit geeft, dus je commando blijft hangen zonder foutmelding.
Aan de kant van het apparaat sluit je drie draden aan: D0, D1 en de common. Die derde geleider is een eis, geen extraatje. Welke kabel daarbij hoort, staat in de bekabelingsgids voor RS485. Meet in rust het teken tussen D0 en D1: D1 hoort positiever te staan.
Het eerste commando, argument voor argument
Dit is het commando, en daaronder staat wat elk deel doet.
mbpoll -m rtu -a 1 -b 9600 -P none -t 4 -r 1 -c 2 -1 /dev/ttyUSB0
| Argument | Wat het doet |
|---|---|
-m rtu | Modbus RTU over een seriele poort. Zonder dit argument kiest mbpoll Modbus TCP |
-a 1 | het serveradres, geldig van 1 tot en met 247 |
-b 9600 | de baudrate |
-P none | de pariteit |
-t 4 | het datablok: 4 is holding registers (FC03), 3 is input registers (FC04) |
-r 1 | het eerste register, 1-gebaseerd zoals de handleiding telt. Met -0 erbij telt mbpoll vanaf PDU-adres 0 |
-c 2 | het aantal registers in dit verzoek |
-1 | een pollcyclus en dan stoppen. Zonder -1 pollt mbpoll door tot Ctrl-C |
/dev/ttyUSB0 | de poort uit de vorige stap |
Een tweede voorbeeld dat op precies een plek afwijkt. De meetwaarden van de SDM630 staan in input registers, dus wordt -t 4 een -t 3. De netfrequentie heeft PDU-adres 0x0046, decimaal 70, en in de 1-gebaseerde telling van mbpoll dus -r 71.
mbpoll -m rtu -a 1 -b 9600 -P none -t 3 -r 71 -c 2 -1 /dev/ttyUSB0
Eastron eist bij deze meter een even aantal registers per verzoek, dus -c 2 is hier geen keuze maar een voorwaarde.
Wil je liever een venster dan een commandoregel, dan doet de Register Explorer in ModbusCloud Diagnostics dezelfde uitlezing met invulvelden voor serveradres, poort en register. In deze les blijft mbpoll de route, omdat je aan de argumenten ziet wat er precies verstuurd wordt.
Wat je ziet als het werkt
Twee dingen: je waarden, en een pollstatistiek. mbpoll drukt eerst de verbindingsinstellingen af, dus daar zie je meteen of je modus, baudrate en pariteit zijn aangekomen. Daarna volgt per gelezen register een regel met het registernummer en de waarde, bij -c 2 dus twee regels.
De statistiek onderaan is belangrijker dan je waarden. Daarin staat het aantal verzonden frames tegenover het aantal ontvangen frames, frames transmitted tegen received. Lopen die twee gelijk op, dan is de hele keten van adapter tot register aantoonbaar goed. Elke mislukte poging kost je bovendien de response timeout, en die ligt bij 9600 baud gebruikelijk tussen een seconde en enkele seconden. Houd het verzoek klein zolang je test: FC03 en FC04 staan tot 125 registers toe, en veel apparaten leggen de grens lager, de SDM630 bijvoorbeeld op 80.
Wat je ziet als het niet werkt
Er zijn drie foutbeelden, en elk beeld sluit een ander deel van de keten uit.
| Wat je ziet | Wat er gebeurde | Waar je zoekt |
|---|---|---|
Niets, received blijft 0 | het verzoek kwam niet aan, of werd verworpen voor de inhoud | bedrading, baudrate, pariteit, serveradres |
| Een exception, bijvoorbeeld exception 02 | het frame kwam foutloos aan, de server weigerde de inhoud | function code, registeradres, aantal |
| Een plausibel maar verkeerd getal | de communicatie is goed, de interpretatie niet | datatype, word order, schaalfactor |
De middelste regel is het goede nieuws dat monteurs vaak missen: een exception bewijst dat je bedrading, je busparameters en je serveradres kloppen. Alleen het adres of het registertype moet nog anders.
Ken je de busparameters niet, dan loop je baudrate tegen framing af en stop je bij de eerste combinatie die antwoord geeft.
Ken je het serveradres niet, dan werkt dezelfde aanpak op het adresbereik; zie de aanpak voor een Modbus-netwerkscan. Van foutbeeld naar oorzaak werken doe je in de les over storingzoeken op Modbus RTU.
Van registerwaarde naar echte eenheid
Je hebt twee getallen binnen, en daar moet een eenheid uit komen. De netfrequentie van een SDM630 staat op PDU-adres 0x0046 (datasheetnummer 30071) als float32 over twee registers, meest significante register eerst.
| Register | Decimaal | Bytes |
|---|---|---|
eerste, PDU-adres 0x0046 | 16968 | 42 48 |
tweede, PDU-adres 0x0047 | 0 | 00 00 |
Achter elkaar gezet is dat 42 48 00 00. Als IEEE 754 float32 gelezen is dat 50,0, en de datasheet zegt Hz.
De regel eronder is kort: een register is 16 bits, en alles wat groter is, is een afspraak van de fabrikant. Je hebt er drie dingen voor nodig die alle drie in de datasheet staan: het datatype, de registervolgorde en de schaalfactor. Hoe je die eruit haalt, staat in de les over een registerkaart lezen. Wat die registervolgorde met je bytes doet, en waarom dezelfde vier bytes vier verschillende getallen kunnen opleveren, werkt de les over word order en floats later in de cursus uit.
Een ander apparaat lost hetzelfde anders op. Een SMA-omvormer volgt SunSpec en zet de netfrequentie als geheel getal in register 40202, met de exponent van tien in een apart schaalregister ernaast. Staat daar -2 en lees je 5001, dan is het 5001 maal 10 tot de macht -2, oftewel 50,01 Hz. Wie die stap overslaat, rapporteert 5001 Hz.
Sluit af met een plausibiliteitscontrole op een grootheid waarvan je de orde van grootte kent: netspanning hoort tussen ongeveer 207 en 253 V te liggen, dat is 230 V plus en min 10 procent volgens EN 50160, en netfrequentie rond 50 Hz.
Wat je vastlegt voordat je de kast dichtdoet
Vier regels op een label kosten twee minuten en besparen de volgende monteur een halve dag: baudrate, pariteit met stopbits, het serveradres, en de registers die je gebruikt met hun datatype. Zet de poortnaam en de datum in het dossier.
Bewaar ook het commando waarmee het lukte. Wie eerst met mbpoll aantoont dat een register leesbaar is en daarna pas de configuratie voor de Modbus-integratie van Home Assistant schrijft, weet bij een lege sensor dat het aan die configuratie ligt en niet aan de bus.
Veelgemaakte fouten
De defaults van de tool niet kennen. mbpoll staat standaard op TCP, 19200 baud en even pariteit. Vergeet je -m rtu, dan krijg je een verbindingsfout die niets met je bus te maken heeft, en zoek je op een plek waar niets stuk is.
Op macOS de tty.*-poort kiezen. Gebruik cu.*. Met de tty.*-naam blijft het commando wachten op een carrier detect die nooit komt, en dat lijkt sprekend op een apparaat dat niet antwoordt.
Zonder -1 pollen en denken dat het vastloopt. Zonder dat argument pollt mbpoll door tot je Ctrl-C geeft. Dat is geen fout maar de standaardwerking, en voor een continue meting juist wat je wilt.
Meerdere dingen tegelijk veranderen. Draai je adres, pariteit en draadjes in een poging om, dan weet je bij succes niet wat het was en bij falen ook niet. Een wijziging, een test, een aantekening.
Aan de slag
- 1
Installeer mbpoll
Debian en Ubuntu:
sudo apt install mbpoll. macOS:brew install mbpoll. Controle:mbpoll --helpgeeft de helptekst. - 2
Sluit de adapter aan
Controle: de poort verschijnt, op Linux met
ls /dev/ttyUSB*en op Windows in Apparaatbeheer. - 3
Bedraad D0, D1 en de common
Controle: meet in rust het teken tussen D0 en D1. D1 hoort positiever te staan, zoals de les over RS485 uitlegt.
- 4
Zoek de vier gegevens op in de datasheet
Serveradres, baudrate, pariteit met stopbits, en het register met zijn datatype. Controle: je kunt ze alle vier opschrijven.
- 5
Lees twee registers uit
Draai
mbpoll -m rtu -a 1 -b 9600 -P none -t 4 -r 1 -c 2 -1 /dev/ttyUSB0. Controle: je krijgt twee getallen terug. - 6
Krijg je stilte, verander dan een ding tegelijk
Eerst het serveradres, dan de pariteit, dan de baudrate, dan D0 en D1 omdraaien. Controle: noteer na elke poging wat je hebt veranderd.
- 7
Reken de waarde terug naar de eenheid
Pas datatype, registervolgorde en schaalfactor uit de datasheet toe. Controle: de orde van grootte klopt met wat je verwacht.
- 8
Leg de instellingen vast
Schrijf ze op een label aan de klemmenstrook. Controle: iemand anders leest het apparaat uit zonder jou te bellen.
Vul dit eerst in voor je eigen apparaat.
serveradres ......... ____
baudrate ............ ____
pariteit, stopbits .. ____
register + FC ....... ____
ruwe waarde ____ x 10^____ = ____ eenheid: ____
Zonder hardware. Installeer de simulator met python -m pip install "pymodbus[serial,simulator]==3.15.0" en start hem met pymodbus.simulator --modbus_server server --modbus_device device. Hij luistert op poort 5020, dus je hebt geen rootrechten nodig. Vervang daarna de seriele argumenten door -m tcp -p 5020 127.0.0.1 en loop dezelfde stappen af, zonder stap 2, 3 en 8.
mbpoll -m tcp -p 5020 -a 1 -t 4 -r 3 -c 1 -0 -1 127.0.0.1
Met -0 telt mbpoll vanaf nul, dus -r 3 is PDU-adres 3. De meegeleverde dataset is expres zo gebouwd dat je alle drie de foutbeelden kunt oefenen: PDU-adres 3 bevat 17001 en geeft die waarde elke keer ongewijzigd terug, de float32 over PDU-adres 6 en 7 begint op 404,17 en loopt bij elke uitlezing op, en PDU-adres 1 staat als ongeldig ingesteld en levert een echte exception. pymodbus valt onder de BSD-3-licentie en is vrij te gebruiken, ook zakelijk. Op Linux en macOS maak je met socat een virtueel seriepaar en volg je de RTU-route wel helemaal.
Verwacht resultaat: twee registerwaarden op je scherm, teruggerekend naar een plausibele eenheid, en een label aan de kast.
Samenvatting
- Een Modbus RTU-apparaat uitlezen vraagt vier gegevens: het serveradres, de baudrate, de pariteit met stopbits, en het register met zijn datatype.
- mbpoll staat standaard op Modbus TCP, 19200 baud en even pariteit, dus
-m rtu,-ben-Pgeef je altijd expliciet mee. - Stilte, een exception en een verkeerd getal zijn drie verschillende diagnoses, en een exception bewijst dat bedrading, busparameters en serveradres allemaal kloppen.
- Een uitgelezen registerwaarde is pas af als je hem hebt teruggerekend naar de eenheid uit de datasheet en op plausibiliteit hebt gecontroleerd.
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.