OPC UA

Das OPC UA Plugin stellt zwei GInOut-Hardwaretypen bereit, mit denen die GInOut-Datenblöcke einer Station über OPC UA ausgetauscht werden können:

  • OPC UA Server: Veröffentlicht die GInOut-Datenblöcke als Variablen im OPC-UA-Adressraum. Fremde Clients (SPS, SCADA, Leitsystem, …) lesen und schreiben darüber die Daten der Station. Dies ist der eigentliche Anwendungsfall.

  • OPC UA Client: Verbindet sich mit einem fremden OPC-UA-Server und hält je Datenblock einen lokalen Puffer aktuell. Dient als Test-/Simulator-Gegenstelle zum Server bzw. zum Anbinden eines vorhandenen OPC-UA-Servers.

Bemerkung

Das Plugin liegt als eigenständiger, entnehmbarer Ordner <exe>\Plugins\OpcUaPlugin\ neben der Anwendung (Plugin-DLL, GInOutPlugin.xml und der mitgelieferte OPC-UA-Stack der OPC Foundation). Ordner entfernen bedeutet Hardwaretyp entfernen. Das Plugin kann alternativ pro Projekt unter <Projekt>\Plugins bereitgestellt werden.

OPC UA Server

  1. Type: OPC UA Server

  2. ID: ID vergeben

  3. Name suffix: Steuerung benennen

  4. Create: Button drücken, um das Objekt zu generieren

  5. DisplayName: Steuerung benennen

In den Einstellungen der Server-Hardware stehen folgende Parameter zur Verfügung:

  • Port [Default 4840]: TCP-Port des OPC-UA-Endpoints.

  • ApplicationName [Default Viper.NET OPC UA Server]: Anwendungsname für die ApplicationDescription, den Endpoint-Pfad und das Zertifikats-Subject.

  • ApplicationUri [Default urn:gefasoft:viper:opcuaserver]: Application-URI für die ApplicationDescription und das Instanzzertifikat.

  • EnableBasic256Sha256 [Default false]: Bietet zusätzlich die sichere SecurityPolicy Basic256Sha256 (Sign & Encrypt) an. Der unverschlüsselte, anonyme Endpoint (None) ist immer verfügbar. Siehe Sicherheit / Zertifikate.

  • AutoAcceptUntrustedCertificates [Default false]: Akzeptiert Client-Zertifikate automatisch, statt sie manuell vom rejected- in den trusted-Store zu verschieben.

  • CertificateStorePath [Default %ProgramData%\Gefasoft\OpcUa\pki]: Wurzelverzeichnis des PKI-Stores. Umgebungsvariablen werden aufgelöst (z.B. %ProgramData% oder %VIPER_PROJECT_DIR%).

  • AdditionalBaseAddresses [Default leer]: Semikolon-getrennte Liste zusätzlicher Hostnamen/IPs, die der Server den Clients ankündigt (z.B. eine extern erreichbare NAT-Adresse). Der eigene Rechnername wird immer automatisch ergänzt.

  • ExposedVariableLists [Default leer]: Semikolon-getrennte Namen von GInOut-Variablenlisten, deren Variablen zusätzlich als benannte, typisierte Nodes exponiert werden (siehe Adressraum). Leer = keine Variablen. Änderungen wirken erst nach einem Neustart des Servers.

