Service-Kabel z.B. für Wago-Controller sehr günstig „selbst gemacht“

In einem meiner letzten Beiträge schrieb ich noch darüber, wie das Kommunikations-Kabel von Wago (ein USB-Kabel mit proprietärem Stecker für die Service-Schnittstelle auf diversen Controllern) unter Virtualbox genutzt werden kann und auch, dass es sich eigentlich nur um einen USB-zu-TTL-Adapter handelt.

Patrik stellte per Kommentar die Frage, ob man dann nicht auch statt des teuren Kabels einen normalen USB-zu-TTL-Adapter nutzen kann. Natürlich kann man.

Wer also statt des etwa 50€ teuren Kabels, das dann an 364 Tagen im Jahr irgendwo in einer Kiste verstaubt, lieber einen kleinen USB-Adapter für 2€ nutzen möchte, kann das problemlos tun.

USB-zu-TTL-Converter FTDI FTD1232 am Service-Port einer Wago 750-841
Einfacher USB-zu-TTL-Converter an einer Wago 750-841

Ich habe hier einen FTDI-Adapter für 2,20€ aus China, der per Mini-USB (da musste ich erstmal nach einem Kabel suchen, alles Micro-USB inzwischen) an den Computer angeschlossen wird. Er wird erkannt als:

ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

Benötigt werden die Pins VCC, GND, TX und RX. Die Belegung am Wago-Controller ist von oben nach unten:

  • TxD
  • RxD
  • +5V
  • GND
Pinout der Wago-Service-Schnittstelle
Pinout der Wago-Service-Schnittstelle

TxD und RxD werden logischerweise mit TX und RX verbunden, jedoch üblicherweise gekreuzt (was natürlich darauf ankommt, ob der genutzte Adapter auf der „Pin-Seite“ noch 1:1 belegt ist), VCC wird mit +5V verbunden, GND mit GND.

Pinout des FTDI USB-zu-TTL-Adapters
Pinout des FTDI USB-zu-TTL-Adapters

Das wars, mehr ist nicht zu tun. Das Kabel wird unter Windows beispielsweise in den Wago Ethernet Settings erkannt und kann zur Kommunikation genutzt werden.

Das Low-Cost Kabel wird in den Ethernet Settings erkannt und kann zur Kommunikation genutzt werden
Der USB-zu-TTL-Adapter in den Ethernet Settings

Selbst gemacht steht übrigens aus dem Grund in Anführungszeichen, weil man ja hier nicht wirklich etwas selbst macht, außer einen FTDI-Adapter zu kaufen und anzuschließen.

HTML5-Visualisierungen auch mit CoDeSys 2.3

CoDeSys in der Version 2.3 (also der klassischen Version, die unter anderem von den meisten WAGO-Controllern ausschließlich unterstützt wird) bringt eine eigene Webvisualisierung mit. Die Visu kann über CoDeSys zusammengesetzt werden, sie wird mit dem Programmdownload auf den Controller übertragen.

Das Problem daran: Die Visu besteht aus einem Java-Applet, das von manchen Browsern überhaupt nicht ausgeführt wird, unter anderem von Chrome oder mobilen Browsern.

CODESYS 3.5 bringt eine neue Visualisierung auf HTML5-Basis mit, die deutlich besser funktioniert. Jedoch laufen die „klassischen“ WAGO-Controller nicht mit CODESYS 3.5, wer nicht gerade einen PFC200 oder PFC100 einsetzt, wird davon nichts sehen.

Es gibt ein Projekt namens WebVisu auf sourceforge, das sich dieses Problems annimmt. Es stellt auf dem integrierten Webserver der Controller eine HTML5-Visu bereit, die mit CoDeSys 2.3 zusammenarbeitet und in wenigen Schritten auf den Controller „installiert“ werden kann.

Installiert insofern in Anführungszeichen, als dass diese Installation lediglich aus dem Kopieren einer einzelnen HTML-Datei auf den Controller besteht. Laut Wiki ist WebVisu kompatibel mit der WAGO 750-841 und dem Beck IPC, zufällig besitze ich einen uralten Controller 750-841 bei dem leider die Buskontakte nicht mehr besonders zuverlässig sind, aber zum Testen reicht es allemal.
Vermutlich funktioniert die Visu auch bei den anderen 750-8xx Controllern mit CoDeSys-WebVisu, davon habe ich allerdings kein Gerät zum spielen.

Die WebVisu.html wird einfach auf dem Controller unter /webserv abgelegt und ist danach unter der IP des Controllers unter /webserv/WebVisu.html zu finden.

