In deze les

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.

Wat je zietWat het betekentWaar je zoektStilte, timeoutHet frame kwam niet aan,of werd verworpen voor hetgelezen wasBedrading: D0, D1,commonSerieel: baudrate enpariteitAdres: het serveradresException,bijvoorbeeld 83 02Het frame kwam foutloosaan en het apparaatweigert dit ene verzoekFunction code: FC03 ofFC04Adres: off-by-one op40001Aantal: over de randvan het blokEen waarde die nietkloptHet transport is in orde,de interpretatie nietDatatype en word orderSchaalfactor en eenheidHet verkeerde register
Wat je ziet bepaalt waar je zoekt. Een exception sluit de hele fysieke laag in een keer uit.

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.

  1. Serveradres. Bijna elk apparaat staat af fabriek op 1. Geldige adressen lopen van 1 tot en met 247, 0 is broadcast.
  2. Baudrate, pariteit en stopbits. De standaard schrijft 19200 met even pariteit voor, maar vrijwel geen fabrikant volgt dat. Probeer eerst 9600 8N1.
  3. D0 en D1 verwisseld. Omdraaien beschadigt niets, maar doe het pas na stap 1 en 2.
  4. 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.
  5. Voeding of interface niet actief. Bij sommige apparaten staat de Modbus-poort in een menu.
Meet de rustspanning voordat je draden omwisseltCorrect aangeslotenD1 staatpositiever dan D0Multimeter, DC volt+−D0 (A, D-)D1 (B, D+)CommonD0 en D1 verwisseldde meting draaitvan teken omMultimeter, DC volt+−D0 (A, D-)D1 (B, D+)CommonMeet met de bus in rust: zet de client even stil, dan zendt niemand.
Meet de richting met de zwarte probe op D0 en de rode op D1, in plaats van te gokken en twee draden tegelijk te verzetten.

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.

Bus, 120 ohm120 ΩTIA-485-A · Belden 9841/9842Patchkabel, 100 ohm100 ΩTIA-568 · CAT5e / CAT6 UTPSignaalReflectie: Ongeveer 9 procent reflecteertDoorgelaten: 91%Γ = (Z₂ − Z₁) / (Z₂ + Z₁) = −0,091 → 9,1 %
Een impedantiesprong stuurt een deel van het signaal terug, en bij jou komt dat eruit als CRC-fouten.

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.

BytesVeld
01serveradres 1
03FC03, holding registers lezen
00 6Bstartadres, PDU-adres 107
00 03aantal: 3 registers
74 17CRC-16, low byte eerst

Bestaan die registers niet, dan komt dit terug:

BytesVeld
01serveradres 1
83exception function code, 0x03 plus 0x80
02exception code 02, illegal data address
C0 F1CRC-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. 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/ttyUSB0
    

    Op Windows vervang je de poort door COM3, op macOS door /dev/cu.usbserial-XXXXXXXX.

  2. 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. 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 -a weer goed en je hebt meteen antwoord. Zo halveer je het domein zonder iets los te schroeven.

  4. 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. 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. 6

    Optioneel: laat de teller oplopen

    Wis de tellers met FC08 subfunctie 0x0A, herhaal foutbeeld 1 en lees daarna 0x0C uit. 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, 0x0C en 0x0D uit 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
Je krijgt van een apparaat exception 02 terug. Wat kun je daarmee meteen uitsluiten?
Alles werkt, tot de compressor aanslaat. Dan lopen de CRC-fouten op, en zodra de machine stopt herstelt het zich. Waar zoek je?
Je draait D0 en D1 om bij een apparaat dat het daarvoor deed. Wat verwacht je in de pollstatistiek?
Waarom is geen antwoord een minder informatief symptoom dan een exception?

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