Zusätzlich zeigt der Eigenschaftendialog schreibgeschützte Statuswerte an: EndpointUrl (opc.tcp://localhost:<Port>/OpcUaServer), AdvertisedAlternateAddresses, SessionCount und IsRunning.

Adressraum

Der Datenblock-Dialog des Servers entspricht dem Standard (ID, Name, Länge); es gibt keine protokollspezifischen Zusatzfelder. Aus jedem Datenblock wird eine Variable im Adressraum erzeugt:

  • Ordner DataBlocks unter Objects, Namespace urn:gefasoft:viper:opcuaserver.

  • Je Datenblock eine ByteString-Variable:

    • NodeId = numerisch, i=<DataBlockId> im Server-Namespace.

    • BrowseName / DisplayName = Name des Datenblocks.

    • DataType = ByteString mit der Länge des Datenblocks (in Byte).

    • AccessLevel = Lesen und Schreiben. Ein Schreibzugriff muss exakt die festgelegte Länge liefern.

Sind in ExposedVariableLists Listennamen eingetragen, entsteht zusätzlich ein Ordner Variables mit der Struktur Variables/<Listenname>/<Variable>. Dort wird jede Variable der genannten Listen als typisierte Node angeboten (bool→Boolean, int→Int32, float→Float, double→Double, string→String, byte[]→ByteString, Arrays als 1D-Array). Diese Variablen sind lediglich eine typisierte Sicht auf dieselben Bytes, die roh bereits im DataBlocks-Ordner sichtbar sind.

Bemerkung

Der Server startet erst, sobald der GInOutManager initialisiert ist und die Variablenlisten geparst hat. Änderungen an den Listen werden erst nach einem Server-Neustart wirksam.

OPC UA Client

  1. Type: OPC UA Client

  2. ID: ID vergeben

  3. Name suffix: Steuerung benennen

  4. Create: Button drücken, um das Objekt zu generieren

  5. DisplayName: Steuerung benennen

In den Einstellungen der Client-Hardware stehen folgende Parameter zur Verfügung:

  • EndpointUrl [Default opc.tcp://localhost:4840/OpcUaServer]: Endpoint-URL des anzubindenden OPC-UA-Servers.

  • UseBasic256Sha256 [Default false]: Verwendet die SecurityPolicy Basic256Sha256 statt None.

  • RemoteNamespaceUri [Default urn:gefasoft:viper:opcuaserver]: Namespace-URI, die beim Verbinden in den tatsächlichen Namespace-Index aufgelöst wird. Daraus werden die Standard-NodeIds (i=<DataBlockId>) abgeleitet, sofern ein Datenblock keine explizite RemoteNodeId besitzt.

  • ReconnectCycleTimeMs [Default 5000]: Zeit in [ms] zwischen Reconnect-Versuchen, solange keine Verbindung besteht.

  • UseSubscription [Default false]: Hält die Datenblöcke über eine echte OPC-UA-Subscription (Server-Push) aktuell statt über Polling. Siehe Warnung unten.

  • PollIntervalMs [Default 200]: Zeit in [ms] zwischen den Lesezyklen, die bei UseSubscription=false den lokalen Puffer aktuell halten.

  • SubscriptionPublishingIntervalMs [Default 200]: PublishingInterval der OPC-UA-Subscription in [ms] (bei UseSubscription=true); bewusst getrennt vom Poll-Intervall.

  • CertificateStorePath [Default %ProgramData%\Gefasoft\OpcUa\pki_client]: Wurzelverzeichnis des PKI-Stores des Clients (Umgebungsvariablen werden aufgelöst).

  • MirrorToVariableList [Default leer]: Name einer GInOut-Variablenliste, in die im Variablen-Browser ausgewählte Server-Variablen als typisierte, datenblocklose Variablen gespiegelt (bidirektional synchron gehalten) werden. Leer = keine Spiegelung. Die Liste wird bei Bedarf angelegt; die Änderung wirkt beim nächsten Verbindungsaufbau.

Als schreibgeschützte Statuswerte zeigt der Dialog IsConnected und LastError. Über die Schaltfläche OPC UA Mirror-Variablen aus Server-Browser… lässt sich die Zielliste festlegen und der verbundene Server nach Variablen durchsuchen, die als Spiegel-Variablen hinzugefügt bzw. entfernt werden.

Datenblöcke

Der Datenblock-Dialog des Clients enthält neben ID, Name und Länge das Feld:

  • RemoteNodeId [Default leer]: Optionale explizite NodeId auf dem Server (z.B. ns=2;i=123). Leer = es wird i=<DataBlockId> im über RemoteNamespaceUri aufgelösten Namespace verwendet (identisch zum Standardschema des OPC UA Servers).

Über den Variablen-Browser des Dialogs (Update list) wird der Adressraum des Servers durchsucht; mit Set werden NodeId und aktuelle Byte-Länge der ausgewählten Variable in RemoteNodeId bzw. Length übernommen.

Warnung

UseSubscription: Der Subscription-Modus hat gegen den mitgelieferten OPC UA Server dieser Codebasis in der aktuellen SDK-Version einen serverseitigen Absturz (BadServerHalted) ausgelöst. Der Standard- und empfohlene Modus ist Polling (UseSubscription=false). Den Subscription-Modus vor produktivem Einsatz sorgfältig testen.

Sicherheit / Zertifikate

Der CertificateStorePath zeigt auf die PKI-Wurzel mit den Unterordnern own / trusted / issuer / rejected. Beim ersten Start wird automatisch ein Instanzzertifikat erzeugt.

  • Default Server: %ProgramData%\Gefasoft\OpcUa\pki

  • Default Client: %ProgramData%\Gefasoft\OpcUa\pki_client

Der unverschlüsselte, anonyme Endpoint (None) ist immer verfügbar. Für einen sicheren Betrieb wird am Server EnableBasic256Sha256=true gesetzt; dann bietet er zusätzlich die verschlüsselten Endpoints (Sign & Encrypt) an. Beim ersten sicheren Verbindungsversuch legt der Server ein unbekanntes Client-Zertifikat im rejected-Store ab und lehnt ab. Um dem Client zu vertrauen, wird sein Zertifikat von rejected\certs nach trusted\certs verschoben; alternativ akzeptiert AutoAcceptUntrustedCertificates=true unbekannte Zertifikate automatisch (nur für Test- bzw. geschlossene Netze empfohlen).

Bemerkung

Als Authentifizierung wird ausschließlich Anonymous unterstützt (optional zusätzlich abgesichert über Basic256Sha256); eine Anmeldung mit Benutzername/Passwort gibt es nicht.

Siehe auch