Modbus loves Smartphones
Modbus ist ein serielles Protokoll, dass sich in der Industrie gut durchgesetzt hat, da es offen und schnell ist. Um Erfahrungen mit Modbus zu sammeln, sollte ich im Rahmen einer Praktikumsarbeit eine Kommunikation zwischen Smartphone und Bus ermöglichen.
Ziel
Verbinden einer LED mit einem Smpartphone via Modbus.
Material
Vorgehen
Um die Lampe an und ausschalten zu können, benötigte ich ein Modbus-fähiges Relay (Stromzufuhr an/aus). Hierfür fiel meine Wahl auf den ADAM 4168.
Da Smartphones mit Modbus-Anschluss eher selten sind musste eine Schnittstelle zwischen Smartphone und Modbus bzw. Relay (ADAM 4168) her. Diese Aufgabe übernimmt in unserem Versuchsaufbau ein Raspberry Pi 3 mit einem RS-485 Shield. Das Smartphone kann nun (via Raspberry Pi und Shield) mit dem Modbus kommunizieren und so die Stromzufuhr zur LED mithilfe des Relay steuern.
Nachdem ich alle noch fehlenden Kabel und Stromanschlüsse aufgetrieben hatten, konnte ich die erwähnten Komponenten verbinden.
Obwohl ich alles richtig verkabelt hatte, blieb noch eine kleine Hürde zu überwinden:
Das Relay kommuniziert standardmässig nicht über das Modbus-Protokoll, sondern über ein proprietäres Protokoll von Advantech. Dieses beruht auf dem Austausch von ASCII-Zeichen. Mit dem Handbuch des Relays und der Python Bibliothek pySerial ging es dann erstaunlich schnell die LED ein- und auszuschalten.
Allerdings wollen wir ja eine Kommunikation über Modbus. Um das Relay in den Modbus Modus zu wechseln wird eine Software mitgeliefert die auf alten Windows Rechnern läuft, aber nicht, zumindest nicht mit geringem Aufwand, auf einem Rasbperry Pi. Zum Glück ist es aber auch möglich das Relay mit einer ASCII Zeichenfolge zu konfigurieren. Mit dem richtigen Befehl konnte ich das Relay dann problemlos in den Modbus-Modus versetzen.
Modbus ist ein wenig komplizierter als nur ASCII-Zeichen zu senden. Zum Glück gibt es dafür eine Python Bibliothek: pymodbus.
Leider ist diese nicht allzu gut dokumentiert. Auch das Manual des Relays für die Modbusbefehle ist viel kürzer und kryptischer gehalten als das für die ASCII-Befehle. Trotzdem konnten ich irgendwann die richtigen Befehle an das Relay senden. Allerdings stimmten die Adressen im Manual nicht genau und so mussten ich ein wenig ausprobieren, bis ich die richtige Adresse für unsere LED gefunden hatte.
Der zweite Teil, die Kommunikation zwischen Raspberry Pi und Smartphone war dann nicht mehr allzu schwer. Da sowohl der Rasperry Pi und das Smartphone am (W)LAN angeschlossen sind, läuft die Kommunikation über das LAN. Auf dem Raspberry Pi habe ich Flask installiert und konnten so einen einfachen Restserver programmieren. Dieser hört auf <tt><url>/on</tt> und <tt><url>/off</tt> und sendet die jeweiligen Befehle über den Modbus an das Relay.
Auf dem Smartphone muss nur noch die richrtige IP des Raspberry Pi's eingegeben werden und schon kann via Knopfdruck das Licht gewechselt werden.
Natürlich muss die Bedienung des LEDs auch auf mehreren Smartphones möglich sein. Dafür speichert der Raspberry Pi noch den aktuellen Zustand und die Smartphones fragen diesen periodisch ab.