OPC UA (Open Platform Communications Unified Architecture) ist ein leistungsfähiges und flexibles Protokoll, das eine große Bedeutung in der modernen Automatisierungstechnik bzw. der Industrie 4.0 hat, weil es Vernetzung und Datenaustausch zwischen verschiedenen Systemen und Geräten unterstützt.  

Merkmale

  • Interoperabilität: OPC UA unterstützt die Kommunikation zwischen Geräten und Systemen verschiedener Hersteller.
  • Plattformunabhängigkeit: OPC UA ist plattformunabhängig und kann auf verschiedenen Betriebssystemen und Hardwarearchitekturen implementiert werden.
  • Sicherheit: OPC UA unterstützt integrierte Sicherheitsfunktionen, einschließlich Authentifizierung, Autorisierung, Verschlüsselung und Datenintegrität.
  • Modularität: Das Protokoll ist modular. Es unterstützt damit verschiedene Anforderungen und Anwendungsfälle mit einfachen und komplexen Datenstrukturen.
  • Echtzeitkommunikation: OPC UA unterstützt sowohl synchronisierte als auch asynchrone Datenübertragung um, z.B. Daten in "Echtzeit" zu übertragen.

OPC UA Protokollstapel
OPC UA - Protokollstapel (OPC Unified Architecture – Wikipedia   04.04.2025)



Konfigurieren des OPC UA-Servers

Voraussetzung für die Aktivierung des OPC-Servers ist eine S7 1200 ab Firmwareversion 4.4 oder eine S7 1500.
Im Falle eines Firmware Update muss das TIA-Portal ab Version 16 zur Verfügung stehen.

Aktivieren des OPC UA-Servers

Der OPC UA-Servers muss aktiviert werden (nur möglich bei S71200 ab Firmwareversion 4.4 oder bei S7 1500):

Aktivieren des OPC UA-Servers

Aktivieren des OPC UA-Servers


Projekt schützen

Das Projekt mit einem Kennwort geschützt werden, um die Benutzerverwaltung und Authentifizierung zu aktivieren:
Der Projektschutz kann nicht deaktiviert werden. Administratorname und Kennwort nicht vergessen, sonst ist der Zugriff auf das Projekt nicht mehr möglich! Es ist besser vorher eine Sicherheitskopie anzulegen!

Projekt schützen

Projekt mit Kennwort schützen

Einheitlicher Vorschlag
BN: prjAdmin
KW: prjAdmin123

Gastzugang sperren und Benutzer anlegen

Aus Sicherheitsgründen wird der anonyme Gastzugang des OPC UA-Servers gesperrt und ein Benutzer mit starkem Kennwort angelegt:

Benutzer anlegen für OPC UA-Zugang

Benutzer anlegen für OPC UA-Zugang


Serverschnittstelle konfigurieren

Damit der OPC UA-Server die Variablen des Programms und deren Inhalte kommuniziert, muss die OPC UA-Serverschnittstelle konfiguriert werden. Nur OPC UA-Elemente, auf die auch tatsächlich zugegriffen werden soll, werden der OPC UA-Serverschnittstelle hinzugefügt. Die OPC UA-Elemente werden einfach per Drag and Drop in die Serverschnittstelle hinübergezogen.
Anschließend wird die OPC UA-Schnittstelle aussagekräftig umbenannt (hier: Server-Schnittstelle_Motorsteuerung):

OPC UA-Serverschnittstelle konfigurieren

OPC UA-Serverschnittstelle konfigurieren

Einheitlicher Vorschlag
BN: opcUser
KW: opcUser123


Zertifikatsmanager konfigurieren

Zertifikatsmanager aktivieren

Der globale Zertifikatsmanager wird aktiviert, um später eigene generierten Zertifikate und Schlüssel verwalten und exportieren zu können. Dabei gehen eventuell vorhandene OPC UA-Zertifikate verloren.

Globalen Zertifikatsmanager aktivieren

Globalen Zertifikatsmanager aktivieren


Zertifikate ausstellen

Da jetzt keine Zertifikate mehr vorhanden sind, werden zwei neue Zertifikate mit dem Zertifikatsmanager erzeugt. Eines ist für den Server (S7-1200) und eines für den Client (Python-Anwendung).

