Ausblick

OPC UA Framework Advanced


Erfolgreich mit nur wenigen Zeilen Code


Meilensteine

Unsere Entwickler sind stets am Draht der Zeit und tragen Sorge für die stetige Weiterentwicklung und Verbesserung unseres Frameworks. Nutzen Sie unseren Ausblick, um schon heute ein Gefühl für die Features von morgen zu bekommen! Ist einer Ihrer Wünsche bisher weder umgesetzt, noch auf unserer Agenda? Dann nehmen Sie gleich jetzt noch mit uns Kontakt auf!

Jetzt auch Plattformunabhängig in der .NET Standard Edition!
Plattformunabhängige OPC UA Client und Server Entwicklung mittels .NET Standard 2.0 und .NET Core 2.0.

Meilenstein #9 - KW 24: Performance

Was sind die Highlights?

  • Mehr als doppelt so schneller Start eines OPC UA Servers 1)
  • Bis zu halb so viel Speicherbedarf je Node 2)

Was ist neu?

  • OpcFileNode.MimeType: Eigenschaft zur Bereitstellung des automatisch vom Framework ermittelten MediaType gemäß RFC 2046
  • OpcFileInfo.MimeType: Eigenschaft zum Auslesen der MimeType Property-Node einer OpcFileNode
  • OpcContext: Beschleunigte Ermittlung des aktuell gültigen Kontextes bei der Verarbeitung von Nodes
  • OpcNode: Beschleunigte Verarbeitung von Kindknoten beim Start des Servers
  • OpcNode: Umstellung von Callback-Methoden zur Verarbeitung von Read/Write-Anfragen auf ein Provider-Pattern für bessere Performance
  • OpcVariableNode: Beschleunigte Erzeugung durch on-demand Initialisierung von Konfigurations-Nodes für historische Daten
  • OpcDataType: Cache für benutzerdefinierte Datentypen um wiederholtes Reflektieren von bereits bekannten Datentypen zu vermeiden
  • NEU: IOpcNodeInfo: Schnittstelle zum vereinfachten und performanteren Verarbeiten von Node-Informationen
  • NEU: OpcNodeManager.CreateNodes: Ausnahmen die während der Ausführung der Methode auftreten, werden nicht länger „gefangen“, sondern bis zum OpcServer.Start weitergereicht

Was ändert sich?

  • Samples: Alle Beispiel-Projekte wurden auf die C# Sprachversion 6.0 downgegradet

Was wurde behoben?

  • OpcNodeManager: Problem bei der Referenzierung der gleichen Root-Node bei Verwendung mehrerer NodeManager (Nodes wurden nicht im AddressSpace angezeigt)
  • OpcNodeManager: Problem mit Querverweisen auf Nodes auf andere benutzerdefinierte Nodes, welche in einen anderen NodeManager erzeugt wurden (Nodes wurden nicht im AddressSpace angezeigt)

Meilenstein #8 - KW 19: Alarm + Events

Was sind die Highlights?

  • Logische Operatoren zum Aufbau von OpcFilter-Instanzen (siehe Snippet 1)
  • Globale Event Notifications mittels NodeManager- und Serverinstanzen (siehe Snippet 2)
  • Einfaches Event Handling clientseitig (siehe Snippet 3)
  • Einfache Definition von Events serverseitig (siehe Snippet 4)

Was ist neu?

  • OpcMonitoredItem: Neue Events EventReceived und DataChangeReceived mit Bubbling über OpcSubscription bis OpcClient
  • OpcSubscription: Neue Events EventReceived, DataChangeReceived und DialogRequested
  • OpcClient: Neue Events EventReceived und DataChangeReceived
  • OpcText.Format: Methode zur Formatierung von Platzhaltern mittels Werten
  • Unterstützung für die folgenden OPC UA Events und Alarme (client- und serverseitig): AcknowledgeableCondition, AlarmCondition, Condition, DialogCondition, DiscreteAlarm, ExclusiveDeviationAlarm, ExclusiveLevelAlarm, ExclusiveLimitAlarm, ExclusiveRateOfChangeAlarm, LimitAlarm, TripAlarm, NonExclusiveDeviationAlarm, NonExclusiveLevelAlarm, NonExclusiveLimitAlarm, NonExclusiveRateOfChangeAlarm und OffNormalAlarm
  • Unterstützung von weiteren Nodetypen: ActionMethod, AddCommentMethod, ConditionVariable, DialogResponseMethod, ExclusiveLimitStateMachine, FiniteStateMachine, FiniteStateVariable, FiniteTransitionVariable, Instance, Object, ShelvedStateMachine, StateMachine, StateVariable, TimedShelveMethod, TransitionVariable und TwoStateVariable

