Modbus RTU, ASCII und TCP mit SerialTool
Zuletzt aktualisiert am von Oliver ReedWas ist Modbus
Das Modbus-Protokoll ist ein serielles Kommunikationsprotokoll, das 1979 von Modicon® (heute Teil der Schneider-Electric-Gruppe) entwickelt wurde, um die Kommunikation zwischen programmierbaren Steuerungen (PLCs) zu ermöglichen. Es hat sich zu einem de facto-Standard in der industriellen Kommunikation entwickelt und ist heute eines der weltweit am häufigsten verwendeten Verbindungsprotokolle für industrielle elektronische Geräte. Modbus ist ein lizenzfreies Protokoll, dessen Spezifikationen auf der Website von The Modbus Organization veröffentlicht sind.
Einfach ausgedrückt ist es ein Verfahren zur Übertragung von Informationen über serielle Leitungen zwischen elektronischen Geräten. Das Gerät, das Informationen anfordert, wird Modbus-Client genannt, und die Geräte, die Informationen bereitstellen, werden Modbus-Server genannt. In einem Standard-Modbus-Netzwerk gibt es einen Client und bis zu 247 Server, jeweils mit einer eindeutigen Serveradresse von 1 bis 247. Der Client kann auch Informationen auf die Server schreiben.
Ursprünglich für industrielle Anwendungen gedacht, wurde dieses Protokoll im Laufe der Zeit auch in anderen Bereichen eingesetzt und zählt heute zu den am weitesten verbreiteten. Selbst heute, obwohl es bereits mehr als 40 Jahre alt ist, findet man es noch in vielen Geräten wie Bedienpanels, SPS, Hausautomationssystemen und sogar in einfachen Geräten wie Arduino.
Modbus RTU- und ASCII-Übertragung über Seriell
Als das Protokoll entwickelt wurde, war die Kommunikation für den Betrieb über eine serielle Schnittstelle vorgesehen, und aus diesem Grund wurde sie in SerialTool implementiert. Modbus wird häufig verwendet, um einen Überwachungsrechner mit einer Remote Terminal Unit (RTU) in SCADA-Systemen (Supervisory Control and Data Acquisition) zu verbinden. Je nach Datenformat wird das Protokoll unterteilt in:
- MODBUS RTU - die Daten werden im Hexadezimalformat übertragen.
- MODBUS ASCII - die Daten werden im ASCII-Format übertragen.
Die Fehlerprüfung unterscheidet sich in beiden Fällen: Bei MODBUS RTU wird ein CRC (Cyclic Redundancy Check) verwendet, der an die Befehle angehängt wird, während bei MODBUS ASCII ein LRC (Longitudinal Redundancy Check) verwendet wird, der ebenfalls nach den Befehlen gesendet wird.
Modbus TCP-Übertragung
1999 wurde „Modbus TCP“ entwickelt, ein Standard für Netzwerke, die die TCP/IP-Protokollsuite verwenden: In der Praxis handelt es sich um eine auf TCP/IP basierende, serielle RTU-Version von Modbus, die Kommunikation über Internet-/Intranet-Netzwerke ermöglicht. In den letzten Jahren wird die TCP/IP-Version immer häufiger eingesetzt, weil sie Open Source, einfach zu implementieren, kostengünstig in der Entwicklung und mit sehr geringem Hardwareaufwand nutzbar ist.
Die Fehlerprüfung unterscheidet sich in beiden Fällen: Bei MODBUS RTU wird ein CRC (Cyclic Redundancy Check) verwendet, der an die Befehle angehängt wird, während bei MODBUS ASCII ein LRC (Longitudinal Redundancy Check) verwendet wird, der ebenfalls nach den Befehlen gesendet wird.
Das Modbus-TCP/IP-Protokoll verwendet binäre Datenkodierung und den TCP/IP-Fehlererkennungsmechanismus. Im Gegensatz zu seriellem Modbus ist die TCP/IP-Version verbindungsorientiert und erlaubt gleichzeitige Verbindungen zum selben Slave oder zu mehreren Geräten. Modbus TCP/IP verwendet ebenfalls das Master-Slave-Paradigma; diese Kommunikation nutzt zusätzlich vier Nachrichtentypen.
Modbus befindet sich auf Ebene 7 des ISO/OSI-Stacks (Application Layer) und definiert die Nachrichtenformatierung, das sogenannte Framing, sowie die Art der Datenübertragung und der Steuerfunktionen. Die Kommunikation erfolgt nach dem Client-Server-Paradigma. Das Protokoll definiert eine Protocol Data Unit (PDU), die nicht von der darunterliegenden Kommunikationsschicht abhängt. Die Application Data Unit (ADU) fügt zusätzliche Felder für Adressierung und Fehlerkontrolle hinzu.
SerialTool Modbus Client (Master / Polling)
SerialTool ist ein Modbus-RTU-, ASCII- und TCP-Client mit Polling, Register-Scan, Verkehrsüberwachung und Live-Diagrammen zum Testen und Debuggen industrieller Geräte.
Mit dem Modbus-Client können Sie sich über Seriell (RTU oder ASCII) oder Netzwerk (TCP über IPv4 oder IPv6) mit einem Modbus-Slave/Server-Gerät verbinden, Daten mit den Standardfunktionen von Modbus lesen und schreiben und ein Modbus-Gerät mit eigener Zuordnung erstellen, auf dem zeitgesteuertes Polling ausgeführt werden kann.
Innerhalb des Prototyp-Geräts können Modbus-Strukturen (Discrete Output Coils, Discrete Input Contacts, Analog Input Register, Analog Output Holding Register) hinzugefügt und das Gerät gespeichert werden, damit es bei Bedarf erneut geladen werden kann. Das Modbus-Prototyp-Gerät kann außerdem in Text-, CSV- oder PDF-Format exportiert werden, um es einfach und intuitiv zu teilen.
Sobald ein Gerät mit der korrekten Zuordnung erstellt wurde, können Echtzeitdiagramme mit den direkt vom Slave-Gerät gelesenen Werten per zeitgesteuertem Polling angezeigt werden.
SerialTool bietet außerdem die Möglichkeit, Modbus-Datenverkehr (seriell und TCP) in einem speziellen Terminal für gesendeten und empfangenen Verkehr anzuzeigen. Das erweiterte Terminal unterstützt Datenexport und Echtzeitfilterung eingehender und ausgehender Daten.
SerialTool bietet außerdem die Möglichkeit, das entfernte Slave-Gerät mit der Funktion Modbus Scanner zu durchsuchen. Durch das Setzen der richtigen Filter kann versucht werden, das entfernte Gerät (Modbus Slave) auch ohne Kenntnis der aktuell unterstützten Register zuzuordnen. Die Modbus-Scanner-Funktion ist besonders nützlich, wenn ein Gerät untersucht werden soll, dessen Eigenschaften unbekannt oder nur teilweise bekannt sind.
Nachfolgend sehen Sie den Hauptbildschirm des Modbus-Moduls von SerialTool:
Hauptbildschirm des Modbus-Clients von SerialTool
Der Hauptbildschirm hebt die wichtigsten Funktionen von SerialTool und des Modbus-Clients (Master) hervor.
SerialTool Modbus Client (Master / Polling)
Auf der linken Seite des Bildschirms kann der Verbindungsmodus Seriell oder TCP gewählt werden:
Verbindungsbildschirm des Modbus-Clients
Wie oben beschrieben, wird das serielle Modbus-Protokoll in zwei Typn unterteilt: RTU und ASCII. Für eine korrekte Kommunikation mit dem entfernten Gerät ist es bei einer seriellen Verbindung unerlässlich zu wissen, welcher Modbus-Protokolltyp vom Slave-Gerät unterstützt wird.
Die ModBus-TCP-Verbindung unterstützt hingegen IPv4 und IPv6. Um die Modbus-Verbindung über TCP einzurichten, müssen die IP des Slave und der entfernte Port festgelegt werden, zu dem eine Verbindung hergestellt werden soll.
Auf dem Verbindungsbildschirm gibt es zwei Parameter für die Antwortzeit, die das Modbus-Slave-Gerät liefern muss.
Eine allgemeine Antwort-Timeout-Zeit (Response Timeout), nach deren Ablauf der Client (Master) nicht länger auf die Antwort des Slave wartet, sowie ein Timeout ab dem letzten vom Slave empfangenen Byte.
Modbus ENRON/Daniel-Emulation
Zu den Verbindungsparametern gehört die ENRON/Daniel-Emulation (oft einfach Enron Modbus oder Daniels Modbus genannt), die sich auf eine spezielle Variante des Standard-Modbus-Kommunikationsprotokolls bezieht.
Sie wurde ursprünglich von der Enron Corporation entwickelt und in den Flow Computern von Daniel Measurement and Control weit verbreitet eingesetzt. Im Laufe der Zeit wurde sie zu einem De-facto-Standard für die elektronische Durchflussmessung (EFM), insbesondere im Öl- und Gassektor.
Durch Aktivieren der ENRON/Daniel-Emulation auf einem Gerät wird das Verhalten von Modbus geändert, um die folgenden Schlüsselfunktionen zu unterstützen:
- 1. Verarbeitung von 32-Bit-Daten in einem einzelnen Register: Dies ist der wichtigste technische Unterschied. Im Standard Modbus sind Register 16 Bit (2 Byte) groß und erfordern das Lesen von zwei Registern für einen 32-Bit-Wert. Im Enron Modbus werden 32-Bit-Werte in ein einzelnes Register abgebildet (4 Byte pro Register).
- 2. Spezifische Adresszuordnung: Es werden vordefinierte Bereiche für 32-Bit-Daten verwendet. Die 5000er-Serie (z. B. 45001 - 45999) ist für Long Integers, während die 7000er-Serie (z. B. 47001 - 47999) für Floating Points verwendet wird.
- 3. Historische Daten und Ereignisse: Unterstützt spezielle Befehle zum Extrahieren historischer Logs und Alarmarchive, im Gegensatz zu Standard-Modbus, das fast ausschließlich für Echtzeit-Lesungen konzipiert ist.
- 4. Kein Offset: Die angeforderte Adresse entspricht exakt der Registernummer und eliminiert den klassischen „+1-Offset“ des Standard-Modbus.
Kurz gesagt: Diese Emulation ist entscheidend, um Kommunikationsfehler (Byte-Fehlausrichtung) zu vermeiden, wenn mit Geräten gearbeitet wird, die native 32-Bit-Daten im Öl- und Gassektor übertragen.
Modbus-Client-Funktionen
Im mittleren Bereich des Bildschirms finden Sie die von SerialTool unterstützten Modbus-Funktionen.
Unterstützte Funktionen im Modbus-Client-Modus
Die Funktionen des ModBus-Clients lassen sich in der folgenden Tabelle zusammenfassen.
| Funktionscode | Aktion | Tabellenname / Beschreibung |
|---|---|---|
| 0x01 | Lesen | Discrete Output Coils |
| 0x02 | Lesen | Discrete Input Contacts |
| 0x03 | Lesen | Analog Output Holding Register |
| 0x04 | Lesen | Analog Input Registers |
| 0x05 | Einzeln schreiben | Discrete Output Coil |
| 0x06 | Einzeln schreiben | Analog Output Holding Register |
| 0x07 | Lesen | Exception Status |
| 0x08 | Diagnose | Diagnose (Serial Line only) |
| 0x0B (dec 11) | Lesen | Comm Event Counter (Serial Line only) |
| 0x0F (dec 15) | Mehrfach schreiben | Discrete Output Coils |
| 0x10 (dec 16) | Mehrfach schreiben | Analog Output Holding Registers |
| 0x11 (dec 17) | Bericht | Server ID (Serial Line only) |
| 0x16 (dec 22) | Maskiertes Schreiben | Holding Register |
| 0x17 (dec 23) | Lesen/Schreiben mehrfach | Holding Registers |
| 0x2B / 0x0E (dec 43 / 14) | Lesen | Device Identification |
Modbus-Datenstrukturen
Informationen werden im Server-Gerät in vier verschiedenen Tabellen gespeichert. Zwei Tabellen speichern diskrete Ein/Aus-Werte (Coils) und zwei numerische Werte (Register). Sowohl Coils als auch Register besitzen jeweils eine schreibgeschützte Tabelle und eine Lese-/Schreibtabelle. Jede Tabelle hat 9999 Werte. Jede Coil oder jeder Contact ist 1 Bit groß und besitzt eine Datenadresse zwischen 0000 und 270E. Jedes Register ist 1 Wort = 16 Bit = 2 Byte und besitzt ebenfalls eine Datenadresse zwischen 0000 und 270E.
| Coil-/Register-Nummern | Datenadressen | Typ | Tabellenname |
|---|---|---|---|
| 1-9999 | 0x0000 to 0x270E | Lesen/Schreiben | Discrete Output Coils |
| 10001-19999 | 0x0000 to 0x270E | Nur Lesen | Discrete Input Contacts |
| 30001-39999 | 0x0000 to 0x270E | Nur Lesen | Analog Input Register |
| 40001-49999 | 0x0000 to 0x270E | Lesen/Schreiben | Analog Output Holding Register |
Modbus-Gerät
SerialTool ermöglicht die Erstellung eines Modbus-Slave-Geräts, das die Registerzuordnung des Slave-Geräts darstellt, zu dem eine Verbindung hergestellt werden soll. Diese Zuordnung ist sehr wichtig, weil sie es ermöglicht, die im entfernten Slave-Gerät vorhandenen Werte in einer lokalen Tabelle anzuzeigen.
Modbus-Client-Funktionen
Verfügbare Funktionen für den Modbus-Client
Über die Funktionsleiste kann ein zuvor erstelltes Gerät mit der Funktion "Load Device" geladen, das aktuelle Gerät mit "Save Device" gespeichert und einzelne Register mit "Add Item" oder mehrere Register mit "Add Items" zur Gerätezuordnung hinzugefügt werden.
Hinzufügen von Modbus-Registern zur Modbus-Gerätezuordnung
Speicherbereich des Modbus-Slave-Geräts (Modbus-Gerät)
Sobald die Zuordnung des Modbus-Slave-Geräts erstellt wurde, kann sie in SerialTool für die spätere Verwendung gespeichert oder ihr Inhalt im CSV-, Text- oder PDF-Format für den Austausch und die Weiterverarbeitung mit Dritten exportiert werden. Das folgende Bild zeigt ein Beispiel für den Export der Zuordnung eines Modbus-Slave-Geräts:
Beispiel für den PDF-Export einer Modbus-Slave-Gerätezuordnung
Sie können das PDF über diesen Link herunterladen.
Modbus-Polling
Durch das Erstellen eines Modbus-Slave-Geräts kann Polling durchgeführt werden, also das zeitgesteuerte Lesen einiger Register des Slave-Geräts,
mit dem Sie verbunden sind.
Dazu muss zunächst der Slave erstellt und zugeordnet sowie das Register oder die Register hinzugefügt werden, für die Polling durchgeführt werden soll, wie in der folgenden Abbildung gezeigt:
Das Bild zeigt das Hinzufügen eines Elements zum Polling in Richtung Slave
Sobald ein oder mehrere Elemente zum Polling hinzugefügt wurden, kann das Polling der mit der Polling-Liste verknüpften Elemente gestartet werden.
Das Bild zeigt die für das Polling ausgewählten Elemente
Zugriff auf Modbus-Funktionen
Der SerialTool-Modbus-Client (Master/Polling) ist dafür ausgelegt, Funktionen in drei Modi auszuführen:
Ausführung von Modbus-Funktionen
- "Execute from Device Table" - Führt die Modbus-Funktion anhand der Gerätezuordnung aus.
- "Execute Function" - Führt die direkte Modbus-Funktion aus und zeigt das Ergebnis im Logfenster an.
- "Send Raw Data" - Sendet eine direkte Anfrage aus Hexadezimalbytes und wartet auf die Antwort.
Execute from Device Table
Dieser Modus führt die ausgewählte Modbus-Funktion aus, indem er direkt die lokal geladene oder erstellte Gerätetabelle verwendet.
Der Benutzer kann den Typ der Modbus-Referenz auswählen, z. B. Coils, Discrete Inputs, Holding Registers oder Input Registers,
die Startadresse und die Anzahl der zu lesenden oder zu schreibenden Elemente festlegen und dann den Befehl mit einem einzigen Klick an den Slave senden.
Der Hauptvorteil dieses Modus besteht darin, dass das Ergebnis sofort in der Gerätezuordnung angezeigt wird und die in der lokalen Tabelle dargestellten Werte aktualisiert.
Auf diese Weise erhält man eine geordnete und dauerhafte Darstellung des Zustands des entfernten Geräts,
die sowohl bei Tests als auch bei Überwachungs- und Wartungsarbeiten nützlich ist.
Wenn der Befehl eine Schreibfunktion betrifft, ermöglicht SerialTool die einfache Vorbereitung der zu übertragenden Daten durch Auswahl von Datentyp,
Anzeigeformat und Inhalt, der in die ausgewählten Register geschrieben werden soll. Daher eignet sich dieser Modus besonders gut,
wenn direkt mit der logischen Struktur des Modbus-Geräts gearbeitet werden soll.
Execute Function
Im Modus Execute Function kann eine Modbus-Funktion direkt aus der Liste der verfügbaren Funktionscodes ausgewählt werden,
z. B. Lesen von Coils, Lesen von Discrete Inputs, Lesen von Holding Registers, Lesen von Input Registers, Einzel- oder Mehrfachschreiben sowie andere vom Protokoll
unterstützte Funktionen.
In diesem Fall ist der Vorgang nicht nur auf die Anzeige in der Gerätezuordnung beschränkt, da das Ergebnis im Logbereich der Anwendung angezeigt wird.
Dieser Ansatz ist besonders nützlich, wenn der Inhalt der empfangenen Antwort schnell überprüft,
eine bestimmte Modbus-Funktion getestet oder gezielte Tests mit variablen Adressen und Mengen durchgeführt werden sollen, ohne die Gerätezuordnung zwingend zu ändern.
Der Modus Execute Function ist auch für das Debugging sehr praktisch, da sich damit sofort das Ergebnis des ausgeführten Befehls,
eventuelle vom Slave zurückgegebene Fehler sowie die mit Anfrage und Antwort verbundenen Informationen anzeigen lassen.
Send Raw Data
Diese Funktion sendet und empfängt beliebige Befehle, die im Hexadezimalformat an den Slave gesendet werden.
Sie ermöglicht es dem Benutzer, die Bytefolge, die über die aktive Verbindung, z. B. seriell oder TCP/IP, übertragen werden soll, manuell einzugeben,
ohne dass das Frame automatisch von der Software aufgebaut wird.
Diese Funktion ist sehr nützlich für fortgeschrittene Tests, Reverse Engineering, Diagnose oder Validierung von Modbus-Geräten und kompatiblen
Protokollen. In der Praxis überträgt der Client genau die vom Benutzer eingegebenen Bytes und lässt damit die volle Kontrolle über den Paketinhalt.
Dadurch können benutzerdefinierte Anfragen simuliert, anomale Antworten getestet oder manuell vorbereitete vollständige Frames gesendet werden.
Wenn die Option zum Warten auf die Antwort aktiviert wird, kann SerialTool außerdem das vom Slave empfangene Rückgabeframe erfassen und im Verkehrsprotokoll
anzeigen, sodass ein unmittelbarer Vergleich zwischen gesendeten und empfangenen Daten möglich ist.
Senden von Rohdaten
Modbus-Scanner-Funktion
SerialTool enthält eine Scan-Funktion für die Modbus-Adressen des verbundenen Slave-Geräts.
Mit dieser Funktion kann ein Adressbereich schnell von einer Startadresse bis zu einer Endadresse durchsucht werden,
wobei auch der während des Scans zu verwendende Funktionscode angegeben wird.
Der Scanner ist besonders nützlich, wenn die vollständige Zuordnung des entfernten Geräts nicht genau bekannt ist oder wenn überprüft werden soll,
welche Adressen gültig sind und welche aussagekräftige Daten enthalten. Für jede abgefragte Adresse zeigt SerialTool in der
Tabelle den verwendeten Funktionstyp, die Adresse, den gelesenen Wert und das Ergebnis des Vorgangs an.
Dieser Modus beschleunigt Diagnose- und Integrationsaufgaben mit Drittgeräten erheblich, da sich damit
schnell die tatsächlich vom Slave verwendeten Bereiche des Modbus-Speichers identifizieren und die Scanergebnisse für spätere Analysen
oder zur Weitergabe exportieren lassen.
Adresstabelle
Diagramm der Modbus-Register des Slave
Die Werte der Modbus-Register können in einem Diagramm dargestellt werden.
Diese Funktion ermöglicht es, ein oder mehrere Elemente der Gerätezuordnung mit einem speziellen Diagrammfenster zu verknüpfen, in dem die Werte
im Zeitverlauf während des Pollings oder bei Aktualisierungsvorgängen aufgezeichnet werden.
Jedes mit dem Diagramm verknüpfte Register kann mit einer eigenen Kurve angezeigt werden, die durch eine bestimmte Farbe und Informationen wie
Modbus-Referenz, Adresse, aktuellen Wert und den dem Element zugewiesenen Namen gekennzeichnet ist. So lässt sich die
zeitliche Entwicklung von Analogwerten, Sollwerten, Messungen oder numerischen Registern, die sich während des Gerätebetriebs ändern, leicht beobachten.
Die Diagrammfunktion ist besonders nützlich für Überwachung, Tests und dynamische Analysen, da sie es ermöglicht,
sofort zu sehen, wie sich die Daten im Zeitverlauf entwickeln, ohne auf eine rein tabellarische Ansicht beschränkt zu sein.
Modbus-Registerdiagramm
Modbus-Verkehrsprotokoll
Alle gesendeten und empfangenen Befehle werden im Modbus-Verkehrsprotokollfenster in Bytes angezeigt.
Das Verkehrsprotokoll ist ein grundlegendes Werkzeug für das Kommunikations-Debugging, da es eine detaillierte Visualisierung der
vom Client übertragenen Daten und der vom Slave-Gerät empfangenen Daten ermöglicht und die Bytefolgen in lesbarer Form darstellt.
Mit diesem Fenster kann der tatsächliche Inhalt der Frames überprüft, die Korrektheit der erzeugten Befehle verifiziert und
mögliche Timeout-Probleme, anomale Antworten, Modbus-Ausnahmen oder unerwartete Daten diagnostiziert werden. Der Verkehr kann während
der normalen Client-Nutzung, beim automatischen Polling oder beim Senden von Rohdaten eingesehen werden.
Das Verkehrsfenster bietet außerdem erweiterte Funktionen wie das Kopieren von Daten im ASCII- oder Hexadezimalformat, Speichern in Dateien,
Suche im Inhalt, Zeilenauswahl und grafische Anpassungsoptionen wie Farben, Schriftarten, Abstände und Anzeigeeinstellungen.
Dadurch ist das Verkehrsprotokoll nicht nur ein einfacher Viewer, sondern auch ein sehr nützliches Arbeitswerkzeug für Entwickler, Techniker und Integratoren.
Modbus-Verkehr