Arduino - Modbus
In diesem Tutorial werden wir lernen:
- Was ist Modbus?
- Warum braucht man Modbus?
- Welche Alternativen zu Modbus gibt es?
- Wie funktioniert Modbus?
- Modbus RTU/ASCII und Modbus TCP
- Wie verwendet man die Arduino-Modbus-Bibliothek?
Was ist Modbus?
Modbus ist ein Protokoll, das zur Kommunikation zwischen Geräten, zwischen Geräten und Software/Apps sowie zwischen Geräten und HMI verwendet wird. Es wird in der Industrie weit verbreitet eingesetzt, um Geräte zu steuern und zu überwachen.
In einfachen Worten ist Modbus eine Sprache, die von einem Gerät verwendet wird, um mit anderen Geräten, Software/Apps und HMI-Geräten zu kommunizieren.
Dieses Tutorial handelt von Arduino, daher repräsentiert Arduino das Gerät. Durch die Verwendung von Modbus können wir Folgendes erstellen:
- Zwei Arduinos kommunizieren miteinander, um Ein- und Ausgänge zu steuern bzw. zu überwachen.
- Arduino kommuniziert mit der Software auf dem PC oder mit einer App auf dem Smartphone.
- Arduino kommuniziert mit einem HMI-Gerät.
Zum Beispiel steuert Arduino #1 mit 4 Schaltern Arduino #2 mit 4 Glühbirnen über eine lange Distanz.
Warum braucht Modbus?
Gibt es Alternativen zu Modbus? Falls ja, wann verwendet man Modbus? Und wann verwendet man die Alternativen?
Ein Schalter, der an Arduino #1 angeschlossen ist, steuert eine LED, die an Arduino #2 angeschlossen ist, über eine lange Distanz.

Der einfachste alternative Weg zu Modbus besteht darin, eigenständig ein einfaches Protokoll zu definieren:
- Arduino #1:
- Wenn der Schalter auf EIN geschaltet wird, Arduino #1 sendet ein Byte (Befehl) mit dem Wert 1 an Arduino #2.
- Wenn der Schalter auf AUS geschaltet wird, Arduino #1 sendet ein Byte (Befehl) mit dem Wert 0 an Arduino #2.
- Arduino #2:
- Wenn das empfangene Byte 1 ist, LED einschalten
- Wenn das empfangene Byte 0 ist, LED ausschalten
- Arduino #1 möchte wissen, ob der Befehl von Arduino #2 erfolgreich ausgeführt wird.
- Arduino #1 möchte den Zustand der LED an Arduino #2 überprüfen.
- Arduino #1 mit mehreren Schaltern möchte mehrere LEDs an Arduino #2 steuern.
- Arduino #1 möchte einen Schalter verwenden, um eine LED an Arduino #2 zu steuern, und Arduino #2 möchte ebenfalls einen Schalter verwenden, um eine LED an Arduino #1 zu steuern.
- Und weitere Anwendungsfälle.
- Wir müssen die Befehle nicht definieren; Modbus hat sie für jeden Fall festgelegt. Wir müssen sie nur implementieren.
- Unser Gerät kann mit anderen Geräten oder Software, die Modbus unterstützen, arbeiten, ohne mit dem Ersteller des Geräts oder der Software zusammenzuarbeiten.
Das oben genannte Protokoll ist von uns definiert und kein Standardprotokoll. Wir müssen noch mehr definieren, falls:
Es ist nicht einfach, alle Befehle selbst zu definieren. Das Problem wird komplizierter, wenn wir die oben genannten Anforderungen vermischen. Und wir können auch nicht garantieren, dass es fehlerfrei ist.
Ein weiteres Problem tritt auf, wenn wir das Protokoll selbst definieren. Wenn unser Arduino mit einem anderen Arduino arbeiten soll, der ein von einer anderen Person definiertes Protokoll verwendet, ist das unmöglich, es sei denn, wir arbeiten zusammen und teilen das von uns selbst definierte Protokoll.
Das sind die Gründe, warum wir das Modbus-Protokoll benötigen. Wenn wir das Modbus-Protokoll verwenden:
Wenn wir das Modbus-Protokoll für Arduino verwenden, können wir zahlreiche kostenlose Software oder Apps verwenden, um unseren Arduino zu steuern und zu überwachen.
Wann Modbus verwendet werden sollte und wann nicht
Das Modbus-Protokoll ist für Anfänger nicht leicht zu verstehen und zu implementieren, selbst wenn eine Modbus-Bibliothek verfügbar ist. Daher ist es in Ordnung, ein einfaches, selbstdefiniertes Protokoll zu verwenden, wie oben beschrieben, wenn:
- Das System ist einfach, zum Beispiel dadurch, dass mehrere Schalter auf dem Arduino #1 mehrere LEDs auf dem Arduino #2 steuern.
- Arduino muss nicht mit anderen Geräten/Software von anderen Herstellern arbeiten.
Wir sollten Modbus verwenden, wenn:
- Das System ist kompliziert.
- Das System erforderte eine hohe Zuverlässigkeit.
- Arduino muss mit anderen Geräten und Software von anderen Entwicklern zusammenarbeiten.
※ Notiz:
Es gibt weitere Standardprotokolle sowie nicht standardisierte Protokolle, die Alternativen zu Modbus darstellen. Sie liegen außerhalb des Umfangs dieses Tutorials.
Wie das Modbus-Protokoll funktioniert
Wie bereits beschrieben, kann ein Arduino über das Modbus-Protokoll mit Software oder Apps, einem HMI-Gerät oder einem anderen Arduino kommunizieren. Dieses Tutorial betrachtet die Kommunikation zwischen zwei Arduinos als Beispiel für Modbus-Kommunikation. Die übrigen sind gleich.
Konzepte
Es gibt einige Konzepte im Modbus-Protokoll:
- Primär und Sekundär
- Anfrage und Antwort
- Funktionscode (FC) und Adresse
Das Modbus-Protokoll funktioniert im Master-Slave-Modell. Unter zwei Arduino-Boards muss einer als Master funktionieren, und der andere arbeitet als Slave.
Master sendet eine Anfrage, und der Slave sendet eine Antwort.

