Modbus-Diagnose
Das Wetterrelais unterstützt neben den üblichen Modbus-Lese- und Schreibfunktionen mehrere standardisierte Diagnosefunktionen.
Damit kann ein Modbus-Master die Kommunikation gezielt prüfen, Geräteinformationen auslesen und verschiedene Kommunikationszähler abfragen.
Die Diagnose unterscheidet sich zwischen Modbus RTU und Modbus TCP. Einige Diagnosefunktionen sind ausschließlich für serielle Modbus-Verbindungen definiert und werden deshalb nur über RTU unterstützt.
Unterstützte Funktionscodes
| Funktionscode | Funktion | RTU | TCP | Verwendung |
|---|---|---|---|---|
| FC01 | Read Coils | Ja | Ja | Binäre Werte lesen |
| FC02 | Read Discrete Inputs | Ja | Ja | Binäre Eingangswerte lesen |
| FC03 | Read Holding Registers | Ja | Ja | Veränderbare Register lesen |
| FC04 | Read Input Registers | Ja | Ja | Nur lesbare Register lesen |
| FC05 | Write Single Coil | Ja | Ja | Einzelne Coil schreiben |
| FC06 | Write Single Register | Ja | Ja | Einzelnes Holding Register schreiben |
| FC08 | Diagnostics | Ja | Nein | RTU-Kommunikation und Diagnosezähler prüfen |
| FC11 | Get Comm Event Counter | Ja | Nein | Kommunikationszähler abfragen |
| FC15 | Write Multiple Coils | Ja | Ja | Mehrere Coils schreiben |
| FC16 | Write Multiple Registers | Ja | Ja | Mehrere Holding Register schreiben |
| FC43 / MEI 14 | Read Device Identification | Ja | Ja | Geräteidentifikation auslesen |
RTU und TCP
FC08 und FC11 gehören zu den Diagnosefunktionen für Modbus Serial Line und werden daher nur über Modbus RTU unterstützt.
Werden diese Funktionen über Modbus TCP angefragt, antwortet das Wetterrelais mit einer Modbus-Exception für eine nicht unterstützte Funktion.
Modbus RTU diagnostizieren
Über Modbus RTU stehen zusätzliche standardisierte Diagnosefunktionen zur Verfügung.
Der Modbus-Master kann damit unter anderem
- die vollständige Anfrage-/Antwortstrecke prüfen,
- Kommunikationszähler zurücksetzen,
- gültige Telegramme zählen,
- CRC-Fehler erkennen,
- Modbus-Exceptions zählen,
- und prüfen, wie viele Anfragen tatsächlich vom Wetterrelais verarbeitet wurden.
FC08 – Diagnostics
Funktionscode 08 verwendet zusätzlich eine sogenannte Subfunction.
Das Wetterrelais unterstützt folgende Unterfunktionen:
| Subfunction | Name | Bedeutung |
|---|---|---|
0x0000 |
Return Query Data | Echo-/Loopback-Test |
0x000A |
Clear Counters and Diagnostic Register | Diagnosezähler zurücksetzen |
0x000B |
Return Bus Message Count | Anzahl empfangener Bus-Telegramme |
0x000C |
Return Bus Communication Error Count | Anzahl erkannter Kommunikations-/CRC-Fehler |
0x000D |
Return Bus Exception Error Count | Anzahl erzeugter Modbus-Exception-Antworten |
0x000E |
Return Server Message Count | Anzahl an das Wetterrelais adressierter Nachrichten |
Andere FC08-Unterfunktionen werden nicht unterstützt.
FC08 / 0x0000 – Return Query Data
Diese Funktion eignet sich für einen direkten Kommunikationstest.
Der Master sendet einen beliebigen 16-Bit-Testwert. Das Wetterrelais sendet denselben Wert unverändert zurück.
Beispiel:
Master -> Wetterrelais
Function: 0x08
Subfunction: 0x0000
Data: 0xA537
Erwartete Antwort:
Wetterrelais -> Master
Function: 0x08
Subfunction: 0x0000
Data: 0xA537
Damit wird die komplette RTU-Kommunikationsstrecke geprüft.
Werden die Daten unverändert zurückgegeben, funktionieren insbesondere
- Slave-Adresse,
- Baudrate,
- Parität,
- Stopbits,
- RS485-Verbindung,
- CRC-Prüfung,
- Anfrageverarbeitung,
- und Antwortübertragung.
FC08 / 0x000A – Diagnosezähler löschen
Mit dieser Funktion können die Diagnosezähler zurückgesetzt werden.
Das ist besonders hilfreich, wenn ein bestimmter Zeitraum untersucht werden soll.
Beispiel:
1. Diagnosezähler löschen
2. Anlage 10 Minuten betreiben
3. Diagnosezähler erneut auslesen
4. CRC-Fehler und Exceptions kontrollieren
FC08 / 0x000B – Bus Message Count
Dieser Zähler gibt an, wie viele Modbus-RTU-Telegramme auf dem Bus erkannt wurden.
Ein steigender Wert zeigt:
Auf dem RS485-Bus werden Modbus-Telegramme empfangen.
Der Zähler allein sagt noch nicht aus, dass jedes Telegramm für das Wetterrelais bestimmt war oder erfolgreich verarbeitet wurde.
FC08 / 0x000C – Bus Communication Error Count
Dieser Zähler enthält die erkannten Kommunikationsfehler.
Dazu gehören insbesondere fehlerhafte CRC-Prüfsummen.
Ein dauerhaft steigender CRC-Fehlerzähler kann beispielsweise auf folgende Probleme hinweisen:
- ungeeignete oder fehlende RS485-Terminierung,
- fehlendes oder falsches Biasing,
- falsche Baudrate,
- falsche Parität,
- schlechte Leitungsqualität,
- EMV-Störungen,
- zu lange Stichleitungen,
- oder elektrische Probleme auf dem RS485-Bus.
Praktischer Test
Ein Diagnoseprogramm kann bewusst ein RTU-Telegramm mit falscher CRC senden.
Das Wetterrelais darf darauf nicht antworten.
Anschließend wird FC08 / 0x000C ausgelesen.
Der Fehlerzähler muss entsprechend angestiegen sein.
FC08 / 0x000D – Bus Exception Error Count
Dieser Zähler gibt an, wie viele Modbus-Exception-Antworten das Wetterrelais erzeugt hat.
Eine Exception entsteht beispielsweise bei
- nicht unterstützten Funktionscodes,
- ungültigen Registeradressen,
- oder ungültigen Werten.
FC08 / 0x000E – Server Message Count
Dieser Zähler zeigt, wie viele Nachrichten tatsächlich an die Slave-Adresse des Wetterrelais gerichtet waren.
Damit lässt sich zwischen allgemeiner Busaktivität und der tatsächlichen Kommunikation mit dem Wetterrelais unterscheiden.
Beispiel:
Bus Message Count: 12000
Server Message Count: 3000
In diesem Beispiel wurden insgesamt 12000 Telegramme auf dem Bus erkannt. Davon waren 3000 an das Wetterrelais adressiert.
FC11 – Get Comm Event Counter
Mit FC11 kann der Modbus-Master den Kommunikations-Event-Counter des Wetterrelais abfragen.
Die Antwort enthält:
Status
Event Count
Der Status wird aktuell mit
0x0000
zurückgegeben.
Der Event Counter zählt erfolgreich abgeschlossene Modbus-Kommunikationsvorgänge.
Anwendung
Der Master kann beispielsweise zunächst den Zähler lesen:
Event Count = 1250
Anschließend werden 100 normale Modbus-Abfragen durchgeführt.
Danach wird FC11 erneut gelesen:
Event Count = 1350
Damit kann geprüft werden, ob die erwartete Anzahl an Kommunikationsvorgängen tatsächlich verarbeitet wurde.
FC11 selbst verändert den Event Counter nicht.
Geräteidentifikation mit FC43 / MEI 14
Das Wetterrelais unterstützt Read Device Identification sowohl über Modbus RTU als auch über Modbus TCP.
Technisch handelt es sich um:
Function Code: 0x2B
MEI Type: 0x0E
Die Funktion wird häufig auch als
FC43/14
bezeichnet.
Damit kann ein Modbus-Master ein Wetterrelais identifizieren, ohne die herstellerspezifischen Systemregister kennen zu müssen.
Unterstützte Device-Identification-Objekte
| Object ID | Bezeichnung | Beispiel |
|---|---|---|
0x00 |
VendorName | Steffen Freitag Engineering |
0x01 |
ProductCode | WTR102 oder WTR202 |
0x02 |
MajorMinorRevision | z. B. 3.0.0 |
0x03 |
VendorUrl | https://wetterrelais.de |
0x04 |
ProductName | Wetterrelais |
0x05 |
ModelName | WTR102 oder WTR202 |
0x06 |
UserApplicationName | aktueller mDNS-Hostname |
0x80 |
Herstellerspezifisch | Seriennummer |
Basic Device Identification
Für eine grundlegende Geräteidentifikation wird beispielsweise angefragt:
Function Code: 0x2B
MEI Type: 0x0E
Read Device ID Code: 0x01
Object ID: 0x00
Das Wetterrelais liefert darauf mindestens:
VendorName
ProductCode
MajorMinorRevision
Einzelnes Objekt lesen
Mit Read Device ID Code 0x04 kann ein einzelnes Objekt gezielt abgefragt werden.
Beispiel Seriennummer:
Function Code: 0x2B
MEI Type: 0x0E
Read Device ID Code: 0x04
Object ID: 0x80
Als Antwort liefert das Wetterrelais die Seriennummer.
Diagnose über Modbus TCP
Bei Modbus TCP stehen die seriellen Diagnosefunktionen FC08 und FC11 nicht zur Verfügung.
Für TCP werden insbesondere folgende Möglichkeiten verwendet:
- normale Registerzugriffe über FC01 bis FC06 sowie FC15 und FC16,
- feste Diagnose- und Testregister,
- Geräteidentifikation über FC43/14,
- und die interne TCP-Verbindungsstatistik des Wetterrelais.
FC43/14 testen
Die Geräteidentifikation kann über TCP genauso wie über RTU abgefragt werden.
Ein Diagnoseprogramm kann dadurch beispielsweise prüfen:
VendorName
ProductCode
Firmwareversion
Modell
mDNS-Hostname
Seriennummer
FC08 über TCP
FC08 ist eine Serial-Line-Diagnosefunktion.
Wird FC08 über Modbus TCP angefragt, unterstützt das Wetterrelais diese Funktion bewusst nicht.
Der Master sollte eine Modbus-Exception erhalten:
Exception Code 0x01
Illegal Function
Auch dieses Verhalten kann als Test genutzt werden.
Modbus-Exception-Antworten
Bei ungültigen oder nicht unterstützten Anfragen antwortet das Wetterrelais mit einer Modbus-Exception.
Typische Fehlercodes sind:
| Exception Code | Bezeichnung | Bedeutung |
|---|---|---|
0x01 |
Illegal Function | Funktionscode wird nicht unterstützt |
0x02 |
Illegal Data Address | Registeradresse ist nicht vorhanden oder nicht zulässig |
0x03 |
Illegal Data Value | Übertragener Wert ist ungültig |
0x04 |
Server Device Failure | Anfrage konnte intern nicht verarbeitet werden |
Bei einer Exception wird im Function Code der Antwort das höchstwertige Bit gesetzt.
Beispiel:
Anfrage:
FC08 = 0x08
Exception-Antwort:
0x88
Darauf folgt der eigentliche Exception Code.
Empfohlener RTU-Diagnosetest
Für eine vollständige RTU-Prüfung empfiehlt sich folgende Reihenfolge:
- Bekanntes Register mit FC04 lesen.
FC08 / 0x0000mit einem Testwert ausführen.FC08 / 0x000Azum Löschen der Diagnosezähler ausführen.- Mehrere normale Modbus-Anfragen senden.
FC08 / 0x000BBus Message Count lesen.FC08 / 0x000CCRC-/Kommunikationsfehler prüfen.FC08 / 0x000DException-Zähler prüfen.FC08 / 0x000EServer Message Count prüfen.- FC11 Event Counter lesen.
- FC43/14 Geräteidentifikation auslesen.
Empfohlener TCP-Diagnosetest
Für Modbus TCP empfiehlt sich folgende Reihenfolge:
- TCP-Verbindung aufbauen.
- Testregister über FC04 lesen.
- Geräteinformationen aus den festen Systemregistern lesen.
- FC43/14 Basic Device Identification ausführen.
- Seriennummer über Object ID
0x80lesen. - Optional FC08 senden und
Exception 0x01erwarten.
Übersicht der Diagnosefunktionen
| Diagnose | RTU | TCP | Vom Master aktiv prüfbar |
|---|---|---|---|
| Normale Registerkommunikation | Ja | Ja | Ja |
| Testregister lesen | Ja | Ja | Ja |
| Echo-/Loopback-Test | Ja | Nein | FC08 / 0x0000 |
| Diagnosezähler löschen | Ja | Nein | FC08 / 0x000A |
| Bus-Telegramme zählen | Ja | Nein | FC08 / 0x000B |
| CRC-/Kommunikationsfehler | Ja | Nein | FC08 / 0x000C |
| Exception-Zähler | Ja | Nein | FC08 / 0x000D |
| An Gerät adressierte Nachrichten | Ja | Nein | FC08 / 0x000E |
| Communication Event Counter | Ja | Nein | FC11 |
| Geräteidentifikation | Ja | Ja | FC43 / MEI 0x0E |
| Hersteller auslesen | Ja | Ja | Device Object 0x00 |
| Modell auslesen | Ja | Ja | Device Object 0x01 / 0x05 |
| Firmwareversion auslesen | Ja | Ja | Device Object 0x02 |
| Hostname auslesen | Ja | Ja | Device Object 0x06 |
| Seriennummer auslesen | Ja | Ja | Device Object 0x80 |
| FC08 über TCP ablehnen | – | Ja | Exception 0x01 erwarten |
Abgrenzung zur internen Diagnose
Die standardisierten Modbus-Diagnosefunktionen werden immer durch den Modbus-Master ausgelöst.
Das Wetterrelais startet selbst keine Modbus-Anfragen an einen verbundenen Master.
Zusätzlich führt das Wetterrelais intern weitere Statistiken, beispielsweise zu
- verbundenen TCP-Mastern,
- Anzahl der Requests,
- Abfrageintervallen,
- Timeouts,
- RX-/TX-Datenmengen,
- Verbindungsabbrüchen,
- und Protokollfehlern.
Diese internen Informationen ergänzen die standardisierten Diagnosefunktionen, sind aber nicht Teil von FC08, FC11 oder FC43/14.