Referenz
Beispielanwendungen
Vollständig lauffähige Clients und Server mit dem OPC UA .NET SDK in C# und VB.NET, filterbar nach Art und Sprache, mit Links auf GitHub.
Referenz
Beispielanwendungen
Die Beispielanwendungen im Repository opcuanet-samples auf GitHub sind vollständige Programme, die Sie klonen, starten und als Ausgangspunkt für eigene Anwendungen verwenden können. Zu den meisten Clients gibt es einen passenden Server im selben Bereich. Starten Sie in diesem Fall zuerst den Server und dann den Client.
So starten Sie ein Beispiel, hier den Client Basic/Client:
git clone https://github.com/Traeger-GmbH/opcuanet-samples.git
cd opcuanet-samples
dotnet run --project cs/Basic/Server -f net8.0
dotnet run --project cs/Basic/Client -f net8.0Server und Client laufen dabei in zwei getrennten Konsolen. Die Beispiele verwenden das SDK in der Evaluation, also ohne Lizenzschlüssel.
Grundlagen
- Client
ClientVerbindet sich mit einem Server, liest einen Node, schreibt einen neuen Wert und liest ihn erneut.
- Server
ServerStellt mit einem eigenen Node-Manager eine Maschine mit einigen Nodes bereit.
- Client
Client.AEAbonniert die Ereignisse einer Maschine, gefiltert nach Schweregrad, quittiert Alarme und beantwortet Dialoge an der Konsole.
- Server
Server.AEStellt eine Maschine mit Dialog-Bedingung, Grenzwert-Alarm und Temperatur-Alarm bereit und ändert deren Zustände laufend.
- Client
Client.AuthenticationMeldet sich mit Benutzername und Passwort am Server an und liest und schreibt einen Node.
- Server
Server.AuthenticationLässt nur Benutzer zu, die mit Benutzername und Passwort angemeldet sind, und prüft sie über eine Zugriffsliste.
- Client
Client.BrowsingDurchsucht den Adressraum des Servers ab dem ObjectsFolder und gibt die Nodes mit ihren Attributen eingerückt aus.
- Client
Client.DataTypesLiest Nodes mit strukturierten Datentypen des Servers und arbeitet mit ihnen über eigene .NET-Klassen.
- Server
Server.DataTypesStellt Nodes bereit, deren Werte eigene strukturierte Datentypen und Aufzählungen haben.
- Server
Server.DataTypes.ComplexStellt Nodes mit eigenen strukturierten Datentypen bereit und bildet deren Felder zusätzlich als eigene Kind-Nodes ab.
- Client
Client.EventTypesAbonniert Ereignisse eines eigenen Ereignistyps und liest ihre strukturierten Ereignisdaten über eine eigene Ereignisklasse.
- Server
Server.EventTypesStellt einen eigenen Ereignistyp aus einem NodeSet bereit; ein Methodenaufruf durch den Client löst Ereignisse mit strukturierten Daten aus.
- Client
Client.HDALiest die Historie eines Nodes, als Rohdaten, seitenweise und mit den Änderungen an der Historie.
- Server
Server.HDAStellt Nodes mit Historie bereit, die der Server im Speicher führt.
- Server
Server.HDA.SqlStellt Nodes mit Historie bereit, die der Server in einer SQLite-Datenbank ablegt, einschließlich der Änderungen an der Historie.
- Client
Client.MethodsRuft Methoden des Servers auf, nacheinander und parallel, und misst die Dauer.
- Server
Server.MethodsStellt Methoden-Nodes bereit, synchron und asynchron ausgeführt, mit Ein- und Ausgabeargumenten.
- Server
Server.NodeTypesImportiert eigene Node-Typen aus einem NodeSet und stellt Instanzen davon über eigene Node-Klassen bereit.
Konfiguration
- Client
Client.ConfiguredViaCodeZeigt verschiedene Wege, einen Client im Code zu konfigurieren, von der Standardkonfiguration bis zu eigenen Einstellungen.
- Server
Server.ConfiguredViaCodeZeigt verschiedene Wege, einen Server im Code zu konfigurieren, von der Standardkonfiguration bis zu eigenen Einstellungen.
- Client
Client.ConfiguredViaXmlLädt die Konfiguration eines Clients aus einer XML-Datei.
- Server
Server.ConfiguredViaXmlLädt die Konfiguration eines Servers aus einer XML-Datei.
Node-Typen
- Client
Client.AnalogItemNodeLiest Analogwerte mit Einheit und Messbereich und gibt sie aus.
- Server
Server.AnalogItemNodeStellt Analogwerte mit Einheit, Messbereich und Gerätebereich bereit.
- Client
Client.DataTypeNodeLiest einen Node mit eigenem Aufzählungstyp, zeigt die möglichen Werte und schreibt einen neuen Wert.
- Server
Server.DataTypeNodeStellt einen eigenen Aufzählungstyp als Datentyp-Node bereit und verwendet ihn für einen Status-Node.
- Client
Client.MethodNodeFindet die Methoden des Servers, zeigt ihre Argumente und ruft eine ausgewählte Methode mit eingegebenen Werten auf.
- Server
Server.MethodNodeStellt Methoden-Nodes auf verschiedene Arten bereit: über Delegaten, Methoden und Befehlsobjekte, mit Ein- und Ausgabeargumenten.
Subscriptions
- Client
Client.BulkChangesAbonniert sehr viele Nodes und verarbeitet ihre Datenänderungen in einem eigenen Thread.
- Server
Server.BulkChangesÄndert die Werte sehr vieler Nodes gleichzeitig in einem festen Intervall.
- Client
Client.BulkChanges.HiResEmpfängt Datenänderungen sehr vieler Nodes mit minimaler Verzögerung, mit PublishingInterval 0 und einem Callback je Datensatz.
- Server
Server.BulkChanges.HiResÄndert die Werte sehr vieler Nodes im Abstand weniger Millisekunden, mit hoch aufgelöstem Publishing.
- Client
Client.HandshakeChangesLiest einen Datenblock, sobald der Server ihn als verfügbar meldet, und bestätigt die Verarbeitung über einen Handshake-Node.
- Server
Server.HandshakeChangesStellt Datenblöcke mit Handshake bereit: meldet neue Daten und wartet, bis ein Client deren Verarbeitung bestätigt.
Anwendungsszenarien
- Anwendung
App.LicenseUsageSetzt die Lizenzschlüssel des SDK und schützt sie bei der Obfuskation der Anwendung durch Verschlüsselung der Zeichenketten, hier mit Eazfuscator.NET.
- Client
Client.BlazorVerbindet sich aus einer Blazor-Server-Anwendung mit einem Server und liest Werte von Nodes.
- Client
Client.ClientAddedNodesWithHistoryLegt am Server einen Variablen-Node mit Historie an und schreibt Werte, die der Server in die Historie übernimmt.
- Server
Server.ClientAddedNodesWithHistoryErlaubt Clients, Variablen-Nodes mit Historie anzulegen, und zeichnet die geschriebenen Werte als Historie auf.
- Server
Server.CustomFileStellt über die Schnittstelle IOpcFileInfo eine Datei aus einer eigenen Quelle als Datei-Node bereit, hier von einem FTP-Server.
- Client
Client.DynamicNamespacesAdressiert Nodes über die Namespace-URI statt den Index und erneuert die Subscriptions nach jedem Wiederverbinden, sodass wechselnde Namespaces des Servers keine Rolle spielen.
- Server
Server.DynamicNamespacesStellt jeden Namespace über einen eigenen Node-Manager bereit und startet den Server mit einer wechselnden Auswahl davon neu.
- Server
Server.DynamicNodesLegt Nodes zur Laufzeit an, gesteuert über Pfade, die an der Konsole eingegeben werden.
- Client
Client.GenericEventsEmpfängt Ereignisse eines eigenen Ereignistyps ohne eigene Klasse für dessen Felder und gibt alle ausgewählten Felder über eine generische Ereignisklasse aus.
- Server
Server.LightweightEventsVerwendet einen einzigen Ereignis-Node für Ereignisse verschiedener Quellen, statt je Quelle einen eigenen Ereignis-Node anzulegen.
- Client
Client.LocalizationFordert Anzeigenamen und Beschreibungen in bevorzugten Sprachen an und zeigt, wie der Server auf eine Ersatzsprache ausweicht.
- Server
Server.LocalizationStellt Anzeigenamen und Beschreibungen in mehreren Sprachen bereit, über die Globalisierungsressourcen des Servers.
- Server
Server.NodeAccessBeschränkt den Zugriff auf Nodes je Benutzer über Zugriffskontrolllisten und liefert über abgeleitete Node-Klassen benutzerabhängige Metadaten.
- Client
Client.NodeExplorerDurchsucht den Adressraum eines Servers und zeigt ihn als Baum in einer Windows-Forms-Anwendung.
- Server
Server.NodeSet.PackMLImportiert das NodeSet der PackML-Companion-Spezifikation und implementiert dessen Objekte und Methoden für mehrere Maschinen.
- Server
Server.NodeSet.Umati.LegacyImportiert die NodeSets des früheren umati-Informationsmodells und meldet Alarme einer Werkzeugmaschine.
- Server
Server.NodeSet.Umati.MachineToolImportiert die NodeSets der Companion-Spezifikationen für Werkzeugmaschinen (umati) und meldet Alarme, die ein Client bestätigen kann.
- Client
Client.PackMLRuft eine Methode der PackML-Companion-Spezifikation mit strukturierten Argumenten auf, mit Datentypen, die aus dem PackML-NodeSet erzeugt sind.
- Server
Server.PlaygroundStellt viele Arten von Nodes bereit, statisch, sich laufend ändernd und als Methoden, um Clients dagegen zu testen.
- Client
Client.RecursiveSubscriptionLegt Job-Nodes unterhalb eines überwachten Nodes an und empfängt die Ereignisse, die der Server dafür meldet.
- Server
Server.RecursiveSubscriptionÜberwacht von Clients neu angelegte Nodes, verarbeitet sie und meldet Ereignisse dazu.
- Client
Client.SignalRLeitet Datenänderungen von Nodes über einen ASP.NET-Core-SignalR-Hub an den Browser weiter.
- Server
Server.SignalRStellt Nodes bereit, deren Werte sich laufend ändern; sie sind die Datenquelle für das Beispiel Client.SignalR.
- Server
Server.SimaticNodesBildet NodeIds im Stil von SIEMENS SIMATIC mit Punkten und Anführungszeichen über eine eigene Factory für NodeIds.
- Server
Server.SimaticNodeSetImportiert das NodeSet einer SIMATIC S7-1500 und tritt wie deren Server auf, etwa um Clients ohne die Hardware zu testen.
- Client
Client.StateMachineÜberwacht den aktuellen Zustand eines Zustandsautomaten auf dem Server.
- Server
Server.StateMachineImplementiert einen Zustandsautomaten mit eigenen Zuständen und wechselt dessen Zustand auf Tastendruck.
- Client
Client.TemperatureVerbindet sich mit einem Server und liest einmal je Sekunde den Wert eines Temperatur-Nodes.
- Server
Server.TemperatureStellt einen Temperatur-Node bereit und ändert seinen Wert einmal je Sekunde.
- Client
Client.Umati.LegacyAbonniert die Alarme einer Werkzeugmaschine nach dem früheren umati-Informationsmodell und liest ihre spezifischen Felder.
- Client
Client.Umati.MachineToolEmpfängt Meldungen einer Werkzeugmaschine nach der OPC-UA-Companion-Spezifikation für Werkzeugmaschinen (umati) und bestätigt sie.
- Server
Server.UserIdentitiesImplementiert eigene Benutzeridentitäten über Zugriffslisten und abgeleitete Klassen, hier mit Windows-Anmeldung.
Plattformen
- Client
Client.UwpVerbindet sich in einer UWP-Anwendung mit einem Server und zeigt den Wert eines Temperatur-Nodes an. Das Anwendungszertifikat liegt als Datei in den Assets, weil das SDK es unter UWP nicht automatisch erstellen kann.
- Client
Client.WpfAbonniert in einer WPF-Anwendung einen Node und zeigt seinen Wert in der Oberfläche an.

