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
Modbus integreren: PLC, Home Assistant of cloud
Modbus integreren kan via een PLC, Home Assistant of een cloudplatform. Vergelijk wat elke route van je vraagt en welke alarmering je erbij nodig hebt.
Wat deze les behandelt
- Drie routes voor dezelfde data: PLC, Home Assistant of cloud
- De vijf gegevens die elke route vraagt: blok, telling, datatype, woordvolgorde, schaal
- Een alarmregel die pas meldt na drie mislukte pollrondes
Lees eerst: Modbus TCP oefenen met een gratis simulator, rtuovertcp: het verschil, en wat je gateway doet, Word order en float: dezelfde bytes, andere waarde
Modbus integreren is niet nog een keer het protocol leren, maar kiezen waar de data naartoe gaat en wie hem daarna beheert. Een PLC, Home Assistant en een cloudplatform lezen exact hetzelfde register uit hetzelfde apparaat, en toch vragen ze alle drie iets anders van jou. Na deze les vergelijk je de drie routes, vul je per route dezelfde vijf gegevens in en stel je een alarmregel op die niet afgaat op een enkele hapering.
Drie routes voor dezelfde data
Neem het totale systeemvermogen van een Eastron SDM630 kWh-meter: input registers, FC04, twee registers omdat het een 32-bit float is. Datasheetnummer 30053 is PDU-adres 52, hexadecimaal 0x0034. Dit is het volledige RTU-verzoek aan serveradres 1, byte voor byte:
| Byte | Waarde | Betekenis |
|---|---|---|
| 1 | 01 | serveradres 1 op de RS485-bus |
| 2 | 04 | FC04, read input registers |
| 3 tot 4 | 00 34 | startadres 0x0034, PDU-adres 52 (datasheetnummer 30053) |
| 5 tot 6 | 00 02 | aantal registers: 2 |
| 7 tot 8 | 30 05 | CRC-16, lage byte eerst (waarde 0x0530) |
En het antwoord, negen bytes lang:
| Byte | Waarde | Betekenis |
|---|---|---|
| 1 | 01 | hetzelfde serveradres |
| 2 | 04 | dezelfde function code, dus geen exception |
| 3 | 04 | byte count: 4 databytes volgen |
| 4 tot 7 | 44 9A 50 00 | float32, most significant register eerst: 1234,5 W |
| 8 tot 9 | F3 5B | CRC-16 over het antwoord (waarde 0x5BF3) |
Dat is de regel van deze les: de vijf PDU-bytes 04 00 34 00 02 zijn op elke route identiek. Wat verandert is de envelop eromheen (serveradres plus CRC-16 op RTU, een MBAP-header van zeven bytes met unit id op TCP) en vooral: wie de vertaling van 44 9A 50 00 naar 1234,5 W onderhoudt. Achter een RTU-naar-TCP-gateway blijft het RTU-frame inclusief CRC zelfs onveranderd en reist het gewoon door de TCP-verbinding.
Wat elke route van je vraagt
Technisch kunnen ze hetzelfde. Het verschil zit in beheer: wie de registerkaart bijhoudt en wie de melding om drie uur 's nachts krijgt.
| PLC of SCADA | Home Assistant | Cloudplatform | |
|---|---|---|---|
| Kennis vooraf | programmeeromgeving van het merk | YAML en Linux | registerkaart lezen |
| Beheer daarna | je programmeur, met contract | jij zelf, meestal zonder contract | de leverancier, zolang het contract loopt |
| Werkt zonder internet | ja | ja | pollen loopt door, versturen wacht |
| Overdraagbaar | ja, met de projectbestanden | alleen aan iemand met dezelfde kennis | ja, via een account |
Voor een woning of klein pand is de Home Assistant Modbus-integratie een korte weg naar de eerste meetwaarde. Zit er al een gebouwbeheersysteem, dan hoort de vraag thuis bij Modbus in gebouwautomatisering. Moet je vanaf kantoor bij twintig locaties kunnen, dan wordt het monitoring via de cloud, met de ModbusCloud Gateway of een andere gateway die zelf uitgaand verbindt.
Van register naar bruikbare meetwaarde
In elke route vul je dezelfde vijf gegevens in. Sla er een over en je krijgt geen foutmelding, maar een verkeerd getal. Twee apparaten naast elkaar laten zien waarom geen van de vijf optioneel is.
| Gegeven | Eastron SDM630, totaal systeemvermogen | NIBE S-serie, buitentemperatuur BT1 |
|---|---|---|
| Blok en function code | input registers, FC04 | input registers, FC04 |
| Telling | datasheetnummer 30053, PDU-adres 52 | input register 1 |
| Datatype | float32 over twee registers | signed 16 bit, een register |
| Woordvolgorde | most significant register eerst, dus ABCD | vervalt bij een enkel register |
| Schaalfactor | geen, de waarde staat in W | deel door 10, ruw -47 is -4,7 graden |
De regel erachter is kort: dit zijn eigenschappen van het apparaat, niet van de bestemming. Ga je van een PLC naar een dashboard, dan verandert alleen de plek waar je ze invult. Per fabrikant vallen ze anders uit: NIBE deelt temperaturen door 10, Daikin door 100, en wie de deler verwisselt zit er precies een factor 10 naast. Als int16 gelezen levert 0x449A het getal 17562 op, en dat lijkt op een plausibel vermogen. De vier varianten van de woordvolgorde staan in de les over datatypes en word order.
Een minimale domoticaconfiguratie
Dit is alles wat Home Assistant nodig heeft om de meter uit het voorbeeld hierboven te lezen:
modbus:
- type: rtuovertcp
host: 192.168.1.50
port: 502
sensors:
- name: Totaal vermogen
device_address: 1
address: 52
input_type: input
data_type: float32
Vier velden dragen de hele les. type is de verbindingsvorm: rtuovertcp omdat er een RS485-naar-Ethernet-gateway tussen zit, tcp bij een apparaat met een eigen ethernetpoort. device_address is het serveradres op de bus, dat achter een gateway ook in de unit id van de MBAP-header terechtkomt. address is 0-gebaseerd en gaat onveranderd als PDU-startadres het frame in, dus 52 en niet 30053. input_type: input kiest het blok, en data_type: float32 plakt de twee registers aan elkaar. Staat de woordvolgorde omgekeerd, dan komt swap: word erbij.
De volledige configuratie met sensoren, schakelaars en huboptionen staat in het artikel over de Home Assistant Modbus-integratie.
Hoe vaak lees je wat uit?
Het interval hoort bij de dynamiek van de grootheid, niet bij het project. Meet je cyclustijd, dus hoe lang een ronde langs alle apparaten duurt, en deel die door het pollinterval: dat is je busbelasting. De vuistregel van deze cursus is onder de 50 procent blijven, dus het interval minstens twee keer de cyclustijd. Op de doorgerekende bus van tien meters op 9600 baud duurt een cyclus 0,98 seconde. Een interval van 1 seconde is dan 97,9 procent, 5 seconden is 19,6 procent, 10 seconden is 9,8 procent en 60 seconden is 1,6 procent.
| Apparaatklasse | Interval | Waarom |
|---|---|---|
| SMA-omvormer | 10 s of langzamer | SMA vraagt minimaal tien seconden tussen twee transfers |
| kWh-meter | 10 s | 9,8 procent busbelasting, voor energiemonitoring ruim genoeg |
| Warmtepomp en GBS | 60 s | 1,6 procent busbelasting, en de aanvoertemperatuur beweegt trager |
| NIBE S-serie | registerbudget nakijken | 100 registers per seconde toegestaan, 60 registers per seconde is al 60 procent |
Twee randvoorwaarden komen erbij. SolarEdge sluit een inactieve TCP-verbinding na 2 minuten, dus daar moet het interval onder blijven als je de sessie open wilt houden. En achter een gateway geldt de seriële rekensom onverkort: de ethernetkant is snel, de bus erachter loopt nog steeds op 9600 baud. De volledige rekensom staat in de les over pollen en busbelasting.
Alarmeren zonder valse meldingen
Een verminkt frame levert geen exception op maar stilte, en dus een timeout. Op een lange bus gebeurt dat af en toe zonder dat er iets aan de hand is. Meld daarom pas offline na drie mislukte pollrondes achter elkaar.
Drie regels houden de nacht rustig. Ten eerste: houd "apparaat reageert niet" apart van "waarde buiten grens", want het eerste verklaart het tweede meestal al. Ten tweede: gebruik bij drempelwaarden een hysteresepaar, dus melden boven 70 graden en herstellen onder 65. Reken op 5 tot 10 procent van de drempel; zonder dat gat schakelt een waarde die op de grens hangt tientallen keren per uur heen en weer. Ten derde: laat de client een dood apparaat na drie mislukte rondes tijdelijk overslaan, anders wacht hij elke ronde de volle timeout af.
Dat laatste is meetbaar. Een enkel dood apparaat rekt een cyclus van 0,98 seconde al naar 1,88 seconde bij een timeout van 1 seconde, en naar 3,88 seconde als de client drie keer een volle timeout afwacht. Modbus-alerts instellen werkt beide patronen uit.
Wat je vastlegt voor de volgende monteur
De installatie werkt nu, en over twee jaar staat er iemand anders. Leg per apparaat vast: merk en type, serveradres of unit id, verbindingsvorm, en per meetwaarde het blok, het adres in beide tellingen, het datatype, de woordvolgorde en de schaalfactor. Zet er het pollinterval bij met de reden, en elke alarmdrempel met zijn herstelwaarde. De reden is het stuk dat iedereen weglaat en dat later niemand kan reconstrueren: 10 seconden lijkt willekeurig tot ernaast staat dat de fabrikant niet sneller bevraagd wil worden.
Dat is precies wat een voorgeprogrammeerde registerkaart uit een templatebibliotheek je bespaart, en precies wat ontbreekt als iemand handmatig heeft geconfigureerd zonder aantekeningen. Controleer zo'n kaart wel een keer tegen het datasheet van jouw firmwareversie. Deze lijst is de basis van de opleveringschecklist in de volgende les.
Veelgemaakte fouten
Meteen in de YAML of het dashboard beginnen. Je vult een configuratie in, de sensor blijft leeg, en je gaat een protocolfout zoeken in een tekstbestand. Toon eerst met een commandline-tool aan dat het register leesbaar is. Pas als dat lukt, weet je dat een lege sensor aan de configuratie ligt.
tcp invullen waar rtuovertcp nodig is. Achter een RS485-naar-Ethernet-gateway is dit een veelvoorkomende oorzaak van een sensor die leeg blijft. De TCP-verbinding komt tot stand, poort 502 staat open, en toch komt er nooit een antwoord terug. Zie de les over RTU of TCP kiezen voor het verschil in bytes.
Verouderde veldnamen overnemen uit een oud forumbericht. In Home Assistant heet het veld device_address en niet slave, en de datatypes heten int16 en float32, niet int en float. Een verouderde naam wordt genegeerd of afgekeurd bij het herstarten, en de melding daarover staat in het log dat je niet openhad.
Alarmeren op een enkele mislukte poll. Je krijgt meldingen op momenten dat er niets aan de hand is, en na een week zet iemand de hele alarmering uit. Tel drie mislukkingen achter elkaar voordat je meldt, en houd "reageert niet" apart van "waarde buiten grens".
Aan de slag
Je koppelt een apparaat aan een systeem en controleert de waarde met een tweede methode. Zowel mbpoll als de pymodbus-simulator zijn gratis te gebruiken, ook zakelijk.
- 1
Bewijs eerst dat het register leesbaar is
Lees de meetwaarde met een commandline-tool, los van je systeem. Voor een float32 vanaf PDU-adres 52 bij serveradres 1:
mbpoll -m rtu -a 1 -b 9600 -P none -t 3:float -r 52 -c 1 -0 -1 /dev/ttyUSB0 - 2
Noteer de vijf gegevens
Schrijf op: blok, telling, datatype, woordvolgorde en schaalfactor. Noteer ook de sentinelwaarden als de fabrikant ze publiceert. Dit briefje is straks je enige houvast bij een verkeerde waarde.
- 3
Voeg het apparaat toe met een minimale configuratie
Alleen host, poort, verbindingsvorm, unit id, registeradres, datatype en interval. Geen naamgeving, geen icoontjes, geen tweede sensor.
- 4
Herstart en zoek de waarde op
Open de statusweergave van je systeem en zoek de nieuwe entiteit. Blijft hij leeg, dan zit het in stap 3 en niet in de verbinding, want stap 1 is geslaagd.
- 5
Vergelijk de twee uitlezingen
Staat er een ander getal dan bij stap 1, loop dan de vijf gegevens langs. Een factor 10 of 100 wijst op de schaalfactor, een absurd groot getal op de woordvolgorde.
- 6
Stel de alarmregel in
Laat de melding pas afgaan na drie mislukte pollrondes achter elkaar, en geef elke drempelwaarde een herstelwaarde die een stuk lager ligt.
Zonder hardware. Start de pymodbus-simulator en koppel je systeem aan 127.0.0.1:5020 met verbindingsvorm tcp. Alle stappen behalve de eerste werken identiek.
Verwacht resultaat: een waarde die in twee onafhankelijke gereedschappen hetzelfde is, en een alarmregel die niet afgaat op een enkele hapering.
Wat je van deze route vastlegt voor de volgende monteur staat in de laatste les, de checklist voor oplevering en overdracht.
Samenvatting
- De PDU verandert niet per bestemming: elke route stuurt dezelfde
04 00 34 00 02en krijgt dezelfde04 04 44 9A 50 00terug, alleen de envelop verschilt. - De drie routes verschillen in beheer en niet in techniek, dus kies op wie de registerkaart bijhoudt en wie de nachtmelding krijgt.
- Blok, telling, datatype, woordvolgorde en schaalfactor zijn eigenschappen van het apparaat, dus elke route heeft ze alle vijf nodig.
- In Home Assistant telt
addressvanaf 0, dus uit datasheetnummer 30053 wordt 52, en achter een gateway is de verbindingsvormrtuovertcpen niettcp. - Kies het pollinterval op de dynamiek van de grootheid en houd de busbelasting onder de 50 procent: bij een cyclus van 0,98 seconde is 10 seconden 9,8 procent.
- Meld een apparaat pas offline na drie mislukte pollrondes en geef elke drempelwaarde een herstelwaarde, anders alarmeer je op ruis.
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.