ESP32 Modbus Grundlagen

Das standardisierte Modbus-Protokoll ist in der Anwenderschicht (7. Schicht) des ISO/OSI Modells angesiedelt. Modbus ist weit verbreitet, vielseitig und wird häufig in der Industrie bei Feldbussen eingesetzt. Die Kommunikation kann über die serielle asynchrone UART-Schnittstelle über EIA-232, EIA-422 und EIA-485 oder TCP/IP erfolgen.

Entwickelt und veröffentlich wurde das Protokoll Modbus 1979 von der Modicon Corporation, die von Richard Morley und seinen Partnern 1968 gegründet wurde. Modbus hat sich seither zu einem der erfolgreichsten Kommunikationsprotokolle entwickelt und gilt als der Urahn der industriellen Kommunikationsprotokolle in der industriellen Automation.

Ursprünglich wurde das Protokoll zur Vernetzung von Modicon SPSen untereinander und auch mit weiteren Geräten entwickelt. Modbus wurde als Open Standard veröffentlicht, wodurch jeder das rotokoll kostenfrei und kommerziell verwenden kann.

Es gibt drei wesentliche Gründe für den Erfolg und die breite Akzeptanz und Anwendung von Modbus:

  • Modbus ist ein Open Standard, welches kostenfrei frei zur Verfügung steht.
  • Modbus verwendet Standard Schnittstellen wie EIA-232, EIA-422, EIA-485 und Ethernet TCP/IP.
  • Das Protokoll Modbus ist einfach.

Die Einfachheit war ein wesentlicher Punkt bei der Entwicklung von Modbus, da die damaligen Rechner teils mit weniger als 64 Byte RAM ausgestattet waren und auch nur auf einer 8-Bit Architektur basierten. Wichtig war auch, dass selbst Ingenieure ohne Programmiererfahrung das einfache Konzept mit Coils und Registern lesen und verstehen konnten.

Modbus RTU

Modbus RTU ist ein Master-Slave-Bus, in dem zu einem Zeitpunkt nur ein Master aktiv sein und auch nur dieser eine Master eine Kommunikation mit einem Slave initiieren kann. Unter der Voraussetzung, dass nur ein Master zu einem gegebenen Zeitpunkt aktiv ist, können auch mehrere Master (Multi-Master) an einem Bus anliegen.

Modbus RTU kommuniziert im Halbduplexverfahren über die EIA-485 Schnittstelle, kann aber auch über einen EIA-232 Bus betrieben werden, mit der Einschränkung, dass nur ein Master mit einem Slave (Punkt-zu-Punkt) über eine Distanz von maximal 15 m miteinander kommunizieren kann.

An einem EIA-485 Bus können maximal 32 Teilnehmer angeschlossen sein, von denen einer der Master ist. Die maximale Distanz beträgt 1200 m, wobei das nur mit einer geringen Baudrate von 1200 Bd möglich ist. Hohe Übertragungsraten sind nur über geringere Entfernungen möglich, wie z. B. die maximale Geschwindigkeit von 115200 Bd, bei einer Leitungslänge von maximal 12 m.

Die Kommunikation über EIA-485 erfolgt symmetrisch7 und kann im Halb- oder Vollduplex Betrieb erfolgen. Bei Vollduplex werden statt zwei Leitungen vier Leitungen benötigt. Für eine fehlerfreie Kommunikation müssen alle Teilnehmer im Netzwerk die gleichen Einstellungen haben, wie die Zahl der Datenbits, der Paritäts- und Stoppbits und der Baudrate (üblich 9600 – 19200 Bits/s).

screenshot 2026 04 02 202712
Abb. 1 – Modbus RTU Netzwerktopologie EIA-485

Das Protokoll Modbus RTU

Der gesamte Rahmen (Application Data Unit, ADU) des Protokolls Modbus RTU, besteht aus den Feldern Slave Adresse, Funktionscode, Datenbytes und CRC Prüfung. Dabei nennt man den Teil ohne Slave ID und ohne CRC-Prüfung Protocol Data Unit (PDU). Die PDU beinhaltet mit dem Funktionscode und den Datenbytes, bei allen Modbus Varianten (RTU/ASCII/TCP) den gleichen Informationsgehalt.

