In deze les

Wat deze les behandelt

  • Wie de vraag stelt en wie antwoordt in jouw installatie
  • Waarom register 40001 bij twee merken iets anders betekent
  • De woorden die de rest van de cursus gebruikt: client, server, PDU, register, function code

Modbus is een vraag-antwoordprotocol: een apparaat stelt een vraag, een ander stuurt een getal terug, en nergens in het bericht staat wat dat getal betekent. Precies die soberheid verklaart allebei de kanten van Modbus: waarom het al sinds 1979 draait op plekken waar nieuwere protocollen sneuvelen, en waarom je er soms onzin uit leest. Na deze les weet je wie in jouw installatie de vraag stelt, wie antwoordt, en wat je zelf nog moet opzoeken.

Wat gebeurt er als een gateway een meter uitleest?

Er gaat een korte vraag over de lijn en er komt een kort antwoord terug, en daar houdt het op. Een gateway wil drie waarden van een kWh-meter op serveradres 1, dus de vraag bevat vier dingen:

Wat de gateway invultWaarde hier
Welk apparaat op de busserveradres 1
Wat voor toegangFC03, holding registers lezen
Vanaf welk adresPDU-adres 107, in de datasheet 40108
Hoeveel registers3

De meter antwoordt met dezelfde function code, een byte count en drie getallen van 16 bits. Dat is 8 bytes heen en 11 bytes terug:

Vraag:    01 03 00 6B 00 03 74 17
Antwoord: 01 03 06 02 2B 00 00 00 64 05 7A

Die bytes hoef je nu nog niet te kunnen ontleden, dat doet de les over het Modbus RTU-frame en de CRC. Waar het om gaat is wat er terugkomt: 555, 0 en 100, zonder eenheid, zonder komma en zonder naam. Pas de registerkaart van dit apparaat maakt er iets van:

RegisterRuwe waardeWat de registerkaart van dit apparaat zegt
PDU-adres 107555stroom L1, stap 0,1 A, dus 55,5 A
PDU-adres 1080geen storing actief
PDU-adres 109100powerfactor, stap 0,01, dus 1,00
Gateway (client)MasterEnergiemeter01Omvormer02Warmtepomp03I/O-module04Vraag: 3 registers vanaf 107Antwoord: 555, 0, 100
De client stelt de vraag, elke server antwoordt alleen als zijn eigen adres genoemd wordt.

Modbus is een applicatielaagprotocol op niveau 7 van het OSI-model, en deze uitwisseling is alles wat het doet. Wil je eerst de volledige naslag over het protocol, lees dan het overzichtsartikel wat Modbus is en waar je het tegenkomt.

Waarom een protocol uit 1979 nog overal draait

Omdat het klein genoeg is om overal in te passen en open genoeg om na te bouwen. Modicon, tegenwoordig Schneider Electric, bracht Modbus in 1979 op de markt en droeg het in april 2004 over aan de Modbus Organization, een stap die de organisatie zelf omschrijft als een keuze voor openheid. De specificatie van het applicatieprotocol staat sindsdien openbaar, op dit moment als versie V1.1b3 van 26 april 2012.

Die soberheid zit in de getallen. Een Modbus-PDU is nooit langer dan 253 bytes, een limiet die het protocol overhield aan zijn eerste seriële implementatie, en het leesverzoek hierboven past op RS485 in acht bytes inclusief de foutcontrole. Een apparaat dat niet meer dan dat hoeft te verwerken heeft geen zware processor nodig en geen onderhandeling bij het opzetten van een verbinding. Daarom kom je het nog tegen op vrijwel elke omvormer, kWh-meter en warmtepompregelaar.

Wie vraagt, wie antwoordt, en hoe je ze herkent

Het apparaat dat het gesprek begint is de client, alles wat wacht is een server. In de praktijk is de client je gateway, PLC, SCADA-systeem, energiemanagementsysteem of een Home Assistant die Modbus praat. De servers zijn de meters, omvormers, sensoren, drives en I/O-modules. Herkennen doe je ze aan het gedrag: wie uit zichzelf begint te praten is de client, en op een bus hoort er precies één van te zijn.

Je komt dezelfde twee rollen in datasheets en configuratieschermen nog overal tegen als master en slave. De specificatie voor de seriële lijn koppelt ze letterlijk aan elkaar: op een seriële Modbus-lijn vervult de master van de bus de clientrol en gedragen de slaves zich als servers. De Modbus Organization verving die woorden op 9 juli 2020 door client en server, maar veldnamen veranderen niet mee. Een scherm met "Modbus master" en "slave ID" gaat dus over precies wat deze cursus client en serveradres noemt.

Wat een register is, en vooral wat het niet is