Die Visualisierung wird unter CoDeSys ganz normal erstellt, das JAVA-Applet ist nachher auch problemlos nutzbar. Die HTML5-WebVisu ist nur zusätzlich vorhanden.

Zum Test habe ich einfach einen inkrementierenden Wert auf eine 8-fach Ausgangsklemme geschrieben und diesen Wert außerdem in der Visu als Zahlenwert, als LED-Zustand und als Kreisdiagramm dargestellt. Außerdem habe ich noch einen Toggle-Taster mit einer booleschen Variable eingefügt, um auch diesen Fall testen zu können.
Direkt in CoDeSys sieht das so aus:

Webvisualisierung und ST-Programm in CoDeSys 2.3
Webvisualisierung und ST-Programm in CoDeSys 2.3

In Chrome fehlt das Kreisdiagramm, generell werden neben dynamischen Formen wie dem Kreissegment auch Tabellen und Skalen nicht angezeigt. Vermutlich fehlen diese Darstellungen in der HTML5-WebVisu einfach:

HTML5 WebVisu in Chrome auf dem Desktop
HTML5 WebVisu in Chrome auf dem Desktop

Auf dem Smartphone wird die WebVisu quasi identisch dargestellt:

HTML5 WebVisu in Chrome auf einem Android Smartphone
HTML5 WebVisu in Chrome auf einem Android Smartphone

Die Bedienung der Schaltfläche funktioniert übrigens einwandfrei, sowohl im Desktop-Browser als auch auf dem Smartphone und die Grafikaktualisierung ist ziemlich flott und ohne Ruckeln.

Alles in allem also eine sehr passende Lösung für Leute, die eine einfache Webvisualisierung unter CoDeSys 2.3 erstellen wollen, die auch ohne JAVA-Applet und damit auch auf mobilen Geräten bedienbar ist.

WAGO USB Service Cable unter Linux in einer Virtualbox benutzen

Um mit SPS-Komponenten zu kommunizieren gibt es verschiedene Wege und fast alle führen zum Ziel. Bei bestimmten Einstellungsarbeiten oder Firmware-Updates ist es aber sinnvoll, die meistens vorhandene Service-Schnittstelle der Controller zu nutzen.

Jeder Hersteller bietet Service-Kabel an, die zu den eigenen Schnittstellen passen, die Kabel sind natürlich immer unterschiedlich.
Auch WAGO bietet ein „WAGO USB Service Cable“ an. Für Windows gibt es einen speziellen Treiber für dieses Kabel, für Linux nicht. Ich bin mir ziemlich sicher, dass dieser Artikel auch auf Siemens S7 und LOGO, sowie auf die meisten anderen SPS-Hersteller anwendbar ist, davon habe ich allerdings keine Altgeräte zum Basteln da.

Ich bin mir sicher, außer mir gibt es noch viele andere SPS-Menschen, die Zuhause Linux nutzen und zum Herumprobieren eine Virtuelle Maschine mit Windows laufen haben, in der die Entwicklungsumgebung läuft. Das Kommunikationskabel läuft allerdings in z.B. Virtualbox nicht ohne nachzuhelfen, wobei es sich wirklich um eine Kleinigkeit handelt.
Denn: Auch wenn jeder Hersteller ziemlich teure Kommunikationskabel in verschiedenen Ausführungen anbietet, eines haben sie gemeinsam: Es sind ziemlich stinknormale USB (oder RS232) auf TTL Konverter, die unter Debian als ttyUSB erkannt werden. Es muss lediglich der Virtualbox-Benutzer in die Gruppe dialout aufgenommen werden, damit er es benutzen darf:

usermod -aG dialout BENUTZERNAME

In der Virtualbox erscheint es bei installiertem Windows-Treiber dann ganz normal in der USB-Geräte-Auswahl:

WAGO USB Service Cable in den USB-Geräten von Virtualbox
WAGO USB Service Cable in den USB-Geräten von Virtualbox

Aktiviert man es dort, kann man es beispielsweise in den WAGO Ethernet Settings als Kommunikationsschnittstelle nutzen:

Virtualbox: WAGO USB Service Cable in den Ethernet Settings
Virtualbox: WAGO USB Service Cable in den Ethernet Settings

Temperatursensor DS18B20 unter Linux per Pythonscript abfragen

Vor ein paar Tagen habe ich eine kurze Übersicht über die Benutzung der OneWire-Schnittstelle in CODESYS 3.5 auf dem Raspberry Pi veröffentlicht. Inzwischen habe ich per Mail von mehreren Lesern die Frage nach einer funktionierenden Lösung mit Python bekommen, daher möchte ich das noch schnell hinterher schieben.