Was ändert sich?

  • Jede Definition (Klasse, Methode, …) mit der Endung EventRaise: Wurde zu Event umbenannt
  • OpcEventNode.Create: Alle Methoden wurden entfernt, da globale Events nicht länger eine Instanz einer OpcEventNode benötigen

Was wurde behoben?

  • Es wurden keine Fehler gefunden.

Snippet 1

    var severity = new OpcSimpleAttributeOperand(OpcEventTypes.Event, BrowseNames.Severity);
    var sourceName = new OpcSimpleAttributeOperand(OpcEventTypes.Event, BrowseNames.SourceName);
 
    // Define a new OpcEventFilter instance where only pass TripAlarms with specific conditions.
    var filterA = OpcFilter.Using(client)
            .FromEvents(OpcEventTypes.TripAlarm)
            .Where(
                OpcFilterOperand.OfType(OpcEventTypes.TripAlarm)
                & (severity == OpcEventSeverity.Medium | severity == OpcEventSeverity.High)
                & sourceName.Like("Tank"))
            .Select();
 
    // Define a new OpcEventFilter instance where any Event passes where its SourceName property is null.
    var filterB = OpcFilter.Using(client)
            .FromEvents(OpcEventTypes.Event)
            .Where(sourceName.IsNull())
            .Select();

Snippet 2

    // Report a global event in a OpcNodeManager instance or using a OpcServer instance
    this.ReportEvent(OpcEventSeverity.Medium, "This is a global event.");

Snippet 3

    // Subscribe events on myNode using filterA.
    client.SubscribeEvent(myNodeId, filterA, (sender, e) => {
        if (e.Event is OpcAcknowledgeableCondition condition) {
            if (!condition.IsAcked) {
                if (condition.Severity == OpcEventSeverity.High)
                    condition.Acknowledge(client, "Got it!");
            }
            else if (!condition.IsConfirmed) {
                condition.Confirm(client, "Saw it!");
            }
            else if (condition.IsEnabled) {
                condition.Disable(client);
            }
        }
    });
 
    // Subscribe global events using filterB.
    client.SubscribeEvent(OpcObjectTypes.Server, filterB, (sender, e) => {
        Console.WriteLine($"Global Event with Message: {e.Event.Message}");
    });

Snippet 4

    protected override IEnumerable<IOpcNode> CreateNodes(OpcNodeReferenceCollection references)
    {
        this.alarmFolderNode = new OpcFolderNode(this.DefaultNamespace.GetName("Alarm Folder"));
        references.Add(this.alarmFolderNode, OpcObjectTypes.ObjectsFolder);
 
        this.AddNotifierNode(this.alarmFolderNode);
 
        this.alarmSourceNodeA = new OpcFolderNode("Alarm Source A");
        this.alarmNodeA = this.CreateAlarmNodeA(this.alarmSourceNodeA);
 
        this.alarmSourceNodeA.AddNotifier(this.SystemContext, this.alarmNodeA);
        this.alarmFolderNode.AddNotifier(this.SystemContext, this.alarmSourceNodeA);
 
        // ...
 
        return new IOpcNode[] { this.alarmFolderNode, this.alarmSourceNodeA, ... };
    }
 
    private OpcNonExclusiveLevelAlarmNode CreateAlarmNodeA(OpcFolderNode owner)
    {
        var alarmNode = new OpcNonExclusiveLevelAlarmNode(
                owner, "MySimpleAlarm_A", OpcLimitAlarmStates.All);
 
        alarmNode.HighHighLimit = 150;
        alarmNode.HighLimit = 100;
        alarmNode.LowLimit = 50;
        alarmNode.LowLowLimit = 25;
 
        alarmNode.AcknowledgeCallback = (context, eventId, comment) => {
            Console.WriteLine("Alarm A is to be acknowledged!");
            return OpcStatusCode.Good;
        };
 
        return alarmNode;
    }

Meilenstein #7 - KW 19: Benutzerdefinierte NodeIds

Was sind die Highlights?

  • Alle Node Klassen verfügen über neue Konstruktoren zur manuellen Vergabe einer benutzerdefinierten NodeID
  • Vordefinierte und benutzerdefinierte NodeIdFactories