Een register is 16 bits. Geen eenheid, geen datatype, geen schaalfactor, geen naam. In het antwoord hierboven is 555 gewoon 555. Of dat 55,5 A, 555 W of de helft van een serienummer is, heeft de fabrikant in een datasheet opgeschreven.

De standaard kent vier datablokken, staat er tot 65536 items per blok in toe, legt vast hoe je die adresseert en of je ze mag schrijven, en houdt daar op. De specificatie zegt met zoveel woorden dat de koppeling tussen het Modbus-datamodel en de toepassing in het apparaat volledig fabrikantspecifiek is. Eén registernummer mag dus bij drie merken drie dingen betekenen.

De standaard legt alleen het adres vast, niet wat er staat.Holding register 40001(datasheetnummer, 1-gebaseerd)Merk ASpanning L1 in 0,1 VMerk BSerienummer, deel 1 van 2Merk CBedrijfsmodus, 0 tot 4
Drie merken, hetzelfde adres, drie betekenissen. Dat is geen fout, dat is het ontwerp.

Daarom bestaat er geen tool die automatisch ontdekt wat een apparaat te bieden heeft, en is de registerkaart van de fabrikant geen papierwerk maar het halve werk. Hoe zo'n kaart is opgebouwd staat in het artikel over Modbus-registers en hun adresbereiken, en de les over een registerkaart lezen maakt er routine van.

RTU en TCP: dezelfde vraag, een andere envelop

De vraag in het midden is identiek, alleen de verpakking verschilt. Dat middenstuk is de PDU (protocol data unit): de function code plus de data, samen maximaal 253 bytes. Modbus RTU zet er een adresbyte voor en twee CRC-bytes achter en komt zo op maximaal 256 bytes per bericht. Modbus TCP verpakt diezelfde PDU in een MBAP-header van 7 bytes, laat de CRC helemaal weg omdat Ethernet en TCP die controle al doen, en komt op maximaal 260 bytes, standaard op poort 502.

Hetzelfde leesverzoek ziet er daardoor zo uit: 01 03 00 6B 00 03 74 17 op RS485, acht bytes, en 00 01 00 00 00 06 FF 03 00 6B 00 03 op TCP, twaalf bytes. In allebei zit dezelfde PDU 03 00 6B 00 03.

Modbus RTUClientgateway of PLCServer 01Server 02Server 03adressen 1 tot 247op één busModbus TCPClientSCADA, gateway ofHome AssistantEthernet switch, servers luisteren op poort 502elk apparaat een eigen IP-adres
RTU deelt één seriële lijn en scheidt de apparaten op adres, TCP geeft elk apparaat een eigen IP-adres.

Dat is het hele verschil op protocolniveau. Hoofdstuk 2 behandelt RTU, hoofdstuk 3 behandelt TCP, en het artikel over Modbus RTU en Modbus TCP naast elkaar weegt ze tegen elkaar af.

De twaalf woorden die je de rest van de cursus nodig hebt

Deze twaalf termen komen in elke volgende les terug, en ze staan precies zo in de datasheets.

TermWat het isVoorbeeld
clientstelt de vraag, neemt het initiatiefgateway, PLC, Home Assistant
serverantwoordt op zijn eigen adresmeter, omvormer, I/O-module
coilbit dat je mag lezen en schrijveneen relaisuitgang
discrete inputbit dat je alleen mag lezeneen alarmcontact
input register16 bits, alleen lezeneen meetwaarde
holding register16 bits, lezen en schrijveneen instelling of een meetwaarde
PDUfunction code plus data, maximaal 253 bytes03 00 6B 00 03
ADUde PDU plus de envelop van het transport256 bytes op RTU, 260 op TCP
serveradreshet adresbyte op RS485, 1 tot 247, 0 is broadcasthet veld slave ID
unit iddatzelfde byte in Modbus TCP, 0xFF op een native TCP-apparaatnaast het IP-adres
function codewat je wilt doenFC03 leest holding registers
exceptionhet foutantwoord van de server83 02, adres bestaat niet

Twee van deze twaalf misleiden: serveradres en unit id lijken uitwisselbaar en zijn dat niet, en het datasheetnummer scheelt één van het adres dat over de lijn gaat. Dat is precies het onderwerp van de volgende les, over Modbus adressering van 40001 naar de draad.

Hoe je deze cursus gebruikt

De cursus telt 21 lessen in vier hoofdstukken: basis, Modbus RTU, Modbus TCP en gevorderde onderwerpen. Werk ze op volgorde door als je bij nul begint, of spring naar de les die past bij het probleem op je bureau. Elke les herhaalt in twee zinnen wat hij uit eerdere lessen nodig heeft, dus geen enkele deur zit op slot. Onder elke les staat een quiz van vier vragen waarmee je zelf toetst of het blijft hangen.

Veelgemaakte fouten