screenshot 2026 04 03 110833
Abb. 2 – Rahmen des Protokolls Modbus RTU

In einem Netzwerk wird jedem Slave eine eigene 1-Byte Adresse von 1…247 zugeordnet, wobei der Master keine eigene Adresse hat. Mit der Adresse 0, kann der Master durch einen Rundruf (Broadcast) alle Slaves gleichzeitig ansprechen. Die Adressen 248 – 255 sind reserviert. Der Funktionscode vermittelt den Slaves die durchzuführende Aktion. Die häufigsten Codes sind in folgender Tabelle aufgeführt.

screenshot 2026 04 03 111128
Abb. 3 – Modbus Funktionscodes

Das Datenbyte wird wie bei der UART Schnittstelle als 11- oder 12-Bit Datenwort (1 Startbit, 8 Datenbits, 1 Paritätsbit, 1 oder 2 Stoppbits) mit dem niederwertigsten Bit (LSB) zuerst übertragen. Das Paritätsbit kann auch entfallen, wenn nach den Datenbits 2 Stoppbits folgen.

Adressrahmen Modbus

Die Adressen der Register werden mit zwei Bytes codiert und können somit jeweils bis zu 65535 Coils, Input Coils, Input Register und Holding Register adressieren.

screenshot 2026 04 03 112041
Abb. 4 Modbus Coils- und Register-Adressen

Die Adressen der Register werden mit zwei Bytes codiert und können somit jeweils bis zu 65535 Coils, Input Coils, Input Register und Holding Register adressieren.

Datenrepräsentation Modbus

Die Bezeichnung der Register und Coils ist in der Literatur nicht immer einheitlich. Mal werden bspw. „Input Coils“ nur als „Input“ oder als „Diskrete Input“ bezeichnet, was teilweise verwirren kann. Hier richten wir uns nach den Bezeichnungen in dem Buch „Modbus“ von John S. Rinald. Demnach sind:

  • Coils: 1-Bit Ausgänge für diskrete digitale Werte (Lesen/ Schreiben)
  • Input Coils: 1-Bit Eingänge für diskrete digitale Werte (nur Lesen)
  • Input Register: Eingänge für vorzeichenlose 16-Bit Werte von 0 – 65535 (nur Lesen)
  • Holding Register: Ausgänge für vorzeichenlose 16-Bit für Werte von 0 – 65535 (Lesen und Schreiben)

Coils und Holding Register können geschrieben und gelesen werden. Lesen bedeutet nicht, dass diese Register als Eingänge verwendet werden können. Das Lesen dient lediglich dem „Rücklesen“, um den Zustand eines Ausgangs auszulesen (rückzulesen).

Bei Modbus gibt es keine direkte Darstellungsmöglichkeit von Gleitkommazahlen. Diese können nach Bedarf aus zwei Registern zusammengesetzt werden. Die Stelle vor dem Komma kann z. B. Register 40001 und der Wert hinter dem Komma 40002 sein. Es können aber beliebige andere Zusammenstellungen gewählt werden, da es hier keine festgelegten Konventionen gibt. Solche Darstellungsmöglichkeiten gelten auch für Zahlen, die größer als 16-Bit sind. Für 32-Bit Zahlen können zwei Register verwendet werden.

Bei der Verwendung von Modbus Hardware muss die Konvention der Hersteller aus den Datenblättern entnommen werden, damit beim Lesen und Schreiben auf die richtigen Register und Coils zugegriffen wird. Hersteller von Modbus Hardware und Programmierer können bspw. für 16 diskrete Eingänge 16 Input Coils verwenden, aber auch genauso ein 16-Bit Input Register. Welche Register die Hersteller für Ein- und Ausgänge verwenden, ist deren Bedürfnissen überlassen. Hier gibt es ein kleines Beispiel zur Adressierung von Modbus Slaves.

Ablauf der Kommunikation