Was ist neu?

  • OpcContext.NodeIdFactory: Eigenschaft zur Bereitstellung der aktuell im Kontext gültigen NodeIdFactory
  • OpcNamespace.GetId: Methoden zur Erzeugung von OpcNodeId Instanzen basierend auf dem jeweiligen Namespace
  • OpcNamespace.GetName: Methoden zur Erzeugung von OpcName Instanzen basierend auf dem jeweiligen Namespace
  • OpcNodeId.Factory: Eigenschaft zur globalen Konfiguration der zu verwendenden NodeIdFactory
  • OpcNodeId.ctors: Weitere Überladungen zur Verwendung einer OpcNamespace-Instanz anstelle eines Indexes oder einer Uri
  • OpcNodeId.OriginalFormat: Eigenschaft zur Bereitstellung des originalen Textformats, aus dem die NodeId erzeugt wurde
  • OpcNodeId.OriginalString: Eigenschaft zur Bereitstellung des originalen Textes, aus dem die NodeId erzeugt wurde
  • OpcNodeId.Path: Eigenschaft zur Definition eines Browse-Pfades speziell für Nodes, die nicht durch einen NodeManager vordefiniert sind
  • OpcNodeId.ValueAsString: Eigenschaft zum Abrufen der Value-Eigenschaft als String codiert
  • OpcNodeManager.DefaultNamespace: Eigenschaft zum Abrufen einer OpcNamespace-Instanz, die die bisherigen Eigenschaften DefaultNamespaceIndex und DefaultNamespaceUri zusammenfasst (beide bleiben existent)
  • OpcNodeManager.NodeIdFactory: Eigenschaft zur Festlegung einer NodeManager-spezifischen NodeIdFactory, standardmäßig wird OpcNodeId.Factory zurückgegeben
  • OpcNodeManager implements IDisposable: Implementierung zur vereinfachten Resourcenverwaltung
  • OpcNodeManager.QueryNode: Methode zum Abrufen von benutzerdefinierten Nodes, die über integrierte Mechanismen nicht vom Framework ermittelt werden können
  • NEU: OpcNodeIdFormat: Enumeration zur Festlegung, wie eine OpcNodeId-Instanz formatiert werden soll bzw. formatiert war (zum Zeitpunkt des Parsens)
  • NEU: OpcNodeIdFactory: Basisklasse für NodeID Factories
  • NEU: OpcNominalNodeIdFactory: Spezialisierung, die nach dem bekannten Schema einen Node-Pfad als NodeId generiert
  • NEU: OpcIncrementalNodeIdFactory: Spezialisierung, die aufsteigend neue numerische NodeId's je Namespace generiert

Was ändert sich?

  • Alle bisherigen Features bleiben unverändert.

Was wurde behoben?

  • Es wurden keine Fehler gefunden.

Meilenstein #6 - KW 19: Verbesserte Nodes

Was sind die Highlights?

  • Speicheroptimierung in allen Nodes

Was ist neu?

  • XyNode-Eigenschaften für den Zugriff auf Kind-Nodes
  • NEU: OpcNodeAction<T>: Zur Definition von generischen Callback-Methoden für kontextsensitive Aufrufe
  • NEU: OpcNodeFunc<T>: Zur Definition von generischen Callback-Funktionen für kontextsensitive Aufrufe mit Rückgabewert

Was ändert sich?

  • Alle bisherigen Features bleiben unverändert.

Was wurde behoben?

  • Es wurden keine Fehler gefunden.

Meilenstein #5 - KW 19: Verbesserte NodeId

Was sind die Highlights?

  • OpcNodeId: Unterstützung von byte-Arrays, Guids und uint Identifier-Werten
  • OpcNodeId: Kein 'Inline-Parsing' mehr bei der Instanziierung: Jeder String-codierte Wert wird 1:1 als Identifier übernommen
  • OpcNodeId: Unterstützung der Foundation-spezifischen Formatierung von NodeID's

Was ist neu?

  • OpcNodeId: Eigenschaft Type, welche über OpcNodeIdType die Art einer ID beschreibt
  • OpcNodeId: Eigenschaft Namespace, welche über eine OpcNamespace-Instanz den Namensraum des Identifiers beschreibt
  • OpcApplicationConfiguration: Platformabhängige Verwendung von Verzeichnisseparatoren
  • NEU: OpcNamespace: Repräsentiert einen Namensraum anhand seines Indexes und seiner Uri (falls bekannt)

Was ändert sich?

  • OpcServer: Es werden nur noch Adressen mit den Schemata 'opc.tcp' und 'https' unterstützt
  • OpcVariableNode: Falsch formatierte DebuggerDisplayAttribute wurden korrigiert
  • OpcNodeInfo: Falsch formatierte DebuggerDisplayAttribute wurden korrigiert