Eine Anfrage, die von Master gesendet wird, enthält im Wesentlichen die folgenden Informationen:
- Funktionscode (FC): 1 Byte, ist der Befehl, der dem Slave sagt, was er tun soll. Zum Beispiel liest er den Zustand eines digitalen Eingangpins, eines digitalen Ausgangspins oder eines analogen Eingangspins, steuert einen digitalen Ausgangspin.
- Adresse: 2 Byte, wird verwendet, um den Pin zu identifizieren. Jedem digitalen Eingangspin, jedem digitalen Ausgangspin und dem analogen Eingangspin wird eine Adresse zugewiesen.
- Daten (z. B. Steuerwert)
Sobald eine Anfrage eingegangen ist, führt der Sklave die entsprechende Aktion aus und sendet eine Antwort zurück, die das Ergebnis der Aktion oder die Information enthält, die Meister angefordert hat.
Funktionscode
Der Funktionscode wurde vom Modbus-Standard definiert. Es gibt viele Funktionscodes. Schauen wir uns unten einige grundlegende Funktionscodes an:
- FC 01 (Lesen von Spulen): ist ein Befehl, der verwendet wird, um den Zustand eines einzelnen oder mehrerer digitaler Ausgangspins auszulesen
- FC 05 (Schreiben einer einzelnen Spule): ist ein Befehl, mit dem der Zustand eines einzelnen oder mehrerer digitaler Ausgangspins gesetzt wird
- FC 02 (Lesen diskreter Eingänge): ist ein Befehl, der verwendet wird, um den Zustand eines einzelnen oder mehrerer digitaler Eingänge auszulesen
"FC 01" bedeutet, dass der Wert des Funktionscode 0x01 ist.
Es gibt noch mehr Funktionscodes. Um Anfänger nicht zu überfordern, stellt dieses Tutorial nur einige wesentliche Funktionscodes vor.
Wenn Sie die Arduino-Modbus-Bibliothek verwenden, müssen Sie:
- Wählen Sie, welchen Funktionscode Sie verwenden möchten
- Geben Sie Adressen für jeden Arduino-Pin an (nur Pins, die Sie verwenden)
Die detaillierte Anleitung zur Verwendung der Modbus-Bibliothek wird im nächsten Tutorial vorgestellt. Folgen Sie unserer Facebook-Seite, um Benachrichtigungen über das neue Tutorial zu erhalten.
Arduino Master kann den Zustand seines digitalen Eingangspins lesen und dann den Zustand des digitalen Ausgangs des Arduino Slave steuern, und umgekehrt.
Zum Beispiel:
- Arduino Master ist an LED #M und Schalter #M angeschlossen.
- Arduino Slave ist an LED #S und Schalter #S angeschlossen.
- Lass uns Schalter #M so steuern, dass LED #S geschaltet wird, und Schalter #S so, dass LED #M geschaltet wird.