Een waarde lezen alsof er een eenheid bij zat. Je leest 555 uit een register en noteert 555 A. Het bericht bevatte een getal van 16 bits en verder niets. De stapgrootte, de komma en de eenheid staan in de datasheet. Een waarde die je niet kunt terugvoeren op een regel in een datasheet heb je dus nog niet gelezen.

Aannemen dat "het apparaat heeft Modbus" genoeg is. Modbus RTU en Modbus TCP zijn twee verschillende fysieke werelden. Een apparaat met alleen RS485-klemmen zet je niet met een patchkabel op je netwerk, en een apparaat met alleen een RJ45-poort hang je niet aan een bestaande bus. Vraag door welk van de twee erin zit voordat je iets bestelt.

Master en slave als iets anders zien dan client en server. Het zijn dezelfde rollen met oudere namen, op 9 juli 2020 vervangen door de Modbus Organization. Configuratieschermen zeggen nog steeds "Modbus master" en "slave ID", en wie daar een derde begrip in ziet, zet uiteindelijk twee clients op één bus.

Aan de slag

Geen installatie deze keer. Je maakt de inventarisatie die een monteur op dag een van een project maakt, en die werkt net zo goed aan een bureau.

  1. 1

    Kies een apparaat waar je echt mee te maken hebt

    Een kWh-meter, een omvormer, een warmtepomp of een laadpaal. Iets dat je hebt geïnstalleerd of gaat installeren.

  2. 2

    Zoek de Modbus-documentatie bij de fabrikant

    Zoek een registerkaart, een Modbus-protocolhandleiding of een communicatiebijlage, niet een forumbericht. Noteer de documentversie, want registerkaarten wijzigen tussen firmwaregeneraties.

  3. 3

    Beantwoord vijf vragen op papier

    Praat het apparaat RTU of TCP? Wat is het fabrieksadres? Welke baudrate staat er af fabriek? In welke notatie staan de registers, 40001-stijl of vanaf 0? En staat er ergens iets over byte- of woordvolgorde (word order)?

  4. 4

    Vul deze kaart in voor jouw apparaat

    Neem de vijf regels hieronder over en maak ze af. Elk hokje dat je niet kunt invullen is een vraag voor de leverancier, geen aanname voor later.

  5. 5

    Noteer waar je gezocht hebt als een vraag openblijft

    Schrijf het paginanummer of de zoekterm op. Dat is het echte resultaat van deze oefening: je weet nu precies wat je moet vragen.

Apparaat:    ______________________  firmware/documentversie: __________
Transport:   RTU over RS485   /   Modbus TCP
Adres:       serveradres ____        of unit id ____
Notatie:     datasheetnummers vanaf 1 (40001-stijl)   /   adressen vanaf 0
Woordvolgorde: ____________________  (of: niet gedocumenteerd)

Zonder apparaat. Pak de openbare protocoldocumentatie van de Eastron SDM630 en beantwoord dezelfde vijf vragen. Ter controle: die meter praat Modbus RTU over RS485, het adresbereik loopt van 1 tot 247 met 1 als fabrieksinstelling, de meetwaarden staan in input registers die je met FC04 leest, en het document vermeldt dat het meest significante register vooropgaat.

Verwacht resultaat: vijf antwoorden op papier, plus het inzicht dat een datasheet ze bijna nooit alle vijf beantwoordt.

Samenvatting

  • Modbus is een vraag-antwoordprotocol op OSI-niveau 7: de client vraagt, de server antwoordt op zijn eigen adres, en een server begint nooit uit zichzelf te praten.
  • Een register is 16 bits zonder eenheid en zonder datatype, dus de betekenis komt uit de registerkaart van de fabrikant en niet uit het protocol.
  • Client en server zijn sinds 9 juli 2020 de officiële namen voor de rollen die in datasheets nog master en slave heten.
  • Modbus RTU en Modbus TCP versturen dezelfde PDU van maximaal 253 bytes en verschillen alleen in de envelop: 256 bytes met adresbyte en CRC, 260 bytes met een MBAP-header van 7 bytes.
  • Voor je een apparaat uitleest wil je vijf dingen weten: transport, adres, baudrate, adresnotatie en woordvolgorde.

Controleer jezelf

Vier vragen over deze les. Je krijgt bij elk antwoord uitleg.

Vraag 1 van 4
Twee apparaten op dezelfde RS485-bus sturen uit zichzelf hun meetwaarde zodra die verandert. Wat weet je dan?
Datasheetnummer 40001 is bij merk A de spanning en bij merk B het eerste deel van het serienummer. Waarom mag dat allebei?
Je leest hetzelfde apparaat een keer rechtstreeks via RS485 en een keer via een gateway over Modbus TCP. Welk deel van het bericht is in beide gevallen exact hetzelfde?
Welke twee termen beschrijven dezelfde rol?

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