
Inhaltsverzeichnis
Das Beispiel ist hardwareunabhängig und zeigt die grundlegende Arbeitsweise von Modbus anhand realer Geräte.
An dieser Stelle sollen zwei kleine Beispiele die Funktionsweise von Modbus zeigen. Ich habe zwei günstige Modbus Slaves bei Amazon gekauft, da die Herausforderung bei solchen Modulen etwas größer ist, als bei gut dokumentierten Modbus Slaves von namhaften Herstellern. Wer nämlich auf irgendeine Doku beim Kauf von diesen günstigen Modulen hofft, wird enttäuscht. Zum Üben und Testen eignen sich die günstigen Modbus Slaves aber ausgezeichnet. Mit ein bisschen Recherche findet man dann auch Dokus, die in etwa zu den Modulen passen.
Zum Schreiben und Lesen der Modbus-Slaves wird die Software Simply Modbus verwendet.
Die Rot gekennzeichneten Elemente zeigen direkt, wie unterschiedlich die Konfiguration der einzelnen Module sein kann, und das es keine klaren Konventionen gibt. Ohne Doku ist sowas immer ein Ratespiel. Mit etwas Glück, Recherche und Übung kommt man aber ans Ziel.
Es können viele weitere Eigenschaften konfiguriert werden, wie z.B. die Konfiguration der Slave-Adresse, der Abgleich der Temperatur und Luftfeuchtigkeit beim SHT20 oder die Baudrate beim Relaismodul, etc. Auf diese Einstellungen werde ich hier nicht weiter eingehen, da es auf den gleichen Prinzipen beruht, wie das im Folgenden Beschriebene.
Auslesen eines Temperatur und Luftfeuchtigkeitssensors
In diesem Beispiel werden zwei 16-bit Input Register (30001 und 30002), mit dem Funktionscode 4, gelesen. Diese enthalten die Temperatur/°C und die Luftfeuchtigkeit/%.

Verwendet wird hier der Temperatur- und Luftfeuchtesensor „Hailege RS485 SHT20″.

Viel kann man zu dem Sensor an dieser Stelle nicht sagen, da es keine Dokumentation gibt und auch keine Beschreibung.
Mit ein bisschen Recherche, kommt man auf folgende Daten:
- Betriebsspannung: 9 – 36 V
- Leistungsaufnahme max: 0,3 W
- Betriebstemperatur: -20 – 60 °C
- Luftfeuchtigkeit: 0% RH – 80% RH
- Genauigkeit Temperatur: +/- 0,3°C bei 25°C
- Genauigkeit Luftfeuchtigkeit: +/- 3% bei 25°C
- Schnittstelle: RS485 Modbus RTU
- Slave Adresse konfigurierbar: 1 – 255 (Default 1)
- Baud Rate: 9600 (8 Datenbits, 1 Stopbit, keine Parität)
Verdrahtung:
- Rot: Betriebspannung Plus
- Schwarz: Betriebsspannung Minus
- Gelb: RS485-A
- Weiß: RS485-B
Register:
- 2 Input-Register
- Adresse 0x01: Temperatur, 2 Bytes, Skalierung/10 (Wert im Register/10 = Temperatur)
- Adresse 0x02: Luftfeuchtigkeit, 2 Bytes, Skalierung/10 (Wert im Register/10 = Luftfeuchtigkeit)
- Weitere Register für Abgleich und Konfiguration
- Adressierung: 1-Basiert (Deswegen Offset 0 in Simply Modbus bzw. 30000)
- Beide Register können gleichzeitig gelesen werden

Ob das höchstwertige oder das niederwertigste Byte vorne ist, konnte ich nicht herausfinden, aber das ist nicht weiter problematisch. Wenn man sich die Registerinhalte anschaut, dann kommt man schon auf die richtig Reihenfolge. Die wäre in diesem Fall „High Byte First“.
Die Konfiguration kann man in Abb. 4 gut erkennen. Wichtig an dieser Stelle ist, dass die Adressierung 1-basiert ist, also beginnend mit 1. Wir werden in einem anderen Beispiel sehen, dass das nicht immer der Fall ist.

