Modbus über WLAN - Teil 2: Software für das Modbus-TCP-WLAN-Modul
Von Josef Bernhardt und Martin Mohr
Im ersten Teil [1] haben wir ins mit der Hardware des Projekts beschäftigt. Kern des Moduls ist ein NodeMCU-Board mit dem Mikrocontroller ESP8266; eine zusätzliche Basis-Platine stellt industriekompatible Anschlüsse bereit. Nach einer kurzen Einführung in die Funktionsweise des Modbus-Protokolls gehen wir nun auf die Ansteuerung des Moduls ein und erfahren, welche Software man dazu verwendet. In dem Beispiel kommt wieder die Garagentorsteuerung aus dem ersten Teil zum Einsatz.
Modbus Protokoll
Modbus ist ein Protokoll, das in der Automationstechnik weit verbreitet ist. Es arbeitet nach dem Master/Slave-Prinzip. Der Busmaster kann bis zu 246◦Slaves ansteuern. Die Adressen 1...247 können für Busteilnehmer verwendet werden. Die Adresse 0 ist die Broadcast-Adresse: Alle Daten, die an diese Adresse gesendet werden, werden von allen Teilnehmern empfangen. Die Konsistenz der einzelnen Datenpakete wird über CRC-Checksummen gewährleistet. Die Slaves besitzen interne Register mit unterschiedlichen Funktionen. Tabelle 1 gewährt einen Überblick über die Modbus-Funktionen.
Beschreibung | Modus | Bits |
Einzelner Ein-/Ausgang „Coil“ | Lesen und Schreiben | 1 |
Einzelner Eingang „Discrete Input“ | nur Lesen | 1 |
(analoge) Eingänge „Input Register“ | nur Lesen | 16 |
(analoge) Ein-/Ausgänge „Holding Register” | Lesen und Schreiben | 16 |
Das Modbus-Protokoll unterscheidet drei Varianten:
- Modbus RTU: binäre Übertragung über RS485 (EIA485).
- Modbus ASCII: Klartext-Übertragung über RS485 (EIA485), weniger effizient als binäre Übertragung, dafür von Menschen lesbar. Man kann die Kommandos mit einem einfachen Terminal versenden.
- Modbus TCP: hier werden die Modbus-Kommandos mit TCP/IP übertragen, meistens über Ethernet oder wie bei unserem Modul über WLAN.
Detaillierte Informationen und Protokollbeschreibungen gibt es auf der Modbus-Webseite [2].
Vorbereitung des Modbus-WLAN-Moduls
Damit wir das WLAN-Modul auch mit dem Modbus-Protokoll verwenden können, muss als Erstes die dazu nötige Firmware geladen werden. Bitte ziehen Sie dazu das NodeMCU-Board von der Modbus-Platine ab und schließen es an den USB-Anschluss Ihres PCs an. Nun starten Sie die Arduino-IDE, die wir im ersten Teil eingerichtet haben. Die Firmware, die das Modul in einen Modbus-Client verwandelt, kann von der Elektor-Projektseite [3] heruntergeladen werden.
In der Arduino-IDE öffnet man die heruntergeladene Datei (Datei -> Öffnen…) OpenPLC_ESP8266_1_0_MUX_V1_1.ino. Die Arduino-IDE fragt nun, ob das Projekt in den Sketch-Bereich verschoben werden kann, was man bejahen sollte. Falls die IDE dabei ein neues Verzeichnis anlegt, kopieren Sie auch die Headerdatei (modbus.h) dorthin, wo auch die ino-Datei liegt, damit der Header beim Kompilieren gefunden wird.
Damit Sie im WLAN auf das Modul zugreifen können, müssen dessen Zugangsdaten am Anfang des Sourcecodes angepasst werden (Listing◦1). Tragen Sie hier die Daten Ihres eigenen WLAN ein.
Listing 1. WLAN-Konfiguration des Modbus-Moduls.
/*********NETWORK CONFIGURATION*********/
const char *ssid = "<YOUR_SSID>";
const char *password = "<YOUR_PASSWORD>";
/***************************************/
Nachdem diese Anpassungen durchgeführt sind, können Sie das Programm wie im ersten Teil beschrieben auf das Modbus-WLAN-Modul laden. Das Modul arbeitet mit DHCP, erhält also automatisch eine IP-Adresse von Ihrem Router (die in der Router-Firmware nachgesehen werden kann). Alternativ dazu können Sie sich die Ausgabe des Programms im Seriellen Monitor der Arduino-IDE (Lupen-Icon rechts oben) ansehen. Die Geschwindigkeit der Schnittstelle muss unten rechts in der Dropdown-Box auf 115200◦Baud eingestellt werden. Wie die Ausgabe der IP-Adresse im Seriellen Monitor aussehen kann, zeigt Listing◦2. Damit Sie diese Prozedur nicht bei jedem Einschalten des Modbus-Moduls wiederholen müssen, sollten Sie eine statische IP-Adresse vergeben, was alle modernen Router ermöglichen. Wie auch immer, notieren sie die ausgegebene IP-Adresse des Moduls, damit Sie über WLAN darauf zugreifen können. Falls Sie keine Ausgabe sehen, betätigen Sie den Reset-Taster auf dem NodeMCU-Board, um die Software neu zu starten, denn die IP-Adresse wird nur während des Neustarts ausgegeben.
Listing 2. IP-Ausgabe des Modbus-WLAN-Moduls.
Connecting to Vodafone-3980
.......
WiFi connected
Server started
My IP: 192.168.0.85
First Test
Um zu überprüfen, ob das Modbus-WLAN-Modul einwandfrei arbeitet, verwenden wir das Tool EasyModbus, das zum Download auf SourceForge bereit steht [4]. EasyModbus stellt uns einen Server, einen Client und eine Bibliothek bereit. Wir benötigen für unseren Test nur den Client, der direkt unter [5] heruntergeladen werden. Um das Tool zu verwenden, benötigen Sie eine installierte Java-Version auf Ihrem PC. Falls Java noch nicht installiert ist, können Sie das freie OpenJDK verwenden [6], das sich in der Entwickler- und Maker-Community einer großen Beliebtheit erfreut und in allen Linux-Distributionen zum Standard gehört. Es wird beispielsweise unter Ubuntu mit dem Terminal-Befehl sudo apt install openjdk-11-jdk installiert.
Um den EasyModbus-Client zu starten, gibt man den Befehl java -jar EasyModbusJavaClient.jar ein. Bild 1 zeigt die Ausgabe des EasyModbus-Clients (links unter Linux, rechts unter Windows). Wählen Sie hier Modbus TCP und geben die IP-Adresse Ihres Moduls ein. Belassen Sie die Starting Address auf 1 und ändern Sie die Number of Values auf 4. Wenn Sie nun auf Read Discrete Inputs – FC 2 klicken, werden die vier digitalen Eingänge des Moduls gelesen und angezeigt. Es ist sinnvoll, wenn dabei zumindest ein Eingang mit einem Signal belegt ist, damit Sie sehen können, ob alles erwartungsgemäß funktioniert.
Der EasyModbus-Client kann nur Daten vom Modbus lesen, nicht aber schreiben. Das Schreiben testen wir mit dem Beispielprogramm, das wir gleich erstellen. Im unteren Bereich des EasyModbus-Clients sind die real übertragenen Daten zu sehen. Diese Funktion ist für das Debuggen extrem hilfreich. Wenn der erste kleine Test erfolgreich war, können wir dazu übergehen, das Modul mit Python zu programmieren.
Modbus-Bibliothek installieren
Um den Test etwas praxisnäher zu gestalten, verwenden wir wieder unser Garagentormodell [7] aus dem ersten Teil. Wir schreiben uns ein Programm für den PC, das die Stellung der Taster und Endschalter per Modbus empfängt, um entsprechende Motor-Aktionen (wiederum per Modbus) zu übermitteln.
Unser Python-Testprogramm benötigt eine Bibliothek [8], um auf den Modbus zuzugreifen. Das ist nichts Besonderes; es gibt Modbus-Bibliotheken für fast alle Programmiersprachen. Im Zweifel könnte man sogar die einzelnen Bytefolgen der Kommandos selbst erzeugen und über das Netzwerk übertragen. Das würde aber hier zu weit führen.
Zunächst sollte man sich vergewissern, dass der Python-Paketinstaller Pip an Bord ist (was bei neueren Python-Installationen stets der Fall sein sollte). Man überprüft dies mit $ python -m pip –version oben Linux oder C:\> py -m pip –version unten Windows.
Sollte kein Pip-Installer vorhanden sein, installiert man ihn über Python mit get-pip.py [9] (und nicht über den Linux-Paketmanager) nach.
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
get-pip.py
Dann wird die Modbus-Bibliothek installiert:
$ python -m pip install -U pymodbusTCP
C:\> py -m pip install -U pymodbusTCP
Eine ausführliche Dokumentation der Bibliothek mit vielen Codebeispielen finden Sie unter [10].
Beispielprogramm
Sehen wir uns nun unser Beispielprogramm in Listing 3 im Detail an. Mit der ersten Zeile wird die Modbus-Bibliothek importiert. In der nächsten Codezeile wird ein neues Verbindungsobjekt erstellt, um mit einem konkreten Modbus-Gerät zu kommunizieren. Es können hierbei mehrere Parameter übergeben werden, in unserem Beispiel die IP-Adresse des Zielgerätes als host. Der Port 502 ist der Standard-Port für die Modbus-TCP-Kommunikation. Mit dem Parameter auto_open bestimmen wir, ob die Verbindung automatisch oder manuell hergestellt werden soll. In unserem Beispiel nutzen wir aus Bequemlichkeit die automatische Variante, aber wenn Sie den Verbindungsaufbau komplett selbst steuern wollen, wählen Sie bitte False. Beim manuellen Verbindungsaufbau haben Sie mehr Möglichkeiten der Steuerung und zur Fehlerbehandlung.
Wird der Parameter debug auf True gesetzt, gibt die Bibliothek alle übertragenen Daten auf der Konsole aus. Das ist extrem hilfreich, wenn man auf der Suche nach einem Fehler ist.
Listing 3. Beispiel-Programm tor.py zur Torsteuerung.
from pyModbusTCP.client import ModbusClient
client = ModbusClient(host="192.168.0.85", port=502, auto_open=True, debug=False)
while(True):
inputs=client.read_discrete_inputs(0,4)
endschalter_oben = inputs[0]
endschalter_unten = inputs[1]
taster_runter = inputs[2]
taster_hoch = inputs[3]
motor_hoch = 0
motor_runter = 1
# Abfrage Endschalter
if(endschalter_oben):
client.write_single_coil(motor_hoch,False)
print("Tor offen")
if(endschalter_unten):
client.write_single_coil(motor_runter,False)
print("Tor geschlossen")
# Abfrage Taster
if (taster_hoch and not endschalter_oben):
client.write_single_coil(motor_hoch,True)
if (taster_runter and not endschalter_unten):
client.write_single_coil(motor_runter,True)
Mit Hilfe einer while- Endlosschleife laufen wir immer wieder durch das Programm, wie es auch im ersten Teil beschrieben wurde. Das Programm arbeitet also zyklisch wie alle Industriesteuerungen. Der Block innerhalb der Endlosschleife ist das eigentliche Programm, in dem zuerst die Eingänge gelesen und dann die Eingangswerte in „sprechende“ Variablen überführt werden. Dann definieren wir auch für die zwei digitalen Ausgänge Variablen. So sind die folgenden Programmzeilen leichter zu lesen.
Sie können dort erkennen, dass der Motor abgeschaltet wird, wenn die Endstellungen erreicht sind. Um am Rechner zu sehen, in welcher Stellung sich das Tor gerade befindet, wird ein Text auf der Konsole ausgegeben. Zu guter Letzt wird der Motor in der entsprechenden Drehrichtung gestartet, wenn die Up/Down-Taste gedrückt wird. Die UND-Verknüpfungen mit den Endschaltern verhindern, dass die Relais anfangen zu flattern, wenn sich das Tor schon in der Endlage befindet.
Um das Programm zu starten, geben Sie auf der Kommandozeile python tor.py ein. Das Programm wird wie gewohnt mit Strg+C beendet.
AdvancedHMI
Eine komfortable Fernsteuerung mit visueller Rückmeldung, die man an eigene Zwecke anpassen kann, lässt sich mit verschiedenen PC-Frameworks verwirklichen. Die AdvancedHMI-Software ist eine offene Software zum Erstellen von HMI-Anwendungen (Human Machine Interface), die mit Ihrer SPS oder einem anderen E/A-Gerät kommunizieren. Die Software unterscheidet sich von anderen Standardpaketen dahingehend, dass Sie ausführbare Dateien erstellen und nicht nur Konfigurationen, die von einer Laufzeit-Engine interpretiert werden. Das Ergebnis ist eine extrem schnelle und effiziente Anwendung.
AdvancedHMI [11] basiert auf dem Microsoft .NET Framework. Anwendungen werden mit dem kostenlosen Microsoft Visual Studio Community 2019 erstellt. Dadurch können Sie per Drag&Drop grundlegende HMIs erstellen, ohne eine einzige Codezeile schreiben zu müssen. Durch die Nutzung des .NET-Frameworks sind Support-Netzwerke und Entwickler reichlich vorhanden. Sie finden für AdvancedHMI weit mehr Unterstützung als für alle anderen Standard-HMI-Pakete zusammen.
Der Autor hat sich mit der Plattform eine Oberfläche zur Steuerung der Basisplatine generiert. Hier wird der Status der Eingänge angezeigt, mit Buttons lassen sich die Ausgänge schalten (Bild 2).
Mit Mono laufen .NET-Programme auch unter Linux - so auch die Oberfläche zur Steuerung der Basisplatine. Ein Test auf dem Raspberry Pi verlief erfolgreich.
Fazit
Mit dem Modbus-WLAN-Modul kann man einfach von einem PC aus oder auch mit dem Smartphone Geräte ansteuern, die dem Modbus-Industriestandard entsprechen. Auch wenn Sie sich in das Modbus-Protokoll einfuchsen wollen, ist dieses Modul ein gutes Testobjekt. Die Hardware ist jedoch auch so robust und fehlertolerant aufgebaut, dass sie sie auch in eigenen ESP8266-Projekten verwenden können, wenn Sie Industriegeräte wie Magnetventile, Motoren und andere Arten von Sensoren/Aktoren ansteuern und auslesen wollen.
Fragen oder Kommentare?
Haben Sie technische Fragen oder Anmerkungen? Wenn ja, wenden Sie sich bitte an den Autor unter josef@bernhardt.de oder an die Redaktion unter editor@elektor.com