Eigentlich wird nicht Zertifikate, sondern jeweils Schlüsselpaare bestehend aus einem privaten Schlüssel und einem Zertifikat (dem öffentlichen Schlüssel) erzeugt. Die Bezeichnung "Gerätezertifikate" ist daher eigentlich nicht ganz korrekt.


Zertifikate ausstellen

Zertifikate ausstellen

Erzeugung des Zertifikats für den Server - die S7-1200 SPS

Im folgenden Dialog, wird bei "Verwendungszweck" OPC UA-Server ausgewählt und ein aussagekräftiger Name bei "Zertifikatsinhaber" gewählt (hier: PLC-19/OPCUA-Server). Alle anderen Parameter belässt man am besten beim Vorschlag des TIA Portals.

Server-Zertifikat erzeugen

Server-Zertifikat erzeugen

Nun muss dieses Zertifikat in den Einstellungen der SPS als Server-Zertifikat für den OPC UA-Server ausgewählt werden:

Auswählen des OPC UA-Server Zertifikats

Auswählen des OPC UA-Server Zertifikats

Erzeugung des Zertifikats für den Client - das Python-Programm

Erneut wird der Zertifikatsmanager aufgerufen (Allgemein → Schutz & Security → Zertifikatsmanager) und ein Zertifikat hinzugefügt:

Diesmal wird bei "Verwendungszweck" OPC UA-Client ausgewählt und ein anderer Name bei "Zertifikatsinhaber" eingetragen (hier: PLC-19/OPCUA-Client).
Beim alternativen Namen für Namen des Zertifikatsinhabers SAN (subject alternative name) wird bei URI (universal/uniform resource identifier)  urn:freeopcua:client eingetragen:

Client-Zertifikat erzeugen

Client-Zertifikat erzeugen

Security Policity auswählen

Im TIA Portal werden die Security Policys (Sicherheitsrichtlinien) ausgewählt, die ein Client einhalten muss, damit der Aufbau der Verbindung vom OPC UA-Server akzeptiert wird. Security Policys spezifizieren die verwendeten Algorithmen der Kryptographie (Verschlüsselung), Signierung (Unterzeichnung) und Schlüsselableitung).

Der OPC-Server (SPS) gibt beim Verbindungsaufbau diejenigen Security Policys bekannt, die er akzeptiert. Der Client wählt die sicherste aus, der er noch verarbeiten kann. Je sicherer eine Verschlüsselung ist, um so mehr Rechenleistung muss für die Verschlüsselung und Entschlüsselung zur Verfügung stehen.

"Keine Security" ist im Produktivbetrieb NICHT aktiviert, sonst kann eine Verbindung mitgelesen und Daten manipuliert werden.
Auch die beiden ersten Security Policys, die auf einer 128 Bit-RSA Verschlüsselung basieren, sind heute überholt, gelten als nicht mehr sicher genug und sollten nicht mehr zugelassen werden.

Hier wurde nur die sicherste Option ausgewählt. Die Rechenleistung des OPC UA-Clients ist hier ausreichend (Computer).

Auswahl der Security Policys

Auswahl der Security Policys


Konfiguration in das Gerät laden

Falls beim Laden der Konfiguration ein Fehler beim Kompilieren mit der Meldung: "Die ausgewählte OPC UA-Lizenz ist nicht ausreichend. Um OPC UA zu verwenden, erwerben Sie die korrekte Lizenz und wählen Sie diese aus." auftritt, einfach die Fehlermeldung anklicken und die gültige Runtime-Lizenz kann ausgewählt werden. (Wenn Sie denn erworben wurde! 😉).

An der Werner-von-Siemens-Schule in Frankfurt konfigurieren Sie den Automation License Manager entsprechend!

Runtime-Lizenz für den OPC UA-Server auswählen

Runtime-Lizenz für den OPC UA-Server auswählen


Falls auch der Fehler "Das Zertifikat, das für die Secure PG/PC- und HMI-Kommunikation und zum Schutz vertraulicher PLC-Konfigurationsdaten verwendet wird, fehlt." beim Übersetzen auftritt. Muss erst wieder ein entsprechendes Zertifikat für die Kommunikation mit dem TIA-Portal erzeugt werden. (Das alte wurde beim Aktivieren des globale Zertifikatsmanagers gelöscht.)

