Mühelose Remote-RS232/RS485-Konnektivität für PLCnext PLCs via Pseudo TTY
In diesem Maker's Blog-Artikel diskutieren wir die Möglichkeiten und Vorteile, die ein Com Server für die PLCnext-Plattform bietet.
Einführung
Die Erweiterungsmodule, die Phoenix Contact für seine PLCs anbietet, können beispielsweise serielle Adapter sein wie:
- AXL F RS UNI
- IB IL RS 232-PRO
- IB IL RS 485
- IB IL RS UNI
- …
Alle Erweiterungsmodule haben eines gemeinsam: Sie können zyklisch über Prozessdaten zugegriffen werden. Dies bietet die Möglichkeit, direkt mit dem seriellen Gerät aus unserer Echtzeitanwendung zu interagieren.
In manchen Fällen ist das nicht das, was wir wollen. Stattdessen möchten wir bestehende (C/C++)-Bibliotheken wiederverwenden und benötigen keinen Echtzeitkontext. Wir werden jedoch feststellen, dass diese Bibliotheken normalerweise so programmiert sind, dass sie direkten Zugriff auf eine COM- oder TTY-Schnittstelle haben.
Es gibt zwei Optionen, um eine TTY-Schnittstelle für einen PLCnext Control zu erstellen:
- Einige Funktionen (C++ / C#) implementieren, die eine TTY-Schnittstelle für die AXL- oder IL-Serial-Adapter aus dem
PLCnext Runtimeheraus erstellen. - Verwendung eines COM-Server-Geräts wie dem GW Device Server.
Der GW Device Server bietet eine transparente TCP-zu-Serial-Schnittstelle. Mit Hilfe eines Tools wie Socat können wir den Serial/TCP-Verkehr direkt an eine Pseudo-TTY-Schnittstelle weiterleiten. Die Verwendung des GW Device Server bietet auch die Möglichkeit, über einen TLS-verschlüsselten Kanal mit dem seriellen Gerät an entfernten Standorten zu kommunizieren.
HINWEIS
In diesem Tutorial fungiert der PLC als Client und stellt die Verbindung zu einem GW Device Server her.
(Es ist jedoch auch möglich, den PLC Socat auf eine Lausch-Option umzuschalten und den GW als Client aktiv mit dem PLC verbinden zu lassen.)
Setup
GW Device Server einrichten
Wir verbinden uns über das Web-Based Management mit dem GW Device Server. Die Standard-IP-Adresse des GW Device Server ist 192.168.254.254.
Wir verwenden die folgenden Einstellungen:
LAN-Einstellungen – Sicherheit
- SSH-Server aktivieren
- Telnet-Server aktivieren
- Secure Data Mode deaktivieren
- TFTP-Server deaktivieren
Serielle Einstellungen
- Port 1 Konfiguration (COM1): TCP-Verbindung auf Port 8000 aktivieren
- Port 2 Konfiguration (COM2): TCP-Verbindung auf Port 8001 aktivieren
GW Device Server testen
Um zu testen, ob wir den GW Device Server korrekt eingerichtet haben, verbinden wir zuerst unseren PLC per Ethernet mit dem GW Device Server. Dann verbinden wir die beiden DSUB-Adapter des GW Device Server miteinander.
Wir können das Setup schnell mit dem Tool Telnet testen. Mit diesem Tool können wir Daten vom PLC an den GW Device Server an Port 8000/COM1 über das serielle Kabel zu Port 8001/COM2 senden und schließlich am PLC wieder empfangen.
Wir verwenden die folgenden Befehle:
ssh admin@192.168.1.10
sudo passwd root
su root
ip addr add 192.168.254.10 dev eth0
telnet 192.168.254.254 8000
## weitere Shell-Sitzung öffnen
telnet 192.168.254.254 8001
# Einige Nachrichten eingeben
Socat bauen
Um Socat einfach auf einem Linux-OS zu bauen, verwenden wir die folgenden Befehle:
mkdir tmp
cd tmp
git clone git://repo.or.cz/socat.git
cd socat
## TODO: An Ihren SDK-Pfad anpassen
source /opt/pxc/release/axcf2152/2020/0/environment-setup-cortexa9t2hf-neon-pxc-linux-gnueabi
. /opt/pxc/release/axcf2152/2020/0/site-config-cortexa9t2hf-neon-pxc-linux-gnueabi
mkdir install
autoconf
./configure $CONFIGURE_FLAGS --prefix=$(pwd)/install --enable-openssl-method
make -j2
make install
Socat deployen und installieren
Um die Socat-Installation zu deployen, führen wir das folgende Skript aus:
cd tmp
mkdir -p deploy
cd deploy
mkdir -p usr
cp -r ../../Daemon/* .
cp -r ../socat/install/* usr/
# Paket erstellen
tar -cf ../socat-binaries.tar .
cd ..
scp socat-binaries.tar admin@192.168.188.41:~
ssh -ttt admin@192.168.188.41 \
"mkdir -p /opt/plcnext/socat-binaries && \
tar -xf /opt/plcnext/socat-binaries.tar -C /opt/plcnext/socat-binaries"
Nach dem Deployen können wir nun per SSH zu unserem PLC verbinden. Zuerst bereiten wir den PLC vor, indem wir die Verzeichnisse und Config-Dateien einrichten:
deploy$ ssh admin@192.168.1.10
admin@192.168.1.10:~$ su root
root@192.168.1.10$ mkdir -p /etc/default/socat
root@192.168.1.10$ touch /etc/default/socat/socat.conf
root@192.168.1.10$ touch /etc/init.d/SocatDaemon
Jetzt modifizieren wir die socat.conf-Datei, um die Parameter der seriellen Schnittstelle an unsere Bedürfnisse anzupassen.
nano /etc/default/socat/socat.conf
Der Inhalt der Datei sieht wie folgt aus.
TARGETIP="192.168.254.254"
TARGETPORT="8000"
TTYNAME="/dev/ttyGWDeviceServer"
OPTIONS="pty,link=$TTYNAME tcp-connect:$TARGETIP:$TARGETPORT,forever,interval=15"
BAUD="9600"
PARITY=""
DATABITS="cs8"
STOPBITS="-cstopb"
FLOWCONTROLL=""
Wenn wir weitere Parameter ändern müssen, müssen wir auch die SocatDaemon-Datei modifizieren. Weitere Informationen zu TTY-Parametern finden Sie in den stty-Manualseiten.
Nun erstellen wir eine SocatDaemon-Datei, um automatisch mit einem Socat-Daemon eine Verbindung zum GW Device Server herzustellen.
HINWEIS:
Diese SocatDaemon-Datei ist ein Beispiel ohne Fehler-/Trennungsmanagement etc. Bitte entsprechend anpassen.
nano /etc/init.d/SocatDaemon
Die Datei hat folgenden Inhalt. (Klicken zum Ein-/Ausblenden des Codes)
Da alle Config-Dateien an Ort und Stelle sind, können wir fortfahren, die Socat-Binaries einzurichten und den Socat-Daemon zu registrieren.
chmod +x /etc/init.d/SocatDaemon
cd /opt/plcnext/socat-binaries
chmod +x usr/bin/*
cp -r usr /
update-rc.d -s -v SocatDaemon 99
/etc/init.d/SocatDaemon start
Wenn alles korrekt eingerichtet ist, können wir den laufenden Daemon mit einem Befehl wie ps -e | grep socat sehen. Wir können auch die Socat-Logs unter cat /var/log/socat.log prüfen.
TTY-Schnittstelle vom Terminal aus zugreifen
Jetzt können wir Nachrichten über die TTY-Schnittstelle senden.
sudo echo "PLC to GW $var" > /dev/GWDeviceServer
Um die Pseudo-TTY kontinuierlich zu testen, können wir einen Befehl wie folgenden verwenden:
while true; do sleep 5 && sudo echo "PLC to GW $var" >/dev/ttyUSB0 && var=$((var+1)); done
Eingehenden Verkehr können Sie anzeigen, indem Sie cat /dev/GWDeviceServer ausführen. Jetzt kann jede Anwendung auf das serielle Gerät zugreifen, das mit dem GW Device Server verbunden ist, als wäre es direkt mit dem PLC verbunden.
Industrietechnik
- Industrielle SPS steuern Frequenzumrichter
- PCB-Via-Tenting erklärt: Vorteile, Prozess, Best Practices
- Cloud Monitoring: Fernsteuerungssystem für Echtzeit-Asset-Management
- 5 Schlüsselvorteile der ferngesteuerten Produktionskontrolle für die moderne Industrie
- Sicheren Remote-gRPC-Zugriff mit grpcurl auf PLCnext-Geräten
- PLCnext Control-Geräte mit SNMP optimieren: Praktischer Leitfaden
- Cluster-Management auf PLCnext: Kubernetes für die industrielle Automatisierung nutzen
- Echtzeit-Monitoring von PLCnext mit Tableau-Dashboards
- Power BI Dashboards aus PLCnext-Clouddaten erstellen
- Echtzeit-Grafana-Dashboards für PLCnext Control in Azure IoT Hub erstellen