Was wurde behoben?

  • OpcApplicationConfiguration: Fehlerhaftes Laden von dateibasierten Konfigurationen wurde behoben

Meilenstein #4 - KW 19: Unterstützung für Enumerationen

Was sind die Highlights?

  • Eigene Enumerationen als benutzerdefinierte Datentypen

Was ist neu?

  • NEU: OpcDataTypeNode: Zur Definition von benutzerdefinierten Datentypen (vorerst nur Enumerationen)
  • NEU: OpcDataTypeAttribute: Attribut zur Festlegung der mit einem Datentypen verbundenen NodeID
  • NEU: OpcEnumMemberAttribute: Attribut zur erweiterten Konfiguration der Werte einer Enumeration bei Verwendung von dieser als benutzerdefinierter Datentyp

Was ändert sich?

  • Alle bisherigen Features bleiben unverändert.

Was wurde behoben?

  • Es wurden keine Fehler gefunden.

Meilenstein #3 - KW 19: Unterstützung für analoge Datenpunkte

Was sind die Highlights?

  • Client- und serverseitige Unterstützung von analogen Datenpunkten unter Berücksichtigung derer Maßeinheiten

Was ist neu?

  • NEU: OpcAnalogItemNode: Node zur Bereitstellung von anlogen Daten
  • NEU: OpcAnalogItemNodeInfo: Stellt Informationen über OpcAnalogItemNode-Instanzen beim Browsen eines Adressraumes bereit
  • NEU: OpcEngineeringUnitInfo: Zur Repräsentation von Maßeinheiten bei der Erfassung und Bereitstellung von anlogen Daten, auch bekannt als 'EUInformation'
  • NEU: OpcValueRange: Zur Repräsentation von Intervallen von Werten mit doppelter Genauigkeit, auch bekannt als 'Range'

Was ändert sich?

  • Alle bisherigen Features bleiben unverändert.

Was wurde behoben?

  • Es wurden keine Fehler gefunden.

Meilenstein #2 - KW 19: Stack Update + Wartung

Was sind die Highlights?

  • Foundation Stack Version: 1.03.351.0

Was ist neu?

  • OpcMonitoredItem: Neue Events EventReceived und DataChangeReceived mit Bubbling über OpcSubscription bis OpcClient
  • OpcSubscription: Neue Events EventReceived, DataChangeReceived und DialogRequested
  • OpcClient: Neue Events EventReceived und DataChangeReceived
  • OpcClientSecurity.CertificateValidationRules: Eigenschaft zur Konfiguration der Regeln, wie Zertifikate vom Client validiert werden sollen
  • OpcServerSecurity.CertificateValidationRules: Eigenschaft zur Konfiguration der Regeln, wie Zertifikate vom Server validiert werden sollen
  • NEU: OpcText: Zur Repräsentation von übersetzbaren Texten, auch bekannt als 'LocalizedText'

Was ändert sich?

  • Alle bisherigen Features bleiben unverändert.

Was wurde behoben?

  • OpcDiscoveryClient: Der OperationTimeout der Anwendungskonfiguration wurde nicht verwendet

Meilenstein #1 - KW 19: Browsen von DataType Nodes

Was sind die Highlights?

  • Browsen von DataType nodes mittels OpcTypeNodeInfo
  • OpcException: Verbesserter Inhalt der Message-Eigenschaft zur besseren Fehlerdiagnose

Was ist neu?

  • OpcClient.SubscribeEventRaise: Zusätzlicher Parameter zur Filterung von Events
  • OpcArgumentInfo: Neue Eigenschaft DataType vom Typen OpcTypeNodeInfo
  • NEU: OpcTypeNodeInfo: Beschreibt beim Browsen Typdefinitionen (rekursiv)

Was ändert sich?

  • OpcName: Wird nicht länger zur Kombination von BrowseName, DisplayName und SymbolicName verwendet, als Ersatz bekam die Schnittstelle IOpcNode die neuen Eigenschaften DisplayName und SymbolicName
  • OpcMethodNodeInfo.GetOutpuArguments: Wurde zu GetOutputArguments umbenannt

Was wurde behoben?

  • Es wurden keine Fehler gefunden.
1) Gemessen bei einer Tiefe von bis zu 16 Nodes in Folge bei über 100.000 benutzerdefinierten Nodes.
2) Gemessen an der Anzahl von über 100.000 benutzerdefinierten Nodes.