Modbus-Kommunikation mit RaspberryPi und PyModbus

Wie man vielleicht bemerkt, beschäftige ich mich gerade mal wieder mit einem meiner Lieblingsgeräte, dem RaspberryPi, lange lagen die beiden Modelle hier herum und staubten ein, in der letzten Zeit müssen sie wieder viel über sich ergehen lassen.

Auf wemaflo.net schrieb ich schon einmal über den RaspberryPi und Modbus, der Artikel bietet aber nicht wirklich viel Mehrwert, daher habe ich mich entschlossen, ihn neu zu schreiben, statt ihn zu übernehmen. Los geht’s!

Ich habe also:

  • Einen RaspberryPi B+ V1.2 mit CODESYS-Laufzeit, welchen ich als Controller benutze (Installation ist hier beschrieben)
  • Einen RaspberryPi B V1, welchen ich als Modbus-Master nutze

Auf beiden Geräten läuft Debian bzw. Raspbian.

RaspberryPi B und RaspberryPi B+
RaspberryPi B und RaspberryPi B+

Zuerst installieren wir auf dem Modbus-Master den Python-Paketinstaller easy_install:

wget https://bootstrap.pypa.io/ez_setup.py -O - | python

Danach installieren wir noch build-essential (vermutlich schon vorhanden) und das Dev-Paket von Python 2.7:

apt-get install build-essential python2.7-dev

Nun fehlt noch das tatsächliche Modbus-Programm, welches wir nun über easy_install installieren (was einen Moment dauern kann):

easy_install -U pymodbus

Nun fehlt noch ein Python-Programm, welches die PyModbus-Bibliothek nutzt. Ich habe hier ein einfaches Beispielprogramm geschrieben, welches einen Inputwert abfragt und diesen dann so lange per Modbus auf den Slave schreibt, bis es mit Enter abgebrochen wird (die IP-Adresse des Modbus-Slave muss natürlich angepasst werden):

#!/usr/bin/env python
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
import thread, time

def input_thread(L):
        raw_input()
        L.append(None)

def do_write_modbus():
        L = []
        thread.start_new_thread(input_thread, (L,))

        #Modbus-Slave
        RPiCODESYS = ModbusClient(host = '192.168.178.123', port=502)
        write_value = input ('Inputvalue: ')
        loop = input ('Loop starten: ')
        write_register = 0

        while 1:
                time.sleep(.1)
                if L: break
                RPiCODESYS.write_register(write_register, write_value)

do_write_modbus()

Herunterladen: Python-Script: Modbustest

Dieses Programm kann nun mit python ausgeführt werden (python modbustest.py).

Ohne Modbus-Slave auf der Gegenseite hilft das aber wenig, wir benötigen noch einen Beweis, dass alles funktioniert.
Unter CODESYS 3 sollten wir nun also ein neues Projekt erstellen, in meinem Falle wieder mit dem RaspberryPi als Zielsystem. Per Rechtsklick auf das Device kann nun ein weiteres Gerät angehängt werden, hier wählen wir den Ethernet-Adapter.

Gerät an den RaspberryPi anhängen
Gerät an den RaspberryPi anhängen

Per Rechtsklick auf den neuen Ethernet-Adapter hängen wir nun noch das Modbus TCP Slave Device an.

Modbus Slave Device an den Ethernet-Adapter anhängen
Modbus Slave Device an den Ethernet-Adapter anhängen

Nun schreiben wir eine Variable in unser Standard-Programm PLC_PRG, um an dieser nachher die über Modbus geschriebenen Werte sehen zu können:

Variable wModbusInput in PLC_PRG einfügen
Variable wModbusInput in PLC_PRG einfügen

Auf diese Variable können wir nun unseren Modbus-Input mappen. In das entsprechende Menü gelangen wir durch einen Doppelklick auf den Modbus TCP Slave:

Modbus-Input auf wModbusInput mappen
Modbus-Input auf wModbusInput mappen

Nun muss nur noch die Verbindung mit dem Controller hergestellt werden. Hierzu öffnen wir per Doppelklick auf den RaspberryPi (Device CODESYS Control for Raspberry Pi) das entsprechende Menü und geben dort die IP des Gerätes ein. Mit Enter wird die IP übernommen und die Verbindung überprüft.

CODESYS mit RaspberryPi verbinden
CODESYS mit RaspberryPi verbinden

Per Klick auf das Zahnrad (oder Alt + F8) loggen wir uns auf dem Gerät ein und starten das Programm mit F5. Nun können wir im PLC_PRG in Quasi-Echtzeit unsere Eingaben aus modbustest.py sehen.

modbustest.py schreibt Daten auf CODESYS-Slave
modbustest.py schreibt Daten auf CODESYS-Slave