Aufbau

Um das ganze noch ein kleines Bisschen spannender zu machen, sind dieses Mal drei Sensoren gleichzeitig angeschlossen. Auf dem Breadboard sieht das so aus:

Drei Temperatursensoren DS18B20 parallel an einer "Sensorleitung"
Drei Temperatursensoren DS18B20 parallel an einer „Sensorleitung“

Schnell in gEDA abgezeichnet sieht es so aus:

Drei DS18B20 parallel als Schaltbild
Drei DS18B20 parallel als Schaltbild

Man sieht also, die Sensoren können parallel geschaltet werden, der Widerstand wird nur ein Mal benötigt.

Wenn, wie im oben bereits verlinkten Artikel die Kernelmodule über den Device Tree geladen sind (/boot/config.txt), sollten die drei Sensoren danach im Verzeichnis /sys/bus/w1/devices/ sichtbar sein, hier gibt es wieder für jeden Sensor einen Ordner, der mit seiner eindeutigen ID benannt ist:

Die Ordner der drei Sensoren, benannt nach der jeweiligen ID
Die Ordner der drei Sensoren, benannt nach der jeweiligen ID

Wie schon im ersten Artikel können auch hier die Werte mit der Datei w1_slave ausgegeben werden:

root@raspberrypi:/sys/bus/w1/devices/28-0216009b68ff# cat w1_slave 
2f 01 4b 46 7f ff 0c 10 a7 : crc=a7 YES
2f 01 4b 46 7f ff 0c 10 a7 t=18937

So weit waren wir beim letzten Mal auch schon, jetzt gehts ans Python-Script.

Programm erstellen

Zuerst müssen wir die bis dahin ja noch nicht existente Datei mit dem Editor unserer Wahl öffnen. Ich mag nano, öffne die Datei also mit

nano temp.py

Um das Programm später mit dem richtigen Interpreter direkt ausführen zu können, müssen wir jetzt im Shebang python als ebendiesen nennen, danach legen wir fest, welche Bibliotheken geladen werden sollen:

#!/usr/bin/env python
import os, time, sys

Um Fehlern aus dem Wege zu gehen, laden wir nun noch die Kernelmodule, die wir nutzen möchten:

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

Am Anfang des Programmes legen wir nun noch ein paar Werte als Variablen fest, die wir später benutzen können. Ich habe als sensorcount die Anzahl des Sensoren angegeben, unter sensors die Kennung der drei Sensoren als Array, unter sensorpath den Pfad zu den Geräteverzeichnissen als String und unter sensorfile den Namen der Datei ebenfalls als String:

sensorcount = 3
sensors = ['28-0216009b68ff', '28-021600b769ff', '28-021600bb4dff'];

sensorpath = '/sys/bus/w1/devices/'
sensorfile = '/w1_slave'

Nun erstellen wir die Funktion, die die Sensordaten abfragt und verarbeitet:

def callsensor(sensor):
  f = open(sensorpath + sensor + sensorfile, 'r')
  lines = f.readlines()
  f.close()
  if lines[0].strip() [-3:] != 'YES':
    sys.exit('Fehler bei Sensor ' + sensor)
  temp_line = lines[1].find('t=')
  if temp_line != -1:
    temp_output = lines[1].strip() [temp_line+2:]
    temp_celsius = float(temp_output) / 1000
    return temp_celsius

Die Funktion öffnet die Gerätedatei im Lesemodus, schreibt den Inhalt auf lines und schließt sie dann wieder. Die Variable sensor wird dabei später als Parameter beim Funktionsaufruf mitgegeben.
Zeile 1 wird nun auf die letzten drei Zeichen gekürzt und geprüft, ob diese „YES“ sind, also ob die Prüfsumme des Sensors okay ist. Wenn nicht, wird das Programm mit einer Fehlermeldung abgebrochen.
Nun wird der Index (also die Position) des Strings t= in der zweiten Zeile ermittelt. Ist diese nicht -1 (das gibt find zurück, wenn nichts gefunden wurde), wird Zeile 2 auf die Zeichen nach t= gekürzt (das ist der fünfstellige Temperaturwert des Sensors), der Wert wird durch 1000 geteilt und wir erhalten so den Wert in °C. Die Funktion wird dann beendet und der Temperaturwert zurückgegeben.

Nun fehlt nur noch der Teil, der die Funktion beim Aufruf des Programms ausführt und die Werte an stdout (also momentan die Konsole) zurückgibt:

for i in range(0, sensorcount):
  s = sensors[i]
  print('Sensor ' + str(i) + ': ' + str(callsensor(s)))
