Minimalbeispiel: OPC UA Client

Wer sich mit Software-Development-Kits für OPC UA auseinandersetzt, wird wahrscheinlich schon auf den UA-.NET Standard Stack der OPC Foundation gestoßen sein. Das github-Repository bringt einige Samples mit sich. Darüber hinaus kann die Library per NuGet in eigene Projekte eingebunden werden. Dabei habe ich festgestellt, dass ein alleinstehendes Minimalbeispiel einige Kniffe benötigt. Los geht’s:

Zuerst erstellen wir ein neues Projekt mit Visual Studio 2017. Da wir die Anwendung später eventuell auch auf Linux ausführen wollen, verwenden wir die Vorlage eines .NET Core Konsolenprogramms. Als Projektname habe ich “UaConsoleClient” gewählt.

Neues Projekt
Neues .NET Core Konsolenprogramm anlegen

Anschließend gehen wir im neuen Projekt mit Rechtsklick auf den Projektnamen zu “NuGet-Pakete verwalten” und durchsuchen nach “OPC Foundation”. Das im Screenshot gezeigte Paket und seine Abhängigkeiten werden installiert.

nuget-Paket einbinden
Einbinden des NuGet-Pakets

Was benötige ich, um ein eigenständiges Minimalbeispiel zu erhalten?

Um zu sehen, welche Programmteile ich benötige, habe ich mir den NetCoreConsoleClient genauer angesehen und die entsprechenden Teile in eine eigene Klasse ausgelagert. Ebenso wichtig ist die Config.xml, welche ich aus besagtem Projekt in mein eigenes kopiert und angepasst habe. Diese Konfigurationsdatei legt einige OPC UA-spezifische Eigenschaften fest, unter anderem die Speicherorte der Zertifikatsdateien.

Um hier ausufernde Listings zu vermeiden, verweise ich an dieser Stelle auf mein github-repo zu diesem Blog-Beitrag.

Damit die Konfigurationsdatei später in das Build-Verzeichnis kopiert wird, ist ein zusätzlicher Eintrag in der .csproj-Datei vorzunehmen. Dafür gehen wir mit einem Rechtsklick auf den Projektnamen um das Kontextmenü zu öffnen und wählen wie im Bild gezeigt:

Kontextmenü
Kontextmenü des Projekts aufrufen

Die Projektdatei öffnet sich im Editor. Hier fügen wir vor dem schließenden </Project>-Tag folgenden Block ein:


<ItemGroup>
 <None Update="UaConsoleClient.Config.xml">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
 </None>
</ItemGroup>

Damit bewirken wir, dass unsere Konfigurationsdatei nach dem Buildvorgang in den Ordner der ausführbaren Datei kopiert wird.

Auf dem Prüfstand

Jetzt wird es spannend. Mein Minimalbeispiel tut erstmal nichts weiter, als den Local Discovery Server auf meinem Entwicklungsrechner mit dem OPC UA-Service “GetEndpoints” zu befragen und die Antwort auf der Konsole auszugeben.

Ich starte mein Programm im Visual Studio Debugger und erhalte die nachfolgend gezeigte Ausgabe.

Konsolen-Ausgabe
Konsolen-Ausgabe

Mein LDS stellt fünf Endpunkte mit unterschiedlichen Sicherheitsstufen zur Verfügung. Auf den genannten LDS und Services wie GetEndpoints u.a. werde ich in zukünftigen Beiträgen zu sprechen kommen.

Abschließend vergewissere ich mich durch die Windows-eigene Zertifikatsverwaltung (certmgr.msc), dass das X.509-Zertifikat erstellt wurde.

Applikations-Zertifikat

Dieses wird in späteren Szenarien benötigt, um die Sicherheitsmechanismen von OPC UA zu nutzen.

Zu guter Letzt

In dem hier vorgestellten Beispiel habe ich den hauseigenen .NET Standard-Stack der OPC Foundation erprobt, um einen einfachen Anwendungsfall umzusetzen. Im Unterschied zu kommerziellen Stacks muss man sich hier alles Benötigte aus den Beispielen zusammensuchen. Käufliche Angebote enthalten in der Regel Tutorials, mit denen man Schritt für Schritt die eigene Anwendung aufbaut. Dafür benötigt der hier eingesetzte Stack keine Runtime-Lizenz und ist zeitlich unbegrenzt lauffähig.

Das zugehörige Repository mit meinem Beispielcode finden Sie hier.