Jetzt bin ich gespannt: Funktioniert bei euch auch alles (wenn nein helfe ich gerne) und wofür benutzt ihr das ganze?

Mein erster Kontakt mit dem Amazon-Rückgaberecht

Ich bestellte unlängst bei Amazon eine Fünferpackung eines Elektronik-Produkts für etwa 10€. Das Paket kam auch wie immer sehr schnell an, ich packte es aus, riss die Klarsichtpackung auf, nahm die Teile heraus und stellte fest, was ich auch durch die durchsichtige Verpackung hätte feststellen können:
Es war das falsche. Nicht falsch versendet, falsch gekauft.

Nun bin ich Leser von Supportermilch und kenne also die Gegenseite auch ein wenig. Und ich wollte auch keiner dieser Kunden sein, die offensichtlich nicht lesen, was sie kaufen und sich danach beschweren.

Ich suchte also auf der Amazon-Seite herum, um herauszufinden, unter welchen Umständen Produkte zurückgenommen wurden, die vom Kunden falsch bestellt wurden, die Verpackung aber bereits geöffnet. Und ich fand: Nichts.
Also suchte ich nach einer Möglichkeit, den Händler zu kontaktieren, und nachzufragen, ob er geöffnete Waren auch dann zurück nimmt, wenn sie durch eigene Blödheit falsch gekauft wurden. Und ich fand: Nichts.

Der Händler war in diesem Fall Amazon. Niemand also, den ich damit besonders stark ärgern würde. Ich klickte also auf „Artikel zurücksenden oder ersetzen“, in der Hoffnung da irgendwie gefragt zu werden, wieso ich das Teil nun nicht mehr haben will. Nun, ich wurde gefragt. Im Dropdown-Menü konnte ich auswählen, was der Grund der Rücksendung ist. Ich wählte ehrlicherweise und weil nichts besser passendes vorhanden war, dass das Produkt inkompatibel und für meinen Zweck nicht nutzbar ist. Nach Absenden dachte ich, dass sich dann vielleicht jemand meldet, der nachfragt, was damit ist, ob es schon ausgepackt ist und so weiter. Dem war nicht so.

Die Weboberfläche teilte mir mit, dass mir der Betrag der Bestellung erstattet würde und ich das Produkt nicht zurücksenden müsse.

Es scheint also für Amazon günstiger zu sein, dem Kunden ein 10€-Produkt zu schenken, als sich mit ihm zu unterhalten und es zurücksenden zu lassen. Wieder was gelernt.

Sinnvolle Zivilschutzapp: Katwarn

Vor relativ kurzer Zeit fand ich auf irgendeiner Seite einen Link zu Katwarn, einem Katastrophenwarndienst. Die Warnungen wurden bisher per SMS verschickt, inzwischen gibt es aber eine App, die zu diesem Zweck am aktuellen Aufenthaltsort, sowie an frei speicherbaren weiteren Orten nach Warnungen vom Wetterdienst, lokalen Ämtern und Behörden und so weiter.

Gibt es nun für einen der gespeicherten Orte oder den Standort eine Warnung, wird der Nutzer per Benachrichtigungston und mehrmaliger Vibration auf die Gefahr aufmerksam gemacht.

Katwarn Unwetterwarnung für die aktuelle Position
Katwarn Unwetterwarnung für die aktuelle Position

Wenn man die Warnung nach oben wischt, kommen dann auch weitere Details zur Warnung, in diesem Falle die amtliche Unwetterwarnung.

Katwarn zeigt die Details der Warnung
Katwarn zeigt die Details der Warnung

Wer im aktuellen Gebiet Warnungen ausgibt, sieht man übrigens oben rechts im Bild, in meinem Fall der Deutsche Wetterdienst und der Landkreis Gießen.

Interessante App, die sicher vor Schaden schützen und warnen kann, in meinem Fall wusste ich also gestern beim Einkaufen schon, dass vermutlich die Polster der Gartenmöbel nass sein werden, wenn ich zuhause ankomme. War dann auch so.

Die App gibt es für iOS, Android und Windows.

Soft-SPS mit CODESYS auf dem RaspberryPi

3S veröffentlichte vor einiger Zeit ein Target samt Runtime für den RaspberryPi. Damit lässt sich auf dem RaspberryPi eine Soft-SPS installieren, welche über CODESYS 3.5 programmiert werden kann.

Eine Lizenz für die Runtime kostet 35€, jedoch kann man als bei 3S angemeldeter Nutzer eine vollwertige Version davon herunterladen, die ohne Lizenz nach 2 Stunden automatisch aus geht.
Die Runtime ist ausdrücklich nicht für den industriellen Gebrauch, sondern zu Test- und Lernzwecken vorgesehen. Wer also ein wenig mit SPS-Programmierung experimentieren möchte, kann das nun auf günstiger, echter Hardware tun.

