CODESYS Virtual Safe Control SL per Kommandozeile verwalten
Für die Verwaltung und Bedienung der CODESYS Virtual Safe Control SL auf einem Linux-Gerät kann direkt über die Kommandozeile mit der VirtualControlAPI interagiert werden.
Die VirtualControlAPI ist ein Python-basiertes Kommandozeilenwerkzeug zur Verwaltung der CODESYS Virtual Safe Control SL auf Linux-Systemen und wird ebenfalls vom CODESYS Control SL Deploy Tool verwendet.
Vorraussetzungen
Ein Gerät mit Linux-basiertem Betriebssystem
Python 3 (>= 3.9)
Das Skript
VirtualControlAPI.py
VirtualControlAPI.py zu erlangen:Möglichkeit 1 (empfohlen):
Installieren Sie, falls noch nicht geschehen, das Package CODESYS Virtual Control for Linux SL zu Ihrer CODESYS-Installation auf Windows hinzu. Danach finden Sie das Skript
VirtualControlAPI.pyim Verzeichnis<CODESYS installation directory>\CODESYS Virtual Control for Linux SL\Delivery\virtuallinux\VirtualControlAPI.py.Möglichkeit 2:
Laden Sie das Package CODESYS Virtual Control for Linux SL aus dem Store herunter und entpacken Sie das Package
.package(beispielsweise CODESYS Virtual Control for Linux SL 4.18.0.0.package) mit einem beliebigen ZIP-Programm. Im entpackten Verzeichnis finden Sie das SkriptVirtualControlAPI.pyunter:Delivery\virtuallinux\VirtualControlAPI.py.
Bedienung
Das Python-Skript VirtualControlAPI.py muss gegebenenenfalls mit root-Privilegien ausgeführt werden. Mit dem Skript werden unter anderem Änderungen an Container-Registrys vorgenommen und Namensräume der Netzwerkadapter modifiziert.
sudo python3 VirtualControlAPI.py <command>
Über folgendes Kommando können Sie eine Hilfe zu allen möglichen Optionen, Parameter und Beschreibungen ausgeben:
sudo python3 VirtualControlAPI.py --help
Typischer Workflow
Importieren eines Container-Images in die lokale Registry
Um ein Image in die Registry zu laden, verwenden Sie den Befehl
--import-imageund übergeben den Namen der.tar.gz-Datei, in der sich das Image befindet. Dadurch wird das Image in die lokale Registry überführt.Beispiel 5. Beispiel:sudo python3 VirtualControlAPI.py --import-image Docker_codesyscontrol_virtuallinux_4.19.0.0_amd64.tar.gz
Um zu sehen, welche Images bereits in der lokalen Registry vorhanden sind, verwenden Sie den Befehl:
sudo python3 VirtualControlAPI.py --list-images
Es werden nur Images angezeigt, die die Kriterien der
VirtualControlAPIerfüllen.Erstellen einer Instanz
Um eine Runtime-Instanz zu erzeugen, wird folgender Befehl verwendet:
sudo python3 VirtualControlAPI.py --add-instance <instance name>
Wenn Sie eine EdgeGateway-Instanz oder eine Safe-Runtime-Instanz erstellen wollen, geben Sie dies am Ende des Kommandos an.
udo python3 VirtualControlAPI.py --add-instance <instance name> --safety sudo python3 VirtualControlAPI.py --add-instance <instance name> --gateway
Dies ist notwendig, da die verschiedenen Instanztypen mit unterschiedlichen Standardkonfigurationen und Standardparametern ausgestattet sind.
Konfigurieren der Instanz
Um die erstellte Instanz zu konfigurieren, ist es ratsam, zunächst die möglichen Konfigurationsparameter einzusehen. Hierfür stellt nachfolgender Befehl die Konfigurationsdatei in formatierter Form dar:
sudo python3 VirtualControlAPI.py --get-configuration <instance name>
Die unter
CONFIG_KEYaufgelisteten Parameter sind in der Regel alle konfigurierbar und können mit dem nachfolgendem Befehl bearbeitet werden:sudo python3 VirtualControlAPI.py --configure <instance name> [set/add/remove] <CONFIG_KEY> <value>
setüberschreibt den aktuellen Wertaddfügt Werte hinzuremoveenfernt den akutellen Wert
In der Regel wird für einen ersten Start lediglich das Setzen des
CONFIG_KEY-Image benötigt. Führen Sie dafür folgenden Befehl aus und ersetzen das Image durch das passende Image. Sie können alle Images mit dem Befehl--list-imagesanzeigen.Beispiel 6. Beispielsudo python3 VirtualControlAPI.py --configure <instance name> set Image codesyscontrol_virtuallinux:4.19.0.0
Wichtig
Damit eine Instanz konfiguriert werden kann, muss sie sich im gestoppten Zustand befinden.
Starten/Stoppen der Instanz
Über die Option
--runwird die Instanz gestartet werden, während sie mit--stopgestoppt wird.sudo python3 VirtualControlAPI.py --run <instance name> sudo python3 VirtualControlAPI.py --stop <instance name>
Für weitere Informationen zu den Optionen und Exitcodes führen Sie den Befehl sudo python3 VirtualControlAPI.py --help aus.
Beispiel Szenario "The Safe House" via Scripting
Die folgenden Teilskripte beschreiben unter anderem, wie das Szenario "The Safe House" über die VirtualControlAPI erreicht werden kann.
Wichtig
Im Artikel "The Safe House" werden weitere technische Aspkete beleuchtet, die für das Betreiben einer sicheren Steuerung relevant sind. Bitte konsultieren Sie diese Hilfeseite, sowie die Sicherheitsdokumentation des Herstellers des Gerätes für sämtliche Sicherheits- oder Zertifizierungsinformationen.
Vorbereitungen
Um das Skript VirtualControlAPI.py, sowie die aktuellsten Versionen der Images der CODESYS Virtual Control for Linux SL zu erhalten, folgen Sie den Anweisungen aus dem Schritt Vorraussetzungen aus dem vorherigem Kapitel. Wiederholen Sie Ihr Vorgehen für CODESYS Virtual Safe Control SL, um die Images für CODESYS Virtual Safe Control SL sowie CODESYS Virtual Safe Time Provider SL herunterzuladen. Die Container-Images finden Sie, je nach Methode, in folgenden Verzeichnissen:
Möglichkeit 1:
Die Container-Images liegen als
tar.gz-Datei in folgendem Verzeichnis:<CODESYS installation directory>\CODESYS Virtual Control for Linux SL\Delivery\<product>\<CODESYS installation directory>\CODESYS Virtual Safe Control SL\Delivery\<product>\Möglichkeit 2:
Die Container-Images liegen als
tar.gz-Datei in folgendem Verzeichnis des CODESYS-Packages:Delivery\<product>\Möglichkeit 3 - Scripting:
Möglichkeit 2 kann auch durch die Verwendung von Skripten erreicht werden. Sehen Sie dazu folgendes Beispielskript zum Download und Entpacken des CODESYS-Package sowie zum Pushen der Images auf die Infrastruktur Ihrer Firma.
Tipp
Bitte beachten Sie die Lizenzbedingungen zur Nutzung einer CODESYS-Software.
DownloadUnpackPush.cmd@echo off setlocal EnableDelayedExpansion REM ===== Configuration ===== set ZIP_URL_vControl=https://store.codesys.com/ftp_download/3S/VirtualLinuxSL/000138/4.18.0.0/CODESYS%%20Virtual%%20Control%%20for%%20Linux%%20SL%%204.18.0.0.package set ZIP_URL_vSafe=https://store.codesys.com/ftp_download/3S/VirtualSafeSL/000139/4.18.0.0/CODESYS%%20Virtual%%20Safe%%20Control%%20SL%%204.18.0.0.package set ZIP_FILE_vControl=%TEMP%\CODESYS Virtual Control for Linux SL 4.18.0.0.package set ZIP_FILE_vSafe=%TEMP%\CODESYS Virtual Safe Control SL 4.18.0.0.package set DEST_DIR=C:\ExtractedFiles set "vControlDir=%DEST_DIR%\vControl" set "vSafeDir=%DEST_DIR%\vSafe" set "REGISTRY=example.registry.com" REM ===== Create destination folder ===== if not exist "%vControlDir%" mkdir "%vControlDir%" if not exist "%vSafeDir%" mkdir "%vSafeDir%" REM ===== Download ZIP ===== curl -L --ssl-no-revoke --no-keepalive --retry 5 --retry-delay 2 -o "%ZIP_FILE_vControl%" "%ZIP_URL_vControl%" curl -L --ssl-no-revoke --no-keepalive --retry 5 --retry-delay 2 -o "%ZIP_FILE_vSafe%" "%ZIP_URL_vSafe%" REM ===== Extract ZIP ===== "C:\Program Files\7-Zip\7z.exe" x "%ZIP_FILE_vControl%" -o"%vControlDir%" -y "C:\Program Files\7-Zip\7z.exe" x "%ZIP_FILE_vSafe%" -o"%vSafeDir%" -y REM ===== load images to docker and push to registry ===== for /f "tokens=3 delims=: " %%I in ('docker load -i "%vControlDir%\Delivery\virtuallinux\Docker_codesyscontrol_virtuallinux_4.18.0.0_amd64.tar.gz"') do ( docker tag %%I %REGISTRY%/%%I docker push %REGISTRY%/%%I ) for /f "tokens=3 delims=: " %%I in ('docker load -i "%vControlDir%\Delivery\edgeamd64\Docker_codesysedge_edgeamd64_4.18.0.0_amd64.tar.gz"') do ( docker tag %%I %REGISTRY%/%%I docker push %REGISTRY%/%%I ) for /f "tokens=3 delims=: " %%I in ('docker load -i "%vSafeDir%\Delivery\linuxsafei386\Docker_codesyssafecontrol_linuxsafei386_4.18.0.0_i386.tar.gz"') do ( docker tag %%I %REGISTRY%/%%I docker push %REGISTRY%/%%I ) for /f "tokens=3 delims=: " %%I in ('docker load -i "%vSafeDir%\Delivery\linuxsafetimeprovider\Docker_codesyssafetimeprovider_linuxsafetimeprovider_4.18.0.0_amd64.tar.gz"') do ( docker tag %%I %REGISTRY%/%%I docker push %REGISTRY%/%%I ) echo Done. endlocal pause
Zusätzliche Vorbereitung:
Laden Sie auf gleichem Weg die Packages für CODESYS License Server for Linux SL und CODESYS CodeMeter for Linux SL herunter.
Da CODESYS Virtual Control for Linux SL nur über eine Netzwerklizenzierung lizensiert werden kann, werden diese beiden Packages für die Lizenzierung benötigt. Für einen Testaufbau ist dieser Schritt nicht notwendig, aber empfohlen und in den folgenden Skripten berücksichtigt.
Übertragen des Skriptes, der debian-Pakete und der Container-Images auf die Steuerung
Für eine Einzelanwendung können Sie die einzelnen Dateien aus den CODESYS-Packages direkt auf die Zielgeräte übertragen. Beispielsweise mit pscp:
pscp -pw password <PathToDockerImage.tar.gz> user@<IP>:~/
Wenn die Container-Images, VirtualControlAPI.py und gegebenenfalls nötige debian-Packages auf einem internen Server oder eine interne Container-Registry geladen wurden, können Sie diese auch direkt von dort beziehen.
#!/bin/bash docker pull example.registry.com/codesyscontrol_virtuallinux:4.18.0.0 docker pull example.registry.com/codesyssafecontrol_linuxsafei386:4.18.0.0 docker pull example.registry.com/codesysedge_edgeamd64:4.18.0.0 curl my-server-url/VirtualControlAPI.py -o VirtualControlAPI.py
Skript für automatisches Setup des Szenarios "The Safe House"
Anmerkung
Folgende Skripte dienen lediglich als Beispiel. Sie müssen gegebenenfalls Anpassungen an der Version, den Netzwerkadaptern, der IP-Addressen, etc. machen.
In den folgenden Beispielen wird angenommen, dass die einzelnen Dateien nach dem Entpacken aus dem CODESYS-Package direkt auf die Steuerung übertragen wurden. Passen Sie die Skripte entsprechend Ihres Anwendungsfalles an.
Linux-Host-PC 2
Navigieren Sie in das Verzeichnis, in dem sich die VirtualControlAPI.py sowie die .tar.gz-komprimierten Container-Images befinden. Passen Sie das folgende Skript an Ihre Gegebenheiten an und führen Sie es aus.
SetupExample_LinuxHostPC2.sh
#!/bin/bash # load images into registry docker load -i Docker_codesyssafetimeprovider_linuxsafetimeprovider_4.18.0.0_amd64.tar.gz # create timeprovider instance and configure python3 VirtualControlAPI.py -a timeprovider --timeprovider python3 VirtualControlAPI.py -c timeprovider set Image codesyssafetimeprovider_linuxsafetimeprovider:4.18.0.0 python3 VirtualControlAPI.py -c timeprovider set GenericCommands -e TARGET_IP=10.0.0.4 -e TARGET_PORT=60000 python3 VirtualControlAPI.py -r timeprovider
Linux-Host-PC
Navigieren Sie in das Verzeichnis, in dem sich die VirtualControlAPI.py sowie die .tar.gz-komprimierten Container-Images befinden. Passen Sie das folgende Skript an Ihre Gegebenheiten an und führen Sie es aus.
SetupExample_LinuxHostPC.sh
#!/bin/bash # load images into registry docker load -i Docker_codesyscontrol_virtuallinux_4.18.0.0_amd64.tar.gz docker load -i Docker_codesysedge_edgeamd64_4.18.0.0_amd64.tar.gz docker load -i Docker_codesyssafecontrol_linuxsafei386_4.18.0.0_i386.tar.gz dpkg -i codemeter-lite_8.30.6885.501_amd64.deb dpkg -i codesyslicenseserver_licenseserver_4.18.0.0_all.deb # create runtime instance and configure python3 VirtualControlAPI.py -a vPLC python3 VirtualControlAPI.py -c vPLC set Image codesyscontrol_virtuallinux:4.18.0.0 python3 VirtualControlAPI.py -c vPLC set Ipc shareable python3 VirtualControlAPI.py -c vPLC set LicenseServer 10.0.0.4 # create edge gateway instance and configure python3 VirtualControlAPI.py -a vGateway --gateway python3 VirtualControlAPI.py -c vGateway set Image codesysedge_edgeamd64:4.18.0.0 # create safe runtime instance and configure python3 VirtualControlAPI.py -a vSafePLC --safety python3 VirtualControlAPI.py -c vSafePLC set Image codesyssafecontrol_linuxsafei386:4.18.0.0 python3 VirtualControlAPI.py -c vSafePLC set Ipc container:vPLC python3 VirtualControlAPI.py -c vSafePLC set Dependencies vPLC python3 VirtualControlAPI.py --run-all
Nach Ausführung der Skripte auf den jeweiligen Rechnern sind die Instanzen nach dem Vorbild des Szenarios konfiguriert und befinden sich im Zustand Running. Damit sind alle notwendigen Geräte fertig vorbereitet. Die weiteren Schritte zur Erstellung eines Projekts und Einbindung von PROFIsafe sind in der Dokumentation CODESYS Safety Extension beschrieben.
Skript für Update der Laufzeitinstanzen
Für ein Versionsupgrade der einzelnen Instanzen sind nur wenige Befehle erforderlich. Durch das Stoppen, Ändern des Container-Images und erneute Starten der Instanzen bleiben sämtliche anderen Einstellungen erhalten. Sie profitieren jedoch von allen Neuheiten und Verbesserungen der neuen Version.
Stellen Sie die Images so auf dem Gerät bereit, wie Sie es in den vorherigen Schritten getan haben.
UpgradeVersions.sh
#!/bin/bash # load images into registry docker load -i Docker_codesyscontrol_virtuallinux_4.19.0.0_amd64.tar.gz docker load -i Docker_codesysedge_edgeamd64_4.19.0.0_amd64.tar.gz docker load -i Docker_codesyssafecontrol_linuxsafei386_4.19.0.0_i386.tar.gz # stop all instances. If only selective instances should be upgraded, use python3 VirtualControlAPI.py -s <instance name> to only stop specific instances python3 VirtualControlAPI.py --stop-all # configure new images for instances python3 VirtualControlAPI.py -c vPLC set Image codesyscontrol_virtuallinux:4.19.0.0 python3 VirtualControlAPI.py -c vGateway set Image codesysedge_edgeamd64:4.19.0.0 python3 VirtualControlAPI.py -c vSafePLC set Image codesyssafecontrol_linuxsafei386:4.19.0.0 # start all instances python3 VirtualControlAPI.py --run-all
Fehlerbehebung
Fehler | Symptom | Ursache | Lösung |
|---|---|---|---|
Permission denied / Zugriffsfehler | Fehlermeldung: | Das Skript benötigt erhöhte Rechte, beispielsweise für Zugriff auf Container Registry, Systempfade und Änderungen am Namespacing der Netzwerkadapter. | Führen Sie den Befehl mit sudo python3 VirtualControlAPI.py <command> |
Image wird nicht in der Registry angezeigt |
| Das Image ist nicht kompatibel. Nur Images, die bestimmte CODESYS-Kriterien erfüllen, werden angezeigt. | Prüfen Sie, ob es ein offizielles CODESYS Virtual Control SL Image ist. |
Der Import wurde abgebrochen. | Führen Sie den Import erneut durch. sudo python3 VirtualControlAPI.py --import-image | ||
Falscher Dateiname / beschädigte Datei | Validieren, ob | ||
Instanz bleibt beim Start hängen | Timeout oder endloser Startversuch | Fehlkonfiguration der Netzwerke | Image prüfen |
Fehlendes oder inkorrekter Image-Tag | Konfiguration validieren | ||
Container Runtime (beispielsweise Podman/Docker) nicht gestartet | Container-Umgebung neu starten |