sys.exit()

Hier haben wir eine for-Schleife, die die Funktion callsensor für jeden Sensor einmal aufruft und die Sensor-ID aus dem Array als Parameter an callsensor übergibt. Das Ergebnis wird ausgegeben und das Programm wird beendet.

Das Programm müssen wir nun nur noch speichern. Um es ausführen zu können, müssen wir es noch ausführbar machen:

chmod +x temp.py

Wenn wir es nun in der Konsole ausführen, bekommen wir drei Ausgaben für unsere Sensoren:

root@raspberrypi:~/tutorials/temperatur# ./temp.py
Sensor 0: 18.437
Sensor 1: 19.937
Sensor 2: 20.062

Zum Schluss hänge ich die Programmdatei (übrigens kommentiert) hier an: Python-Programm temp.py

Raspberry Pi: 1-Wire Temperatursensor 18B20 auslesen unter Linux und CODESYS

Wer sich mal etwas mit dem kostengünstigen verdrahten moderner Häuser oder Wohnungen auseinander gesetzt hat, wird schon auf den 1-Wire oder OneWire Bus gestoßen sein. Dieser Bus ermöglicht es, mit einem geringen Verdrahtungsaufwand zum Beispiel Sensoren an ein Gerät anzuschließen. Es werden mindestens zwei Adern benötigt, besser drei oder vier, es können jedoch mehrere Sensoren parallel angeschlossen werden.

Ein sehr beliebter Sensor ist der Temperatursensor 18B20 bzw. DS18B20, er misst die Temperatur auf 0,5°C genau und gibt diese als tausendstel aus, 21,5°C zeigt der Sensor also als 21500 an. Die Messung wird über eine Prüfsumme validiert.

1-Wire am Raspberry Pi aktivieren

Der Raspberry Pi bringt einen 1-Wire-Bus mit, der über die GPIO-Pins läuft. Der Bus mus jedoch zuerst eingeschaltet werden, dies geschieht über die Datei /boot/config.txt, hier muss eine Zeile mit folgendem Inhalt eingetragen werden:

dtoverlay=w1-gpio

Dies aktiviert im Device Tree die 1-Wire-Schnittstelle auf dem Standard-GPIO-Pin, also Pin 7. Nach dieser Änderung muss ein Neustart durchgeführt werden, der Bus ist nun aktiv.

DS18B20 an den Raspberry Pi anschließen

Der Sensor hat drei Beinchen. Schaut man auf die abgeflachte Seite mit der Beschriftung, ist das linke Beinchen die Nummer 1 und damit GND (also 0V), das mittlere die Nummer 2 und damit DQ (die Datenleitung) und das rechte Beinchen ist die Nummer 3 und stellt die Versorgungsleitung VCC (3,3V) dar.

Belegung der Pins des DS18B20
Belegung der Pins des DS18B20

In diesem Beispiel schließen wir den DS18B20 mit drei Adern an die 3,3V Versorgungsspannung des Raspberry Pi an. Bei größeren Leitungslängen empfiehlt es sich, für die Versorgungsspannung 5V zu nehmen und den Widerstand von DQ auf eine separate Ader mit 3,3V zu ziehen. Zum Testen reicht dieser Aufbau aber allemal.

So wird der Sensor DS18B20 an die GPIO-Pins des Raspberry Pi angeschlossen
So wird der Sensor DS18B20 an die GPIO-Pins des Raspberry Pi angeschlossen

Die Verkabelung kann entweder fliegend verlötet werden, oder aber (etwas eleganter und einfacher) auf einem Breadboard aufgesteckt werden. Ich tat letzteres, wenn auch wegen akuten Jumperwire-Mangels nicht besonders ordentlich:

Der DS18B20 auf dem Breadboard, verbunden mit dem Rsspberry Pi
Der DS18B20 auf dem Breadboard, verbunden mit dem Rsspberry Pi

Sensordaten abfragen im Linux-Terminal

Jeder Sensor hat eine einmalige Kennung, unter dieser Kennung wird auch ein Geräteordner unter /sys/bus/w1/devices angelegt. In meinem Falle hat der Sensor die Kennung 28-021600bb4dff, daher ist der Geräteordner /sys/bus/w1/devices/28-021600bb4dff. In diesem Ordner befindet sich die Gerätedatei w1_slave. Lässt man sich diese Datei beispielsweise mit cat ausgeben, wird der Sensor abgefragt und die Checksumme, sowie die Temperatur ausgegeben:

Die Ausgabe der Gerätedatei des DS18B20
Die Ausgabe der Gerätedatei des DS18B20