Voraussetzungen

  • Sinnvollerweise benötigt man einen RaspberryPi, unterstützt sind laut Handbuch Version 1.x Modell A, B und B+, sowie Version 2 Modell B.
  • Der RaspberryPi soll ein funktionierendes Debian-Betriebssystem haben (also am Besten Raspbian). Über das vorinstallierte Konfigurationstool „raspi-config“ sollte die benutzte Partition auf die gesamte Speicherkarte ausgedehnt sein. Außerdem ist es sinnvoll, dem RaspberryPi eine statische IP zuzuweisen, um ihn im Netzwerk immer zu finden.
  • Auf dem Programmiercomputer wird CODESYS 3.5 benötigt, auf store.codesys.com kann man die Programmierumgebung nach Registrierung kostenlos herunterladen.
  • Ebenfalls auf dem Programmiercomputer benötigt man das Paket „CODESYS Control for Raspberry Pi SL“, welches ebenfalls kostenlos heruntergeladen werden kann.
  • Es wird ein SSH-Programm benötigt, für Windows bietet sich PuTTY an, Linux hat einen solchen Client eigentlich immer an Bord.

Übertragen der CODESYS Runtime auf den RaspberryPi

In CODESYS 3.5 wird nun im Reiter „Tools“ der Package-Manager aufgerufen, über „Installieren“ wird das heruntergeladene Paket installiert.

Installieren der RaspberryPi Targets über den Paketmanager
Installieren der RaspberryPi Targets über den CODESYS-Paketmanager

Danach sollte CODESYS neu gestartet werden.

Nun muss die Laufzeitumgebung noch auf dem RaspberryPi installiert werden. Dies geschieht wieder über den Reiter „Tools“ und den Menüpunkt „Update RaspberryPI“, hier muss nun die IP und die Zugangsdaten für den SSH-Zugriff auf den Raspberry eingegeben werden, nach dem Klick auf „OK“ wird die Software übertragen.

CODESYS Laufzeit auf den RaspberryPi übertragen
CODESYS Laufzeit auf den RaspberryPi übertragen

Der RaspberryPi muss nun einmal neu gestartet werden, danach läuft darauf die CODESYS-Runtime. Übrigens: Stoppen und starten kann man die Laufzeitumgebung mittels Initscript (ja, sie lässt sich darüber auch wieder starten, nachdem sie sich nach zwei Stunden beendet hat):

/etc/init.d/codesyscontrol start
/etc/init.d/codesyscontrol stop

Nun können wir ein neues Standardprojekt anlegen und als Zielsystem den RaspberryPi auswählen.

RaspberryPi als Zielsystem für das neue Projekt auswählen
RaspberryPi als Zielsystem für das neue Projekt auswählen

Per Doppelklick auf das „Device“ öffnet sich nun links ein Menü, in dem die Einstellungen für die Laufzeit auf dem Gerät vorgenommen werden können. Hier stellen wir nun die Verbindung zum RaspberryPi her, indem wir die IP eintippen und mit Enter bestätigen.
Hier werden nun weitere Einzelheiten des Gerätes angezeigt, wenn es denn online ist:

CODESYS 3.5 hat eine Verbindung zum RaspberryPi hergestellt
CODESYS 3.5 hat eine Verbindung zum RaspberryPi hergestellt

Nun kann das Programm PLC_PRG ganz normal geschrieben und übersetzt werden, durch Klick auf „Einloggen“ (das Zahnrad) oder Alt + F8 wird das Programm auf den RaspberryPi geladen.

Ähnliche Artikel

Wieso eigentlich ein neues Blog?

Seien wir mal ehrlich, es ist vieles eingeschlafen, was die deutschen Blogs angeht. Es wird nicht mehr bei den “kleinen“ gelesen, es kommen keine Kommentare mehr und verlinkt wird auch nicht.

Diese Eingeschlafenheit ist einer der Gründe, weshalb ich das fast eingeschlafene Blog wemaflo.net geschlossen habe und hier neu beginne. Etwas Themenorientierter und, das ist zumindest mein Plan, deutlich interaktiver. Damit meine ich nicht nur, dass ich um Kommentare bettele (was ich natürlich mache), sondern dass ich aktiv wieder beginnen werde, interessante Blogs zu lesen, zu verlinken und dort auch zu kommentieren. 

Ungefähr (ziemlich genau) steht auch im Artikel “Vernetzt Euch!“ im neu entdeckten Plaintron Blog, welches ich euch hiermit ans Herz lege (falls ihr an Elektronik-Bastelthemen interessiert seid).

Wer also weitere interessante Blogs kennt und liest (oder betreibt) kann mir gerne einen Kommentar da lassen (na, gemerkt?), ich lese und kommentiere eigentlich schon immer ziemlich gerne.