Zum Lesen verwenden wir den Funktionscode 4, beschrieben in ESP32 Modbus Grundlagen.
In Register 30001, also das erste Register der Input-Register, steht der Wert 0x0105, bzw. 261. Was dividiert durch 10, 26,1°C ergibt.
Das Register 30002 enthält die Luftfeuchtigkeit/10 in %, also 37,1 %.
Ansteuern einer Relaisplatine
Im folgenden Video wird die Relaiskarte über Simply Modbus Master angesteuert.
Bei diesem Modul werden zwei Coils (00001 und 00002) geschrieben. Die Coils sind 1-bit Register.

Die Relaisplatine wird im Gegenssatz zum SHT20 geschrieben und nicht gelesen. Auch zu diesem Modbus-Slave können wir einige Daten im Internet finden. Leider lag auch hier keine Doku bei, oder wenigstens ein Link zum Download.

Im Gegensatz zum Sensor sind hier die Anschlussbelegungen brauchtbar bezeichnet. Weitere Daten sind: (Hier nur die für Modbus relevanten Daten)
- Betriebsspannung: 7 – 24 V
- Schnittstelle: RS485 Modbus RTU
- Slave Adresse konfigurierbar: 1 – 255 (Default 255)
- Baud Rate konfigurierbar: 4800, 9600, 19200 (Default 9600) (8 Datenbits, 1 Stopbit, keine Parität)
Register:
- 2 Coils (1-bit Output Register)
- Adresse 0x01: Relais 1
- Adresse 0x02: Relais 2
- Weitere Register für Konfiguration
- Adressierung: 0-Basiert (Deswegen Offset 1 in Simply Modbus bzw. 00001)
- Es kann nur ein Register pro Befehl geschrieben werden, nicht beide gleichzeitig!
Wir stellen die Slave Adresse auf 255, da diese per default eingestellt ist. Zum schreiben einzelner Coils verwenden wir den Funktionscode 5. Der Offset steht auf 1, da wir der zu schreibenden Adresse 00001, 1 subtrahieren müssen, wegen der 0-basierten Adressierung. Ich wiederhole an dieser Stelle das bei diesem Modul immer nur ein Coil gleichzeitig geschrieben werden kann.
Wir schreiben in ein Register (Values to Write = 1, oben neben First Register), nämlich Coil 1 (First Register) mit dem Funktionscode 5 und subtrahieren einen Offset von 1 (minus offset), Abb. 7. Das erste Relais schaltet, was an der LED D5 ersichtlich ist, Abb. 8.


Als nächstes schalten wir das zweite Relais ein. Dafür müssen wir lediglich das zweite Register auswählen (First Register = 2) und den Wert 1 schreiben. Offset bleibt 1, da wegen der 0-basierten Adressierung, das zweite Coil, Register 1 ist und das erste Coil, Register 0.


Jetzt wird es spannend, wenn man die Relais ausschalten möchte, können wir nicht beide gleichzeitig ausschalten, nur nacheinander. Der Funktionscode 15, zum Schreiben mehrerer Coils, funktioniert hier einfach nicht. Dafür müssen wir nacheinander den Wert 0 in die Coils schreiben. Dies überlasse ich dem interessierten Leser.
Desweiteren können die Zustände der Coils mit dem Funktionscode 1 rückgelesen werden.
Weiterführende Links
- Installation ESP-IDF unter Windows 10/11
- Erstes Programmbeispiel, die blinkende LED
- Visual Studio Code und ESP-IDF Extension
- ESP32 – Das Entwicklungsboard
- ESP32 JTAG-Debugger
- FreeRTOS am ESP32 – Grundlagen, Tasks und Scheduling
- ESP-IDF Menuconfig – Überblick und wichtigste Optionen
Projekte