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 RTU storing zoeken: symptoom en oorzaak
Een Modbus RTU storing oplossen begint bij wat je ziet. Stilte, een CRC-fout of een exception wijzen elk naar een ander domein, en dat halveert je zoektijd.
Wat deze les behandelt
- Stilte, CRC-fout en exception wijzen elk naar een ander domein
- Wat een exception al bewijst over kabel, busparameters en adres
- De diagnosetellers van FC08, en telkens een variabele veranderen
Lees eerst: Het Modbus RTU frame byte voor byte, plus CRC, Meerdere Modbus apparaten op een bus zetten, Je eerste Modbus apparaat uitlezen met mbpoll
Een Modbus RTU storing los je niet op door bij de kabel te beginnen, maar door te kijken wat je scherm laat zien: stilte, verminkte frames of een exception. Die drie beelden sluiten elkaar uit en wijzen elk naar een ander domein. Na deze les stel je in een minuut vast waar je moet zoeken, en heb je de drie foutbeelden zelf nagemaakt op een opstelling die het deed.
Drie foutbeelden, drie verschillende werelden
Wat je ziet bepaalt waar je zoekt. De standaard beschrijft vier uitkomsten van een verzoek: een normaal antwoord, geen antwoord omdat het verzoek nooit aankwam, geen antwoord omdat de server een communicatiefout ontdekte en het frame verwierp, en een exception-antwoord omdat het frame foutloos aankwam maar niet uitvoerbaar was. Aan jouw kant van de kabel vallen die vier terug op drie waarnemingen.
De middelste kolom is het inzicht dat de meeste monteurs missen. Het protocol zelf staat als naslag uitgeschreven in de uitleg over Modbus RTU.
Als er helemaal niets terugkomt
Stilte is het minst informatieve symptoom, want drie domeinen kunnen hem veroorzaken. Loop ze af van goedkoop naar duur, en verander telkens een ding.
- Serveradres. Bijna elk apparaat staat af fabriek op 1. Geldige adressen lopen van 1 tot en met 247, 0 is broadcast.
- Baudrate, pariteit en stopbits. De standaard schrijft 19200 met even pariteit voor, maar vrijwel geen fabrikant volgt dat. Probeer eerst 9600 8N1.
- D0 en D1 verwisseld. Omdraaien beschadigt niets, maar doe het pas na stap 1 en 2.
- Common ontbreekt. Een twee-draads Modbus-bus heeft drie geleiders. Zonder die derde draad kan het common-mode bereik van -7 V tot +12 V overschreden worden.
- Voeding of interface niet actief. Bij sommige apparaten staat de Modbus-poort in een menu.
Als je wel iets ziet maar het klopt niet
Verminkte frames en wisselvallig gedrag horen in het fysieke domein, want een CRC-fout levert geen exception op maar stilte. Je ziet dan afwisselend een antwoord en een timeout. De klassiekers: terminatie ontbreekt of er staat er een derde bij (maximaal twee op een bus, nooit een op een aftakking), termineren zonder biasing, een ster in plaats van een doorgeluste keten, een te lange bus (maximaal 1000 m bij 9600 baud met AWG26 of dikker, met Cat5 nog 600 m), of twee apparaten die op hetzelfde serveradres staan.
Dat stukje netwerkkabel werkt vaak jarenlang, tot de bus wordt verlengd of de baudrate omhoog gaat. Welke kabel je wel gebruikt, staat in de gids over RS485-bekabeling voor Modbus.
Als het apparaat netjes nee zegt
Neem een concreet verzoek: drie holding registers lezen vanaf PDU-adres 107, dus datasheetnummer 40108, bij serveradres 1.
| Bytes | Veld |
|---|---|
01 | serveradres 1 |
03 | FC03, holding registers lezen |
00 6B | startadres, PDU-adres 107 |
00 03 | aantal: 3 registers |
74 17 | CRC-16, low byte eerst |
Bestaan die registers niet, dan komt dit terug:
| Bytes | Veld |
|---|---|
01 | serveradres 1 |
83 | exception function code, 0x03 plus 0x80 |
02 | exception code 02, illegal data address |
C0 F1 | CRC-16, low byte eerst |
De regel: bij een exception zet de server het hoogste bit van de function code, dus de waarde wordt precies 0x80 hoger, gevolgd door exact een byte met de exception code. Is de tweede byte van een frame groter dan 0x80, dan zie je met het blote oog een exception. Hetzelfde verzoek bij een apparaat dat die registers wel heeft begint met 01 03 06: 03 blijft de function code, 06 is de byte count.
De standaard kent negen exception codes (01 tot en met 06, 08, 0A en 0B), maar je komt er in de praktijk drie tegen. Exception 01 betekent dat het apparaat deze function code niet kent, bijvoorbeeld FC03 waar alleen FC04 bestaat. Exception 02 is de meest voorkomende: bijna altijd de off-by-one tussen datasheetnummer en PDU-adres, of een blok dat over de rand van de kaart loopt. Exception 03 krijg je als je aantal niet mag, bijvoorbeeld meer dan de 125 registers die FC03 toestaat, al antwoorden veel apparaten daar 02 op.
Als het getal plausibel is maar toch verkeerd
Hier is de communicatie in orde en zit de fout in de interpretatie. De snelste test is een grootheid pakken waarvan je de orde van grootte kent. Netspanning hoort tussen ongeveer 207 en 253 V te liggen en de netfrequentie rond 50 Hz. Lees je 5001 waar 50,01 hoort te staan, dan mist er een schaalfactor van honderd.
Vier oorzaken dekken bijna alles: een verkeerde of dubbel toegepaste schaalfactor, een signed waarde die als unsigned wordt gelezen (een buitentemperatuur van -5,0 graden springt dan naar 6548,6), een verkeerd register uit een blok dat verder netjes antwoordt, en een verkeerde word order. Dat laatste komt terug in de les over datatypes en word order.
Een storing zoeken zonder de bus te slopen
De methode is saai en werkt: verander een ding, leg het effect vast, en draai de wijziging terug als hij niets oplevert. Wie drie dingen tegelijk verandert en het daarna ziet werken, weet nog steeds niets.
Je hebt daarbij meer dan je pollstatistiek. Elke conforme server houdt diagnosetellers bij die je met FC08 uitleest zonder een klem los te draaien. Subfunctie 0x0A wist alle tellers. 0x0B geeft het aantal frames dat dit apparaat op de bus zag, waarbij frames met een verkeerde CRC niet meetellen. 0x0C geeft het aantal communicatiefouten en 0x0D het aantal exceptions dat dit apparaat zelf terugstuurde.
Wanneer het aan de omgeving ligt
Het patroon is herkenbaar: het werkt, tot er een machine aanslaat. Frequentieregelaars, contactoren en schakelende voedingen stralen in op een buskabel die met hun voedingskabels in dezelfde goot ligt. Aard het scherm aan een kant, want aan twee kanten aarden maakt er een aardlus van. Log de fouten met een tijdstempel voordat je gaat meten, en vraag wat er op die momenten inschakelt. Die ene vraag scheelt vaak een halve dag.
Dat loggen hoeft niet met de hand. De Data Logger in ModbusCloud Diagnostics legt meerdere registers over tijd vast en exporteert naar CSV, en de foutenteller in de Protocol Analyzer telt de mislukte transacties mee. Dan leg je het tijdstip van de uitval naast het inschakelmoment in plaats van het te vermoeden.
Veelgemaakte fouten
Bij een timeout meteen aan de bekabeling trekken. Een verkeerd serveradres geeft exact hetzelfde beeld en kost dertig seconden om uit te sluiten. Doe de goedkope tests eerst, en scan desnoods de bus zoals beschreven in de uitleg over een Modbus-netwerk scannen.
Een exception als storing behandelen. Een exception is een geslaagde transactie met een inhoudelijk antwoord. Zodra je er een ziet, hoef je de kabel, de baudrate en het adres niet meer te verdenken. Wie dat toch doet, verliest uren aan een probleem dat in zijn eigen verzoek zit.
Meerdere dingen tegelijk veranderen. Je verzet het adres, je zet de terminatie erbij en je verlaagt de baudrate, en het werkt. Prima, tot het volgende project. Verander een ding per test en noteer het resultaat.
Een patchkabel vertrouwen omdat hij toevallig acht aders heeft. Cat-kabel zit rond 100 ohm karakteristieke impedantie tegen ongeveer 120 ohm voor een RS485-kabel. Op korte lengtes merk je niets, op lange lengtes komt het eruit als CRC-fouten.
Aan de slag
Je maakt de drie foutbeelden zelf, achter elkaar, op dezelfde opstelling. Je leert het verschil zien door het te veroorzaken.
- 1
Begin bij een lezing die werkt
Lees een register uit dat je kent en noteer de pollstatistiek. mbpoll is gratis te gebruiken, ook zakelijk.
mbpoll -m rtu -a 1 -b 9600 -P none -t 4 -r 1 -c 2 -1 /dev/ttyUSB0Op Windows vervang je de poort door
COM3, op macOS door/dev/cu.usbserial-XXXXXXXX. - 2
Foutbeeld 1: draai D0 en D1 om
Wissel de twee draden en herhaal dezelfde lezing. De verzonden frames lopen op, de ontvangen frames blijven op nul: honderd procent uitval. Draai de draden terug.
- 3
Foutbeeld 2: gebruik een verkeerd serveradres
Vraag hetzelfde register op bij een adres dat niet bestaat, bijvoorbeeld
-a 9. Zelfde beeld: niets terug. Zet-aweer goed en je hebt meteen antwoord. Zo halveer je het domein zonder iets los te schroeven. - 4
Foutbeeld 3: vraag een register op dat niet bestaat
Zet het startadres ver voorbij het einde van de registerkaart, bijvoorbeeld
-r 60000. Nu komt er wel een antwoord, en dat is een exception. Daarmee is bewezen dat bekabeling, busparameters en serveradres alle drie goed zijn. - 5
Zet de drie waarnemingen naast elkaar
Maak een tabel met drie rijen: wat je veranderde, wat je zag, en in welk domein je zou zoeken. Dat tabelletje is het eindresultaat van deze les.
- 6
Optioneel: laat de teller oplopen
Wis de tellers met FC08 subfunctie
0x0A, herhaal foutbeeld 1 en lees daarna0x0Cuit. Niet elk apparaat ondersteunt FC08, dus controleer je datasheet.
Zonder hardware. Foutbeeld 3 doe je tegen de pymodbus-simulator, die gratis te gebruiken is, ook zakelijk. Start hem met pymodbus.simulator --modbus_server server --modbus_device device, verbind met -m tcp -p 5020 en vraag een adres op dat er niet is. Foutbeeld 1 en 2 boots je op TCP na met een verkeerde poort en een verkeerde unit id, maar het mechanisme verschilt: op TCP weigert de verbinding zelf, op RS485 verdwijnt je frame stil in de kabel.
Verwacht resultaat: drie foutbeelden in een tabel, elk met het domein dat het aanwijst of uitsluit.
Samenvatting
- Stilte, een CRC-fout en een exception wijzen elk naar een ander domein, en dat onderscheid maak je voordat je gereedschap pakt.
- Een exception bewijst dat je frame foutloos is aangekomen, dus dat bekabeling, baudrate, pariteit en serveradres alle vier goed staan.
- Een CRC-fout levert nooit een exception op maar altijd stilte, en daarom heeft een timeout minstens drie mogelijke oorzaken.
- Exception 02 betekent bijna altijd de off-by-one tussen datasheetnummer en PDU-adres, of een blok dat over de rand van de registerkaart loopt.
- Met FC08 lees je de tellers
0x0B,0x0Cen0x0Duit zonder de bus af te koppelen, en hun verhouding scheidt een fysiek probleem van een configuratieprobleem.
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.