In deze les

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:

ByteWaardeBetekenis
101serveradres 1 op de RS485-bus
204FC04, read input registers
3 tot 400 34startadres 0x0034, PDU-adres 52 (datasheetnummer 30053)
5 tot 600 02aantal registers: 2
7 tot 830 05CRC-16, lage byte eerst (waarde 0x0530)

En het antwoord, negen bytes lang:

ByteWaardeBetekenis
101hetzelfde serveradres
204dezelfde function code, dus geen exception
304byte count: 4 databytes volgen
4 tot 744 9A 50 00float32, most significant register eerst: 1234,5 W
8 tot 9F3 5BCRC-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.

RoutesModbus-apparaatMeter, omvormer,warmtepompBestemmingRegeling, dashboard, alarm1PLC of SCADAingebouwd2Protocol-bridge naar de GBSBACnet, KNX3Home AssistantYAML4Modbus naar MQTTMQTT5Cloudplatformuitgaand TLS
1
PLC of SCADA. De regelaar spreekt zelf Modbus en stuurt er iets mee aan. Korte regellus, maar je hebt de programmeeromgeving en de licentie van dat merk nodig.
2
Protocol-bridge naar de GBS. Registers worden objecten of datapunten in het bestaande gebouwbeheersysteem. Twee vertaaltabellen om te onderhouden in plaats van een.
3
Home Assistant. Gratis en snel opgezet, geschikt voor woningen en kleine panden. Jij bent daarna de beheerder van de server, de back-up en de updates.
4
Modbus naar MQTT. De gateway pollt en publiceert naar een broker. Handig als het doel een IoT-platform is, maar je bouwt de datamodellering zelf.
5
Cloudplatform. De gateway pollt lokaal en stuurt zelf naar buiten. Geen inkomende poort en geen eigen server, wel een abonnement en een leverancier.
Dezelfde registers, vijf mogelijke bestemmingen. De keuze zit in beheer, niet in techniek.
KenmerkPLC of SCADAHome AssistantCloudplatform
Kennis voorafprogrammeeromgeving van het merkYAML en Linuxregisterkaart lezen
Beheer daarnaje programmeur, met contractjij zelf, meestal zonder contractde leverancier, zolang het contract loopt
Werkt zonder internetjajapollen loopt door, versturen wacht
Overdraagbaarja, met de projectbestandenalleen aan iemand met dezelfde kennisja, 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.

GegevenEastron SDM630, totaal systeemvermogenNIBE S-serie, buitentemperatuur BT1
Blok en function codeinput registers, FC04input registers, FC04
Tellingdatasheetnummer 30053, PDU-adres 52input register 1
Datatypefloat32 over twee registerssigned 16 bit, een register
Woordvolgordemost significant register eerst, dus ABCDvervalt bij een enkel register
Schaalfactorgeen, de waarde staat in Wdeel 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.

tcpnative Modbus TCPHAhubPV-omvormerEthernetPoort 502
Voor apparaten met een eigen ethernetpoort die zelf Modbus TCP spreken, zoals de meeste moderne omvormers.
rtuovertcpRTU-frames in een TCP-stroomHAhubseriële serverEthernetPoort 502 (RTU-framing)
Voor seriële gateways die het RTU-frame onveranderd doorgeven. Je herkent het aan de CRC achteraan het antwoord.
serialrechtstreeks op RS485HAhubUSB-RS485A/B/GND/dev/ttyUSB0
Voor een USB-naar-RS485-adapter op de machine waar Home Assistant draait. Jij geeft poort, baudrate en pariteit op.
Kies je de verkeerde verbindingsvorm, dan krijg je timeouts en geen foutmelding. tcp en rtuovertcp lijken op elkaar, maar het frame op de lijn verschilt.

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.

ApparaatklasseIntervalWaarom
SMA-omvormer10 s of langzamerSMA vraagt minimaal tien seconden tussen twee transfers
kWh-meter10 s9,8 procent busbelasting, voor energiemonitoring ruim genoeg
Warmtepomp en GBS60 s1,6 procent busbelasting, en de aanvoertemperatuur beweegt trager
NIBE S-serieregisterbudget nakijken100 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.

Poll 1OKPoll 2MisluktPoll 3MisluktPoll 4MisluktOffline-alarmDrie missers achter elkaar
Alarmeer nooit op een enkele mislukte poll. Op een bus met veel verkeer is een losse timeout normaal.

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. 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. 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. 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. 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. 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. 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 02 en krijgt dezelfde 04 04 44 9A 50 00 terug, 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 address vanaf 0, dus uit datasheetnummer 30053 wordt 52, en achter een gateway is de verbindingsvorm rtuovertcp en niet tcp.
  • 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
Je nieuwe sensor blijft leeg in je domoticasysteem, terwijl mbpoll precies hetzelfde register op hetzelfde apparaat wel uitleest. Waar zoek je?
Waarom is `scan_interval: 1` voor een warmtepomp meestal een slechte keuze?
Je meldt een apparaat offline zodra een enkele poll mislukt. Wat gebeurt er in een installatie met een lange RS485-bus?
Welke van de vijf gegevens (blok, telling, datatype, woordvolgorde, schaalfactor) hoef je niet in te vullen als je een apparaat aan een cloudplatform koppelt in plaats van aan een PLC?

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