In deze les

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
ByteWaardeBetekenis
101serveradres: dit verzoek is voor server 1
203FC03, lees holding registers
3 en 400 6Bstartadres, PDU-adres 107
5 en 600 03aantal registers: 3
7 en 874 17CRC-16, low byte eerst

Server 1 antwoordt, server 3 blijft stil:

01 03 06 02 2B 00 00 00 64 05 7A
ByteWaardeBetekenis
101de server zet zijn eigen adres in het antwoord
203dezelfde function code als in het verzoek
306byte count: 6 databytes volgen
4 tot 902 2B 00 00 00 64de waarden 555, 0 en 100
10 en 1105 7ACRC-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.

AdresBetekenis
0broadcast, alle servers luisteren
1 tot en met 247individuele serveradressen
248 tot en met 255gereserveerd, 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.

ClientMeter 1addr 3Meter 2addr 3Beide op adres 3Frames botsen, CRC-fout
Twee servers met hetzelfde adres antwoorden tegelijk, en de client leest onzin.

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.

AdressweepID 1ID 12ID 301247AntwoordtStil
Loop de adresruimte af met een apparaat tegelijk aan de bus.

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.

Poll 1AntwoordPoll 2TimeoutPoll 3TimeoutPoll 4TimeoutOffline meldenPas na drie mislukte polls offline melden
Een enkele mislukte poll is geen storing. Drie op rij wel.

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. 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. 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. 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. 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. 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. 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. 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
Sinds je een tweede meter hebt bijgeplaatst krijg je van adres 3 afwisselend goede antwoorden en CRC-fouten. Wat is de eerste verdachte?
Waarom kun je met een broadcast (adres 0) geen registers lezen?
Je hebt biasing nodig op je bus. Hoeveel apparaten kun je dan nog aansluiten zonder repeater?
Meter 7 van je tien meters valt uit. Je response timeout staat op 1 seconde, zonder retries. Wat merk je aan de rest?

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