Stimmen beide Checksummen überein, ist das Ergebnis plausibel und hinter der crc steht „YES“. Im Fehlerfall würde dort „NO“ stehen. In der zweiten Zeile wird die Temperatur angezeigt, teilt man diesen Wert durch 1000 kommt man auf die Temperatur in °C, bei mir also 20,125°C.

Das ist eigentlich schon alles. Diese Datei kann man natürlich über Scripte oder Programme auslesen und weiter verwenden.

Sensordaten abfragen unter CODESYS

Seit längerem gibt es ja von 3S die CODESYS Laufzeit für den Raspberry Pi, eine meiner Meinung nach für Privatanwender und Bastler schöne Lösung in die Automatisierung einzusteigen, ohne hohe Ausgaben für „echte“ SPS-Hardware zu haben.

Über CODESYS auf dem Raspberry Pi habe ich schon zwei Artikel verfasst. Im ersten Artikel wird unter anderem erklärt, wie die Laufzeit auf dem Gerät installiert wird und wie eine Verbindung zum Raspberry Pi hergestellt wird, im zweiten geht es eher um die Python-Bibliothek Pymodbus, die die Modbus-Kommunikation zum Beispiel zwischen einem Raspberry Pi und einem Controller mit CODESYS ermöglicht.

Wir benötigen also einen Raspberry Pi mit installierter CODESYS Laufzeit, sowie dem angeschlossenen und funktionierenden Sensor wie oben beschrieben.

Im CODESYS legen wir ein neues Projekt an und wählen als Zielsystem den Raspberry Pi.

CODESYS Projekt anlegen für DS18B20 auf Raspberry Pi
CODESYS Projekt anlegen für DS18B20 auf Raspberry Pi

Nachdem das Programm angelegt ist, baut sich automatisch die Struktur auf und man sieht auch schon den Punkt für 1-Wire (bzw. Onewire).

Zunächst muss eine Verbindung zum Raspberry Pi hergestellt werden, dafür werden per Doppelklick auf den Raspberry die Geräteeinstellungen geöffnet und die IP des Gerätes eingetragen (und die Zugangsdaten, falls nicht zuvor schon einmal geschehen). Wenn die Verbindung grün angezeigt wird, ist alles in Ordnung.

CODESYS verbinden mit dem Raspberry Pi im Device Manager
CODESYS verbinden mit dem Raspberry Pi im Device Manager

Nun kann mit der Konfiguration des 1-Wire Sensors begonnen werden. Per Rechtsklick auf den Eintrag „Onewire“ öffnet sich das Kontextmenü, hier wird über den Menüpunkt „Gerät anhängen“ das Gerät „Onewire_master“ angehängt.

Das Gerät Onewire_master anhängen
Das Gerät Onewire_master anhängen

Auf die selbe Art wird nun noch der Sensor DS18B20 angehängt: Rechtsklick auf Onewire_master, Gerät anhängen, DS18B20 auswählen.

Nun sind alle Geräte vorhanden, die benötigt werden. Der Sensor muss nun noch Parametriert werden, die Gerätekennung muss eingetragen werden. Hierzu öffnet man das Device per Doppelklick und trägt im Reiter „1-wire bus Parameter“ in der Spalte „Wert“ die Kennung ein, die eben schon in der Konsole angezeigt wurde, bei mir also 28-021600bb4dff. Das ganze als String, also in Hochkommata ‚.

Der Sensor DS18B20 wird parametriert, die Gerätekennung wird eingetragen.
Der Sensor DS18B20 wird parametriert, die Gerätekennung wird eingetragen.

Das war eigentlich schon alles, der Sensor sollte nun im Programm benutzbar sein. Den Temperaturwert kann man recht einfach nutzen, indem man den String rTemp des Sensors ausliest und beispielsweise auf eine Variable schreibt. Der Wert rTemp ist ein REAL, die Variable muss also auch den Typ REAL haben.

Der Temperaturwert wird über rTemp ausgelesen.
Der Temperaturwert wird über rTemp ausgelesen.

Im laufenden Programm sieht das ganze dann so aus:

Die Livedaten des DS18B20 werden im laufenden Programm angezeigt.
Die Livedaten des DS18B20 werden im laufenden Programm angezeigt.

Eigentlich recht simpel. Da mehrere Sensoren parallel angeschlossen werden können, kann man so einfach die Temperatur in einem ganzen Haus messen und dank der HTML5-WebVisu von CODESYS 3.5 auch optisch ansprechend im Netzwerk abrufbar machen. Eine Heizungssteuerung wäre natürlich auch ein guter Anwendungszweck.

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?

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