Zertifikat für die Kommunikation mit dem TIA-Portal erzeugen
Zertifikat für die Kommunikation mit dem TIA-Portal erzeugen

Dabei können  die Voreinstellungen  belassen werden:

Zertifikat für die Kommunikation mit dem TIA-Portal erzeugen
Zertifikat für die Kommunikation mit dem TIA-Portal erzeugen


Client-Zertifikat vorbereiten

  1. Das Client-Zertifikat muss exportiert werden.
  2. Dann wird dieser Zertifikatcontainer mit OpenSSL in den privaten Schlüssel und das Zertifikat (öffentlicher Schlüssel) konvertiert.
  3. Das Client-Zertifikat wird vom Pythonprogramm genutzt.

Client-Zertifikat exportieren

Der Zertifikatsmanager wird über die Security-Einstellungen aufgerufen (Security-Einstellungen → Schutzfunktionen→ Zertifikatsmanager), im Reiter "Gerätezertifikate" werden die Zertifikate angezeigt. Das Client-Zertifikat wird ausgewählt und mit einem Rechten-Maus-Klick öffnet sich Als Container für das Zertifikat wird PKCS12 ausgewählt. Da der private Schlüssel und das Zertifikat (öffentliche Schlüssel) enthalten sind, muss ein Kennwort für den Export eingegeben, um das komplette Archiv zu schützen.


Client-Zertifikat exportieren

Client-Zertifikat exportieren


Zertifikat konvertieren

Das Zertifikat wurde mit der Dateiendung .p12 exportiert. Mit dem Konsolenprogramm openssl werden nun eine Datei mit dem Zertifikat und eine weitere Datei mit dem privaten Schlüssel im PEM-Format (Privacy-enhanced electronic mail) extrahiert:

openssl pkcs12 -in PLC-1OPCUA-Client.p12 -out PLC-1OPCUA-Client_cert.pem -clcerts -nokeys -password pass:YourPassword
openssl pkcs12 -in PLC-1OPCUA-Client.p12 -out PLC-1OPCUA-Client_key.pem -nocerts -nodes -password pass:YourPassword

Danach wird die Zertifikatsdatei in das binäre DER-Format (Distinguished Encoding Rules) konvertiert:

openssl x509 -outform der -in PLC-1OPCUA-Client_cert.pem  -out PLC-1OPCUA-Client_cert.der

Aschließend werden URI und IP-Adresse des Servers überprüft:

openssl x509 -in PLC-1OPCUA-Client_cert.der -inform der -text -noout

URI in Zertifikat überprüfen

URI und IP in Zertifikat überprüfen

URI ist urn:freeopcua.client
Daher wird naheliegenderweise wird im weiteren die Python-Bibliothek opcua-asyncio verwendet, die früher freeopcua hieß.

Man sieht die IP-Adresse die der SPS im TIA Portal zugewiesen wurde. Sollte die IP-Adresse der SPS nochmal verändert werden, dann muss dieses für den Client bestimmte Zertifikat neu erzeugt werden, sonst lässt sich keine Verbindung mit dem OPC UA-Server der SPS aufbauen.

OPC UA-Verbindung testen

Die Python3-Bibliotheken müssen vorab installiert werden:

pip3 install asyncua opcua-client

Wenn ev. weitere Abhängigkeiten (z.B.: pyQt) bestehen, müssen weitere Pakete nachinstalliert werden.

OPC UA-Client starten

Zum Testen der Verbindung wird der FreeOpcUA Client gestartet, indem er mit

opcua-client

von der Konsole gestartet wird.

Falls das nicht funktioniert, kann die ausführbare Datei auch hier heruntergeladen werden:

https://moodle.eick-at.de/pluginfile.php/1134/mod_page/content/48/opcua-client.exe

OPC UA-Client konfigurieren

Die URL wie folgt aufgebaut:

opc.tcp://opcUser:Kennwort@IP-Adresse:Portnummer

Hier in diesem Projekt wurden folgende Einstellungen gewählt:

opc.tcp://opcUser:asdUIZFD5367478!!@192.168.178.25:4840

