Modbus RTU

Was ist Modbus?

Modbus ist ein serielles Kommunikationsprotokoll für ferngesteuerte Anlagen. Mit Modbus werden von einem Master bis zu 256 Slaves angesteuert. Die Slaves können dabei mit dem Master kommunizieren, da die Datenübertragung aber seriell erfolgt, kann stets nur ein Signal vom Master an einen Slave ausgegeben werden, oder ein Slave den Master adressieren. Modbus RTU hat sich neben Modbus TCP und Madbus ASCII als Standardprotokoll in der Industrie etabliert. Bei Modbus RTU werden Daten binär verschickt wodurch eine besonders geringe Fehleranfälligkeit realisiert wird. Ausserdem sorgt die binäre übertragung im Vergleich zur ASCII übertragung für eine höhere Datenrate. Ein Nachteil von Modbus RTU liegt darin, dass die übertragenen Daten in Maschinencode verschickt werden und deshalb nicht direkt lesbar sind sondern noch in Klartext übersetzt werden müssen.

Verbindungsablauf

Bei einer Signalübertragung wird zunächst die Verbindung initialisiert.
Dafür wird für mindestens 3,5 Zeichen eine Sendpause vom Master eingelegt.
Danach sendet der Master mit 8bit die Adresse, welche festlegt welcher der Slaves angesprochen wird. Der adressierte Slave antwortet mit seiner eigenen Adresse, um dem Master den korrekten Empfang der Daten zu signalisieren.
Daraufhin sendet der Master den 8bit Funktionscode. Dieser regelt welche Parameter vom Slave auszulesen bzw. anzupassen sind. Falls der Funktionscode nicht korrekt übertragen wurde setzt der Slave das höchste bit auf 1 und signalisiert dem Master einen Fehler, ansonsten wird vom Slave mit dem Funktionscode geantwortet.
Wurde der Funktionscode richtig verschickt, so werden n Byte Daten vom Slave an den Master verschickt. Falls ein Fehler aufgetreten ist sendet der Slave hier den Fehlercode.
Die Datenübertragung wird mit 16bit CRC Fehlererkennung abgeschlossen welche sich durch eine besonders hohe Genauigkeit bei der Fehlererkennung auszeichnet. Ist die Datenübertragung abgeschlossen muss wie zu Beginn der übertragung 3,5 Zeichen gewartet werden, bis eine weitere übertragung initiiert werden kann. Zur korrekten Übertragung muss der Datenfluss stets gewährleistet sein. Wird die Datenübertragung für mehr als 1,5 Zeichen unterbrochen, so wird die Datenübertragung als fehlerhaft bewertet und verworfen.

Sendepause Adressfeld Funktionsfeld Datenfeld CRC Fehlererkennung
Länge min. 3,5 Zeichen 8 bit 8 bit n Byte 16 bit
Funktion Initiierung der übertragung Adressierung des korrekten Slave übergabe der auszulesenden Register Datenübertragung bzw. Identifikation eines aufgetretenen Gerätefehlers Erkennung eines eventuellen übertragungsfehlers

Das Modbus Protokoll

Bei den Funktionscodes werden prinzipiell 3 verschiedene Codes unterschieden. Diese sind Abfrage-Code und Stell-Code sowie ein Fehler-Code. Die Implementierung funktioniert mit mb_req_pdu , mb_rsp_pdu und mb_excep_rsp_pdu wobei mb für Modbus, der darauffolgende Teil für die Abkürzung des Funktionscodes und der Schluss pdu für Protocol Data Unit steht. Die Protocol Data Unit besteht aus der Vereinigung von Funktionscode und Daten. Jedes Gerät verfügt über eine gewisse Anzahl von numerischen Registern sowie eventuell einige diskrete Speicher. Einige der Speicher können nur ausgelesen werden, während andere sowohl lesbar als auch beschreibbar sind. Mit Hilfe der Funktionscodes wird eine gewisse Zahl Register oder diskreter Speicher ausgelesen bzw. manipuliert. Problematisch an den Registern und disktreten Speichern ist die Tatsache, dass für die Adressierung keine einheitliche Norm festgelegt wurde und deshalb beim Austausch von Geräten in einem Netzwerk die Adressierung anders sein kann. Dadurch muss das Datenerfassungsprogramm eventuell neu programmiert werden.

Warum Modbus?

Modbus ist frei verfügbar und sehr gut dokumentiert, was die Implementierung erleichtert. Ausserdem ist Modbus RTU sehr sicher, die Fehlererkennung durch CRC Polynom hat eine Erkennungsrate von ca. 99,996% sodass die Integrität der Daten sichergestellt ist. Auch wenn jeder Hersteller die Register und disktreten Speicher seiner Geräte anders belegt, sind die zugrundeliegenden Befehle und Funktionscodes stets die gleichen und beim Wechsel eines Geräts müssen nur die auszulesenden Register angepasst werden.