Und wenn ich ausreichend Zeit zur Verfügung habe bastle ich auch sehr gerne und blogge dann darüber…

 

Debian – Windows 10 in VirtualBox: Gasterweiterungen für bessere Integration installieren

Vor ein paar Tagen schrieb ich schon davon, wie Windows 7 in einer VirtualBox-VM unfallfrei auf das kürzlich erschienene Windows 10 aktualisiert werden kann, heute geht es darum, dieses Windows 10 möglichst Anwenderfreundlich nutzbar zu machen.

Denn wer eine laufende Windows 10 Instanz unter der VirtualBox-Version 4.3.x hat, wird feststellen, dass sich die Größe der virtuellen Maschine nicht an die Größe des VirtualBox-Fensters anpassen lässt, gemeinsame Ordner nicht verfügbar sind (also quasi mit dem Host geteilte Netzlaufwerke) und es auch sonst mit der Host-Integration nicht besonders weit her ist.

Das liegt daran, dass Windows 10 in der VirtualBox-Version 4.3.x noch nicht wirklich unterstützt wird und es auch keine funktionierenden Gasterweiterungen für Windows 10 gibt (die Gasterweiterungen stellen eine Art Treiberpaket für die Integration des Gastsystems in das Hostsystem dar).

Abhilfe schafft hier die Deinstallation der bisherigen VirtualBox-Software (Achtung: Nur deinstallieren, nicht vollständig entfernen, wir brauchen ja die Konfigurationen noch!) und die anschließende Installation von VirtualBox 5.0 aus den offiziellen Oracle-Quellen. Falls diese Quellen noch nicht Teil der Paketquellen des Rechners sind, sollten sie hinzugefügt werden:

deb http://download.virtualbox.org/virtualbox/debian jessie contrib

Der öffentliche Schlüssel für dieses Repository kann wie folgt installiert werden:

wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
VirtualBox 5.0 unterstützt Windows 10 offiziell
VirtualBox 5.0 unterstützt Windows 10 offiziell

Das neue VirtualBox-Paket unterstützt dann auch Windows 10 32bit und 64bit (kann in den Einstellungen der virtuellen Maschine geändert werden) und stellt die passenden und aktuellen Gasterweiterungen in der Windows-Maschine dann als virtuelles CD-Laufwerk zur Installation bereit.

VirtualBox 5.0: Gasterweiterungen und geteilte Ordner mit Windows 10
VirtualBox 5.0: Gasterweiterungen und geteilte Ordner mit Windows 10

Nach der Installation der Treiber können die gemeinsamen Ordner wieder verwendet werden, auch das Anpassen der Fenstergröße und die saumlose Mauszeigerintegration funktionieren einwandfrei.

(Ja, ich weiß, meine Platten sind bald voll…)

Feeds von florianmai.de

Per Kommentar wurde ich letztens darauf hingewiesen, dass ich doch bitte wieder Feeds anbieten soll.

Den Kommentar wollte ich nicht freischalten (er wurde im Impressum gepostet, wo ich eigentlich keine Kommentare haben will), daher hier nun die Antwort:

Natürlich gibt es auch hier weiterhin die Möglichkeit, das Blog im Feed zu lesen. Diese sind bisher nur noch nirgends verlinkt, was ich vorläufig hier mal nachhole:

Viel Spaß beim Lesen!

Was soll eigentlich der neue Spam per SMS?

Vielleicht gehts euch ja wie mir, ich habe in der letzten Zeit häufiger SMS mit offensichtlichem Spam-Inhalt bekommen. Meistens besteht der Inhalt aus einem kurzen Satz und einem Link, der einem irgendetwas verspricht.

Ich bekam bisher vor allem „Kontaktanfragen“ von gutaussehenden Damen (deren Aussage), die mich gerne kennenlernen wollten und mir zu diesem Zwecke einen Link zu ihrem Profil schickten.
Wie schon bei dermaßen plumpem E-Mail-Spam dachte ich mir auch hier bisher, dass da ja kaum jemand drauf klicken wird, doch das ist offensichtlich falsch.

Alex von 1337core hat einfach mal die Bitly-Statistiken zu einem solchen Link angesehen, bisher hat da ein Link knapp 17.500 Klicks, der Nutzer hat aber noch viele, viele andere Links in seinem Profil. In diesem Fall geht es offensichtlich darum, Benutzer mit Gewinnspielen auf eine Seite zu locken, um die Links zu maskieren wird eben der Link-Kürzer Bitly verwendet.

Mit bit.ly maskierter SMS-Spamlink
Mit bit.ly maskierter SMS-Spamlink

Falls ihr euch also mal wieder sagt „Das kann sich doch überhaupt nicht lohnen, da klickt eh niemand drauf“, wird die Antwort vermutlich „doch“ heißen.