Konzept
Einführung
Die Konzepte, die jede Client-Entwicklung mit dem OPC UA .NET SDK voraussetzt: Verbindungsaufbau, Verbindungsparameter, Endpunkte und Sicherheit.
Konzept
Einführung
Die Verbindung zum Server
Verbinden
Das passiert beim Aufruf der Methode Connect:
- Der Client prüft, ob eine Serveradresse festgelegt ist (Eigenschaft
ServerAddress). Wenn sie fehlt, löstConnecteineInvalidOperationExceptionaus. - Der Client ändert seinen Status (Eigenschaft
OpcClient.State) auf den WertConnecting. Wenn sich der Client nicht im StatusCreatedoderDisconnectedbefindet, bleibt der Aufruf ohne Wirkung. - Der Client prüft seine Konfiguration auf Gültigkeit und Schlüssigkeit.
- Anschließend sucht der Client einen passenden Endpunkt (engl. Endpoint). Dazu verwendet er die Klasse
OpcDiscoveryClient. Er vergleicht die Endpunkte mit der gewünschten Endpunktkonfiguration und wählt den Endpunkt aus, der der Konfiguration entspricht oder zumindest genügt. Nach welchen Kriterien der Client einen Endpunkt auswählt, hängt von seinen Einstellungen ab. Die Kriterien beschreibt der Abschnitt Verbindungsparameter. - Danach erstellt der Client die Konfiguration für eine neue Sitzung.
- Der Client prüft die Instanzzertifikate:
- das Zertifikat des Clients (je nach verwendeter Sicherheitskonfiguration)
- das Zertifikat des Servers (das Zertifikat, das der Endpunkt bereitstellt)
- Schließlich erstellt der Client einen Channel, der als Verbindung zwischen Client und Server dient.
- Über den Channel versucht der Client, eine Sitzung zu erstellen.
- Nachdem weitere Sitzungsdaten ausgetauscht und geprüft sind, aktiviert der Client die Sitzung.
- Der Client ruft die verfügbaren Namespaces ab.
- Der Client richtet die Überwachung der Verbindung ein:
- KeepAlive-Tracking, um Verbindungsabbrüche zu erkennen
- Notification-Tracking, um Benachrichtigungen zu empfangen
- Wenn die Auflösung von Datentypen aktiviert ist (zum Beispiel über
OpcClient.UseDynamic), lädt der Client noch das Typsystem des Servers. - Der Client ändert seinen Status (Eigenschaft
OpcClient.State) auf den WertConnected.
Wenn einer der Schritte fehlschlägt, kehrt der Client in seinen vorherigen Status zurück.
Trennen
Das passiert beim Aufruf der Methode Disconnect:
- Der Client ändert seinen Status (Eigenschaft
OpcClient.State) auf den WertDisconnecting. - Der Client gibt alle erworbenen Ressourcen wieder frei, zum Beispiel File-Handles zu Datei-Nodes.
- Der Client beendet die Überwachung der Verbindung und bricht einen laufenden Versuch ab, die Verbindung wiederherzustellen. Er entfernt die Subscriptions aus
OpcClient.Subscriptions. - Der Client beendet die aktive Sitzung.
- Der Client schließt den Channel, den er beim Verbinden erstellt hat, und verwirft ihn.
- Der Client ändert seinen Status (Eigenschaft
OpcClient.State) auf den WertDisconnected.
Verbindungsabbrüche erkennen
Die Abbrucherkennung (BreakDetection) erkennt Abbrüche der Verbindung zum Server. Sie verwendet dafür das KeepAlive-Verfahren: Der Client sendet in regelmäßigen Abständen eine KeepAlive-Anfrage an den Server, um die Verbindung zu prüfen und aufrechtzuerhalten. Den Abstand legt die Eigenschaft OpcClient.KeepAlive.Interval fest, standardmäßig 5000 Millisekunden. Das Ergebnis der letzten Anfrage stellt die Eigenschaft OpcClient.KeepAlive bereit (zum Beispiel Status, ServerState und Time). Jede neue Antwort meldet das Ereignis OpcClient.KeepAlive.Updated.
Wenn eine KeepAlive-Anfrage fehlschlägt, geht der Client von einer unterbrochenen Verbindung aus. Dasselbe gilt sofort, ohne das nächste KeepAlive abzuwarten, wenn ein Service-Aufruf als Ganzes mit einem Status fehlschlägt, der auf eine verlorene Verbindung hinweist, zum Beispiel BadConnectionClosed oder BadSessionIdInvalid. Der Aufruf selbst löst seine Ausnahme trotzdem aus:
- Der Client ändert seinen Status auf den Wert
Reconnecting(EreignisOpcClient.Reconnecting). - Anschließend versucht er in festen Abständen, die bestehende Sitzung wiederherzustellen. Den Abstand legt die Eigenschaft
OpcClient.ReconnectIntervalfest, standardmäßig 10000 Millisekunden. Wenn das innerhalb der Sitzungsdauer (EigenschaftOpcClient.SessionTimeout) nicht mehr möglich ist, erstellt der Client eine neue Sitzung und legt die Subscriptions darin neu an. - Wenn er die bestehende Sitzung wiederherstellt, ändert der Client seinen Status auf den Wert
Reconnected(EreignisOpcClient.Reconnected). Wenn er eine neue Sitzung erstellt hat, ändert er seinen Status auf den WertConnected(EreignisOpcClient.Connected). - Wie lange der Client es höchstens versucht, legt die Eigenschaft
OpcClient.MaxReconnectDurationfest. Standardmäßig ist sie 0, die Versuche sind also unbegrenzt. Wenn diese Zeit abläuft, bevor ein Versuch gelingt, ändert der Client seinen Status auf den WertDisconnectedund löst das EreignisOpcClient.BreakDetectedaus. Danach verbindet er sich nicht mehr von selbst, erst ein Aufruf vonConnectbaut die Verbindung neu auf.
Wenn die Eigenschaft OpcClient.ReconnectInterval auf den Wert 0 gesetzt ist, versucht der Client nicht, die Verbindung wiederherzustellen. Stattdessen ändert er seinen Status auf den Wert Disconnected und löst das Ereignis OpcClient.BreakDetected aus. Die Abbrucherkennung ist standardmäßig aktiviert, die Eigenschaft OpcClient.UseBreakDetection schaltet sie ein und aus. Wenn sie deaktiviert ist, überwacht der Client die Verbindung nicht. Wie Sie die Abbrucherkennung konfigurieren, zeigt der Abschnitt Verbindungsüberwachung.
Verbindungsparameter
Damit der Client eine Verbindung zum Server aufbauen kann, legen Sie die richtigen Parameter fest. Der Client benötigt immer die Adresse, unter der der Server erreichbar ist (Eigenschaft OpcClient.ServerAddress). Die Adresse ist ein URI (= Uniform Resource Identifier) und liefert dem Client alle wesentlichen Informationen über den Server. Die Serveradresse opc.tcp://192.168.0.80:4840 enthält zum Beispiel das Schema opc.tcp. Das Schema legt fest, über welches Protokoll die Daten wie ausgetauscht werden. Möglich sind opc.tcp und https. Für OPC UA Server im lokalen Netzwerk empfehlen wir opc.tcp. Für Server außerhalb des lokalen Netzwerks kann sich https anbieten. Außerdem legt die Adresse fest, dass der Server auf dem Rechner mit der IP-Adresse 192.168.0.80 läuft und auf Anfragen über den Port 4840 wartet. Das ist der Standardport für OPC UA, benutzerdefinierte Portnummern sind ebenfalls möglich. Anstelle der statischen IP-Adresse können Sie auch den DNS-Namen des Rechners verwenden, zum Beispiel localhost anstelle von 127.0.0.1.
Wenn keine Endpoint-Policy festgelegt ist (Eigenschaft OpcClient.Security.EndpointPolicy), wählt der Client den Endpunkt automatisch aus. Von den Endpunkten mit dem Schema der Serveradresse nimmt er den mit dem niedrigsten Policy-Level, einer Zahl, die der Server vergibt. Das ist in der Regel ein Endpunkt mit dem Sicherheitsmodus None. Möglich sind zudem Sign und SignAndEncrypt. Wenn der Server keinen solchen Endpunkt anbietet, wählt der Client automatisch den nächsten, zum Beispiel einen mit Sign. Dabei übergeht der Client Endpunkte mit dem Sicherheitsmodus None, deren Sicherheitsalgorithmus nicht None ist, und Endpunkte mit unbekanntem Sicherheitsalgorithmus. Wenn er keinen passenden Endpunkt findet, löst Connect eine OpcException mit dem Status BadSecurityChecksFailed aus.
Die automatische Auswahl lässt sich auf verschlüsselte Endpunkte beschränken (Eigenschaft OpcClient.Security.UseOnlySecureEndpoints, standardmäßig deaktiviert). Dann kommen nur Endpunkte mit dem Sicherheitsmodus SignAndEncrypt in Frage. Außerdem kann der Client den Endpunkt nach der Vorgabe der OPC Foundation auswählen: Dann gilt der Endpunkt mit dem höchsten Policy-Level automatisch als der beste für den Datenaustausch. Dieses Verhalten ist standardmäßig deaktiviert. Sie aktivieren es über die Eigenschaft OpcClient.Security.UseHighLevelEndpoint.
Wenn der Client eine bestimmte Endpoint-Policy erzwingen soll, legen Sie sie über die Eigenschaft OpcClient.Security.EndpointPolicy fest. Der Client verwendet dann nur einen Endpunkt mit genau diesem Sicherheitsmodus und Sicherheitsalgorithmus. Mit der Eigenschaft OpcClient.Security.AutoUpgradeEndpointPolicy weicht der Client auf den nächstbesseren Endpunkt aus, wenn der Server die festgelegte Policy nicht anbietet. Welchen Endpunkt der Client tatsächlich verwendet, liefert die Eigenschaft OpcClient.UsedEndpoint.
Wenn der Server eine Zugriffssteuerung verwendet, zum Beispiel über eine ACL (= Access Control List, also eine Zugriffskontrollliste), muss der Client dem Server gültige Benutzerdaten übermitteln, bevor eine Verbindung zustande kommt. Mit diesen Daten stellt der Server die Identität des Benutzers fest, der den Client bedient. Die Identität des Benutzers lässt sich über ein Benutzername-Passwort-Paar (Klasse OpcClientIdentity) oder über ein Zertifikat (Klasse OpcCertificateIdentity) ausweisen. Übergeben Sie die Identität dem Client über die Eigenschaft OpcClient.Security.UserIdentity. Der Client übermittelt sie dann beim Verbindungsaufbau an den Server. Wie Sie die Identität einer bestehenden Sitzung wechseln, beschreibt der Abschnitt Benutzer anmelden.
Endpunkte
Die Endpunkte ergeben sich aus dem Kreuzprodukt der Basis-Adressen des Servers und der Sicherheitsstrategien, die der Server unterstützt. Jede Basis-Adresse ergibt sich aus einem unterstützten Paar aus Schema und Port und dem Host (IP-Adresse oder DNS-Name). Für den Datenaustausch lassen sich mehrere Schemen (möglich sind opc.tcp und https) auf unterschiedlichen Ports festlegen. Die so verknüpften Strategien (engl. Policies) legen das Vorgehen beim Datenaustausch fest. Jede Policy besteht aus dem Policy-Level, dem Sicherheitsmodus (engl. Security Mode) und dem Sicherheitsalgorithmus (engl. Security Algorithm) und legt damit die Art des sicheren Datenaustauschs fest.
Angenommen, der Server unterstützt zwei Sicherheitsstrategien:
- Security Policy A: Level 0, Sicherheitsmodus
None, SicherheitsalgorithmusNone - Security Policy B: Level 1, Sicherheitsmodus
Sign, SicherheitsalgorithmusBasic256Sha256
Dazu kommen drei Basis-Adressen für verschiedene Schemen:
- Basis-Adresse A:
https://mydomain.com/ - Basis-Adresse B:
opc.tcp://192.168.0.123:4840/ - Basis-Adresse C:
opc.tcp://192.168.0.123:12345/
Das Kreuzprodukt ergibt daraus die folgenden Endpunktbeschreibungen:
- Endpunkt 1: Adresse
https://mydomain.com/, Level 0, SicherheitsmodusNone, SicherheitsalgorithmusNone - Endpunkt 2: Adresse
https://mydomain.com/, Level 1, SicherheitsmodusSign, SicherheitsalgorithmusBasic256Sha256 - Endpunkt 3: Adresse
opc.tcp://192.168.0.123:4840/, Level 0, SicherheitsmodusNone, SicherheitsalgorithmusNone - Endpunkt 4: Adresse
opc.tcp://192.168.0.123:4840/, Level 1, SicherheitsmodusSign, SicherheitsalgorithmusBasic256Sha256 - Endpunkt 5: Adresse
opc.tcp://192.168.0.123:12345/, Level 0, SicherheitsmodusNone, SicherheitsalgorithmusNone - Endpunkt 6: Adresse
opc.tcp://192.168.0.123:12345/, Level 1, SicherheitsmodusSign, SicherheitsalgorithmusBasic256Sha256
Den Adressteil des Endpunkts benötigt der Client immer, über den Konstruktor oder über die Eigenschaft ServerAddress. Aus den Endpunkten mit dem Schema dieser Adresse wählt der Client standardmäßig den mit dem niedrigsten Level aus. Im Beispiel oben ist das für die Adresse opc.tcp://192.168.0.123:4840/ der Endpunkt 3. Wenn der Client stattdessen den Endpunkt 4 verwenden soll, legen Sie dessen Policy über die Eigenschaft OpcClient.Security.EndpointPolicy fest.
Zertifikate und Sicherheit
Das SDK soll den Einstieg in OPC UA so einfach wie möglich machen. Deshalb ist die Verbindung zwischen Client und Server ohne weitere Konfiguration des Clients nicht vollständig abgesichert. Sobald Sie den finalen Spike implementiert und getestet haben, sollten Sie sich mit der Sicherheit befassen:
- Wie Zertifikate Client und Server ausweisen, wo sie liegen und wie die Anwendungen sie prüfen, beschreibt die Seite Zertifikate verstehen.
- Wie sich Benutzer anmelden und welche Rechte sie erhalten, beschreibt die Seite Benutzer und Rollen.
- Alle Einstellungen für den Produktivbetrieb und eine Checkliste enthält der Abschnitt Härtung für den Produktivbetrieb.