Mit der Schaltfläche "Connect options" können die Sicherheitsparameter festgelegt werden:

Festlegen der Verbindungsoptionen

Festlegen der Verbindungsoptionen

OPC UA-Verbindung testen und Werte von Knoten auslesen und verändern

Sollte sich die Verbindung in Folge eines Timeout (Zeitlimit überschritten) nicht herstellen lassen, so kann temporär und testweise unter Gerätekonfiguration → Eigenschaften → Allgemein → OPC UA → Server → Security → Security Channel die Security Policy "Keine Security" aktiviert werden. Im Produktivbetrieb darf die Security Policy "Keine Security" aus Sicherheitsgründen NICHT aktiv sein.

Nach dem Herstellen der Verbindung wird zur Serverschnittstelle navigiert und die Attribute angezeigt und entsprechend verändert werden, indem die "Refresh"-Schaltfläche angeklickt wird:

Motor einschalten: WebStart True => Motorschütz True
Motor ausschalten: WebStop False => Motorschütz False

OPC UA-Client
OPC UA-Client


Eigenes Python3-Programm als OPC UA-Client

Verlief der Verbindungstest erfolgreich, und wurden die interessanten NodeId notiert, kann ein einfaches Testprogramm geschrieben werden, mit dem der Motor des Beispielprogramm ein- bzw. ausgeschaltet werden kann (RemoteControlPLC/PythonOpcClient at main · ateachment/RemoteControlPLC · GitHub):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from asyncua.sync import Client, ua
import settings

#Benutzer verbinden
client = Client(settings.SERVER_ADDRESS,timeout=20)
client.set_security_string(settings.SECURITY_STRING)

try:
    client.connect()
    print("Verbindung hergestellt")
    # Knoten über die Knoten-ID holen
    WebStartNode = client.get_node('ns=4;i=3')
    WebStopNode = client.get_node('ns=4;i=4')
    MotorschützNode = client.get_node('ns=4;i=5')
    MotorschutzschalterNode = client.get_node('ns=4;i=6')

    # Deklaration von Unified Architekture - Variablen
    on = ua.DataValue(ua.Variant(True, ua.VariantType.Boolean))
    off = ua.DataValue(ua.Variant(False, ua.VariantType.Boolean))
    
    # Motorschütz EIN
    WebStartNode.write_value(on)
    # Motorschütz AUS
    WebStopNode.write_value(off)

    WebStart = WebStartNode.get_value()
    WebStop = WebStopNode.get_value()
    Motorschutzschalter = MotorschutzschalterNode.get_value()
    Motorschütz = MotorschützNode.get_value()
    print("WebStart: " + str(WebStart))
    print("WebStop: " + str(WebStop))
    print("Motorschütz: " + str(Motorschütz))
    print("Motorschutzschalter: " + str(Motorschutzschalter))
finally:
    client.disconnect()

Eigenes Python3-Programm als OPC UA-Client

Zeile 1: Die Bibliothek asyncua.sync wird importiert.

Zeile 5: Das Client-Objekt wird erzeugt. Sollte es beim Herstellen der Verbindung einen Timeout geben, kann der Wert des Parameters timeout erhöht werden.

Zeilen 12-15: Knoten werden geholt, indem die NodeId übergeben wird.

Zeilen 18-19: Variablen im Unified Architecture - Format werden erzeugt

Zeilen 20 bzw. 22: Diese ua-Variablen werden in den entsprechenden WebStart- bzw. WebStop-Node geschrieben umd den Motorschütz zu aktivieren bzw. zu deaktivieren.

Zeilen 26-29: Die Werte der Knoten werden geholt.

Zeilen 30-33: Die Werte der Knoten werden ausgegeben. Da es sich dabei um den Datentyp bool handelt, müssen sie mit str() erst in eine Zeichenkette umgewandelt werden, damit sie gemeinsam mit der vorangesetzten Bezeichnung ausgegeben werden können.



Quellen:

OPC Unified Architecture – Wikipedia   (04.04.2025)

https://johanneskinzig.de/index.php/software-development/30-communication-between-simatic-s7-1500-and-python-using-opc-ua-sign-encrypt  (03.11.2020)

Last modified: Thursday, 24 April 2025, 10:29 AM