Lösung:
- Master liest den Zustand des Schalters #M → sende eine Anfrage an Slave, um LED #S entsprechend dem Zustand des Schalters #M zu steuern → Slave steuert LED #S und sendet die Antwort
- Master sendet eine Anfrage an Slave, um den Zustand von Schalter #S auszulesen → Slave antwortet mit dem Zustand von Schalter #S → Master steuert LED #M entsprechend dem Zustand von Schalter #S
※ Notiz:
- Im obigen verwenden wir die Begriffe "digitaler Eingangspin" und "digitaler Ausgangspin", um es Anfängern leichter zu machen. Tatsächlich repräsentiert "digitaler Eingangspin" den Zustand eines Geräts, der nur gelesen werden kann, und "digitaler Ausgangspin" den Zustand eines Geräts, der gelesen und geschrieben werden kann.
- Modbus kann mehrere Masters und mehrere Slaves unterstützen
- Modbus kann nicht nur für digitale Eingänge/Ausgänge, sondern auch für analoge Eingänge/Ausgänge verwendet werden.
Modbus RTU/ASCII und Modbus TCP
Es gibt drei gängige Modbus-Typen: Modbus RTU, Modbus ASCII und Modbus TCP. Die Funktionsprinzipien sind bei allen Modbus-Typen dieselben wie oben beschrieben. Jeder Modbus-Typ ist darauf ausgelegt, sich an die Netzwerkumgebung anzupassen: Seriell oder TCP.
- Systemdiagramm

- Protokollstapel

Unterschiede zwischen Modbus RTU/ASCII und Modbus TCP
Modbus RTU/ASCII | Modbus TCP |
---|---|
Over serial (RS-232/RS-422/RS-485) | Over TCP |
Support single transaction(*) | Support multiple transactions(**) |
Zeilenumbruch
- (*): Modbus RTU/ASCII unterstützt nur eine Transaktion. Das bedeutet, dass wenn ein Master eine Modbus Anfrage sendet, er auf eine Modbus Antwort oder Timeout warten muss, bevor er eine weitere Anfrage sendet.
- (): Modbus TCP unterstützt mehrere Transaktionen. Das bedeutet, dass ein Master eine Modbus Anfrage senden kann, ohne auf eine Modbus Antwort warten zu müssen. Es kann mehrere Anfragen kontinuierlich senden. Um eine Antwort zu identifizieren, die zu einer Anfrage gehört, hat Modbus TCP ein zusätzliches Feld, genannt "Transaktions-ID". Die Anfrage und die entsprechende Antwort haben dieselbe Transaktions-ID.
Wie man die Arduino-Modbus-Bibliothek verwendet
Dank der Modbus-Bibliothek wird die Verwendung von Modbus mit Arduino vereinfacht.
Wir werden ein Tutorial darüber machen, wie man die Modbus-Bibliothek verwendet. Gefällt unsere Facebook-Seite, um Benachrichtigungen über das neue Tutorial zu erhalten.