ESP32 Modbus Grundlagen – Praxis mit Relais und Sensor

whatsapp image 2026 05 03 at 10.19.02

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/%.

whatsapp image 2026 04 30 at 21.42.09 (2)
Abb. 1 – Hailege RS485 SHT20 Temperatur-Feuchtigkeits-Sensor-Modul

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

whatsapp image 2026 04 30 at 21.42.09 (1)
Abb. 2 – 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
whatsapp image 2026 04 30 at 21.42.09
Abb. 3 – Anschlussbelegung

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.

smmastertemp
Abb. 4 – Simply Modbus Master Lesevorgang

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.

whatsapp image 2026 04 30 at 22.31.14
Abb. 5 – Relaiskarte bestep

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.

whatsapp image 2026 04 30 at 22.31.56
Abb. 6 – Anschlussbelegung Relaisplatine

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.

sm coil 1
Abb. 7 – Coil 1 schreiben
whatsapp image 2026 04 30 at 23.04.30
Abb. 8 – Relais 1 geschaltet LED D5 leuchtet

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.

sm coil 2
Abb. 8 – Wert 1 in Coil 2 in Register 1 schreiben
whatsapp image 2026 04 30 at 23.04.16
Abb. 9 – Relais 2 eingeschaltet, D7 leuchtet

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

Projekte

 

Schreibe einen Kommentar