Der Master sendet zunächst eine Anfrage mit Slave-Adresse, Funktionscode und den benötigten Daten. Alle Slaves im Netzwerk empfangen das Telegramm, jedoch verarbeitet nur der Slave mit der passenden Adresse die Anfrage. Nach erfolgreicher Prüfung der Adresse und der CRC-Prüfung führt der Slave die angeforderte Aktion aus und erstellt ein Antworttelegramm. Dieses wird anschließend an den Master zurückgesendet.

Der Master kann eine Nachricht senden, wenn vorher mindestens 3,5 Bytes oder für 35 µs keine Aktivitäten auf dem Bus stattgefunden haben. Fällt diese Pause geringer aus, verfällt die Nachricht, da sie vom Slave als Fehler eingestuft wird. Zwischen den gesendeten Bytes darf eine Übertragungsdauer von maximal 1,5 Bytes liegen, da die Übertragung sonst als FRAME_NOT_OK abgebrochen wird.

Auf die vom Master gesendete Nachricht antwortet der angesprochene Slave mit einer ähnlichen Nachricht. Zuerst sendet der Slave seine Adresse, gefolgt vom erhaltenen Funktionscode oder einem Fehlercode. Der Master prüft die Antwort des Slaves und validiert sie mithilfe der Parität und der CRC-Prüfung.

CRC-Prüfung

Die CRC-Prüfung (Cyclic Redundancy Check), wird vom Master generiert, und vom Slave auf Basis der Adresse, dem Funktionscode und dem Datenfeld berechnet. Sie besteht aus 16-Bit, bzw. 2 Bytes und dient der Erkennung von Übertragungsfehlern. Sofern die Prüfsumme, die der Slave berechnet hat, nicht mit dem vom Master gesendeten Wert übereinstimmt, müssen die Daten vom Master erneut gesendet werden.

Modbus TCP/IP

Die Übertragung von Modbus über das Ethernet, wird als Modbus TCP bezeichnet. Im Gegensatz zu Modbus RTU, welches über die EIA-485 Schnittstelle übertragen wird, verfügt Modbus TCP über eine wesentlich höhere Bandbreite. Es können tausende Slaves in einem Netzwerk vorhanden sein, und ein Multi-Masterbetrieb ist auch möglich.

Das Protokoll von Modbus TCP entspricht dem von Modbus RTU, welches mit Hilfe von TCP/IP über das Ethernet übertragen wird. Allerdings wird nur die PDU übertragen. Die CRC-Prüfung entfällt hier, da die Fehlererkennung in der TCP-Schicht erfolgt. Die Adressierung erfolgt nicht über eine Slave Adresse, sondern über die TCP-/IP-Adresse.

In einigen Fällen repräsentiert die TCP-/IP-Adresse mehrere Slaves. In diesem Fall muss ein weiteres ID-Feld hinzugefügt werden.

Modbus TCP über WLAN

Die Übertragung von Modbus TCP kann ohne Weiteres direkt über WLAN erfolgen, soweit die Geräte (Client und Server) über WLAN verfügen.

Modbus ASCII

Modbus ASCII ist sehr ähnlich zu Modbus RTU. Statt der CRC-Prüfung erfolgt hier eine 1-Byte Längsparität-Prüfsumme. Eine Übertragung beginnt mit einem „:“ ohne vorherige Wartezeit und endet wiederum ohne Wartezeit mit CR (Carriage Return) und LF (Line Feed).

modbusascii
Abb. Modbus ASCII-Telegram

Es werden keine Binärfolgen übertragen, wie bei Modbus RTU, sondern Binärzeichen, die direkt für den Menschen lesbar sind. Die Datenübertragungsrate ist geringer als bei RTU, da jedes Datenbyte zwei ASCII-Zeichen (0. . . 9, A. . . F) in hexadezimaler Form enthält.

Wird über RTU das Byte 0101 1001 = 0x5B übertragen, so muss Modbus ASCII diesen Wert in zwei Schritten übertragen, nämlich die 5 als ASCII Zeichen 0x35 und das B als ASCII Zeichen 0x42. Also 2 Bytes 0011 0101 und 0100 0010.

Weiterführende Links

Blog Artikel

Projekte