Zum Inhalt springen

Referenz

Versionshistorie

Alle Releases des OPC UA .NET SDK mit neuen Funktionen, Änderungen und Fehlerbehebungen, gruppiert nach Versionsreihe und Minor-Version.

Referenz

Versionshistorie ​

Die Releases sind nach Versionsreihen und Minor-Versionen gruppiert. Die Releases der aktuellen Version 2.59 sind ausgeklappt, ältere Releases lassen sich einzeln aufklappen.

Welche Änderungen beim Umstieg von einer älteren Version bestehenden Code betreffen, fasst die Seite Auf neue Version umsteigen zusammen.

2.50–2.59 (2025–2026) ​

2.59 ​

API-Änderungen: 3 neu, 2 entfernt, 3 geändert

2.59.0.0 (freigegeben am 09.11.2026) ​

Neu

  • Neu: OpcObjectTypes.ServerCapabilitiesType und OpcObjectTypes.ServerDiagnosticsType. Sie bezeichnen die Objekttypen ServerCapabilitiesType und ServerDiagnosticsType und liefern die Bezeichner der zugehörigen Nodes. Bisher waren die Eigenschaften der Klassen OpcObjectTypes.OpcServerCapabilitiesType und OpcObjectTypes.OpcServerDiagnosticsType nicht erreichbar, weil keine Instanz davon bereitgestellt wurde.
  • Neuer Typ OpcModifiedNodeHistory. Er speichert die geänderten Werte (OpcModifiedHistoryValue) eines Nodes, auch mehrere Änderungen eines Werts mit demselben Zeitstempel. Die Werte sind nach ihrem Zeitstempel sortiert, bei gleichem Zeitstempel von der neuesten zur ältesten Änderung. Ist die Kapazität erreicht, wird die älteste Änderung entfernt.

Geändert

  • Bruch: Die veraltete Abhängigkeit Portable.BouncyCastle (Version 1.9.0) ist durch BouncyCastle.Cryptography (Version 2.7.0) ersetzt. Deren Assembly heißt BouncyCastle.Cryptography.dll statt BouncyCastle.Crypto.dll. CertificateFactoryRandomGenerator bietet zusätzlich AddSeedMaterial(ReadOnlySpan<byte>) und NextBytes(Span<byte>), die der IRandomGenerator von BouncyCastle.Cryptography ab .NET 6 deklariert. Anwendungen, die die Assemblies selbst verteilen, müssen BouncyCastle.Cryptography.dll statt BouncyCastle.Crypto.dll verteilen. Anwendungen, die Portable.BouncyCastle selbst referenzieren und dessen Typen verwenden, müssen auf BouncyCastle.Cryptography umstellen, weil beide Pakete dieselben Typen enthalten.
  • Die Abhängigkeit von System.Management entfällt.
  • Bruch: Die Operatoren <, <=, >, >= und == von OpcFilterOperand lösen eine ArgumentNullException aus, wenn der linke Operand null ist. Die Konstruktoren von OpcContentFilterElement lösen eine ArgumentNullException für Operanden aus, die null sind. Bisher wurde eine NullReferenceException ausgelöst. Code, der die NullReferenceException abfängt, muss jetzt die ArgumentNullException abfangen.
  • Bruch: Die Klasse OpcContentFilterElementFactory, die keine öffentlichen Member hatte, entfällt. Code, der den Typ nennt, lässt sich nicht mehr kompilieren. Eine Instanz des Typs ließ sich nie erhalten.
  • Bruch: EndpointDescriptionExtensions.SetEndpointPolicy löst eine ArgumentNullException aus, wenn die Endpunkt-Policy null ist. Der Indexer von OpcSecurityPolicyCollection löst eine ArgumentNullException aus, wenn ihm null zugewiesen wird. Bisher löste SetEndpointPolicy eine NullReferenceException aus, und der Indexer speicherte einen Eintrag ohne Policy. Code, der die NullReferenceException abfängt, muss jetzt die ArgumentNullException abfangen. Code, der über den Indexer null zuweist, schlägt jetzt fehl.
  • Bruch: Das Ereignis CertificateRequested von OpcServer und OpcClient tritt auch ein, wenn das Anwendungszertifikat vorhanden, aber ungültig ist, mit dem Grund Invalid, UseNotAllowed, Revoked, TimeInvalid, IssuerUseNotAllowed, IssuerRevoked oder IssuerTimeInvalid (zum Beispiel TimeInvalid bei einem abgelaufenen Zertifikat). Das Zertifikat wird nie automatisch ersetzt (AutoCreateCertificate der Ereignisdaten ist false). Stellt der Handler kein alternatives Zertifikat bereit, bleibt es in Gebrauch, und ein Trace-Eintrag wird geschrieben. Bisher wurde ein solches Zertifikat ohne Hinweis verwendet. Das Ereignis tritt jetzt auch ein, wenn ein Server mit einem ungültigen Anwendungszertifikat startet oder ein Client sich damit verbindet. Handler, die jeden Grund wie ein fehlendes Zertifikat behandeln, werden also auch in diesem Fall aufgerufen.
  • Bruch: OpcEventContext entfällt; das SDK hat diesen Typ nie erstellt oder zurückgegeben. Code, der OpcEventContext verwendet, lässt sich nicht mehr kompilieren.
  • Bruch: ExtensionObjectExtensions.To<T> löst für ein Extension Object, das null ist, eine ArgumentNullException statt einer NullReferenceException aus. Children von OpcAddObjectTypeNode und OpcAddVariableTypeNode lösen eine ArgumentNullException statt einer NullReferenceException aus, wenn ein Command hinzugefügt oder zugewiesen wird, der null ist. Code, der die NullReferenceException abfängt, muss jetzt die ArgumentNullException abfangen.
  • Ein eigener IOpcNodeHistoryProvider sollte auch den Wert direkt vor und den Wert direkt nach dem angeforderten Zeitraum liefern, damit der Server Werte interpolieren kann, wenn die Historie zu bestimmten Zeitpunkten oder verarbeitet gelesen wird. Andernfalls ergeben solche Lesevorgänge weiterhin BadNoData.
  • Bruch: OpcNodeHistory<T> verwendet als Standardkapazität -1 (unbegrenzt) statt 0. Mit 0 schlug jeder Aufruf von Add fehl. Eine Kapazität von 0 oder kleiner als -1 wird jetzt mit einer ArgumentOutOfRangeException abgelehnt, auch von den Konstruktoren von OpcNodeHistorian. Code, der die Kapazität 0 übergibt (zum Beispiel new OpcNodeHistory<T>(0, values)), schlägt jetzt mit einer ArgumentOutOfRangeException fehl.
  • Bruch: OpcNodeHistorian.ModifiedHistory ist ein OpcModifiedNodeHistory statt eines OpcNodeHistory<OpcModifiedHistoryValue>. Code, der die Eigenschaft als OpcNodeHistory<OpcModifiedHistoryValue> verwendet, muss angepasst werden: GetValues(DateTime) ersetzt den Indexer nach Zeitstempel, RemoveAt(DateTime), Replace und das Ereignis Replaced gibt es nicht mehr. Code, der gegen eine ältere Version kompiliert wurde, muss neu kompiliert werden.
  • Bruch: Das Lesen (zum Beispiel mit OpcClient.ReadNodeHistoryModified) und das Löschen (zum Beispiel mit OpcClient.DeleteNodeHistoryModified) der geänderten Historie eines OpcNodeHistorian beziehen sich auf die Zeitstempel der Werte statt auf die Änderungszeitpunkte. Mehrere Änderungen eines Werts kommen in der Reihenfolge von der neuesten zur ältesten, auch beim Rückwärtslesen. Code, der die geänderte Historie über einen Zeitraum von Änderungszeitpunkten liest oder löscht, erhält oder löscht jetzt andere Werte.
  • Bruch: OpcClient.BrowseNode(OpcBrowseNode) und OpcClient.BrowseNodes lösen für einen Command, der null ist, eine ArgumentNullException aus. Bisher wurde eine NullReferenceException ausgelöst. Code, der die NullReferenceException abfängt, muss jetzt die ArgumentNullException abfangen.
  • Bruch: OpcClient.CallFunc löst eine InvalidCastException aus, wenn das erste Ausgabeargument null ist und der Ergebnistyp ein Werttyp ist, der nicht null sein kann. Bisher wurde eine NullReferenceException ausgelöst. Code, der die NullReferenceException abfängt, muss jetzt die InvalidCastException abfangen.
  • Bruch: OpcClient.CallMethods löst für einen Command, der null ist, eine ArgumentNullException aus. Bisher wurde ein solcher Command übersprungen, sodass die Ergebnisse der folgenden Commands am Index des vorherigen Commands zurückgegeben wurden. Ein Aufruf, bei dem alle Commands null waren, schlug mit einer OpcException mit BadNothingToDo fehl. Code, der einen Command übergibt, der null ist, schlägt jetzt fehl, statt verschobene Ergebnisse zu erhalten.
  • Bruch: Die Überladungen für einen einzelnen Command OpcClient.CallMethod(OpcCallMethod), ReadNodeHistory(..., OpcReadNodeHistory), CreateNodeHistory, ReplaceNodeHistory, UpdateNodeHistory, DeleteNodeHistory, DeleteNodeHistoryAtTime und DeleteNodeHistoryModified lösen für einen Command, der null ist, eine ArgumentNullException mit dem ParamName command aus. Bisher lautete der ParamName commands.Item, und CallMethod(OpcCallMethod) schlug mit einer OpcException mit BadNothingToDo fehl. Code, der für einen Command, der null ist, die OpcException von CallMethod(OpcCallMethod) abfängt, muss jetzt die ArgumentNullException abfangen.
  • Bruch: Die Konstruktoren von OpcServer, die eine Folge von Nodes übernehmen, lösen für einen Node, der null ist, eine ArgumentNullException aus. Bisher schlug OpcServer.Start() mit einer OpcException fehl. Die Ausnahme tritt jetzt beim Erstellen des Servers auf und ist eine ArgumentNullException statt einer OpcException.
  • Bruch: OpcNode.ReadAttributeValueCore und OpcNode.WriteAttributeValueCore lösen für einen Wert, der null ist, eine ArgumentNullException aus. Bisher wurde eine NullReferenceException ausgelöst. Eine abgeleitete Klasse, die die NullReferenceException abfängt, muss jetzt die ArgumentNullException abfangen.
  • Bruch: Die aus Commands erstellten Dienstanfragen (zum Beispiel OpcCallMethodsRequest, OpcReadNodesRequest oder OpcWriteNodesRequest) lösen für einen Command, der null ist, eine ArgumentNullException aus. Bisher wurde ein solcher Command übersprungen, sodass die Ergebnisse der folgenden Commands dem falschen Command zugeordnet wurden. Code, der einen Command übergibt, der null ist, schlägt jetzt fehl, statt verschobene Ergebnisse zu erhalten.
  • Bruch: OpcClient.CreateSubscription löst eine OpcException mit BadServerNotConnected aus, wenn der Client nicht verbunden oder bereits getrennt wurde. Bisher wurde eine NullReferenceException ausgelöst. Code, der die NullReferenceException abfängt, muss jetzt die OpcException abfangen.
  • Bruch: OpcEventFilterFactory.Select löst für Operanden, die null sind, eine ArgumentNullException aus. Bisher wurde eine NullReferenceException ausgelöst, während der Client verbunden war. Code, der die NullReferenceException abfängt, muss jetzt die ArgumentNullException abfangen.
  • Bruch: OpcEventFilterConstrainedFactory.Where verknüpft die angegebene Bedingung mit der Bedingung der Factory durch ein logisches UND, wie ein einzelnes Where mit beiden Bedingungen, verknüpft durch den Operator &. Bisher wurden die Elemente der angegebenen Bedingung nur angehängt. Dadurch blieb die erste Bedingung das Wurzelelement des Filters, und Element-Operanden der angehängten Bedingung verwiesen auf falsche Elemente. Ein Ereignisfilter aus verketteten Aufrufen von Where schränkt die Ereignisse jetzt nach allen Bedingungen ein, sodass ein MonitoredItem möglicherweise weniger Ereignisse erhält als bisher.
  • Bruch: OpcClientApplication.Exit trennt den Client auch in den Zuständen Connecting, Reconnecting und Reconnected (der Zustand, den der Client nach einer Wiederverbindung mit derselben Sitzung annimmt). Während sich der Client verbindet, wartet Exit, bis der Verbindungsaufbau abgeschlossen ist. In einer nicht interaktiven Umgebung beendet Exit auch Run, wenn der Client bereits getrennt ist, zum Beispiel weil die Wiederverbindung fehlgeschlagen ist. Bisher tat Exit in diesen Zuständen nichts: Der Client blieb verbunden oder versuchte weiter, sich wieder zu verbinden, und Run kehrte in einer nicht interaktiven Umgebung nicht zurück (zum Beispiel wurde ein Dienst nicht beendet). Die Ereignisse Exiting und Exited treten jetzt auch in den Zuständen Connecting, Reconnecting und Reconnected ein.
  • Bruch: Die Konstruktoren von OpcClientApplication, OpcServerApplication und OpcServerServiceApplication prüfen ihre Argumente, bevor die Anwendung für den aktuellen Thread registriert wird. Bisher blieb nach einem Konstruktor, der eine ArgumentNullException auslöste, die fehlgeschlagene Instanz registriert: OpcApplication.Current lieferte sie, und der nächste Konstruktor im selben Thread löste eine InvalidOperationException aus, bis die Garbage Collection die Instanz freigegeben hatte. Nach einem fehlgeschlagenen Erstellen liefert OpcApplication.Current jetzt null statt der fehlgeschlagenen Instanz.
  • Eine Anwendung, die ohne Aufruf von Exit von der Garbage Collection freigegeben wurde, verhindert nicht mehr, dass im selben Thread die nächste Anwendung erstellt wird. Bisher löste der nächste Konstruktor eine ArgumentException aus.
  • Anwendungen lassen sich gleichzeitig in mehreren Threads erstellen und beenden. Bisher konnte das die Registrierung beschädigen, sodass OpcApplication.Current die Anwendung eines anderen Threads lieferte oder eine Ausnahme ausgelöst wurde.
  • Bruch: OpcServerApplication.Exit stoppt den Server auch im Zustand Suspended. Bisher tat Exit in diesem Zustand nichts, sodass der Server angehalten blieb und Run in einer nicht interaktiven Umgebung nicht zurückkehrte. Die Ereignisse Exiting und Exited treten jetzt auch in diesem Zustand ein.
  • OpcNodeManager.SyncRoot, GetNode(string) und IsNodeReadyToPublish lösen eine InvalidOperationException aus, solange der Server, der den Node-Manager verwendet, noch nicht gestartet ist, wie die anderen Member des Node-Managers, die einen gestarteten Server voraussetzen. Bisher wurde eine NullReferenceException ausgelöst.
  • OpcClient.BrowseNode und BrowseNodes verwenden OpcBrowseNode.IncludeSubtypes, sobald die Eigenschaft gesetzt ist, wie der Dienst Browse. Ein Command, bei dem der Wert nicht gesetzt ist, folgt wie bisher den Subtypen seiner Referenztypen.
  • Bruch: Die HTTPS-Endpunkte des OpcServer überlassen die Wahl der TLS-Versionen dem Betriebssystem, statt TLS 1.0, 1.1 und 1.2 anzubieten. Clients, die nur TLS 1.0 oder 1.1 unterstützen, können sich nicht mehr über HTTPS verbinden, wenn das Betriebssystem diese Versionen deaktiviert hat.

Behoben

  • Problem mit den Operatoren & und | von OpcContentFilterElement, die ein Element mit einem über seinen Konstruktor erstellten OpcContentFilter verknüpfen (zum Beispiel new OpcContentFilter(element1) & element2). Die Verknüpfung schlug mit einer NullReferenceException fehl. Das Element wird jetzt mit den bisherigen Elementen des Filters verknüpft.
  • Bruch: Problem mit OpcFilterOperand.Between, das die Operanden in der Reihenfolge untere Grenze, Operand, obere Grenze übergab. Dadurch prüfte zum Beispiel a.Between(1, 5), ob 1 zwischen a und 5 liegt, statt ob a zwischen 1 und 5 liegt. Die Operanden werden jetzt in der Reihenfolge übergeben, die OPC UA festlegt. Code, der das Problem ausgeglichen hat, indem er Between auf der unteren Grenze aufruft (zum Beispiel lower.Between(a, upper)), prüft jetzt, ob die untere Grenze zwischen a und der oberen Grenze liegt, und muss auf a.Between(lower, upper) umgestellt werden.
  • Problem mit der Meldung der NotSupportedException, die der Operator != von OpcFilterOperand auslöst. Sie schlug den Ausdruck (a < b || a > b) vor, der sich nicht kompilieren lässt. Die Meldung schlägt jetzt (a < b) | (a > b) vor.
  • Problem mit der Überladung von OpcHistoryValue.CreateModified, die einen Wert übernimmt. Sie setzte den Wert auch in den Daten des Historienwerts, auf dem sie aufgerufen wurde, während dessen Eigenschaft Value weiterhin den vorherigen Wert lieferte. Der geänderte Wert verwendet jetzt eine Kopie der Daten, und der Historienwert bleibt unverändert.
  • Bruch: Problem mit OpcHistoryValue.Create(OpcValue), das einen Historienwert erstellte, der die Daten des angegebenen Werts teilte. Wurde der Wert eines der beiden gesetzt, änderten sich die Daten des anderen, während dessen Eigenschaft Value weiterhin den vorherigen Wert lieferte. Der Historienwert verwendet jetzt eine Kopie der Daten. Code, der einen OpcValue nach der Übergabe an Create ändert oder einen mit Create erstellten Historienwert ändert, ändert die Daten des jeweils anderen Werts nicht mehr.
  • Problem mit dem Konstruktor von OpcCertificateStoreInfo, der mit einer NullReferenceException fehlschlug, wenn der Speichertyp OpcCertificateStoreType.Application und der Pfad eines Zertifikatspeichers des Betriebssystems (zum Beispiel CurrentUser\My) angegeben waren.
  • Bruch: Problem mit OpcSecurityPolicyCollection.CopyTo, das jede Policy ab dem angegebenen Array-Index an denselben Index des Arrays kopierte, sodass die Policies vor diesem Index fehlten. Bei einem leeren Array schlug die Methode mit einer ArgumentOutOfRangeException fehl. Die Methode kopiert jetzt alle Policies ab dem angegebenen Index in das Array, wie List<T>.CopyTo, und löst eine ArgumentException aus, wenn das Array zu klein ist. Code, der einen Array-Index größer als null übergibt, erhält alle Policies ab diesem Index statt eines Teils davon an ihrem eigenen Index. Code, der ein Array übergibt, das für alle Policies zu klein ist, erhält eine ArgumentException.
  • Bruch: Problem mit dem Ereignis CertificateRequested von OpcServer und OpcClient, bei dem ein über AlternativeCertificate der Ereignisdaten bereitgestelltes Zertifikat nicht verwendet wurde: Ein Server ohne Anwendungszertifikat startete nicht („Server does not have an instance certificate assigned“), andernfalls blieb das Zertifikat des Anwendungsspeichers in Gebrauch. Das bereitgestellte Zertifikat wird jetzt verwendet, auch bei späteren Starts und Verbindungen; es muss seinen privaten Schlüssel enthalten. Handler, die AlternativeCertificate auf ein anderes Zertifikat setzen, ändern jetzt das Zertifikat, das die Anwendung verwendet.
  • Bruch: Problem mit OpcStruct, bei dem das Erstellen des Datentyps einer Struktur mit einem Array-Feld, dessen Datentyp unbekannt ist, mit einer NullReferenceException fehlschlug. Jetzt wird eine InvalidOperationException ausgelöst, die den Datentyp, das Feld und die Struktur nennt. Code, der in diesem Fall die NullReferenceException abfängt, fängt die InvalidOperationException nicht ab.
  • Bruch: Problem mit OpcEnum: Felder ohne Wert erhielten den Wert 0, wenn ein anderes Feld mit einem Wert ungleich 0 definiert war, und die angegebenen Instanzen von OpcEnumField wurden verändert. Wie in C# folgt ein Feld ohne Wert jetzt dem Wert des vorherigen Felds (A, B, C = 5, D ergibt 0, 1, 5, 6), und die angegebenen Instanzen bleiben unverändert. Enumerationen mit Feldern ohne Wert neben Feldern mit Wert sowie Enumerationen, deren Felder alle mit dem Wert 0 definiert sind, erhalten andere Werte. Value eines ohne Wert angegebenen OpcEnumField bleibt 0, und GetFields liefert Kopien.
  • Problem mit EnumStrings von OpcMultiStateDiscreteNode: Das Lesen der Eigenschaft eines Nodes, dessen Variable EnumStrings keinen Wert hat, löste eine ArgumentNullException aus. Die Eigenschaft liefert in diesem Fall jetzt null. Das Problem bestand seit Version 2.53.0.0.
  • Problem mit AvailableStates und AvailableTransitions von OpcFiniteStateMachineNode: Das Lesen der Eigenschaft eines Zustandsautomaten ohne die optionale Variable AvailableStates oder AvailableTransitions oder ohne deren Wert löste eine ArgumentNullException aus. Die Eigenschaft liefert in diesem Fall jetzt null. Das Problem bestand seit Version 2.54.0.0.
  • Problem mit OpcFiniteStateMachineNode<T>: Ein Zustandsautomat, dessen Zustände über einen Typ bezeichnet werden, der keine Enumeration ist (zum Beispiel uint), endete mit einer StackOverflowException, wenn der Unterzustandsautomat eines Zustands erstellt wurde. Die Zustandsnummer wird jetzt in T umgewandelt und an CreateSubStatesMachineNode(T) übergeben. Das Problem bestand seit Version 2.54.1.0.
  • Problem mit den Membern, die ein Node-Typ von seinem Basistyp erbt (zum Beispiel geliefert von OpcNodeTypeInfo.GetMembers eines Subtyps): Das Lesen von Parent eines geerbten Variablen- oder Objekt-Members endete mit einer StackOverflowException, die die Anwendung beendete. Parent liefert jetzt das übergeordnete Element des Members, den der Basistyp deklariert. Das Problem bestand seit Version 2.50.4.0.
  • Problem mit dem Konstruktor von OpcClassicInterface, der für eine Schnittstellenspezifikation ohne Namen und ohne Version mit einer NullReferenceException fehlschlug. In diesem Fall werden jetzt die Version 1.0 und ein Name aus der Kategorie und dieser Version verwendet. Das Problem bestand seit Version 2.6.0.0.
  • Problem mit OpcMethodNode.Call: Jeder Eintrag einer nicht leeren Liste outputArguments wurde vor den Ausgabeargumenten der Methode ein zweites Mal zur Liste hinzugefügt. Die Methode fügt jetzt nur ihre Ausgabeargumente zur Liste hinzu. Das Problem bestand seit Version 2.33.0.0.
  • Bruch: Problem mit dem OpcServer, bei dem eine Anfrage der Dienste AddNodes, AddReferences, DeleteNodes, DeleteReferences oder Call, die einen Command mit einem Null-Bezeichner enthielt, als Ganzes abgelehnt wurde (BadNothingToDo, bei AddNodes, DeleteNodes und DeleteReferences BadUnexpectedError). Die übrigen Commands werden jetzt ausgeführt, und der Command mit dem Null-Bezeichner erhält den Status, den OPC UA festlegt (BadParentNodeIdInvalid, BadNodeIdInvalid, BadSourceNodeIdInvalid, BadTargetNodeIdInvalid, BadReferenceTypeIdInvalid oder BadMethodInvalid). Das Problem bestand seit Version 2.7.0.0, bei Call seit Version 2.50.5.0. Eine solche Anfrage wird nicht mehr abgelehnt: RequestValidating tritt mit einem guten Ergebnis ein, die Anfrage wird verarbeitet und nicht in RejectedRequestsCount der Serverdiagnose gezählt. Serveranwendungen, die sich auf die Ablehnung verlassen haben, müssen Commands mit einem Null-Bezeichner selbst behandeln.
  • Problem mit dem Dienst AddNodes des OpcServer, der einen Node der NodeClass Unspecified nicht als ungültige NodeClass ablehnte. Der Server meldet für einen solchen Node jetzt BadNodeClassInvalid, wie OPC UA es festlegt. Das Problem bestand seit Version 2.7.0.0.
  • Problem mit dem Dienst AddNodes des OpcServer, der einen Node, den der Server nicht erstellen konnte, mit dem Status Good und ohne NodeId als hinzugefügt meldete. Der Server meldet für einen solchen Node jetzt BadNotSupported. Das Problem bestand seit Version 2.7.0.0.
  • Problem mit OpcNodeHistory<T>.Enumerate(DateTime?) und Enumerate(DateTime?, DateTime?), die Werte außerhalb des Zeitraums lieferten, wenn eine Grenze nicht der Zeitstempel eines Werts war, zum Beispiel alle Werte vor der Startzeit oder nach der Endzeit. Die Methoden liefern jetzt die Werte innerhalb des Zeitraums einschließlich seiner Grenzen.
  • Problem mit OpcNodeHistory<T>.RemoveRange(DateTime?) und RemoveRange(DateTime?, DateTime?), die keinen Wert entfernten, wenn eine Grenze null, DateTime.MinValue oder DateTime.MaxValue war. Dadurch entfernte RemoveRange(DateTime?) nie einen Wert. Eine solche Grenze schränkt den Zeitraum jetzt nicht ein. Ein OpcNodeHistorian meldet damit keine Werte mehr als gelöscht, ohne sie zu löschen, wenn ein Client die Historie eines Nodes ohne Start- oder Endzeit löscht.
  • Problem beim Lesen der Historie eines Nodes zu bestimmten Zeitpunkten (zum Beispiel mit OpcClient.ReadNodeHistoryAtTime) oder der verarbeiteten Historie (zum Beispiel mit OpcClient.ReadNodeHistoryProcessed) von einem OpcServer: Ein Zeitpunkt zwischen zwei Werten ergab BadNoData statt eines interpolierten Werts. OpcNodeHistorian.ReadHistory liefert jetzt auch den Wert direkt vor und den Wert direkt nach dem Zeitraum, aus denen der Server den Wert zu oder vor einem angeforderten Zeitpunkt ermittelt. Das Lesen der Rohwerte der Historie mit ReturnBounds liefert jetzt die Grenzwerte statt BadBoundNotFound.
  • Problem mit den Historiendiensten von OpcNodeHistorian für einen Node mit dem ValueRank Any, ScalarOrOneDimension oder OneOrMoreDimensions, die jeden Wert mit BadTypeMismatch ablehnten. Ein Wert wird jetzt angenommen, wenn sein ValueRank für den ValueRank des Nodes gültig ist.
  • Problem mit OpcNodeHistorian, der PercentDataBad und PercentDataGood der AggregateConfiguration des Nodes nur auf 0 oder 100 setzte. Die Prozentwerte werden jetzt aus der Anzahl schlechter und guter Werte berechnet.
  • Problem mit OpcSubscriptionDiagnostics.RepublishMessageRequestCount, den der Server je Republish-Anfrage zweimal erhöhte.
  • Problem mit OpcReadNodeHistoryDetails.ReturnBounds (zum Beispiel von OpcReadNodeHistoryRawDetails), dessen Setter unabhängig vom übergebenen Wert true setzte. Dadurch ließen sich die Grenzwerte nicht mehr abschalten, nachdem sie einmal angefordert waren.
  • Problem mit dem Konstruktor von OpcNodeHistorian, der HistoryReadOrWrite zu AccessLevel und UserAccessLevel des Nodes hinzufügte und IsHistorizing setzte, bevor er eine ungültige Kapazität mit einer ArgumentOutOfRangeException ablehnte. Die Argumente werden jetzt geprüft, bevor der Node geändert wird, und die Ausnahme nennt bei einem ungültigen modifiedCapacity den Parameter modifiedCapacity statt capacity.
  • Problem beim Löschen der Rohwerte oder der geänderten Werte der Historie eines Nodes in einem Zeitraum (zum Beispiel mit OpcClient.DeleteNodeHistory oder OpcClient.DeleteNodeHistoryModified mit Start- oder Endzeit) in einem OpcServer, das stattdessen die gesamte Historie des Nodes löschte. Das Problem bestand seit Version 2.7.0.0.
  • Problem beim Einfügen oder Ersetzen der Historie eines Nodes (zum Beispiel mit OpcClient.CreateNodeHistory oder OpcClient.ReplaceNodeHistory) in einem OpcServer, der jedes Einfügen und Ersetzen als Aktualisierung verarbeitete. Das Einfügen eines Werts am Zeitstempel eines vorhandenen Werts ersetzte diesen, statt BadEntryExists zu ergeben, und das Ersetzen eines Werts an einem Zeitstempel ohne Wert fügte ihn ein, statt BadNoEntryExists zu ergeben. Das Problem bestand seit Version 2.7.0.0.
  • Problem mit OpcUpdateNodeHistoryDataDetails und OpcUpdateNodeHistoryStructureDataDetails einer Anfrage, die ein OpcServer empfängt (zum Beispiel im Ereignis RequestValidating), deren Values null waren.
  • Problem mit den Historiendiensten von OpcNodeHistorian (CreateHistory, UpdateHistory, ReplaceHistory und DeleteHistory), die ab dem zweiten Wert eines Aufrufs mit einer ArgumentException fehlschlugen, weil die geänderte Historie nur einen Wert je Änderungszeitpunkt speicherte. Ein Client erhielt für den Node BadUnexpectedError, obwohl die vorherigen Werte bereits geändert waren. Jede Änderung wird jetzt gespeichert.
  • Problem mit OpcServer.RegisterNamespace(Uri), das eine URI, die kein gültiger Namespace ist, in die Namespace-Tabelle eintrug, bevor es sie mit einer FormatException ablehnte.
  • NullReferenceException in OpcClientIdentity.Matches für eine Identität, die mit dem Passwort null erstellt wurde. Eine solche Identität passt jetzt zu keinem Passwort.
  • Problem mit OpcAccessControlEntry.EndpointAccessMode, das den OperationAccessMode des Eintrags statt des Zugriffsmodus der Endpunkte lieferte. Die Zugriffskontrolle selbst war nicht betroffen: Ob ein Endpunkt für einen Principal aktiviert oder deaktiviert ist, wurde bereits anhand des Zugriffsmodus der Endpunkte ausgewertet.
  • Problem mit OpcServerDiagnostics.IsEnabled, das eine ArgumentOutOfRangeException auslöste, wenn die Diagnose bei laufendem Server abgeschaltet wurde, während der Server noch die Diagnosedaten mindestens einer Subscription hielt.
  • Problem mit OpcDataTypeSystem.Default und OpcNodeTypeSystem.Default (zum Beispiel GetTypes), die mit einer FileNotFoundException fehlschlugen, weil die vordefinierten Nodes von OPC UA (Ressource Opc.Ua.PredefinedNodes.uanodes) nicht in die Assembly eingebettet waren. Die Ressource ist jetzt eingebettet, und ihre Datentyp-Nodes, die auch das Attribut DataTypeDefinition angeben, werden korrekt gelesen. (nur Opc.UaFx.Client)
  • Problem mit EnumValues von OpcMultiStateValueDiscreteNode und Value von OpcEnumValuesPropertyNode, die eine ArgumentNullException auslösten, wenn die Variable EnumValues keinen Wert hatte. Ein Server mit einem solchen Node startete deshalb nicht. Beide liefern in diesem Fall jetzt null.
  • Problem mit OpcFiniteStateMachineNode, das mit einer NullReferenceException fehlschlug, wenn sein Typ für einen Zustand einen Unterzustandsautomaten deklarierte, die Klasse dafür aber keinen Node erstellte (siehe CreateSubStatesMachineNode). Ein Server mit einem solchen Zustandsautomaten startete deshalb nicht.

2.58 ​

API-Änderungen: 44 neu, 1 entfernt, 1 geändert, 2 veraltet

2.58.0.0 (freigegeben am 30.10.2026)

Neu

  • Neue Eigenschaft OpcCertificateSettings.Organization. Sie nimmt die Organisation (O) in das Subject des Anwendungsinstanzzertifikats auf, das das SDK erstellt, wie OPC UA es fordert. Bei einem OpcServer stammt die Organisation aus OpcServerInfo.CompanyName. Ohne bekannte Organisation bleibt das Subject wie bisher.
  • Neue Member OpcRequestProcessedEventArgs.RequestType und IsUnsupportedService sowie die neuen Member RegisterServer, RegisterServer2 und FindServersOnNetwork von OpcRequestType. Damit erkennt ein Server, welchen Dienst eine Anfrage aufgerufen hat, auch bei Diensten, die er nicht unterstützt.
  • Neues Ereignis SessionActivationFailed des OpcServer. Es tritt bei jeder abgelehnten Aktivierung einer Sitzung ein und nennt die Identität, die der Client verwendet hat (OpcUserNameIdentityTokenInfo, OpcCertificateIdentityTokenInfo), ohne deren Passwort oder Token-Daten.
  • Neue Einstellung OpcServerDiagnostics.IsEnabled, die die Diagnose von Sitzungen und Subscriptions einschaltet (Standardwert false).
  • Neu: OpcServer.Discovery mit OpcServerDiscovery.RegistrationInterval, dem Intervall, in dem sich der Server am lokalen Discovery-Server registriert (Standardwert 30000 ms; 0 schaltet die Registrierung ab).
  • Neue Überladungen von OpcDiscoveryClient.DiscoverEndpoints und DiscoverServers, die nach Transportprofil und Server-URI filtern.
  • OpcBrowseNode.IncludeSubtypes ist jetzt öffentlich (Standardwert false), und OpcViewDescription bietet öffentliche Konstruktoren, um eine View zu browsen. IncludeSubtypes wirkt in dieser Version nur über client.Services.Browse; BrowseNode und BrowseNodes werten die Eigenschaft noch nicht aus.
  • Neue Methode OpcClient.ChangeUserIdentity, um die Benutzeridentität einer verbundenen Sitzung zu wechseln.
  • Neu: OpcClient.ReconnectInterval legt die Zeit zwischen zwei Versuchen fest, die Verbindung wiederherzustellen (bisher ReconnectTimeout, das als verborgener Alias erhalten bleibt). OpcClient.MaxReconnectDuration beendet diese Versuche nach der angegebenen Zeit (Standardwert 0, unbegrenzt).
  • Neue Methode OpcDataFieldInfo.GetLength, die die maximale Länge jeder Dimension eines Felds angibt.
  • Bruch: Neuer Typ OpcRawObject. Er stellt den Wert einer Struktur, die das SDK nicht dekodieren kann (ein unbekannter Datentyp oder ein Feld ohne festen ValueRank), mit seiner Kodierung und seinem kodierten Inhalt dar. OpcData.Encode kodiert eine Struktur als OpcRawObject. Code, der für den Wert einer unbekannten Struktur ein Byte-Array oder ein XmlElement erwartet hat, erhält jetzt ein OpcRawObject. Dessen RawData enthält, was bisher zurückgegeben wurde.
  • Bruch: Neue Attribute RolePermissions, UserRolePermissions, AccessRestrictions und AccessLevelEx in OpcAttribute und OpcAttributes, das neue Member DataTypeDefinition von OpcAttributes sowie die neuen Typen OpcRolePermission und OpcPermissions. Das Lesen des Attributs DataTypeDefinition liefert jetzt ein OpcDataTypeInfo statt einer StructureDefinition oder EnumDefinition des Stacks. Das Lesen von RolePermissions oder UserRolePermissions liefert ein Array von OpcRolePermission statt RolePermissionType.
  • Neue Einstellung OpcServerSecurity.IsAuditingEnabled (Standardwert false) sowie die Audit-Ereignisse der Secure-Channel-Dienste (AuditOpenSecureChannelEventType, AuditChannelEventType).
  • Das Trace-Ereignis des Stacks (Opc.Ua.Tracing.Instance.TraceEventHandler) liefert die protokollierte Ausnahme in TraceEventArgs.Exception.

Geändert

  • Bruch: Die CertificateFactory des Stacks ist nicht mehr Teil der öffentlichen API des Pakets, weil das SDK weder das Signieren durch eine Zertifizierungsstelle (CA) noch das Erzeugen von Sperrlisten (CRL) anbietet. Code, der CertificateFactory verwendet, lässt sich nicht mehr kompilieren.
  • Bruch: OpcSecurityAlgorithm.Auto sowie die Standardendpunkte des Discovery-Servers und des OPC-Classic-Wrapper-Servers verwenden Basic256Sha256 statt der veralteten Policies Basic256 (Sign) und Basic128Rsa15 (SignAndEncrypt). Ein Client mit Auto verbindet sich nicht mehr mit einem Server, der nur die veralteten Policies anbietet.
  • Das Zertifikat, das das SDK für einen OpcServer erstellt, nennt auch den vollqualifizierten Namen des Rechners. So akzeptieren es Clients, die sich über diesen Namen verbinden. Ein vorhandenes Zertifikat bleibt unverändert.
  • Bruch: Der OpcServer meldet Audit-Ereignisse nur noch, solange OpcServerSecurity.IsAuditingEnabled den Wert true hat. Er meldet sie nur an Clients, die über SignAndEncrypt oder HTTPS mit einem Benutzer in der Rolle SecurityAdmin verbunden sind, wie OPC UA es festlegt. Audit-Ereignisse zu Sitzungen meldet ein Server erst, nachdem IsAuditingEnabled auf true gesetzt wurde.
  • Bruch: State, StateChanged und BreakDetected des OpcClient folgen einem Verbindungsverlust, den ein fehlschlagender Dienstaufruf erkennt (zum Beispiel BadConnectionClosed oder BadSessionIdInvalid), sofort statt erst mit dem nächsten Keep-Alive. Eine neu erstellte Sitzung verbindet sich innerhalb eines Intervalls wieder mit einem neu gestarteten Server. Code, der sich darauf verlassen hat, dass sich der Zustand nur mit dem Keep-Alive ändert, sieht die Änderung jetzt früher.
  • Bruch: Das Datentypsystem von OPC UA enthält jetzt alle vordefinierten Datentypen (zum Beispiel Integer, UInteger, Enumeration oder Image). Jeder Datentyp nennt seinen Supertyp als BaseType. Felder von Datentypen, die von einem eingebauten Typ abgeleitet sind (zum Beispiel Duration, UtcTime oder LocaleId), werden jetzt dekodiert. Eingebaute Typen und die Strukturen von OPC UA nennen ihren Supertyp jetzt als BaseType, bisher nannten sie keinen. Ein Feld eines von ByteString abgeleiteten Typs liefert ein ByteString statt eines Byte-Arrays.
  • Der OpcServer meldet eine Verbindung, die ein Client zurückgesetzt hat, im Trace nicht mehr als Fehler, weder beim Lesen noch beim Schließen des Sockets.
  • Bruch: OpcClient.ReconnectTimeout und DefaultReconnectTimeout sind als veraltet (obsolete) gekennzeichnet. Verwenden Sie stattdessen ReconnectInterval und DefaultReconnectInterval. Code, der sie verwendet, erhält eine Compiler-Warnung und mit TreatWarningsAsErrors einen Compiler-Fehler.
  • Bruch: Die Historiendienste für einzelne Nodes OpcClient.ReadNodeHistoryProcessed, ReadNodeHistoryAtTime und ReadNodeHistoryModified lösen für einen Node, den der Server abgelehnt hat, eine OpcException mit dem Statuscode des Servers aus (zum Beispiel BadAggregateNotSupported). Für einen Node, den der Server ohne Werte akzeptiert hat, liefern sie ein leeres Ergebnis. Bisher wurde in beiden Fällen eine KeyNotFoundException ausgelöst. Code, der die KeyNotFoundException abfängt, muss jetzt die OpcException abfangen.
  • Bruch: OpcDiscoveryClient (DiscoverEndpoints, DiscoverServers und seine Konstruktoren) löst eine OpcException mit dem Grund aus (zum Beispiel BadSecureChannelClosed), wenn der Server nicht erreichbar ist, den Kanal während des Handshakes schließt oder die Discovery-URL ein nicht unterstütztes Schema verwendet. Die Navigatoren der Historie von OpcClient.ReadNodeHistory und ReadEventHistory lösen eine OpcException mit BadCommunicationError aus, wenn eine Seite nicht innerhalb der maximalen Anzahl von Anfragen abgeschlossen wurde. Bisher wurde die ServiceResultException des Stacks ausgelöst. Code, der die ServiceResultException abfängt, muss jetzt die OpcException abfangen.
  • Bruch: OpcViewDescription.Default ist jetzt ein statisches, schreibgeschütztes Feld (static readonly), damit sich die Standard-View nicht ersetzen lässt. Code, der OpcViewDescription.Default einen Wert zuweist, lässt sich nicht mehr kompilieren. Code, der gegen eine ältere Version kompiliert wurde und OpcViewDescription.Default liest, muss neu kompiliert werden, weil aus der Eigenschaft ein Feld geworden ist.

Behoben

  • Problem mit Methoden im OpcServer, die über einen Command implementiert sind (zum Beispiel eine Methode eines importierten NodeSets, implementiert mit OpcNodeSetManager.ImplementNodeCallback) und ein Argument mit dem ValueRank Any, ScalarOrOneDimension oder OneOrMoreDimensions deklarieren. Jeder Aufruf einer solchen Methode schlug mit einer IndexOutOfRangeException fehl. Der Wert eines solchen Arguments wird jetzt je nach empfangenem Wert als Skalar oder als Array an den Command übergeben. Ein Array von ByteStrings kommt zum Beispiel als ByteString[] an, wie bei einem Argument, das als eindimensionales Array deklariert ist.
  • Problem mit Nodes, die mit dem Modell ihres Typs erstellt wurden (zum Beispiel Instanzen von Companion-Spezifikationen). Ihre Variablen übernahmen die Zugriffsebenen und Schreibmasken des NodeSets nicht und ließen sich trotzdem schreiben. Das Problem bestand seit Version 2.50.6.0.
  • Problem mit Notifiern, die mit OpcNodeManager.AddNotifierNode hinzugefügt wurden. Ein Client, der die Notifier-Hierarchie ab dem Server-Objekt browst, fand sie nicht.
  • Problem mit Arrays von object (zum Beispiel ein Methodenargument mit dem Datentyp BaseDataType und dem ValueRank OneDimension), die als Array von Strukturen statt als Array von Varianten kodiert wurden.
  • Problem mit dem OpcServer, der einen Endpunkt mehrfach anbot, wenn eine Endpunkt-Policy mehr als einmal konfiguriert war. Der Server behält beim Start die erste Policy und entfernt die Wiederholungen.
  • Problem mit dem OpcServer, der bei jedem Start den Fehler „Could not load CertificateTrustList for UserTokenPolicy“ im Trace meldete.
  • Bruch: Problem mit dem OpcServer, bei dem ein Start die ServerConfiguration der Anwendung veränderte. Dadurch bot ein Neustart anonymen Zugriff an, obwohl nur die OpcUserNameAcl aktiviert war. Der Server arbeitet jetzt mit einer Kopie der Konfiguration. Code, der Configuration.ServerConfiguration nach dem Start liest, sieht die Werte, die er selbst gesetzt hat, statt der verwendeten Policies.
  • Problem mit OpcClient.Connect, das mit einer IndexOutOfRangeException fehlschlug, wenn die Data Type Dictionaries des Servers eine NamespaceUri gar nicht oder mehrfach angeben. Ein Dictionary, das sich nicht laden lässt, wird ausgelassen und im Trace gemeldet. Das Problem bestand seit Version 2.8.0.0.
  • Problem mit dem OpcNodeManager, der beim Ändern eines MonitoredItems MonitoredItemsDeleted statt MonitoredItemsModified auslöste. Das Problem bestand seit Version 2.7.4.0.
  • Problem mit dem OpcClient, der sich nicht mit einem Server verbinden konnte, der eine User-Token-Policy mit einer nicht unterstützten Security-Policy (zum Beispiel RSA_DH_AesGcm) vor einer unterstützten anbietet.
  • Problem mit dem OpcServer, der mit einer StackOverflowException beendet wurde, wenn die Diagnose aktiviert war, ein Client die Diagnose der Sitzungen oder Subscriptions überwachte und eine andere Sitzung einen Sitzungsdienst aufrief.
  • Bruch: Problem beim Lesen der verarbeiteten Historie (zum Beispiel mit OpcClient.ReadNodeHistoryProcessed), das beide Zeitstempel anforderte. Dadurch konnte ein Server die Anfrage mit BadTimestampsToReturnInvalid ablehnen. Das Problem bestand seit Version 1.5.11.0. Die verarbeiteten Werte tragen keinen Server-Zeitstempel mehr.
  • Problem mit dem OpcServer, bei dem eine Anfrage zum Lesen der geänderten Historie als OpcReadNodeHistoryRawDetails statt als OpcReadNodeHistoryModifiedDetails ankam. Das Problem bestand seit Version 2.7.0.0.
  • Problem mit mehrdimensionalen Feldern einer Struktur (zum Beispiel UInt16[2,3,2]), die bei der Kodierung der Struktur ausgelassen wurden. Das Problem bestand seit Version 2.8.0.0.
  • Problem mit einem OpcStatusCode, der sich weder als Methodenargument übergeben noch als Wert schreiben ließ.
  • Problem mit dem OpcClient, der im Zustand Reconnecting blieb, wenn der Server nach dem Wiederverbinden eine seiner Subscriptions ablehnte. Das Problem bestand seit Version 2.32.0.0.
  • Bruch: Problem mit einer Struktur aus einem Data Type Dictionary, deren Feld auf einen Datentyp verweist, der nur über seine DataTypeDefinition bekannt ist. Der Client konnte eine solche Struktur nicht auflösen. Das Problem bestand seit Version 2.40.0.0. Name und XmlName eines solchen Datentyps nennen jetzt den Namespace seines Nodes statt des Namespace von OPC UA.
  • Problem mit Feldern, die mit einem Datentyp ohne eigene Definition deklariert sind (zum Beispiel einem herstellerspezifischen Subtyp von Byte). Sie nannten den nächstliegenden Supertyp statt ihres deklarierten Datentyps. Außerdem lieferte OpcClient.GetDataType für einen solchen Datentyp keinen Datentyp.
  • Problem mit einem Variablen-Node eines Array-Typs, der ohne Wert erstellt wurde (zum Beispiel new OpcDataVariableNode<int[]>(name)). Er nannte einen skalaren ValueRank und keine Array-Dimensionen. Das Problem bestand seit Version 2.52.0.0.
  • Problem mit einer Matrix von Strukturen, deren Kodierung mit einer InvalidCastException fehlschlug. Das Problem bestand seit Version 2.9.2.0.
  • Problem mit den Retain-Policies von Conditions, die eine Condition nicht in jedem Zustand beibehielten, den sie nennen. So wurde zum Beispiel ein aktiver Alarm nicht mehr beibehalten, sobald er quittiert war. Das Problem bestand seit Version 2.55.0.0.
  • Problem mit dem GDS Push Management des OpcServer. CreateSigningRequest lehnte einen vom Client übergebenen Subject-Namen ab und forderte weder die Organisation noch die Anwendungs-URI des Zertifikats an. UpdateCertificate lehnte ein Zertifikat ab, dessen Subject sich in mehr als dem Common Name vom aktuellen unterschied. ApplyChanges ließ den Server ohne das neue Zertifikat oder ohne dessen privaten Schlüssel zurück, sodass Verbindungen mit Sign oder SignAndEncrypt fehlschlugen. Das Problem bestand seit Version 2.53.0.0.
  • Problem mit dem GDS Push Management des OpcServer, das keine unterstützten Formate für private Schlüssel nannte, solange keine Formate konfiguriert waren (jetzt PFX und PEM). Außerdem lehnte es CreateSigningRequest und UpdateCertificate ohne Zertifikatstyp ab, auch bei einer Zertifikatsgruppe mit nur einem Typ. Das Problem bestand seit Version 2.53.0.0.
  • KeyNotFoundException in den Diensten zum Aktualisieren der Historie einzelner Nodes OpcClient.CreateNodeHistory, ReplaceNodeHistory, UpdateNodeHistory, DeleteNodeHistory, DeleteNodeHistoryAtTime und DeleteNodeHistoryModified bei einer NodeId, die nur einen Namespace-Index angibt (zum Beispiel ns=2;s=Value). Die Ergebnisse der Dienste zum Aktualisieren der Historie verwenden jetzt die NodeId des Commands als Schlüssel.
  • Endloses Lesen der Historie, wenn der Server einen Node auf einer Folgeseite ablehnt, weil der Fortsetzungspunkt des abgelehnten Nodes auf jeder Seite erneut angefordert wurde. Das Problem bestand seit Version 1.6.5.0.
  • Problem mit einer neuen Subscription, deren MonitoredItems der Server abgelehnt hat. Wenn das anschließende Löschen der Subscription ebenfalls fehlschlug, ersetzte dieser Fehler den der MonitoredItems. Die OpcException nennt jetzt den Grund, aus dem die MonitoredItems abgelehnt wurden. Das Problem bestand seit Version 2.32.0.0.
  • Ausnahme unter Linux mit neueren OpenSSL-Versionen beim Erstellen eines Anwendungszertifikats.

2.57 ​

API-Änderungen: 8 neu

2.57.1.0 (freigegeben am 23.10.2026)

Neu

  • Neues Ereignis NotificationFailed in OpcSubscription und OpcClient sowie der zugehörige Handler OpcSubscriptionSetup.NotificationFailed. Das Ereignis tritt ein, wenn eine Benachrichtigung des Servers nicht empfangen werden konnte, zum Beispiel weil sich ein Wert darin nicht dekodieren lässt. Bisher wurden die Datenänderungen und Ereignisse einer solchen Benachrichtigung ohne Hinweis verworfen. Das Ereignis löst zuerst die OpcSubscription aus, zu der die Benachrichtigung gehört, und, wenn es dort nicht behandelt wird, der OpcClient. Eine Benachrichtigung, deren Subscription (noch) nicht bekannt ist, meldet nur der OpcClient.
  • Neuer Wert OpcAttribute.DataTypeDefinition, um das Attribut DataTypeDefinition eines Datentyp-Nodes zu lesen.

Behoben

  • Problem mit strukturierten Datentypen, die nur über ihre DataTypeDefinition bekannt sind (zum Beispiel mit OpcClient.UseDynamic) und ein Member eines anderen strukturierten Datentyps deklarieren. Seit Version 2.57.0 wurde ein solches Member ohne seine Felder dekodiert. Dadurch konnten die danach dekodierten Werte falsch sein, Ereignisse mit einer solchen Struktur wurden ohne Hinweis verworfen, oder die Dekodierung schlug mit einer überschrittenen MaxStringLength oder dem Statuscode BadEncodingLimitsExceeded fehl.
  • Problem mit strukturierten Datentypen, die nur über ihre DataTypeDefinition bekannt sind und ein Member eines einfachen Datentyps ohne eigene Definition deklarieren (zum Beispiel ein herstellerspezifischer Subtyp von Byte, UInt16 oder String). Das Dekodieren einer solchen Struktur schlug mit einer ArgumentNullException fehl, der gesamte Lesevorgang mit dem Statuscode BadUnknownResponse. Ein solches Member wird jetzt als der nächstliegende Supertyp dekodiert, den der Client kennt.
  • Deadlock zwischen Browse-Anfragen und Änderungen am Node-Manager, die unter der Sperre des Node-Managers vorgenommen werden.
  • Problem mit Ereignissen eines eingebauten Ereignistyps im OpcClient. Seit Version 2.56.0 wurde ein solches Ereignis als Instanz eines der Basistypen seines Ereignistyps erzeugt, zum Beispiel eine Dialog-Condition als OpcCondition statt als OpcDialogCondition oder eine Alarm-Condition als OpcAcknowledgeableCondition statt als OpcAlarmCondition.
  • Problem, durch das OpcClient.Connect() fehlschlug, wenn UseDynamic aktiviert ist und der Server dieselbe HasSubtype- oder HasEncoding-Referenz eines Datentyps mehrfach sendet.
  • NullReferenceException im OpcClient bei Servern, die einen Endpunkt ohne URL liefern.
2.57.0.0 (freigegeben am 14.09.2026)

Behoben

  • Problem mit strukturierten Datentypen, die OpcEncodingMaskKind.Auto verwenden und deren erstes optionales Member nicht gesetzt ist. Werte, die nach einem solchen Member dekodiert wurden, konnten falsch sein, oder die Dekodierung schlug mit einer EndOfStreamException oder einer ServiceResultException fehl, die eine überschrittene MaxStringLength meldete.
  • Problem mit Membern eines strukturierten Datentyps, die als einer der Wrapper-Typen OpcText, OpcName, OpcNodeId, OpcValue oder OpcEngineeringUnitInfo deklariert sind. Ein solches Member wird jetzt einheitlich kodiert und dekodiert, unabhängig davon, ob es einen Wert oder eine Null-Referenz enthält.
  • Problem mit Membern eines strukturierten Datentyps, die als Nullable-Werttyp deklariert sind (zum Beispiel int?, short?, double? oder DateTime?). Der Wert eines solchen Members bleibt jetzt erhalten.
  • NullReferenceException beim Dekodieren eines strukturierten Datentyps mit einem Array-Member, das nicht optional ist und eine Null-Referenz enthält.
  • InvalidCastException beim Dekodieren eines Arrays von Guid-Werten.
  • Problem mit leeren Arrays der Wrapper-Typen OpcText, OpcName, OpcValue und OpcEngineeringUnitInfo. Als Member eines strukturierten Datentyps wird ein solches Array jetzt als leeres Array statt als Null-Referenz kodiert. Als Parameter eines Methodenaufrufs wird es jetzt als Array des Typs übergeben, den die aufgerufene Methode deklariert, und vom Server akzeptiert. Bisher wurde für einen solchen Parameter nur eine Null-Referenz akzeptiert.
  • Problem, bei dem ein leeres Array von OpcNodeId-Werten als Array erweiterter NodeIds übergeben wurde.

2.56 ​

API-Änderungen: keine

2.56.0.0 (freigegeben am 19.08.2026)

Behoben

  • Sichergestellt, dass der RetainState nicht automatisch durch einen anderen Unterzustand als den EnableState aktualisiert wird, wenn die RetainPolicy den Wert Manual hat.
  • Fehlerhaft behandelte nodeChanges in OpcNode.UpdateChanges: Der angegebene Parameter wurde nicht an die verwendeten Handler übergeben und ging dadurch verloren. Nur die bereits ausstehenden Änderungen wurden an die Handler für Benachrichtigungen über Datenänderungen weitergeleitet.
  • Problem mit falscher Auflösung des Ereignistyps im OpcClient, wenn ein Ereignistyp nur über eine erweiterte NodeId registriert ist (zum Beispiel über OpcNamespace.GetId, wobei der Instanz von OpcNamespace kein Namespace-Index zugewiesen ist). Dadurch wurden immer Instanzen von OpcEvent empfangen statt des spezifischen Subtyps von OpcEvent oder eines benutzerdefinierten typisierten Speichers für Ereignisdaten.

2.55 ​

API-Änderungen: 2 neu

2.55.0.0 (freigegeben am 07.08.2026)

Neu

  • Neue Eigenschaft OpcConditionNode.IsRetainedPolicy in OpcConditionNode. Sie überschreibt die Standardlogik, die den Wert der Eigenschaft OpcConditionNode.IsRetained abhängig von den Zuständen der Condition-Nodes steuert (zum Beispiel EnableState, ActiveState, AckedState und ConfirmState). Der Standardwert dieser Eigenschaft hängt vom verwendeten Subtyp von OpcConditionNode ab. Mit dem Wert OpcConditionRetainPolicy.Manual für die Eigenschaft IsRetainedPolicy erhalten Sie die volle Kontrolle über die Eigenschaft IsRetained.

Geändert

  • Der Initialwert der Eigenschaft OpcConditionNode.IsRetained und ihrer Subtypen (OpcAcknowledgeableConditionNode und OpcAlarmConditionNode) einschließlich der davon abgeleiteten Subtypen kann ab dieser Version abweichen. So entspricht der Initialwert der Zustandsmaschine des jeweiligen Condition-Typs. Die einzelnen Conditions beschreibt OPC UA Part 9, weitere Details enthält die Dokumentation der neuen Enumeration OpcConditionRetainPolicy. Der jeweilige Condition-Typ verwendet standardmäßig die passende Policy, um konforme Initialwerte zu liefern. Um das zu überschreiben, setzen Sie die Eigenschaft OpcConditionNode.IsRetainedPolicy auf den Wert OpcConditionRetainPolicy.Manual. Damit erhalten Sie die volle Kontrolle über die Eigenschaft IsRetained.

Behoben

  • StackOverflowException, wenn der Rechner unter Last steht.

2.54 ​

API-Änderungen: 93 neu, 10 entfernt, 9 geändert

2.54.1.1 (freigegeben am 27.07.2026)

Behoben

  • StackOverflowException in der neuen Klasse OpcFiniteStateMachineNode<T> bei Verwendung von ChangeStateTo.
2.54.1.0 (freigegeben am 22.07.2026)

Neu

  • Unterstützung für dynamische Datentypen, die rekursiv auf sich selbst verweisen.
  • Neue geschützte virtuelle Eigenschaft InheritReferenceTypeId für OpcInstanceNodes, die steuert, ob die DefaultReferenceTypeId an die direkten Kind-Nodes vererbt wird.
  • Neue Methode OpcNodeSet.GetNodes, die den gesamten in einem NodeSet definierten Adressraum liefert.

Behoben

  • Problem mit falsch generiertem Attribut DataTypeDefinition im OpcServer bei strukturierten Datentypen mit optionalen Feldern und OpcEncodingMaskKind.Explicit.
  • Problem mit falscher Kodierung optionaler Felder im OpcClient, wenn UseDynamic aktiviert ist und der Server kein TypeDictionary bereitstellt.
  • Problem, bei dem die Methode OpcNodeSet.GetNode nur Nodes ausgehend vom Root-Node fand. Die Methode findet jetzt jeden Node im geladenen NodeSet.
  • Problem beim Abrufen von Nodes mit der Methode OpcNodeSet.GetNode nach dem Laden eines NodeSets ohne benutzerdefinierten Kontext mit passenden Namespace-URIs.
2.54.0.0 (freigegeben am 25.06.2026)

Neu

  • Neue Eigenschaft SupportedTokenTypes in OpcEndpointDescription. Sie liefert eine aufzählbare Folge der unterstützten OpcAccessControlTokenType-Werte, über die sich die unterstützten Zugriffssteuerungslisten des vom Server bereitgestellten Endpunkts ermitteln lassen. Die Werte lassen sich mit OpcDiscoveryClient.DiscoverEndpoints(...) abfragen.
  • Neue Eigenschaften AvailableStates und AvailableTransitions in OpcFiniteStateMachineNode.
  • Neue Eigenschaft SupportCurrentState für Zustandsmaschinen, die den verpflichtenden CurrentState-Node nicht unterstützen. Wenn Sie die Eigenschaft überschreiben, deaktivieren Sie die Unterstützung von CurrentState einschließlich der Aufrufe der Methode ChangeStateTo. Der CurrentState-Node liefert dann Bad als Statuscode und BAD als Wert, sein Kind-Node „Id“ liefert eine Null-Referenz als Wert.
  • Unterstützung für die Bereitstellung der Ereignis-Historie im OpcServer über die Schnittstelle IOpcEventHistoryProvider und für das Lesen der Ereignis-Historie im OpcClient über die Methode ReadEventHistory.
  • Neue Eigenschaft OpcServerBinding.UseExclusiveAddress, die festlegt, ob nur ein Prozess an den Port binden darf.

Geändert

  • Erweiterte Zertifikatvalidierung, insbesondere für Anwendungsinstanzzertifikate, mit konformer Validierung der Erweiterung Basic Constraints. Das ist für die CTT-Konformität erforderlich.
  • Der Listener-Socket verwendet beim Binden an den Port jetzt standardmäßig eine exklusive Adresse. Die neue Eigenschaft OpcServerBinding.UseExclusiveAddress steuert dieses Verhalten.

Behoben

  • Problem mit undefinierten Array-Dimensionen von Variablen-Nodes und Definitionen strukturierter Datentypen in NodeSet-Dateien, die einen ValueRank größer als null definieren. Das Attribut ArrayDimensions wird jetzt anhand des Werts des Attributs ValueRank mit einem leeren Array von Dimensionen initialisiert.
  • ArgumentNullException im OpcServer, wenn ein Client ConditionRefresh aufruft. Hinweis: Als Nebeneffekt dieser Korrektur kann das SDK beim Aufruf von ConditionRefresh jetzt automatisch Ereignisdaten senden, auch wenn die Anwendung den QueryEventsCallback nicht implementiert.
  • Problem mit fehlenden strukturierten Datentypen in OpcNodeSet nach dem Import einer Datei NodeSet2.xml, die mehrere Datentypen nur über DataTypeDefinitions und teilweise über zusätzliche DataTypeDescriptions definiert. Diese DataTypeDescriptions werden nicht von DataTypeEncodings referenziert, die ihrerseits keine inversen Referenzen auf ihren kodierten Datentyp-Node verwenden. In solchen Fällen ignoriert die API jede DataTypeDescription und liefert die Informationen zum Datentyp aus der DataTypeDefinition des Datentyp-Nodes.
  • NullReferenceException beim Aufruf von OpcServer.GetDataTypes(), wenn ein NodeSet geladen wurde, das eine leere Strukturdefinition enthält.
  • NullReferenceException beim Import von NodeSets, die als Namespace-URI eine Zeichenkette verwenden, die sich nicht als URI parsen lässt.
  • OpcPropertyNode<T> war im Adressraum nicht sichtbar, wenn der Typparameter T ein Wrapper-Typ wie OpcText war und ein Konstruktor mit Eltern-Node verwendet wurde.
  • Die Methoden OpcText.Equals() und .CompareTo() konnten eine NullReferenceException auslösen und ein falsches Vergleichsergebnis liefern.
  • Der OpcServer konnte bei begrenzter Größe zu viele History-Werte liefern.

2.53 ​

API-Änderungen: 32 neu, 2 entfernt, 13 geändert

2.53.1.0 (freigegeben am 06.05.2026)

Behoben

  • Ausnahme, wenn einige Typen in Benutzer-Assemblies nicht geladen werden konnten, bei Verwendung eines OpcServer oder eines OpcClient mit aktivierter dynamischer Typregistrierung.
  • Problem, bei dem benutzerdefinierten Nodes, die nach dem Start des OpcServer mit OpcNodeManager.AddNode() hinzugefügt wurden, manchmal die hierarchische Referenz vom Eltern-Node fehlte.
2.53.0.0 (freigegeben am 16.04.2026)

Neu

  • Neue Eigenschaft OpcServer.UseDynamic zusammen mit den Typen OpcStruct, OpcStructField, OpcEnum und OpcEnumField, mit denen sich Datentypen für den OpcServer dynamisch definieren lassen.
  • Neuer Typ OpcEnumValue, der Enumerationswerte mit dem OPC-UA-Datentyp EnumValueType darstellt.
  • Zwei neue statische Methoden (Shared in Visual Basic) in OpcEnum, die die Enumerationswerte einer typisierten Enumeration liefern. Wie die Informationen ermittelt werden, steuern die Attribute OpcEnumAttribute, OpcEnumMemberAttribute und EnumMemberAttribute.
  • Neuer OpcEnumValuesPropertyNode, um benutzerdefinierte OpcEnumValues im Adressraum des Servers zu veröffentlichen.
  • Neue Nodes OpcMultiStateDiscreteNode und OpcMultiStateValueDiscreteNode mit jeweils einer generischen Implementierung. Sie entsprechen in ihrer Verwendung den in OPC UA definierten Node-Typen MultiStateDiscreteType und MultiStateValueDiscreteType.
  • Neue Klasse OpcAccessControlRole, die Standardrollen darstellt und benutzerdefinierte Rollen definiert, in denen OpcPrincipals Mitglied sein können.
  • Neue Klasse OpcServerSecurityRoles, die alle Standardrollen bereitstellt, die der OpcServer üblicherweise kennt.
  • Neue Eigenschaften Roles und AccessControlRoles in OpcServerSecurity: Die erste liefert alle Standardrollen von OPC UA, die zweite die Rollen, die der OpcServer aktuell verwendet. In dieser Implementierung sind alle Instanzen der Standardrollen in der Eigenschaft AccessControlRoles enthalten.
  • Neue Methoden Assign und Revoke in OpcAccessControlEntry, die die Rollenmitgliedschaften des Principals im Eintrag steuern.
  • Neue Methode IsInRole in OpcPrincipal, die ermittelt, ob der Principal Mitglied einer bestimmten Rolle ist.
  • Automatische Zuweisung des anonymen Principals zur Rolle Anonymous.
  • Automatische Zuweisung aller anderen Principals zur Rolle AuthenticatedUser. Benutzerdefinierte Zugriffssteuerungslisten müssen sicherstellen, dass authentifizierte Principals ebenfalls dieser Rolle zugewiesen werden.
  • Neues Ereignis CertificateChanged in OpcServer, das ausgelöst wird, wenn eine Sitzung mit einer Identität, die Mitglied der Rolle SecurityAdmin ist, das Zertifikat des Servers ändert.
  • Unterstützung für GDS Push Management mit ServerConfigurationType, UpdateCertificate, TrustList und rollenbasierter Authentifizierung über die Rolle SecurityAdmin. Um GDS Push Management zu aktivieren, muss die benutzerdefinierte Implementierung des OpcServer mindestens einen ACL-Eintrag bereitstellen, der der Rolle SecurityAdmin zugewiesen ist.

Behoben

  • Problem mit doppelten Kind-Referenzen bei Nodes, die eingebettete, von der Foundation definierte Instanzen von NodeState für einen ganzen Node-Baum verwenden, wobei die Kind-Nodes durch den NodeState und nicht durch den Benutzercode definiert sind. Das betrifft seit Version 2.51.4.1 komplexe Foundation-Nodes, die im Benutzercode erstellt und nicht aus einem NodeSet importiert werden.

2.52 ​

API-Änderungen: 5 neu

2.52.0.0 (freigegeben am 13.03.2026)

Neu

  • Neue abstrakte Subtypen OpcDiscreteItemNode und OpcDiscreteItemNode<T> der Basisklasse OpcDataItemNode.
  • Neuer Subtyp OpcTwoStateDiscreteNode der Basisklasse OpcDiscreteItemNode.
  • Unterstützung der neuen Security-Policy-Algorithmen Aes128_Sha256_RsaOaep und Aes256_Sha256_RsaPss.

Behoben

  • CTT-Problem mit falschem Statuscode BadSessionClosed statt BadNoSubscription, wenn eine Sitzung ein Publish ohne Subscription anfordert.
  • Problem mit nicht funktionierender automatischer Zuweisung der NodeId für ShelvingState in OpcAlarmConditionNode.
  • Problem mit nicht initialisiertem Attribut ValueRank nach dem Erstellen einer nicht generischen Instanz von OpcVariableNode ohne Übergabe eines Werts.

2.51 ​

API-Änderungen: 6 neu, 3 geändert

2.51.4.1 (freigegeben am 18.02.2026)

Behoben

  • Problem mit doppelten Kind-Referenzen für aus NodeSets importierte Nodes, insbesondere bei HasComponent-Referenzen.
2.51.4.0 (freigegeben am 18.02.2026)

Neu

  • Neue Eigenschaft OpcServer.EstimatedReturnTime zur Unterstützung der CTT-Konformität. Die Eigenschaft aktualisiert direkt den Wert des zugehörigen Nodes unter Objects/Server/EstimatedReturnTime. So können Clients Wertänderungen des Nodes abonnieren, die neueste geschätzte Rückkehrzeit des Servers vor dem Herunterfahren erhalten und ihre Wiederverbindungslogik darauf abstimmen.
  • Verbessertes OpcNodeModel mit zusätzlichen Überladungen für CreateByDefault, OmitByDefault und OmitOptionals mit einem zusätzlichen booleschen Parameter recursive. Er steuert, ob die Standardwerte und Direktiven nur auf das Modell oder auch auf seine Kinder angewendet werden.
  • Unterstützung für die modellabhängige Erstellung des optionalen LastTransition-Nodes in Zustandsmaschinen-Nodes hinzugefügt.
  • Logik zur Unterstützung serverbezogener Operationsgrenzen (mit OpcServer.OperationLimits.AutoDetermineLimits) gemäß CTT-Konformität hinzugefügt.
  • Die Implementierung des internen OpcOperationLimiter wurde überarbeitet und liefert praktikablere Standardgrenzen, wenn AutoDetermineLimits aktiviert ist.
2.51.3.0 (freigegeben am 12.02.2026)

Neu

  • Clientseitige Unterstützung von ResendData über OpcSubscription.ResendData, um aktuelle Werte von MonitoredItems im Reporting-Modus abzufragen.

Behoben

  • Problem im OPC UA Server bei der Behandlung ausstehender ResendData-Anfragen, insbesondere wenn sich der aktuelle Wert zwischenzeitlich nicht geändert hat.
  • Problem, durch das der Typ OpcNodeId in Definitionen strukturierter Datentypen seit Version 2.50.0 auf ExpandedNodeId statt auf NodeId abgebildet wurde.
  • Problem, durch das mit OpcVariableNode.Value gesetzte Werte bei einem benutzerdefinierten Datentyp unter Umständen nicht in die Historie des OpcNodeHistorian aufgenommen wurden.
  • Problem bei der mit Version 2.50 eingeführten rekursiven automatischen Zuweisung von NodeIds, wenn Standard-Nodes mit Kind-Nodes erstellt werden, deren relative Baumtiefe größer als eins ist.
  • Problem beim Import von NodeSets mit Typdefinitionen, die nicht in hierarchischer Reihenfolge stehen.
2.51.2.0 (freigegeben am 12.01.2026)

Behoben

  • Problem, durch das OpcClient.Connect() fehlschlagen konnte, wenn UseDynamic aktiviert ist und der Server einen oder mehrere TypeDictionary-Nodes bereitstellt, die beim Lesen den Status BadNotReadable liefern. In diesem Fall wird der Fehler jetzt ignoriert und ein leeres TypeDictionary verwendet.
2.51.1.0 (freigegeben am 27.11.2025)

Behoben

  • Falscher Statuscode von ActivateSession bei ungültigem Sitzungsbezeichner oder leerer Client-Signatur (CTT-Konformität).
  • Die PolicyId der UserTokenPolicy-Einträge war in den von GetEndpoints gelieferten Endpunktbeschreibungen innerhalb des Servers nicht eindeutig (CTT-Konformität).
  • Wenn ein Client ein UserNameIdentityToken mit leerem Benutzernamen sendet, wird jetzt der Statuscode BadIdentityTokenInvalid zurückgegeben (CTT-Konformität).
2.51.0.0 (freigegeben am 24.11.2025)

Geändert

  • Bei Verwendung von .NET Framework ist jetzt Version 4.7.2 oder höher erforderlich.
  • Die Methode IOpcNodeHistoryProvider.ReadHistory() hat neue Parameter erhalten, um History-Werte zu streamen, statt alle Werte im Speicher zu puffern. Insbesondere muss die Implementierung die Werte jetzt in umgekehrter Reihenfolge zurückgeben, wenn der Parameter timeFlowsBackward den Wert true hat.

Behoben

  • Problem, durch das das Lesen des ServerDiagnosticsNode den Status BadOutOfService lieferte, obwohl die Diagnose im OpcServer aktiviert war.
  • Problem, durch das eingehende Verbindungen zum OpcServer mit BadUserTokenRejected fehlschlugen, wenn eine https:-URL verwendet wurde.
  • Wenn ein Client eine HistoryRead-Anfrage mit einem Wert für maxCount sendet, wird dieser Wert jetzt korrekt berücksichtigt, um die History-Werte beim Senden der Antwort aufzuteilen.
  • ASP.NET-Core-Abhängigkeiten auf Version 2.3.6 aktualisiert.

2.50 ​

API-Änderungen: 439 neu, 9 entfernt, 38 geändert

2.50.7.0 (freigegeben am 22.10.2025)

Neu

  • Leistungsverbesserungen beim Erstellen von Variablen-Nodes (vereinfachte und vereinheitlichte Initialisierung).
  • Neue Eigenschaften UseNodeNameAsDefaultDescription und UseNodeNameAsDefaultSymbolicName in OpcAutomatism für die bedingte Initialisierung des Attributs Description und der Eigenschaft SymbolicName von OpcNode.

Geändert

  • Verbesserte CTT-Konformität bei der Standardinitialisierung von OpcNode: Die Standardwerte für das Attribut Description und die Eigenschaft SymbolicName entfallen unter bestimmten Bedingungen. Für das bisherige Verhalten aktivieren Sie die entsprechenden Eigenschaften in OpcAutomatism.

Behoben

  • Problem mit überschriebenen Attributen von Variablen-Nodes, die über ein OpcNodeModel bereitgestellt werden.
2.50.6.2 (freigegeben am 06.10.2025)

Behoben

  • Problem mit InvalidOperationException oder NullReferenceException beim Erstellen eines OpcConditionNode oder eines OpcHistoryConfigurationNode.
2.50.6.1 (freigegeben am 25.09.2025)

Behoben

  • Problem mit NullReferenceException bei NodeSet-Variablen mit undefinierten Array-Dimensionen.
2.50.6.0 (freigegeben am 21.09.2025)

Neu

  • IOpcNodeInfo um die Eigenschaften WriteAccess und UserWriteAccess erweitert, die auch die Werte dieser Attribute liefern.
  • Neue Schnittstelle IOpcVariableNodeInfo als Subtyp von IOpcNodeInfo, um Variablen von anderen Nodes zu unterscheiden und variablenspezifische Attribute bereitzustellen.
  • Unterstützung von Modellattributen, um Nodes mit den in einem Modell definierten Initialwerten der Attribute zu initialisieren.
  • Neue Node-Typ-Implementierungen OpcAnalogUnitRangeNode und OpcAnalogUnitNode.

Geändert

  • Die Eigenschaft Model und die übrige API zu OpcNodeModel wurden von OpcInstanceNode nach OpcNode verschoben, um eine korrekte Initialisierung der Nodes sicherzustellen.
2.50.5.0 (freigegeben am 17.09.2025)

Neu

  • Erweiterte Authentifizierung mit mehreren Mechanismen zum Schutz vor Brute-Force-Angriffen.
  • Neue Eigenschaft OpcServer.AuthenticationLimits, die die neuen Grenzen für den Brute-Force-Schutz bei der Authentifizierung steuert.
  • Node-Typen auf Version 1.05.03 aktualisiert.
  • BadUserAccessDenied, wenn eine ungültige Identität verwendet wird, um die Identität einer bestehenden Sitzung zu ändern (CTT-Konformität).
  • Neue Konstruktoren mit einem Parameter vom Typ OpcNodeModel für weitere Unterklassen: OpcConditionNode (einschließlich seiner Unterklassen), OpcOrderedObjectNode und OpcFileNode.

Geändert

  • Die Validierung von Anfragen wurde überarbeitet: Zuerst wird der Inhalt der Anfrage validiert, danach, ob die angeforderte Operation erlaubt ist. Außerdem werden Diagnoseinformationen (einschließlich Null-Referenzen) nur noch auf Anforderung geliefert. Das dient der CTT-Konformität.

Behoben

  • Problem mit NullReferenceException in OpcContext, wenn er aus einem OpcOperationContext erstellt wurde.
  • Problem mit NullReferenceException in OpcNodeId, wenn ValueAsString auf der Instanz OpcNodeId.Null abgefragt wird.
  • Problem mit NullReferenceException (seit Version 2.50.4) beim Erstellen eines OpcDataItemNode (oder einer seiner Unterklassen) nach dem Start des Servers.
  • Problem mit doppelten Eltern-Kind-Referenzen beim Import von NodeSet-Dateien mit typisierten Instanzen.
2.50.4.0 (freigegeben am 09.09.2025)

Neu

  • Neue Eigenschaft OpcServerInfo.ProductUri, um die ProductUri in der Variablen BuildInfo der Variablen ServerStatus zu setzen.
  • Neue generische Implementierung von OpcMethodNode: OpcMethodNode<T> unterstützt typisierte Delegaten und das Ändern des verwendeten Callback-Ziels.
  • Unterstützung für ResendData(...) auf den MonitoredItems von Subscriptions.
  • Neue Eigenschaft OpcServer.OperationLimits, die die Operationsgrenzen des Servers steuert (vorerst nur unbegrenzt oder automatisch anhand der verfügbaren Systemressourcen ermittelt).

Geändert

  • Die DefaultReferenceTypeId von OpcFolderNode war fälschlich Organizes; stattdessen wird jetzt HasComponent verwendet. Diese Änderung dient der CTT-Konformität.
  • ServerDiagnostics liefert keine Kind-Nodes mehr, und jede explizite Lese- oder Schreiboperation auf die Kind-Nodes über ihre NodeId führt zu BadOutOfService. Dieses Verhalten gilt bei deaktivierter ServerDiagnostics und dient der CTT-Konformität.

Behoben

  • Problem mit nicht gemeldetem Statuscode SemanticsChanged (0x4000) für MonitoredItems beim Schreiben von Werten in semantische Eigenschaften, zum Beispiel eines OpcAnalogItemNode.
  • Problem mit doppelten Referenzen beim Browsen des Adressraums importierter Nodes. Das betraf vor allem Methoden-Nodes und ihre InputArguments und OutputArguments.
  • Problem mit nicht konformen Leseergebnissen des Attributs InverseName von ReferenceTypes: Jetzt wird BadAttributeIdInvalid statt einer Null-Referenz (Nothing in Visual Basic) geliefert.
  • Falscher Statuscode in Server-Subscriptions beim Zugriff auf die Subscription einer anderen Sitzung: statt BadSessionIdInvalid jetzt BadSubscriptionIdInvalid.
  • Falscher Statuscode, wenn die Impersonation eines Identity-Tokens fehlschlägt: statt BadIdentityTokenInvalid jetzt BadIdentityTokenRejected. Diese Änderung dient der CTT-Konformität.
2.50.3.0 (freigegeben am 17.07.2025)

Behoben

  • Problem mit NullReferenceException beim Erstellen einer Instanz von OpcAlarmConditionNode (oder einer ihrer Unterklassen) im OpcServer.
2.50.2.0 (freigegeben am 07.07.2025)

Neu

  • Der OpcServer liefert jetzt die Informationen zur lokalen Zeitzone des Servers in der Eigenschaft LocalTime des Server-Objekts.
  • Unterstützung für das Verfolgen und Melden von Modelländerungen.
  • Neue Eigenschaft OpcAutomatism.RaiseModelChangeEvents, um das Verfolgen und Melden von Modelländerungen global zu aktivieren oder zu deaktivieren.
  • Neue Methoden OpcNode.SuspendModelChangeEvents(...) und OpcNode.ResumeModelChangeEvents(...), um das Verfolgen und Melden von Modelländerungen je Node zu steuern.

Behoben

  • Problem beim Dekodieren strukturierter Datentypen, wenn das erste Feld optional ist.
  • OpcNodeManager.GetNode(string) lieferte nicht immer Instanzen von OpcFiniteStateMachineNode.
  • Problem beim Empfang von Daten zu ModelChangeEvent und GeneralModelChangeEvent im OpcClient.
  • Problem mit NullReferenceException in OpcGeneralModelChange, wenn die Eigenschaft Changes des Datenspeichers eine Null-Referenz (Nothing in Visual Basic) war.
2.50.1.0 (freigegeben am 16.06.2025)

Neu

  • Unterstützung von Methoden-Membern bei der Reflexion von NodeType.

Behoben

  • Problem mit Zustandsmaschinen, bei denen jeder Übergang die Übergangsnummer null hat.
  • Problem mit Zustandsmaschinen mit Zuständen, bei denen null eine ungültige Zustandsnummer ist.
2.50.0.0 (freigegeben am 12.06.2025)

Neu

  • Unterstützung von NodeTypeSystem-Informationen im OpcServer und in OpcContext.
  • Unterstützung der Erstellung typisierter Node-Instanzen beim Import von Nodes aus einer NodeSet-Datei.
  • Verbesserte dynamische Erstellung typisierter Node-Instanzen beim Laden eines NodeSets.
  • OpcFiniteStateMachineNode ermittelt Zustände und Übergänge jetzt aus den Node-Typ-Informationen, wenn keine Attribute zur Definition der Zustände und Übergänge angegeben sind.
  • Thread-lokaler OpcContext (über die neue Eigenschaft OpcContext.Current) für Szenarien, in denen ein OpcContext benötigt, aber über keinen Parameter übergeben wird. Das gilt derzeit nur für Servercode.
  • Neue Eigenschaften OpcNodeManager.NodeSetImportOptions und OpcNodeSetManager.ImportOptions, mit denen Sie festlegen, dass beim Import aus NodeSets die Strukturfelder der Elterntypen in die DataTypeDefinition-Attribute übernommen werden.
  • Neue Methode OpcEncoding.Empty() für leere Encoding-Arrays.
  • Neues OpcEncodingMask.DefaultAuto zur Vereinfachung generischer Encoding-Definitionen.
  • Thread-lokaler OpcContext (über die neue Eigenschaft OpcContext.Current) für Szenarien, in denen ein OpcContext benötigt, aber über keinen Parameter übergeben wird, zum Beispiel im Konstruktor eines Nodes.
  • Neue Methode OpcContext.OfNode, um in den Kontext eines bestimmten Nodes zu wechseln. Außerdem fügen die Methoden AddChild und RemoveChild in OpcInstanceNode den Kind-Node jetzt dem Node-Manager hinzu, dessen Kontext für die Operation verwendet wird, beziehungsweise entfernen ihn daraus. Der Kind-Node wird also demselben Node-Manager hinzugefügt oder daraus entfernt wie der Node, dessen Kontext an AddChild und RemoveChild übergeben wird.
  • Neue Methoden OpcServer.RegisterNamespace und OpcServer.RegisterNamespaces, um bekannte Namespaces vorab zu registrieren. So werden sie in einer bestimmten Reihenfolge registriert und erhalten festgelegte Namespace-Indizes.
  • Neue Methode OpcNodeManager.IsNodeReadyToPublish(...), die ermittelt, ob angewendete Node-Änderungen darauf warten, von mindestens einem MonitoredItem veröffentlicht zu werden.
  • Rekursive Navigation von einer OpcSession zu ihren OpcSubscriptions und von dort zu deren OpcMonitoredItems.
  • Neues Ereignis OpcNode.ChangesUnhandled, das ausgelöst wird, wenn Änderungen auf einen Node angewendet werden sollen, aber kein MonitoredItem existiert, das die Node-Änderungen annimmt (zum Beispiel aufgrund eines Filters) und behandelt.

Geändert

  • Wenn OpcClientSecurity.UseOnlySecureEndpoints auf true gesetzt ist, wählt der OpcClient jetzt nur noch Endpunkte mit dem Modus SignAndEncrypt und nicht mehr solche mit dem Modus Sign, da Letzterer keine Vertraulichkeit bietet. Für das bisherige Verhalten (Endpunkte mit Sign oder SignAndEncrypt) setzen Sie client.Security.EndpointPolicy auf eine Policy mit diesem Modus und OpcClient.Security.AutoUpgradeEndpointPolicy auf true. Alternativ setzen Sie OpcClient.Security.UseHighLevelEndpoint auf true, um den „besten“ vom Server angebotenen Endpunkt zu wählen. Das bietet allerdings keine Sicherheit.
  • Beim Erstellen eines Ereignisfilters mit OpcEventFilterFactory.Select() wird in den einfachen Attributoperanden jetzt standardmäßig der Typbezeichner von BaseEventType verwendet (wie vor Version 2.32.0.0). So lassen sich bei mehreren Ereignistypen, die gleichnamige Felder haben können, alle Felder empfangen. Für das bisherige Verhalten, den tatsächlichen Ereignistyp in den einfachen Attributoperanden anzugeben, übergeben Sie OpcEventFieldSelectOptions.UseExplicitEventTypeIds an OpcEventFilterFactory.Select().

Behoben

  • NullReferenceException beim Import eines NodeSets mit einer FiniteStateMachine ohne den Kind-Node LastTransition.
  • NullReferenceExceptions beim Vergleich zweier Werte der Struktur Number, wenn der zugrunde liegende Wert eine Null-Referenz (Nothing in Visual Basic) ist.
  • Problem, durch das Clients den Fehler BadNotSupported erhielten, wenn sie eine neue Verbindung zum Server aufbauen wollten, nachdem ein Client Audit-Ereignisse abonniert hatte.
  • Problem, durch das OpcEngineeringUnitInfo.CommonCode eine Zeichenkette mit einem NUL-Zeichen liefern konnte.
  • Problem, das eine OpcException beim Lesen eines strukturierten Datentyps mit einem Array verschachtelter strukturierter Datentypen verursachen konnte, wenn OpcClient.UseDynamic aktiviert war.
  • Problem, durch das der OpcServer Clientverbindungen mit nicht vertrauenswürdigen Zertifikaten akzeptieren konnte, obwohl OpcSecurity.AutoAcceptUntrustedCertificates auf false gesetzt war.
  • Problem, durch das sich der OpcClient mit Endpunkten mit dem Policy-Modus None verbinden konnte, wenn der Server nur diese Policy anbot, obwohl OpcClientSecurity.UseOnlySecureEndpoints auf true gesetzt war.
  • Problem beim Dekodieren strukturierter Datentypen, wenn für ein Array-Feld ein Null-Wert auftrat.
  • Problem mit InvalidCastException beim Lesen eines strukturierten Datentyps, der ein Array strukturierter Datentypen enthält.
  • IndexOutOfRangeException beim Import eines NodeSets, in dem ein VariableNode einen ValueRank von 0 angibt.
  • [Client SDK] Die Methoden OpcData.Decode<T>(...), die mit Version 2.40.0.0 hinzukommen sollten, fehlten im Client SDK (Opc.UaFx.Client).

2.40–2.42 (2023–2024) ​

2.42 ​

API-Änderungen: 16 neu, 12 geändert

2.42.5.0 (freigegeben am 03.12.2024)

Behoben

  • NullReferenceException, die intern ausgelöst und abgefangen wurde, wenn eine leere Publish-Response verarbeitet wurde.
2.42.4.0 (freigegeben am 21.10.2024)

Neu

  • Impliziter Cast-Operator von UserIdentityToken nach OpcIdentityToken hinzugefügt.

Geändert

  • Die Abhängigkeit Portable.BouncyCastle wurde auf Version 1.9.0 aktualisiert, um eine Sicherheitslücke zu beheben.

Behoben

  • Fehlerhaft generiertes SwitchValue-Feld für Union-Datentypen im Attribut DataTypeDefinition.
2.42.3.0 (freigegeben am 10.09.2024)

Neu

  • Unterstützung für Abo-Lizenzen hinzugefügt.

Behoben

  • Problem, durch das OpcClient.State beim Aufruf von OpcClient.Disconnect() im Zustand Connecting stehen bleiben konnte, wenn gleichzeitig ein anderer Thread Methoden wie OpcClient.CallMethod() aufruft.
2.42.2.0 (freigegeben am 22.08.2024)

Neu

  • Von den Klassen OpcAccessControlList und OpcUserIdentity kann jetzt abgeleitet werden, und benutzerdefinierte Instanzen von OpcAccessControlList lassen sich über die Methode OpcServerSecurity.AddAccessControlList() zu einem OpcServer hinzufügen.
2.42.1.0 (freigegeben am 25.07.2024)

Behoben

  • Problem, bei dem ein Seiteneffekt in einer internen Klasse dazu führen konnte, dass die Methode OpcNodeIdFactory.Create() für bestimmte Node-Instanzen nicht aufgerufen wurde.
  • Problem, das eine InvalidOperationException in OpcFiniteStateMachine.ChangeStateTo() aufgrund eines falschen Vergleichs von OpcNodeId-Werten verursachte.
2.42.0.1 (freigegeben am 07.06.2024)

Behoben

  • Ungültig generiertes Längenfeld für Arrays im Attribut DataTypeDefinition in Unterklassen, wenn das Feld in der Basisklasse deklariert ist.
2.42.0.0 (freigegeben am 05.06.2024)

Neu

  • Neue Eigenschaft OpcAutomatism.UseNullInsteadOfEmptyArrays, die verschiedene Array-, List- und Collection-Eigenschaften hinsichtlich ihrer unterstützten und kodierten Werte steuert. Wenn diese Eigenschaft auf true gesetzt ist, setzen einige Eigenschaften eine Null-Referenz (Nothing in Visual Basic) nicht mehr auf ein leeres Array, eine leere Liste oder Collection. Außerdem kodieren sie diese Werte mit der Array-Größe -1. Wenn ein Server oder Client ein leeres Array, eine leere Liste oder Collection benötigt, muss die Eigenschaft OpcAutomatism.UseNullInsteadOfEmptyArrays auf false gesetzt werden. Das führt zu leeren Array-, Listen- und Collection-Werten, die mit der Array-Größe null kodiert werden.

Geändert

  • OpcArgument.ArrayDimensions und OpcArgumentInfo.ArrayDimensions unterstützen jetzt Null-Referenzen (Nothing in Visual Basic), wenn das über OpcAutomatism.UseNullInsteadOfEmptyArrays aktiviert ist. Wenn ein Server den Wert null für die ArrayDimensions angibt, gibt diese Eigenschaft jetzt also ebenfalls eine Null-Referenz (Nothing in Visual Basic) zurück.

Behoben

  • Der OpcClient wählt keinen Endpunkt mit unbekanntem Sicherheitsalgorithmus mehr aus (wodurch die Verbindung fehlschlagen würde), wenn Standardeinstellungen verwendet werden und mindestens ein Endpunkt mit bekanntem Sicherheitsalgorithmus verfügbar ist.
  • Problem, durch das OpcNode.Id zu einer anderen Objektinstanz wechselte, wenn ein Client das Attribut NodeId eines Nodes las.
  • Problem, bei dem in der DataTypeId eines strukturierten Datentyps, der auf einen anderen strukturierten Datentyp verweist, ein ungültiger Namespace-Index angegeben wurde.
  • OpcNodeManager.GetNode(string) findet jetzt auch untergeordnete Nodes, die in einem anderen Namespace existieren (solange die Namespaces von derselben Instanz von OpcNodeManager verwaltet werden).
  • Ungültig generiertes Längenfeld für Arrays im Attribut DataTypeDefinition.
  • Speicherleck im OpcServer, das jedes Mal auftrat, wenn ein Client eine GetEndpoints-Anfrage sendete.
  • Workaround für einige OPC Classic Server hinzugefügt, die das Lesen bestimmter Eigenschaften zusammen mit anderen, regulären Eigenschaften nicht unterstützen.

2.41 ​

API-Änderungen: 2 neu, 1 geändert

2.41.1.0 (freigegeben am 18.01.2024)

Geändert

  • Die Abhängigkeit Microsoft.AspNetCore.Server.Kestrel.Core wurde auf Version 2.1.25 aktualisiert, um eine Sicherheitslücke zu beheben.

Behoben

  • Problem, das ein Speicherleck im OpcClient verursachte, wenn OpcClient.BrowseNodes() wiederholt aufgerufen oder mit den Klassen OpcFileMethods, OpcFileStream oder OpcFileInfo auf Datei-Nodes zugegriffen wurde.
  • Problem, durch das der OpcClient fälschlicherweise Leseanfragen (vom Keep-alive-Timer) senden konnte, obwohl der Aufruf von ActivateSession noch nicht abgeschlossen war.
2.41.0.0 (freigegeben am 02.12.2023)

Geändert

  • Die Benutzerauthentifizierung im OpcServer wird jetzt nur noch einmal während ActivateSession durchgeführt, statt für jede Anfrage einzeln.

Behoben

  • Problem mit OpcVariableNodeInfo.IsArray und OpcVariableNode.IsArray, die bei einem Array mit 3 oder mehr Dimensionen fälschlicherweise false zurückgaben (Ersteres seit Version 2.33.0).
  • Problem mit einem Deadlock, der beim Aufruf von OpcClient.Disconnect() oder OpcClient.Dispose() auftrat, während gleichzeitig Ereignis-Subscriptions aktiv waren.
  • Problem, durch das OpcClient.State nicht auf Reconnecting wechselte, wenn eine Verbindungsunterbrechung erkannt wurde, während eine Operation wie ReadNodes() noch ausgeführt wurde.
  • Problem, das die Erstellung eines Ereignisfilters aus einer OpcNodeId verhinderte, wenn ein aufgelöster Namespace verwendet wurde.
  • Problem, das ein Speicherleck verursachte, wenn wiederholt Instanzen von OpcMethodNode erstellt (und verworfen) wurden und dabei eine Delegate-Instanz übergeben wurde.
  • Problem, durch das reflektierte Typfelder in falscher Reihenfolge deklariert wurden, wenn der Typ eine Schnittstelle implementiert.

2.40 ​

API-Änderungen: 9 neu, 3 entfernt, 2 geändert

2.40.0.0 (freigegeben am 23.10.2023)

Neu

  • Neue Methoden OpcContext.Enter(...), um einen lokalen Kontext zu betreten und so Szenarien außerhalb von Client und Server auszuführen.
  • OpcDataTypeInfo wurde erweitert, um ExtensionObjects auch als Systemtyp zu unterstützen (Eigenschaft IsSystemType).
  • Neue Methoden OpcData.Decode<T>(...) zur manuellen Dekodierung eines binär kodierten Datenstroms oder Puffers in ein strukturiertes Objekt.
  • Explizite Unterstützung für das Kodieren, Dekodieren und Verwenden von ExtensionObjects.
  • Verbesserte Leistung beim erstmaligen Empfang benutzerdefinierter Ereignisdaten.
  • Neue Methode OpcNodeSet.Load(string, OpcNodeSetLoadOptions), um mehr Details zur zu ladenden NodeSet-Datei anzugeben.

Behoben

  • Problem mit falsch berechneter Kodierungsmaske bei Verwendung expliziter Kodierung.
  • Problem beim Kodieren und Dekodieren von Subtypen eingebauter Datentypen entsprechend ihren Basistypen.
  • Probleme beim Kodieren und Dekodieren von ExtensionObjects in benutzerdefinierten strukturierten Datentypen.
  • Problem mit verschachtelten Ereignistyp-Feldern wie ActiveState/Id, die seit Version 2.32.0 nicht korrekt gemeldet werden.
  • Problem mit gemischten Datentypen, die mit DataTypeDescriptions und DataTypeDefinitions definiert werden, wobei die Definitionen unterschiedliche Feldtypen verwenden. Die Beschreibungen werden jetzt priorisiert.
  • Problem mit Ereignis-Subscriptions, die seit Version 2.29.0 nicht funktionieren, wenn kein OpcEventFilter angegeben wurde.

2.30–2.33 (2022–2023) ​

2.33 ​

API-Änderungen: 8 neu, 4 geändert

2.33.0.0 (freigegeben am 11.09.2023)

Neu

  • OpcNodeContext wurde um die neue Eigenschaft NodeManager erweitert, die auf den OpcNodeManager im aktuellen Kontext verweist, in dem eine Operation ausgeführt wird.
  • Neue Methode OpcMethodNode.Call(...) zum Aufrufen eines implementierten Methoden-Nodes mit einem benutzerdefinierten Kontext, unabhängig von einem Aufruf durch einen Client.
  • Neue Methoden Close(...), GetPosition(...), Open(...), Read(...), SetPosition(...) und Write(...) zum Aufrufen der implementierten Methoden eines OpcFileNode mit einem benutzerdefinierten Kontext, unabhängig von Aufrufen durch einen Client.
  • Verbesserte Leistung bei der Erstellung von Ereignisfiltern, die nur Ereignistypen des vom Server bereitgestellten Node-Typsystems verwenden.
  • Unterstützung von Datentypen, die nur über eine Datentypdefinition und nicht mehr über eine Datentypbeschreibung deklariert werden.
  • Unterstützung der dynamischen Auflösung und Darstellung von Union-Datentypen mit der Klasse OpcDataObject.

Geändert

  • OpcContext.Empty.SessionId liefert keine Null-Referenz (Nothing in Visual Basic) mehr, sondern OpcNodeId.Null.
  • Die Zugriffsmodifizierer der Methoden OpcNodeManager.AddNode(...) und OpcNodeManager.RemoveNode(...) wurden von protected auf public geändert, um die Verwendung zu vereinfachen.
  • Die Auswertung von OpcVariableNodeInfo.IsArray verwendet jetzt den Wert von ValueRank statt ArrayDimensions, um zu entscheiden, ob das Attribut Value ein Array liefert.

2.32 ​

API-Änderungen: 16 neu

2.32.0.0 (freigegeben am 28.08.2023)

Neu

  • Weitere DCOM-Sicherheitsoptionen mit Eigenschaften zur Konfiguration von AuthenticationService, AuthorizationService und ProxyCapabilities im Anwendungscode.
  • Neue Eigenschaft Name in OpcDataTypeAttribute, um für jeden Datentyp einen eigenen Namen zu definieren, den der implementierende .NET-Typ verwendet.
  • Unterstützung für die verzögerte Initialisierung benutzerdefinierter Store-Implementierungen von OpcData mit einem Standardkonstruktor.
  • Neue Eigenschaft IsUnion in IOpcDataTypeInfo, die angibt, ob ein Datentyp ein Union-Datentyp ist.
  • Neue Schnittstelle IOpcUnion zur Implementierung benutzerdefinierter Union-Datentypen.
  • Typisierte Unterstützung für den abstrakten Datentyp Number, der die Kodierung aller primitiven numerischen Datentypen unterstützt.
  • Neue Klasse OpcSubscriptionSetup für die Erstellung einer neuen Subscription mit allen vordefinierten Eigenschaften.
  • Neue Methode OpcClient.CreateSubscription(...), die ein OpcSubscriptionSetup verwendet, um eine neue OpcSubscription zu erstellen.

Behoben

  • Verweis auf System.Text.Encodings.Web 4.5.1 (für das NuGet-Paket) hinzugefügt, um eine Warnung vor einer Sicherheitslücke zu beheben, die durch den transitiven Verweis über Microsoft.AspNetCore.Server.Kestrel 2.1.3 beziehungsweise 1.1.3 verursacht wurde.
  • Problem mit Ereignissen, die nicht am Server-Node gemeldet werden, bis ein MonitoredItem erstellt wurde, um das erwartete Ereignis in seiner Node-Hierarchie zu überwachen.
  • Fehlender impliziter Aufruf von ApplyChanges mit OpcEventNode.ReportEvent(...).
  • Problem mit der Verwendung des Typbezeichners von BaseEventType in den einfachen Attributoperanden eines EventFilter.
  • Problem, durch das gleiche Start- und Endzeiten beim Lesen verarbeiteter History-Werte zu einer Endlosschleife und steigendem Speicherverbrauch führen konnten.
  • Probleme mit Deadlocks bei der Verwendung von UseDynamic und Subscriptions mit strukturierten Datentypen, die mit der Klasse OpcDataObject dargestellt werden.

2.31 ​

API-Änderungen: keine

2.31.0.0 (freigegeben am 17.05.2023)

Geändert

  • Abhängigkeit Newtonsoft.Json auf Version 13.0.3 aktualisiert, um eine Sicherheitslücke zu beheben.
  • Der UA Wrapper Server für OPC-Classic-Verbindungen generiert jetzt immer ein neues Anwendungszertifikat, statt zu versuchen, eines aus dem Zertifikatspeicher des Clients zu laden.
  • Wenn bei einer opc.com:-URL kein Port angegeben ist, wird der Port für den Classic Wrapper Server nicht mehr von classID und progID abgeleitet, sondern es wird eine freie dynamische Portnummer ermittelt. Das erleichtert die gleichzeitige Verwendung mehrerer OpcClients mit derselben opc.com:-URL.

Behoben

  • Problem bei der Aktualisierung der ApplicationUri des OpcServer aus dem ausgewählten Zertifikat: Sie wurde erst beim zweiten statt beim ersten Start angewendet, wodurch der Reconnect-Mechanismus des OpcClient fehlschlug.

2.30 ​

API-Änderungen: 1 neu, 2 geändert

2.30.0.0 (freigegeben am 07.12.2022)

Neu

  • Trace-Protokollierung auf Debug-Ebene bei Verwendung der Unterbrechungsüberwachung mit dem OPC Classic UA Wrapper Server hinzugefügt.
  • Die Eigenschaft OpcNodeId.Resolution.InheritParentNamespace wurde eingeführt, um die Vererbung des Namespace von Eltern-Nodes an ihre Kinder zu steuern.
  • Die Auflösung der Standard-NodeId verwendet jetzt den Namespace des Eltern-Nodes (wenn es nicht der Standard-Namespace ist), um die automatische NodeId eines Nodes zu definieren. Das gilt, wenn OpcNodeId.Resolution.InheritParentNamespace den Wert true hat (der Standardwert).

Geändert

  • Das Verhalten beim Starten und Beenden eines OPC Classic UA Wrapper Servers ist jetzt deterministischer, da jeder OpcClient einen eigenen Wrapper Server verwendet, der jetzt auch gestoppt wird, wenn der OpcClient die Verbindung trennt.
  • Die Methode OpcCertificateIdentity.Matches() ist jetzt virtuell, um einen benutzerdefinierten Identitätsvergleich zu ermöglichen.
  • Die Eigenschaft OpcEvent.EventId liefert jetzt den zugrunde liegenden ByteString statt eines Byte-Arrays (wie vor der Einführung von ByteString).

Behoben

  • Problem mit ArgumentOutOfRangeException, die ausgelöst wird, wenn ein OpcFiniteStateMachineNode erstellt wird, ohne Zustände über Attribute zu definieren.
  • Problem mit NullReferenceException, wenn ein OpcFiniteStateMachineNode erstellt wird, nachdem der OpcServer bereits gestartet wurde.
  • OpcEvent.GetValue<T>(string) gibt jetzt korrekt einen ByteString-Wert zurück, wenn für den Typparameter T der Typ Opc.UaFx.ByteString verwendet wird.
  • Problem mit ArgumentException in OpcClient.Connect(), wenn der Anzeigename (Friendly Name) der aktuellen AppDomain Zeichen enthält, die in Pfaden nicht zulässig sind (zum Beispiel in einem Office-VSTO-Add-on).

2.20–2.29 (2021–2022) ​

2.29 ​

API-Änderungen: 11 neu, 1 geändert

2.29.0.0 (freigegeben am 16.09.2022)

Neu

  • Eigenschaft OpcClientInterfaces.UseBreakMonitoring hinzugefügt, um den UA Wrapper Server für OPC-Classic-Verbindungen vorübergehend anzuhalten, während ein Verbindungsabbruch (DCOM) zum OPC Classic Server erkannt wird.
  • Neue Methode OpcNamespace.GetNextId() zur Abfrage der nächsten freien numerischen OpcNodeId aus dem OpcNamespace.
  • Eine Reihe neuer Attribute für spezifische Zustände von OpcStateMachineNode und deren Übergänge.
  • Neue Klasse OpcStateNode zur Darstellung des in OPC UA definierten StateType.
  • Neue Klasse OpcTransitionNode zur Darstellung des in OPC UA definierten TransitionType.
  • Unterstützung für die Konfiguration benutzerdefinierter OpcFiniteStateMachineNodes mit den neuen Zustands- und Übergangsattributen, um den Anfangszustand, die Zustands-Nodes und die Übergangs-Nodes mit numerischen oder Enum-Werten festzulegen.
  • Neue Methode OpcFiniteStateMachineNode.ChangeStateTo(), um den aktuellen Zustand der StateMachine in einen anderen Zustand zu ändern. Die Methode prüft dabei, ob der Zielzustand existiert und ob es einen Übergang vom aktuellen in den neuen Zustand gibt.

Geändert

  • OpcNode.AddNotifier wird bei anderen Typen als OpcObjectNodes und deren Unterklassen nicht mehr unterstützt.

Behoben

  • Probleme mit fehlenden Datentypinformationen für den abstrakten Datentyp Structure (i=22).
  • Probleme beim Zugriff auf die Eigenschaften OpcTransitionVariableNode.VariableId/Node.
  • Probleme beim Zugriff auf die Eigenschaften OpcFiniteTransitionVariableNode.VariableId/Node.
  • Probleme beim Zugriff auf die Eigenschaften OpcStateVariableNode.VariableId/Node.
  • Probleme beim Zugriff auf die Eigenschaften OpcFiniteStateVariableNode.VariableId/Node.

2.28 ​

API-Änderungen: keine

2.28.1.0 (freigegeben am 02.09.2022)

Neu

  • Inline-Initialisierung reservierter Felder im Zusammenhang mit Kodierungsmasken mithilfe eines Bit-Arrays.

Behoben

  • Problem mit Hostname oder IP-Adresse, die bei der Generierung des Ports für den OPC Classic UA Wrapper Server nicht berücksichtigt wurden.
  • Problem mit dem OPC Classic Client, der weiterhin IOPCBrowseServerAddressSpace.ChangeBrowsePosition() mit OPC_BROWSE_TO aufrief, obwohl OpcClient.Interfaces.DataAccess.SupportsBrowseTo auf false gesetzt war.
  • Problem mit falschem ValueRank und falschen ArrayDimensions in Datentypdefinitionen von Strukturen, die ein anderes Feld zur Definition der Länge eines Array-Felds verwenden.
2.28.0.0 (freigegeben am 19.08.2022)

Neu

  • Die Inline-Definition von DataTypeDictionaryNodes wurde verbessert, sodass nur noch einer zur Verfügung steht, wenn eine Datentypbeschreibung eines Datentyps veröffentlicht werden soll.
  • Unbekannte (benutzerdefinierte) Datentypen werden jetzt mit den Ereignissen OpcData.TypeResolve und OpcClient.TypeResolve aufgelöst, unter Verwendung der zugehörigen Kodierungskennung und OpcNodeId.Null für die Datentypkennung.

Geändert

  • Die Deaktivierung von OpcAutomatism.UseDynamicTypeRegistration führte zu einer verzögerten dynamischen Typregistrierung, wenn ein benutzerdefinierter Datentyp manuell registriert wurde.

Behoben

  • Problem mit ArgumentException, wenn die Eigenschaft Value eines OpcStateVariableNode oder OpcFiniteStateVariableNode geändert wurde.
  • Problem mit OpcData.TypeResolve, bei dem die übergebenen Ereignisargumente den Encoding Identifier als Typbezeichner lieferten. Der Encoding Identifier wird jetzt als Teil des Encodings übergeben.
  • Problem, durch das OpcClient.TypeResolve nicht für jeden Datentyp aufgerufen wurde.
  • Problem mit nicht kodierten, dynamisch aufgelösten Datentypen.
  • Problem mit fehlender führender Array-Länge, wenn ein Datentyp ein Feld mit fester Länge verwendet.
  • Probleme mit inline registrierten Datentypen, obwohl OpcAutomatism.UseDynamicTypeRegistration deaktiviert wurde.
  • Probleme mit Aufzählungen, die in einem anderen DataTypeDictionary als die strukturierten Datentypen beschrieben werden, wenn voll qualifizierte Datentypbezeichner (Wert und Namespace-URI) verwendet werden.
  • Problem beim Import von NodeSets mit Definitionen strukturierter Datentypen ohne explizite Kennung des Basistyps.
  • Problem mit Fehlern beim Laden von Datentypen in einigen Clients von Drittanbietern beim Zugriff auf DataTypeDictionaries, die nur Aufzählungen deklarieren.
  • Probleme bei der Auswahl eines Endpunkts über Constraints bei Endpunkten mit Mode == None, aber Algorithm != None, und beim Fallback, wenn kein anderer Endpunkt verfügbar ist.

2.27 ​

API-Änderungen: 20 neu

2.27.0.0 (freigegeben am 27.06.2022)

Neu

  • Neue Eigenschaft NumberInList in OpcOrderedObjectNode, um die aktuelle Position eines Nodes innerhalb des Servers zu bestimmen.
  • Neues Ereignis OpcClient.TypeResolve, um benutzerdefinierte Typen abhängig von client- und sitzungsbezogenen Bedingungen aufzulösen.
  • OpcDataTypeDictionary.GetType(OpcEncoding) wurde verbessert und berücksichtigt jetzt Kodierungen ohne erweiterte NodeIds.
  • Neue geschützte statische Methoden OpcNode.DefineModel (Shared in Visual Basic) zur Definition Node-Typ-abhängiger Modellierungsregeln für das gesamte Node-Modell.
  • Einführung von IOpcDataTypeMapper und seiner Standardimplementierung OpcDataTypeMapper.
  • Neue Methode in OpcData zur Registrierung, Bestimmung und Aufhebung der Registrierung benutzerdefinierter Datentyp-Mapper.
  • Neue Methoden OpcDataTypeMapper.Convertible und OpcDataType.Delegate, um einfache benutzerdefinierte Datentyp-Mapper zu erstellen.

Behoben

  • Problem mit OpcPropertyNode<T>, der nicht zu seinem Eltern-Node hinzugefügt wird, wenn der Typparameter einen benutzerdefinierten Datentyp darstellt.
  • Problem mit BadNodeIdUnknown bei EnumStrings, wenn ein benutzerdefinierter Aufzählungstyp mit EnumStrings definiert ist.
  • Problem mit mehrfachen hierarchischen Referenzen zwischen Eltern- und Kind-Nodes, wenn für einen Kind-Node ein Subtyp des Standardreferenztyps verwendet wird.
  • Regression bei der Erweiterung der Überladungen von IOpcNodeInfo.Child und deren Implementierungen.

2.26 ​

API-Änderungen: 15 neu, 1 geändert

2.26.0.1 (freigegeben am 13.04.2022)

Behoben

  • Regression, die das Ableiten benutzerdefinierter Datentypen ohne Datentypattribute verhinderte.
2.26.0.0 (freigegeben am 13.04.2022)

Neu

  • Das OpcDataTypeAttribute ermöglicht jetzt festzulegen, welche Datentypen über Datentypdefinitionen, über Datentypbeschreibungen oder über beides deklariert werden.
  • Neue Eigenschaft Declarations in OpcDataTypeInfo, die angibt, auf welche Weise der Datentyp deklariert wurde.
  • Unterstützung für Arrays von Bit-Membern zur Definition der Kodierungsbits, sodass nicht mehr nur skalare Kodierungsbit-Member verwendet werden können.
  • OPC Watch bietet jetzt eine Upload-Schaltfläche, um eine Datei in einen Datei-Node zu schreiben (der vorhandene Dateiinhalt wird vorher verworfen).
  • Neue Eigenschaft OpcNodeId.Resolution zur Konfiguration, wie NodeIds aufgelöst werden, wenn keine benutzerdefinierten NodeIds verwendet werden.
  • Neue Ereignisse BeforeAdd und AfterAdd in OpcNode zur Behandlung von Bedingungen und Zuständen zu dem Zeitpunkt, zu dem ein Node zum Adressraum des Servers hinzugefügt wird oder wurde.
  • Neue Methode OpcNode.Implement, um die Erstellung des Nodes abzuschließen, bevor er zum ersten Mal verwendet wird.
  • Unterstützung der Implementierung von Standardschnittstellen aus OPC UA.
  • Einführung von OpcOrderedObjectListNode als Standardimplementierung des OrderedListType.
  • Einführung des abstrakten OpcOrderedObjectNode als Standardimplementierung von IOrderedObjectType und IOpcOrderedObjectNode.

Behoben

  • Problem mit nicht beachteten NodeIds benutzerdefinierter Datentypkodierungen.
  • Problem mit zwischengespeicherten Anwendungszertifikaten, die einen benutzerdefinierten Pfad für den Anwendungsspeicher verwenden.

2.25 ​

API-Änderungen: 5 neu

2.25.0.0 (freigegeben am 22.03.2022)

Neu

  • OPC UA Stack Types auf Version 1.04.368 aktualisiert.
  • Die vom Server definierten Datentyp-Nodes liefern im Fall eines opaken Datentyps keine Datentypdefinition mehr. Jede Leseanforderung führt zu BadAttributeIdInvalid, das Verhalten entspricht damit dem der eingebauten opaken Datentyp-Nodes.
  • Einführung von IOpcData<T>, um Datentypen ableiten zu können, die programmatisch nicht vererbbar sind.
  • Verschiedene Verbesserungen bei der Verarbeitung von Metadaten zu Datentypen, um die Leistung von Kodierungs- und Dekodierungsoperationen zu verbessern.
  • Neue Eigenschaften im Umfeld von OpcClientSecurity zur Konfiguration des AuthenticationLevel und ImpersonationLevel, die der Client bei der Verbindung mit einem OPC Classic Server verwenden soll.

Geändert

  • Standardgröße der (automatischen) Kodierungsmaske von einem Bit auf 32 Bit geändert, um die Verwendung der standardmäßig erwarteten 32-Bit-Kodierungsmaske zu vereinfachen.

Behoben

  • Problem mit der (automatisch) verwendeten Bitnummer, wenn ein Member eines Datentyps mit OpcDataTypeMemberSwitchAttribute als optional gekennzeichnet ist.
  • Problem beim erneuten Laden des Datentypsystems des Servers, nachdem eine Verbindung verloren und wiederhergestellt wurde.

2.24 ​

API-Änderungen: 55 neu, 2 geändert, 1 veraltet

2.24.0.0 (freigegeben am 09.03.2022)

Neu

  • Neue Schnittstelle IOpcAsyncMethodCommand zur Implementierung asynchroner Befehle.
  • Neue Methode OpcMethodCommands.Execute zur Bereitstellung einer benutzerdefinierten generischen Befehlsmethode, die mit einem Befehlsobjekt ausgeführt werden kann.
  • Neue Methode OpcMethodCommands.ExecuteAsync zur Bereitstellung einer benutzerdefinierten generischen Befehlsmethode, die asynchron mit einem Befehlsobjekt ausgeführt werden kann.
  • Unterstützung von IOpcAsyncMethodCommand und Delegaten, die auf eine Methode verweisen, die einen Task oder Task<T> zurückgibt. Beide werden beim Methodenaufruf asynchron ausgeführt.
  • Neue Eigenschaft OpcAutomatism.UseAsyncMethodCalls zur globalen Steuerung der Ausführung von Methodenaufrufen für jeden Server und alle seine Node-Manager.
  • Neue Eigenschaft OpcNodeManager.UseAsyncMethodCalls zur lokalen Steuerung der Ausführung von Methodenaufrufen der vom Node-Manager definierten Methoden.
  • Unterstützung für NumericRange-Informationen aus OPC UA mit der neuen Struktur OpcRange.
  • OpcReadNode wurde um die neue Eigenschaft Range erweitert, um das Lesen eines Bereichs von Elementen in einem Attribut zu unterstützen.
  • OpcWriteNode wurde um die neue Eigenschaft Range erweitert, um das Schreiben eines Bereichs von Elementen in einem Attribut zu unterstützen.
  • Zusätzliche Überladungen der Methode OpcClient.ReadNode, um eine OpcRange zum Lesen eines Bereichs von Elementen in einem Attribut anzugeben.
  • Zusätzliche Überladungen der Methode OpcClient.WriteNode, um eine OpcRange zum Schreiben eines Bereichs von Elementen in einem Attribut anzugeben.

Geändert

  • Die Eigenschaft OpcNodeAccessToken.IndexRange ist jetzt veraltet. Verwenden Sie stattdessen die neue Eigenschaft OpcNodeAccessToken.Range.
  • Der Typ der Eigenschaft OpcReadVariableValueContext(<T>).Range wurde von Ua.NumericRange in OpcRange geändert.
  • Der Typ der Eigenschaft OpcWriteVariableValueContext(<T>).Range wurde von Ua.NumericRange in OpcRange geändert.
  • Der Typ der Eigenschaft OpcReadPropertyValueContext(<T>).Range wurde von Ua.NumericRange in OpcRange geändert.
  • Der Typ der Eigenschaft OpcWritePropertyValueContext(<T>).Range wurde von Ua.NumericRange in OpcRange geändert.

Behoben

  • Probleme mit dem strikten XmlReflectionImporter, der in Mono und Xamarin beim Mappen von Klasseninformationen (einschließlich erwarteter Attribute und Eigenschaftstypen) verwendet wird.

2.23 ​

API-Änderungen: 10 neu

2.23.0.0 (freigegeben am 02.03.2022)

Neu

  • Neue Eigenschaft Tag in OpcServiceCommand zur Zuweisung benutzerdefinierter Metadaten, die an einen bestimmten Befehl gebunden sind.
  • Neue Methoden Load, Parse und TryParse für OpcDataTypeDictionary, um ein XML-serialisiertes Dictionary von Datentypen auf verschiedene Weise einzulesen.
  • Überarbeitung von OpcReadHistoryDetails, OpcReadNodeHistoryDetails, OpcReadNodeHistoryRawDetails und OpcReadNodeHistoryModifiedDetails.
  • Fehlende Dokumentation zu OpcReadHistoryDetails, OpcReadNodeHistoryDetails, OpcReadNodeHistoryRawDetails und OpcReadNodeHistoryModifiedDetails hinzugefügt.
  • Neue Eigenschaft ReturnBounds in OpcReadNodeHistoryDetails.
  • Neue Methoden ReadNode[s]History[Modified] in OpcClient, um benutzerdefinierte OpcReadHistoryDetails zu unterstützen.

Behoben

  • OPC-Classic-Verbindungen geben jetzt RPC_C_AUTHN_LEVEL_PKT_INTEGRITY für DCOM an, um die Härtungsänderungen für CVE-2021-26414 zu berücksichtigen.

2.22 ​

API-Änderungen: 28 neu

2.22.0.1 (freigegeben am 25.02.2022)

Behoben

  • Problem beim Aufruf von Acknowledge, Confirm und AddComment auf Instanzen von OpcCondition und OpcAcknowledgeableCondition.
2.22.0.0 (freigegeben am 11.02.2022)

Neu

  • Neue Methode CreateArray in OpcArrayDimensions.
  • Neue Methoden GetDataType in OpcContext, um kontextabhängige Datentypinformationen zu ermitteln.
  • Unterstützung von OpcModelChangeEvent[Node] und OpcGeneralModelChangeEvent[Node] einschließlich der zugehörigen OpcModelChangeItem und OpcModelChangeActions.
  • Benutzerdefinierte Veröffentlichung und Behandlung von Modelländerungsereignissen mit den neuen Klassen OpcModelChangeEventNode und OpcGeneralModelChangeEventNode.
  • Inline-Komprimierung von Modelländerungsereignissen, wenn ein Ereignis-Snapshot eines OpcGeneralModelChangeEventNode bereitgestellt werden soll.

Behoben

  • Problem mit falscher Definition des ValueRank bei Verwendung des Konstruktors von OpcArguments, der benutzerdefinierte Array-Dimensionen akzeptiert.
  • Problem mit der neuen DataTypeDefinition, wenn ein benutzerdefinierter Aufzählungstyp definiert wird, bevor er zum ersten Mal verwendet wird.

2.21 ​

API-Änderungen: 1 neu

2.21.0.0 (freigegeben am 01.02.2022)

Neu

  • Client-API: Vorbereitung der zu OPC UA 1.04 kompatiblen Unterstützung von Datentypdefinitionen über das neue Attribut DataTypeDefinition für Datentyp-Nodes. Diese Erweiterung ist abwärtskompatibel zu OPC UA 1.03, da DataTypeDictionaries und DataTypeDescriptions einschließlich der DataTypeEncodings weiterhin zur Bestimmung der deklarierten und beschriebenen Datentypinformationen verwendet werden.
  • Server-API: Einführung der zu OPC UA 1.04 kompatiblen Unterstützung von Datentypdefinitionen über das neue Attribut DataTypeDefinition für Datentyp-Nodes. Diese Erweiterung ist abwärtskompatibel zu OPC UA 1.03, da DataTypeDictionaries und DataTypeDescriptions einschließlich der DataTypeEncodings weiterhin zur Deklaration und Beschreibung eines Datentyps verwendet werden.

2.20 ​

API-Änderungen: 47 neu, 44 geändert

2.20.4.0 (freigegeben am 14.01.2022)

Neu

  • Clients werden jetzt mit dem Statuscode BadNodeIdUnknown benachrichtigt, wenn ein abonnierter Node später gelöscht wird.
2.20.3.0 (freigegeben am 04.01.2022)

Behoben

  • Problem mit OpcNamespace.Resolve(), durch das OpcNamespaceCollection.ResolveValue() nicht richtig funktionierte.
  • IndexOutOfRangeException, wenn ein nicht generischer OpcAnalogItemNode im Server verwendet wird.
  • Problem mit StackOverflowException, wenn (implizit) ein Byte[] als Null-Verweis in einen ByteString konvertiert wird.
2.20.2.0 (freigegeben am 20.10.2021)

Behoben

  • Problem mit doppelter Nennung von Fehlern in OpcException.Message.
  • Problem mit OpcMethodNode bei Verwendung des falschen Callback-Ziels.
2.20.1.0 (freigegeben am 08.10.2021)

Neu

  • Neues OpcEnumAttribute, um die Definition von Enum-Membern zu steuern und festzulegen, ob für diese EnumStrings oder EnumValues verwendet werden. Zusätzlich bietet das OpcEnumAttribute Eigenschaften, um die bestehenden Automatismen je Enumeration festzulegen.

Behoben

  • Problem beim Verbinden mit Servern über https:-URLs unter .NET Framework.
2.20.0.0 (freigegeben am 17.09.2021)

Neu

  • OpcClient liefert jetzt Informationen zum Node-Typ für Ereignis-, Objekt- und Variablentypen.
  • OpcNode bietet die neuen Methoden RegisterType und UnregisterType, um benutzerdefinierte Node-Typen zu verwalten.
  • OpcNode bietet die neuen Methoden GetType und GetTypeInfo zur Ermittlung von Instanzen von System.Type und OpcNodeTypeInfo, die einen Node-Typ definieren oder beschreiben.
  • OpcInstanceNode bietet die neuen Methoden GetNodeValue und SetNodeValue zum Ändern des Wertattributs eines bestimmten OpcVariableNode, der ein Kind des Instanz-Nodes ist.
  • Das Ableiten von OpcObjectNode zur Definition eines benutzerdefinierten Node-Typs führt auch zu inline erstellten Eigenschafts- und Variablen-Nodes für die in der Unterklasse definierten Eigenschaften und Felder.
  • Unterklassen von OpcTypeNode zur Definition benutzerdefinierter Node-Typen (OpcNodeType und OpcNodeType<T>).
  • Neue Attribute zur Beschreibung benutzerdefinierter Node-Typen (OpcNodeTypeAttribute, OpcNodeTypeIgnoreMemberAttribute, OpcNodeTypeMemberAttribute, OpcNodeTypeOptionalMemberAttribute).
  • Die Klasse OpcNodeTypeSystem wurde erweitert, um Informationen über aktuelle und Standard-Node-Typen des Systems bereitzustellen.
  • Neue Eigenschaften und Methoden in OpcNodeTypeInfo, um zusätzliche Informationen über den Typ und seine Kind-Nodes bereitzustellen.
  • Die Datentypauflösung von OpcArgument wurde erweitert, um auch spät initialisierte benutzerdefinierte Datentypen zu unterstützen.

Geändert

  • OpcInstanceNode bestimmt jetzt seine DefaultTypeDefinitionId anhand des Node-Typs, der zum Erstellen des Instanz-Nodes verwendet wird.
  • OpcMemberOrigins definiert jetzt ein zusätzliches Enum-Member Method für Methoden.

Behoben

  • Problem mit spät definierten benutzerdefinierten Datentypen, die für Argumente in OpcMethodNodes verwendet werden.
  • Problem mit BadNodeIdUnknown beim Zugriff auf die InputArguments und OutputArguments von OpcMethodNodes, die erstellt wurden, bevor der zugehörige OpcNamespace initialisiert und im Server definiert wurde (zum Beispiel bevor OpcNodeManager.CreateNodes ausgeführt wurde).

2.10–2.19 (2020–2021) ​

2.19 ​

API-Änderungen: 36 neu, 1 entfernt, 10 geändert

2.19.2.0 (freigegeben am 10.09.2021)

Neu

  • Unterstützung von IEnumerable<OpcName> in OpcNamePath.
  • Neue Methoden OpcClient.GetType(s), um alle mit einer NodeId verbundenen Typinformationen zu ermitteln.
  • Neue Methode OpcClient.IsSubtypeOf, um festzustellen, ob ein Typ ein Subtyp eines anderen Typs ist.
  • Neue Methode IOpcNodeInfo.Child(OpcNamePath), um einen Kind-Node über einen Pfad von BrowseNames zu ermitteln.
  • Neue Eigenschaft ServiceName in OpcServiceRequest und OpcServiceResponse.
  • Neue Methoden GetResults und GetResultExceptions in OpcServiceResponse, um anfrage- und befehlsbezogene Ausnahmeinformationen zu ermitteln.
  • Neues Ereignis OpcServer.RequestJudgement zur Behandlung von Problemen mit Anfragen. Darüber lässt sich entscheiden, ob eine Beanstandung verworfen wird. So lässt sich zum Beispiel eine veraltete Anfrage (BadInvalidTimestamp) über die Eigenschaft Dismiss doch zulassen.

Geändert

  • Unnötige Zeilenumbrüche in der String-Darstellung von Instanzen von OpcException wurden entfernt.

Behoben

  • Irreführende Verwendung desselben Basistyps (also des obersten Node-Typs) für den obersten Basistyp bei der Untersuchung der Typhierarchie eines Node-Typs (zum Beispiel war der BaseType von BaseEventType gleich BaseEventType).
  • Mögliche NullReferenceExceptions bei Verwendung der Methoden OpcClient.GetDataType und OpcClient.GetNodeType mit einer Null-Referenz (Nothing in Visual Basic) statt einer gültigen Instanz der Klasse OpcNodeId.
  • Problem, durch das zu wenige HistoryValues zurückgegeben wurden, wenn der Server keine Werte, sondern nur einen Fortsetzungspunkt in einer der Antworten gesendet hat.
2.19.1.0 (freigegeben am 01.09.2021)

Neu

  • Die neue Methode GetValue in der Klasse OpcEvent ermöglicht es Unterklassen, den Wert einer Eigenschaft einem Node-Wert des Ereignisses zuzuordnen, ohne den zugehörigen NamespaceIndex für einen vollqualifizierten BrowseName zu kennen. Als Index wird dabei der Namespace der Typdefinition verwendet, für die diese Eigenschaft implementiert wird. Die Methode lässt sich auch wie die bekannte Methode DataStore.Get verwenden, sodass weiterhin explizit der vollqualifizierte BrowseName übergeben werden kann. Der NamespaceIndex muss beim Zugriff auf Ereignisdaten also nicht mehr bekannt sein.

Geändert

  • Möglicher Bruch: IOpcReadOnlyNodeDataStore erfordert jetzt auch die Implementierung von IOpcNamespaceResolver.

Behoben

  • Problem mit der Auflösung des zugehörigen benutzerdefinierten Typs beziehungsweise der zugehörigen benutzerdefinierten Instanz von OpcEvent für ein benutzerdefiniertes Ereignis, das mit der vollqualifizierten NodeId des Ereignistyps deklariert wurde.
  • Problem mit Hängern bei der Verbindung zu OPC Classic Servern.
2.19.0.0 (freigegeben am 27.08.2021)

Bruch: Clients und Server seit Version 2.17.0.0 greifen nicht gemäß der OPC-UA-Spezifikation auf Datei-Nodes zu beziehungsweise stellen diese nicht spezifikationsgemäß bereit. Sie verwenden ein Byte-Array statt ByteString zum Lesen und Schreiben von Dateiinhalten. Dieser Fehler wurde in dieser Version korrigiert.

Neu

  • Die Auflösung von Node-Typen und Datentypen wurde verbessert, um auch erweiterte (also aufgelöste) NodeIds zu unterstützen.

Geändert

  • Bruch: OpcFileReadMethodNode.FileReadCallback und OpcFileReadMethodNode.FileReadExCallback geben jetzt einen ByteString statt eines Byte-Arrays zurück.
  • Bruch: OpcFileWriteMethodNode.FileWriteCallback und OpcFileWriteMethodNode.FileWriteExCallback akzeptieren jetzt einen ByteString für den Datenparameter statt eines Byte-Arrays.
  • Parameter von OpcFilterOperand.OfType von value : object in typeId : OpcNodeId geändert, um sicherzustellen, dass ein OfType-Operand wie erwartet ausgewertet wird (also mit einer OpcNodeId).

Behoben

  • Bruch: Regression beim Zugriff auf OpcFileNode mit Lese- und Schreiboperationen, nachdem der Foundation Stack die Verwendung von ByteString für ByteString und Byte[] für Byte[] erzwingt statt ByteString für Byte[].
  • Problem, durch das keine historischen Werte zurückgegeben wurden, wenn der Server den Statuscode GoodNoData mit einem Fortsetzungspunkt meldet.
  • Problem mit endlos zurückgegebenen historischen Werten, wenn der Server die Wiederverwendung von Fortsetzungspunkten erlaubt.

2.18 ​

API-Änderungen: 61 neu, 4 geändert

2.18.5.0 (freigegeben am 13.08.2021)

Neu

  • Unterstützung der kodierungsbasierten Abfrage von Datentypen über OpcClient.GetDataType, zum Beispiel mit OpcValue.DataTypeId.
  • Verbesserte Verarbeitung von (strukturierten) Datentypinformationen, um doppelte Datentypdeklarationen zu unterstützen und auf Datentypbeschreibungen umzuleiten, wenn darauf verwiesen wird.
  • Vereinfachte Definition von Eigenschafts-Nodes, ohne den Node manuell zu den Kindern eines übergeordneten Nodes hinzuzufügen.

Behoben

  • Regression in Version 2.18.4.0 mit OpcException und BadServerNotConnected bei aktivierter Option OpcClient.UseDynamic während der Verbindung mit einem Server.
  • Probleme mit Siemens OPC UA Servern, die eine benutzerdefinierte Serverschnittstelle mit benutzerdefinierten strukturierten Datentypen verwenden. Diese Lösung erfordert die Option „Aktivierung der Standard-SIMATIC-Serverschnittstelle“, um die Einrichtung der benutzerdefinierten Serverschnittstelle und die verwendeten Datentypen zu unterstützen.
2.18.4.0 (freigegeben am 09.08.2021)

Neu

  • Unterstützung kompilierter Delegaten aus Expression<TDelegate> in OpcMethodNodes.
  • Neuer Indexer mit einem Int32, um ein bestimmtes OpcDataField in einem OpcDataObject zu adressieren.
  • Das Ereignis OpcClient.SubscriptionsChanged wird jetzt ausgelöst, wenn OpcClient.Subscriptions geleert wird.
  • Veralteter Code, der in .NET 5.0 nicht mehr unterstützt wird, wurde entfernt.
  • Verbesserte Ausnahmebehandlung und Fehlermeldungen beim Import eines UANodeSet.

Behoben

  • Problem mit spät geladenen benutzerdefinierten Typinformationen, nachdem das Ereignis OpcClient.Connected ausgelöst wurde.
  • Problem mit der erweiterten Unterstützung von byte[], durch das die Unterstützung von sbyte[] als Wert eines Variablen-Nodes nicht mehr funktionierte (Ursache: .NET unterscheidet bei Mustervergleichen nicht zwischen vorzeichenbehafteten und vorzeichenlosen Typen).
  • Problem beim Schreiben von Byte[]-Werten in Variablen-Nodes, da der Stack der Foundation die Verwendung von Variant erzwingt, um Byte-Arrays als Byte[] statt als ByteString zu verarbeiten. Das führte zu falschen Typvalidierungen beim Schreiben eines Variablen-Nodes mit einem Byte-Array als Datentyp oder Wert. Gelöst wurde das durch die Berücksichtigung des nachfolgenden Stack-Codes.
2.18.3.0 (freigegeben am 28.06.2021)

Neu

  • Erweiterte Ausnahmedetails über die inneren Ausnahmen sowie über Aggregate-Exceptions, um bei Verbindungsproblemen mit OPC Classic weitere Informationen bereitzustellen, wenn der OPC Classic Wrapper Server im selben Prozess ausgeführt wird.
  • Weitere Optionen für OpcNodeIdComparison: IgnoreNamespaceIndex und IgnoreNamespaceIndexIgnoreCase.

Geändert

  • OpcClassicDiscoveryClient verwendet jetzt die OpcException, um stackbezogene Ausnahmen bereitzustellen.

Behoben

  • Probleme mit der OpcServerInfo, wenn das SDK in einer Umgebung mit „Bundled Assemblies“ verwendet wird.
  • Probleme beim Verbinden mit OPC Classic Servern, die auf einem anderen Rechner ausgeführt werden.
  • Probleme mit fehlenden Nodes beim Browsen von OPC Classic Servern mit flacher Organisation der Nodes.
  • Probleme bei der Übertragung von Byte-Arrays an Methoden-Nodes aufgrund der Logik des Foundation-Stacks, Byte-Arrays standardmäßig als ByteStrings zu übertragen.
2.18.2.0 (freigegeben am 17.06.2021)

Neu

  • Neue Methoden Translate in OpcServerGlobalization, die Mechanismen zur Lokalisierung benutzerdefinierter Ressourcen bereitstellen.
  • Unterstützung von Enum-Arrays, die im OPC Stack 1.03 fehlte.
  • Methoden OpcNodeId.Equals, mit denen sich NodeIds anhand vordefinierter Vergleichsmethoden über OpcNodeIdComparison benutzerdefiniert vergleichen lassen.

Geändert

  • OpcNodeId vergleicht NodeIds jetzt gemäß der OPC-UA-Spezifikation unter Berücksichtigung der Groß- und Kleinschreibung von Identifier und Namespace.

Behoben

  • Problem mit fehlenden bevorzugten Gebietsschemata in OpcSession nach dem Aktivieren einer Sitzung. Die Gebietsschemata wurden nur intern aktualisiert und verwendet.
  • Probleme mit Ausnahmen vom Typ ServerHalted beim Zugriff auf Eigenschaften einer Instanz der Klasse OpcServer vor dem Start der Instanz.
2.18.1.0 (freigegeben am 02.06.2021)

Neu

  • Der fehlende Setter der Eigenschaft OpcBrowseNode.Degree wurde hinzugefügt.
  • Neue Eigenschaft OpcClient.Interfaces zur Konfiguration der Kommunikation über die OPC-Classic-Schnittstellen.
  • Die neue Klasse OpcClassicDataAccessOptions stellt Optionen bereit, um die Art der Organisation des Servers festzulegen und ob der Server den BrowseTo-Dienst unterstützt.

Behoben

  • Problem unter Mono beim Verbinden mit einem OPC UA Server, der kein Zertifikat bereitstellt.
  • Problem mit fehlenden Subscription-basierten Benachrichtigungen nach einem automatischen Wiederaufbau der Verbindung.
  • Problem bei der Verwendung eines Byte-Arrays in einem OpcValue, das vom zugrunde liegenden Stack als ByteString statt als Byte-Array kodiert wurde.
  • Problem bei der Kodierung des Attributs Value bei nicht generischen OpcVariableNodes, wenn ein Array von ByteString-Werten verwendet wird.
2.18.0.0 (freigegeben am 26.05.2021)

Neu

  • Verbesserungen für Szenarien, in denen Byte[], ByteString und ByteString[] oder einzelne davon als Datentyp von Methodenargumenten oder Variablen-Nodes verwendet werden.
  • Unterstützung der Eigenschaft OpcDataTypeInfo.Documentation anhand des Attributs OpcDataTypeNode.Description.
  • Die neuen Methoden OpcReferenceTypes.GetReferenceTypeName(OpcNodeId) und GetReferenceType(OpcName) wurden eingeführt.
  • Vollständige Überarbeitung und Erweiterung der Typen OpcRelativePath und OpcRelativePathElement.
  • Unterstützung der Übersetzung von Browse-Pfaden mit dem Dienst TranslateBrowsePath.
  • OpcClient unterstützt jetzt die Übersetzung von Browse-Pfaden über die neuen Methoden TranslatePath und TranslatePaths.

Geändert

  • Das Format von ByteString wurde von Base64-basierter Kodierung in hexadezimale Formatierung (X2) geändert, um der binär kodierten Darstellung eines ByteString der Foundation zu entsprechen.

Behoben

  • Falsch initialisierte Attribute ArrayDimensions und ValueRank von Methodenargumenten und Variablen-Nodes, die Byte[], ByteString oder ByteString[] oder einen davon als Datentyp verwenden.
  • Falsche Initialwerte von DataTypeDictionary-Nodes bezüglich der verwendeten Attribute ArrayDimensions und ValueRank nach Einführung des neuen expliziten Datentyps ByteString.
  • Eine vermeidbare NullReferenceException beim Initialisieren benutzerdefinierter Datentypen wird nicht mehr ausgelöst.
  • Probleme mit falsch bestimmten Metadaten von OpcArgument, die zum Definieren Array-basierter Methodenargumente verwendet werden.
  • Probleme bei der Untersuchung von Informationen zu System.Type bei out-Parametern, die als By-Reference-Parameter im Delegaten eines Methoden-Nodes verwendet werden.
  • Probleme beim Import von Referenzen aus UANodeSets, wenn diese über Aliase definiert werden.
  • Problem mit fehlenden Typinformationen bei der Untersuchung von Feldern benutzerdefinierter Datentypen, die vom Typ eines Arrays sind. Dabei fehlte die TypeId des Elementtyps im ArrayType des Felds.
  • Probleme in Anwendungen mit Komponenten von Drittanbietern, die Attribute verwenden, die nicht ladbar sind. Das behebt bekannte TypeLoadExceptions, die bei der Untersuchung benutzerdefinierter Datentypen und Ereignistypen auftreten konnten.

2.17 ​

API-Änderungen: 2 neu, 3 geändert

2.17.0.0 (freigegeben am 04.05.2021)

Neu

  • Unterstützung für benutzerdefinierte Implementierungen der Klasse OpcFileInfo.
  • Erweiterung des OpcMethodContexts um einen Verweis auf den Owner, um Zugriff auf die zugrunde liegende Instanz von OpcServer zu erhalten.
  • Erweiterung der Kodierung zur Unterstützung strukturierter Datentypen anhand ihrer Basistypinformationen.
  • Unterstützung von Null-Referenzen bei Verwendung von OpcNamespace.Create.
  • Einführung des expliziten Datentyps ByteString, um die Unterscheidung zwischen Byte-Array- und ByteString-Werten zu erleichtern.

Behoben

  • Problem mit Servern, die Null-Referenzen als Teil ihres NamespaceArrays verwenden.
  • Problem mit zurückgesetzter OpcNode.Description, zum Beispiel bei OpcDataVariableNode<T> mit einem benutzerdefinierten Datentyp.
  • Problem mit nicht initialisierten Ereignis-Nodes bei Verwendung außerhalb eines Adressraums, zum Beispiel bei leichtgewichtigen Ereignissen.
  • Problem mit der automatischen Firewall-Awareness und den dabei verwendeten DNS-sicheren Hostnamen. Um in diesem Fall eine neue Sitzung zu erstellen, wird jetzt die über Discovery ermittelte unveränderte Endpunkt-URL verwendet.
  • Problem mit TypeInitializationException bei der Prüfung auf Verwendung der Unity-Runtime in manchen Szenarien mit dynamisch geladenen Assemblies.
  • Problem mit InvalidOperationException im BufferManager der Foundation, wenn ein gesperrter Puffer freigegeben werden soll, der zuvor nicht entsperrt wurde.
  • Problem mit nicht aufgelösten Datentypinformationen in Argumenten von Methoden-Nodes, wenn erweiterte NodeIds für den Datentyp verwendet werden.
  • Problem mit nicht aufgelöster Datentyp-Kodierung im Typsystem des Servers, wenn erweiterte NodeIds für die Datentyp-Kodierung verwendet werden.
  • Problem beim Vergleich erweiterter NodeIds mit demselben Identifier, aber unterschiedlichen Namespaces.
  • Problem beim Ermitteln von Typinformationen benutzerdefinierter Datentypen mit denselben Namen, aber in unterschiedlichen Namespaces.
  • Problem mit NullReferenceExceptions beim Versuch, eine Ressource zu übersetzen, ohne zuvor Ressourceninformationen hinterlegt zu haben.
  • Problem mit fehlenden benutzerdefinierten Datentypen, wenn diese über mehrere (dynamische) Node-Manager definiert werden.
  • Problem mit der Vererbung des Standard-ReferenceTypes bei Verwendung von OpcFolderNodes. Dadurch wurde der Standard-ReferenceType Organizes nach einem Stack-Update nicht mehr für die direkten Kind-Nodes übernommen.
  • Weiterführendes Problem bei der Deklaration und Verwendung von Variablen-Nodes mit ExpandedNodeIds oder NodeIds als Datentypen.
  • Threading-Problem beim asynchronen Start mehrerer Instanzen von OpcServer.
  • Falscher Wert des Attributs ArrayDimensions der Nodes InputArguments und OutputArguments von OpcMethodNodes.

2.16 ​

API-Änderungen: 9 neu

2.16.1.0 (freigegeben am 21.04.2021)

Neu

  • OpcNominalNodeIdFactory wurde erweitert, um zusätzliche benutzerdefinierte Logik auf den verwendeten OpcName anzuwenden, anhand dessen die OpcNodeId erstellt wird.

Behoben

  • Problem mit weiterhin existierenden Instanzen von OpcSubscription in OpcClient.Subscriptions, obwohl der Client nicht mehr verbunden ist.
2.16.0.0 (freigegeben am 20.04.2021)

Neu

  • Unterstützung für benutzerdefinierte Quellen von OpcFileNode über die neue Schnittstelle IOpcFileInfo.

Behoben

  • Problem beim Deklarieren von und Zugreifen auf Variablen-Nodes, die ExpandedNodeId als Datentyp verwenden.
  • Problem mit FileNotFoundExceptions, wenn Assemblies von Drittanbietern verwendet werden, während die dynamische Typregistrierung aktiviert ist.

2.15 ​

API-Änderungen: 6 neu

2.15.0.0 (freigegeben am 31.03.2021)

Neu

  • Neue Eigenschaft Opc.UaFx.Client.OpcSubscription.Client, um Zugriff auf den Client zu erhalten, der Besitzer einer Subscription ist.
  • Neue Eigenschaft OpcServer.Binding.Addresses, um explizite IP-Adressen der Netzwerkschnittstellen zu binden und auf diesen zu lauschen.
  • Methode OpcNodeCollection.TryGet, um zu versuchen, einen Node anhand seiner NodeId zu ermitteln.
  • Methoden OpcNodeManager.GetNode, um Nodes anhand ihrer NodeId oder über einen Pfad zu ermitteln. Der Pfad ist eine Folge aus Browse- und Symbolic-Names der Nodes auf dem Weg zum Node, jeweils getrennt durch einen Schrägstrich (/).

Behoben

  • Problem beim Erstellen von Eigenschafts-Nodes ohne Eltern-Node.

2.14 ​

API-Änderungen: 12 neu

2.14.0.0 (freigegeben am 04.03.2021)

Neu

  • Neue statische Methode OpcName.IsNullOrEmpty, die bei der Auswertung die Namespace-Informationen des OpcNames ignoriert.
  • Neue statische Methode OpcNodeId.IsNullOrEmpty, die bei der Auswertung die Namespace-Informationen der OpcNodeIds ignoriert.
  • Neue Methode OpcNamespace.GetId(object), um NodeIds zu ermitteln, ohne den Typ des Werts zu kennen.
  • Dynamische Auflösung von Datentypinformationen, ohne diese zuvor dem Datentypsystem mitzuteilen (also zu registrieren).
  • Zusätzliche nicht generische Methoden OpcData.RegisterType, sodass die Methoden mit generischem Typparameter nicht mehr verwendet werden müssen.
  • Neue Methoden OpcDataTypeNode.Create(...), um Instanzen von OpcDataTypeNodes auf nicht generischem Weg zu erstellen.

Geändert

  • Doppelte Verweise auf DataTypeNodes bei Verwendung der Klasse OpcAddressSpace wurden entfernt.

Behoben

  • Problem mit fehlerhaften oder zu vielen Subscriptions, das den OpcClient daran hinderte, sich nach Verlust einer Verbindung automatisch neu zu verbinden.
  • Problem mit inline initialisierten OpcDataTypeNodes bei Verwendung der dynamischen Auflösung von Datentypinformationen.
  • Problem mit fehlenden Typreferenzen bei benutzerdefinierten Enumerationen im globalen Datentypsystem.

2.13 ​

API-Änderungen: 4 neu

2.13.0.0 (freigegeben am 01.03.2021)

Neu

  • Verbesserte Auflösung des Attributs DataType mit Unterstützung erweiterter NodeIds.
  • Verbesserte dynamische Kodierung und Dekodierung von Datentypen zur Unterstützung von Unterklassen und kaskadierten benutzerdefinierten strukturierten Datentypen.
  • Das OpcDataTypeIgnoreMemberAttribute wurde eingeführt, um Member eines Typs explizit von der Kodierung und Dekodierung auszuschließen.
  • Die Eigenschaften OpcDataTypeAttribute.NamespaceUri und OpcDataTypeAttribute.UseDataTypeDescription wurden eingeführt, um den Ziel-Namespace des zu verwendenden Data Type Dictionary eines Datentyps zu definieren und festzulegen, ob der Datentyp eine Beschreibung in einem benutzerdefinierten Data Type Dictionary benötigt.
  • Unterstützung benutzerdefinierter Ziel-Namespaces für benutzerdefinierte Enumerationen.
  • Unterstützung eingebetteter benutzerdefinierter Datentypen beim dynamischen Datenaustausch über Container-Typen wie Variant oder ExtensionObject.

Behoben

  • Problem mit fehlenden Verweisen auf Ziel-Namespaces im inline definierten Data Type Dictionary, wenn der benutzerdefinierte Datentyp ohne Informationen zum Ziel-Namespace definiert wurde.

2.12 ​

API-Änderungen: 34 neu, 2 entfernt, 4 geändert

2.12.3.0 (freigegeben am 17.02.2021)

Neu

  • Verbesserte Unterstützung von IL2CPP bezüglich Problemen bei der Auswertung eingebetteter String-Werte.

Behoben

  • Probleme bei der Verwendung der Standard-Probing-Pfade für Zertifikate unter Unity mit UWP.
  • Problem beim Aufruf von Methoden-Nodes nach der Einführung der Lokalisierung von Argumenten.
2.12.2.0 (freigegeben am 15.02.2021)

Neu

  • Unterstützung der Übersetzung von Argumenten von Methoden-Nodes.

Behoben

  • Probleme beim Zugriff auf lokalisierte Informationen mit dem Client bei einer neutralen Kultur.
  • Problem mit Null-Referenzen (Nothing in Visual Basic), wenn lokalisierbare Attribute ohne Übersetzung gelesen werden.
2.12.1.0 (freigegeben am 11.02.2021)

Neu

  • Neue Klasse OpcNodeExportOptions zur Konfiguration der Informationen, die beim Export von Nodes in ein NodeSet exportiert werden sollen.
  • Überladung der Methode OpcNodeManager.ExportNodes(OpcNodeExportOptions) zur Definition benutzerdefinierter Exportoptionen.
  • Einführung der neuen Klasse OpcNodeGlobalization, um die Ressourcen zu verwalten, die zur Lokalisierung von Attributen eines bestimmten Nodes verwendet werden sollen.
  • Die Eigenschaften OpcNode.DisplayNames und OpcNode.Descriptions stellen Instanzen bereit, über die sich die Lokalisierung der lokalisierbaren Attribute eines Nodes je Node steuern lässt.

Geändert

  • Bidirektionale Verweise zwischen DataTypeDescription-, DataTypeEncoding- und DataType-Nodes werden jetzt unidirektional exportiert (mit den Standard-Exportoptionen).

Behoben

  • Problem mit automatisch ermittelten Serverinformationen anhand prozessbezogener Versionsinformationen, die die Auswertung von ProductVersion und FileVersion einschlossen.
  • Problem mit dem Überschreiben von OpcNode.SymbolicName, wenn ein Node importiert wird, der für die Eigenschaft SymbolicName einen anderen Wert verwendet als für das Attribut DisplayName.
  • Problem mit nicht mehr mehrzeilig Base64-kodiertem DataTypeDictionary (mit den Standard-Exportoptionen).
  • Problem mit entfernten Attributen ParentNodeId in NodeSets (mit den Standard-Exportoptionen).
  • Problem mit umsortierten Nodes (anhand ihrer NodeId) beim Export in ein NodeSet. Ab sofort werden sie in der Reihenfolge ihrer Definition beziehungsweise Implementierung exportiert.
  • Problem mit fehlenden Supertypen beim Import von Nodes, die zuvor in einen Server importiert und wieder exportiert wurden (aufgrund der Neuordnung der Nodes).
2.12.0.0 (freigegeben am 04.02.2021)

Neu

  • Neue Eigenschaft Namespaces in IOpcApplicationInstance und OpcApplicationInstance, um die verwendeten Namespaces bereitzustellen.
  • Neue Eigenschaft Namespaces im OpcClient, um die Namespaces des verbundenen Servers abzubilden.
  • Neue Eigenschaft Namespaces im OpcServer, um die Namespaces bereitzustellen, die die Node-Manager des Servers zur Organisation des Adressraums verwenden.
  • Neue Eigenschaft Namespaces in OpcContext, um die im aktuellen Kontext gültigen Namespaces bereitzustellen.
  • Die Schnittstelle IOpcNamespaceResolver wurde in der OpcNamespaceCollection und OpcReadOnlyNamespaceCollection implementiert.
  • Methode Resolve in IOpcNamespaceResolver, um einen anderen (online) Namespace anhand der Metadaten eines offline beziehungsweise lokal definierten Namespaces aufzulösen.
  • OpcNamespace stellt jetzt immer dann eine URI bereit, wenn OpcNamespace.Value eine gültige URI darstellt.
  • Verbindungen zu OPC Classic Servern über einen inline verwendeten Wrapper-Server werden jetzt gesichert, indem dieselbe Benutzeridentität verwendet wird, die unter OpcClient.Security.UserIdentity eingestellt wurde.
  • OpcClient und OpcClassicDiscoveryClient unterstützen jetzt die Verwendung einer Hostidentität zur DCOM-Authentifizierung. Hinweis: Beim OpcClient wird die unter OpcClient.Security.UserIdentity eingestellte Identität ebenfalls zur DCOM-Authentifizierung verwendet.
  • Neue Eigenschaft Scope in OpcNamespace, die den Kontext beschreibt, in dem der Namespace erstellt wurde und in dem seine Metadaten gelten.
  • Verbesserte Geschwindigkeit bei der Initialisierung von OpcNodes während des Starts des OpcServers.
  • Die Verwendung von OpcNodeManager.ctor(OpcNamespace, ...) mit einem Namespace, der einen expliziten Namespace-Index besitzt, führt zu einer ArgumentException, da es Aufgabe des Servers ist, den verwendeten Namespaces den zugehörigen Namespace-Index zuzuweisen.
  • Die Instanzen von OpcNamespace im OpcNodeManager werden jetzt mit den Instanzen von OpcNamespace der neuen Eigenschaft OpcServer.Namespaces synchronisiert. In der Startphase des Servers können sich die Instanzen in OpcNodeManager.Namespaces deshalb ändern. Spätestens beim Aufruf von Methoden wie OpcNodeManager.CreateNodes(...) sind alle OpcNodeManager.Namespaces mit den OpcServer.Namespaces synchronisiert.

Geändert

  • Der Namespace OpcNamespace.Default stellt jetzt den zum Standard-Namespace gehörigen Wert sowie die URI bereit, unter der der Namespace der Foundation identifiziert werden kann.
  • Abgekündigte Methoden in IOpcNamespaceResolver sowie deren Implementierung in OpcClient, OpcServer, OpcContext und OpcNodeManager wurden entfernt.
  • Übergänge von OpcClient.State finden nicht mehr statt (bei Verwendung des standardmäßig aktivierten Reconnect-Mechanismus), wenn während eines Wiederverbindungsversuchs zum Beispiel ReadNode aufgerufen wird.
  • Bei einer unterbrochenen Verbindung versucht der OpcClient (standardmäßig), die Verbindung wiederherzustellen und dabei die zuvor verwendete Sitzung wiederzuverwenden. Wenn die vorherige Sitzung nach dem Wiederaufbau der Verbindung wiederverwendet werden kann, löst der OpcClient (wie bisher) das Ereignis Reconnected aus. Wenn der Client eine neue Sitzung erstellen muss (zum Beispiel, weil diese abgelaufen ist), löst der OpcClient jetzt das Ereignis Connected statt Reconnected aus. So lassen sich diese Situationen im Benutzercode unterscheiden.
  • Vergleiche von OpcNodeId und OpcNamespace mit Null-Verweisen verhalten sich jetzt wie bei jeder anderen typischen .NET-API (dieses Verhalten unterscheidet sich von dem des Stacks der Foundation).

Behoben

  • Problem mit zusammengefallenen Endpunkt-URLs bei der Discovery von Servern, die zum Beispiel opc.tcp://:4840 als Endpunkt-URL liefern.
  • Problem mit nicht aufgelösten NodeIds, wenn manuell erstellte MonitoredItems einer Subscription zugewiesen werden.
  • Problem mit überaufgelösten NodeIds: Die Auflösung erzeugt (wie bisher) vollständig neue NodeIds, überschreibt aber nicht mehr wiederholt die Namespace-Informationen der ursprünglichen NodeId.
  • Problem im OPC Classic Stack mit zunehmender Anzahl an Threads (insbesondere in MTA-Anwendungen), sobald die Verbindung zum OPC Classic Server einmal verloren ging.
  • Problem bei der Definition benutzerdefinierter Datentypen, ohne eine explizite NamespaceUri in deren DataTypeEncoding festzulegen.
  • Problem mit dem Verlust von Informationen zu OpcNamespace, nachdem eine bereits initialisierte NodeId anhand einer NodeId der Foundation erneut initialisiert wird, da sich diese zwischenzeitlich geändert hat.
  • Problem in Anwendungen, in denen mehrere Server oder Client und Server im selben Prozess ausgeführt werden: Die beteiligten Namespaces entsprachen nicht in jedem Fall der jeweiligen Anwendung. Das Problem wurde gelöst, indem weder der Namespace einer existierenden NodeId noch der einer Instanz von OpcNamespace indirekt aufgelöst wird. Wenn Sie dieses Verhalten dennoch benötigen, müssen Sie die entsprechende Logik selbst implementieren.

2.11 ​

API-Änderungen: 47 neu, 4 entfernt, 8 geändert, 1 veraltet

2.11.5.0 (freigegeben am 21.12.2020)

Neu

  • Optimierung der verwendeten Aliase in exportierten UA NodeSets (nicht verwendete werden beim Erstellen des UA NodeSets entfernt).
  • Redundante Informationen in den Attributen DisplayName und Description werden jetzt entfernt. Wenn beide Attribute denselben Wert haben, wird das Attribut Description beim Erstellen des UA NodeSets nicht mehr exportiert.
  • Redundante Informationen im Attribut ParentNodeId werden beim Erstellen des UA NodeSets nicht mehr exportiert, wenn der ParentNode bereits durch eine Referenz über die ReferenceTypeId des Kind-Nodes referenziert wird.

Behoben

  • Problem mit NullReferenceExceptions im OpcServer, wenn ein Client versucht, einen neuen Node anzulegen, und dabei auf einen ParentNode mit unbekannter oder ungültiger NodeId verweist.
  • Problem mit fehlenden Node-Verweisen (auf Nodes, die in einem anderen Node-Manager definiert werden) in UA NodeSets beim Export von Nodes, deren NodeId implizit festgelegt wurde.
  • Problem beim Export von Nodes, die über das Attribut ParentNodeId aufeinander verweisen und zwischen denen zugleich ein expliziter Node-Verweis besteht. In solchen Fällen wird jetzt auf die ParentNodeId verzichtet, wenn child.ReferenceTypeId (die Standardreferenz zwischen Eltern- und Kind-Nodes) der zu beschreibenden Referenz im UA NodeSet entspricht. Der Import des bisher erzeugten UA NodeSets führte zu einem Adressraum mit mehrfachen Verweisen zwischen den Nodes (beschrieben durch das Attribut ParentNodeId und die Referenzen).
2.11.4.0 (freigegeben am 15.12.2020)

Neu

  • Neue Eigenschaft OpcContext.Owner, die auf Instanzen von IOpcApplicationInstance wie OpcClient oder OpcServer verweist, zu denen der Kontext gehört (soweit verfügbar).
  • Neue Eigenschaft OpcException.Context, die eine Instanz der Klasse OpcContext bereitstellt, über die weitere kontextabhängige Informationen zur ausgelösten beziehungsweise behandelten Ausnahme abgerufen werden können.

Behoben

  • Problem bei der Verwendung abstrakter Methoden für Methoden-Nodes (Ursache ist ein Fehler im .NET Framework bei Verwendung der Erweiterungsmethoden GetCustomAttribute<T>).
2.11.3.1 (freigegeben am 27.11.2020)

Behoben

  • Problem beim Verbinden mit Servern, die bei Endpunkt-URLs Groß- und Kleinschreibung unterscheiden und URLs mit der Endung / nicht unterstützen.
2.11.3.0 (freigegeben am 23.11.2020)

Neu

  • Fehlende Eigenschaft OpcEventDataSetItem.ClientID ergänzt.
  • Fehlende Code-Dokumentation von OpcSecurityPolicy, OpcSecurityMode und OpcSecurityAlgorithm ergänzt.
  • Neue Eigenschaft PreferredLocales in OpcContext, OpcOperationContext und OpcSession.
  • Neue Eigenschaften OpcNode.Read/WriteDisplayNameCallback.
  • Neue Methode OpcServer.GetSession(sessionId) zum Abfragen einer bestimmten Sitzung über deren Session-ID.
  • Neue Eigenschaft OpcServer.Globalization zur besseren Bereitstellung lokalisierter Informationen und Daten.

Geändert

  • Der Datentyp der Eigenschaften OpcNode.Read/WriteDescriptionCallback wurde von String auf OpcText geändert.
  • OpcDataChangeDataSetItem.ClientID von Int32 in Int64 geändert, um dem bei OpcMonitoredItem.ClientID verwendeten Typ zu entsprechen.

Behoben

  • Problem mit fehlender OpcNotification.Data, wenn OpcNotification.GetDataChanges() verwendet wird, ohne zuvor auf die OpcNotification.Data zugegriffen zu haben.
  • Problem bei der Typinitialisierung in OpcClient unter Unity mit IL2CPP: Typen wurden in einer abweichenden Reihenfolge initialisiert.
2.11.2.0 (freigegeben am 10.11.2020)

Neu

  • Experimentelle Methode OpcNodeManager.ExportNodes zur Generierung von Instanzen von OpcNodeSet anhand des Adressraums, den Node-Manager definieren. Nutzen Sie die Methode je nach Anwendungsfall und geben Sie uns Feedback bei Problemen oder gewünschten Erweiterungen.

Behoben

  • Problem, durch das OpcClient.Dispose() hängen bleiben konnte, während noch eine Subscription aktiv ist.
  • Mögliche Ausnahmen beim Aufruf von OpcClient.Dispose und OpcServer.Dispose.
  • Problem bei der Validierung von Lizenzinformationen unter Verwendung von IL2CPP und .NET Standard 2.0 als Scripting Backend in Unity.
  • Problem, das die korrekte Verwendung eines existierenden SynchronizationContexts zur Verarbeitung von Benachrichtigungen in demselben Kontext verhinderte, in dem eine Subscription erstellt wurde.
  • Problem beim Hinzufügen weiterer Node-Referenzen (Verweise wurden nicht korrekt in den Adressraum übernommen).
2.11.1.0 (freigegeben am 05.11.2020)

Neu

  • Der OpcServer kann jetzt auch gestoppt werden, wenn er pausiert wurde.
  • Eigenschaft zur Konfiguration der TimestampsToReturn für alle ReadNodesHistory-Anfragen über OpcClient.Services.ReadNodesHistory.TimestampsToReturn.
  • Eigenschaft OpcCertificateInfo.ApplicationUri zum Abrufen der ApplicationUri, die als Erweiterung „Subject Alternative Name“ in Zertifikaten enthalten ist.
  • Eigenschaft OpcClientSecurity.AutoUpgradeEndpointPolicy zum Aktivieren einer Endpunktauswahl, die auf der Übereinstimmung mit der Konfiguration (Standard) und einem Nächstbeste-Verfahren basiert, das einen Endpunkt bestimmt, der mindestens die konfigurierte Policy gewährleistet.

Geändert

  • Der Konstruktor von OpcCertificateJudgementEventArgs prüft nicht mehr, ob eines der übergebenen Zertifikate eine Null-Referenz (Nothing in Visual Basic) ist, weil manche Server für Endpunkte mit der Policy None (Mode und Algorithm) keinerlei Zertifikatdaten verwenden.

Behoben

  • Problem mit nicht mehr verfügbaren Benachrichtigungen in Subscriptions und MonitoredItems, wenn diese nicht (mehr) in der aktuellen Sitzung erstellt beziehungsweise aktiv sind.
  • Problem mit fehlenden oder fehlerhaften Security Policies nach dem Neustart von Instanzen von OpcServer.
2.11.0.0 (freigegeben am 06.10.2020)

Neu

  • Neue Methode OpcServer.Suspend(), um den Server in den Status Suspended zu versetzen.
  • Neue Methode OpcServer.Resume(), um den Server aus dem Status Suspended wieder in den Status Started zu versetzen.
  • Neue Werte in der Enumeration OpcServerState: Suspending und Suspended.
  • Erweiterung der Methode OpcSession.Close, die nicht mehr nur Diagnosedaten verwirft, sondern jetzt tatsächlich die Sitzung schließt.
  • Fehlende Code-Dokumentation für Subscription-bezogene Typen im Client-Namespace.

Geändert

  • Die Methode OpcSession.Close schließt ab sofort die Sitzung und macht den sitzungsbezogenen Identifier ungültig.
  • Methoden von OpcClient validieren ab sofort den Verbindungsstatus mit einer OpcException (mit BadServerNotConnected) statt einer InvalidOperationException.
  • Der Standardwert der Eigenschaft QueueSize der Instanz von OpcMonitoredItem, die über OpcClient.SubscribeEvent(s) erstellt wird, wurde von int.MaxValue auf uint.MaxValue geändert. So verwendet der Server für die Queue der Ereignisbenachrichtigungen die maximal unterstützte Größe. Das war auch das ursprüngliche Ziel des falschen Werts int.MaxValue.
  • Die Eigenschaft OpcMonitoredItemStatus.DataItemQueueSize wurde in QueueSize umbenannt, um der Benennung der entsprechenden Eigenschaft in der Klasse OpcMonitoredItem zu entsprechen. Diese repräsentiert die angeforderte Größe, die Eigenschaft in OpcMonitoredItemStatus die revidierte Größe.
  • Der Rückgabetyp der Eigenschaft OpcMonitoredItemStatus.Id wurde von Int32 in Int64 geändert, damit er den zugrunde liegenden, nicht CLS-konformen UInt32 des Stacks der Foundation abbilden kann.
  • Die letzten API-Änderungen an OpcMonitoredItem wurden auf OpcMonitoredItemStatus übertragen: Die Eigenschaft OpcMonitoredItemStatus.AutoFlushCache wurde in QueueMode umbenannt (wie in der Klasse OpcMonitoredItem).

Behoben

  • Für Kommunikationsfehler wurde der falsche Statuscode verwendet: Statt BadNotConnected wird jetzt BadCommunicationError verwendet.
  • Der OpcClient verband sich mit einem (möglicherweise unsicheren) Fallback-Endpunkt, wenn eine vordefinierte SecurityPolicy vom Server nicht unterstützt wird.
  • Der Wert der Eigenschaft OpcSubscription.TimestampsToReturn wurde nicht auf die MonitoredItems der Subscription übernommen, wenn diese nicht zusätzlich geändert wurden.
  • Schreibfehler in der Code-Dokumentation der Methoden RegisterNode.

2.10 ​

API-Änderungen: 12 neu, 4 geändert

2.10.0.3 (freigegeben am 11.09.2020)

Behoben

  • Problem beim Verbinden mit OPC Classic Servern.
2.10.0.2 (freigegeben am 09.09.2020)

Behoben

  • Problem beim Vergleichen von OpcNodeIds, wenn diese ein Byte-Array als Wert der NodeId verwenden.
2.10.0.1 (freigegeben am 15.07.2020)

Neu

  • Beschreibung des NuGet-Pakets aktualisiert.
2.10.0.0 (freigegeben am 14.07.2020)

Neu

  • Automatische Initialisierung von Nodes, die über den Dienst AddNodes hinzugefügt werden. Das Ergebnis entspricht dem Verhalten beim Hinzufügen von Nodes in einem benutzerdefinierten Node-Manager.
  • Erweiterung der Methode OpcCertificateManager.SaveCertificate, die das Format des Zertifikats anhand der Dateierweiterung im Parameter filePath ermittelt.
  • Neue Methoden OpcValueRange.Of, um die zugehörige OpcValueRange für einen bestimmten Datentyp dynamisch zu ermitteln.
  • Nicht generische OpcAnalogItemNodes können jetzt auch selbstständig die zugehörigen OpcValueRanges für InstrumentRange und EngineeringUnitRange festlegen (über das Attribut DataType).
  • Unterstützung für die Kodierung und Dekodierung von System.Decimal (von OPC UA 1.03 nicht unterstützt) über System.Double. Das betrifft Felder von Datenstrukturen.
  • Eigenschaft ProductUri in OpcClient und OpcServer zur einfacheren Konfiguration.
  • Automatische Initialisierung der ProductUri-Information in Client- und Serveranwendungen.
  • Verwendung des aktuell gültigen SynchronizationContext, um Benachrichtigungen in demselben Kontext zu verarbeiten, in dem die zugehörige Subscription erstellt wurde.
  • Verbesserungen für GUI-Anwendungen (wie Windows Forms) beim korrekten Multithreading in der Behandlung empfangener Benachrichtigungen.
  • Neue Methoden OpcNode.UpdateChanges zur Benachrichtigung über Änderungen an einem Node (und seinen Kind-Nodes).
  • Fehlende Dokumentation für verschiedene Typen ergänzt.

Geändert

  • OpcNode.OnAfterApplyChanges und OpcNode.OnBeforeApplyChanges nutzen jetzt OpcNodeChangesEventArgs statt EventArgs.
  • OpcNode.AfterApplyChanges und OpcNode.BeforeApplyChanges übergeben jetzt OpcNodeChangesEventArgs statt EventArgs an Ereignishandler.

Behoben

  • Problem beim Schreiben von AnalogItemNodes, die über einen benutzerdefinierten Node-Manager ohne InstrumentalRange bereitgestellt werden: Beim Schreiben wurde keine Validierung des Werts durchgeführt.
  • Problem mit nur einmal aktualisiertem SourceTimestamp in OpcValues (wenn nicht explizit ein SourceTimestamp angegeben wurde) beim Schreiben von Variablen.
  • Problem im OpcNodeHistorian (bei dessen Zuweisung) beim Import von Nodes aus einem NodeSet mit aktiviertem Attribut Historizing, wenn zugleich die Kind-Nodes HistoryConfiguration oder AggregateConfiguration fehlten.
  • Problem beim Linken der Assembly in C++-CLR-Projekten mit C++/CLI, das den Fehler C2686 auslöst.
  • Problem mit NullReferenceExceptions unter .NET Core 3.1 beim Empfang von Ereignisbenachrichtigungen.
  • Problem mit nicht aufgelösten NodeIds, wenn der NamespaceIndex 1 verwendet wird (der für den Core- beziehungsweise Application-Namespace reserviert ist).

2.0–2.9 (2017–2020) ​

2.9 ​

API-Änderungen: 182 neu, 41 entfernt, 50 geändert

2.9.2.1 (freigegeben am 08.05.2020)

Behoben

  • Problem beim Lesen strukturierter Datentypen, die ein Array-Feld enthalten, wenn OpcClient.UseDynamic auf true gesetzt ist.
2.9.2.0 (freigegeben am 06.05.2020)

Neu

  • Weitere Überladungen der Konstruktoren der Klasse OpcArgument, die einen Wert der Enumeration OpcDataType, die NodeId eines Datentyps und benutzerdefinierte Array-Dimensionen akzeptieren.
  • Unterstützung n-dimensionaler (also mehrdimensionaler) Arrays strukturierter Datentypen.
  • Unterstützung n-dimensionaler Variablen-Nodes (einschließlich der neuen Eigenschaft ArrayDimensions in der Klasse OpcVariableNode).
  • Unterstützung von Null-Referenzen als Feldwert für Felder, die einen Referenz-Datentyp als Feldwert verwenden.
  • Unterstützung der NodeClass ObjectType im Dienst AddNodes.
  • Unterstützung der NodeClass VariableType im Dienst AddNodes.

Behoben

  • Problem bei der automatischen Definition des ValueRank bei n-dimensionalen benutzerdefinierten strukturierten Datentypen.
  • Problem im Stack bei der Unterstützung n-dimensionaler benutzerdefinierter strukturierter Datentypen.
  • Probleme beim Laden von UANodeSets mit erweiterten Werten für die Attribute AccessLevel und UserAccessLevel in UAVariable-Einträgen (bezieht sich auf den Stack 1.04).
  • Problem mit NullReferenceExceptions beim Abruf von OpcDataTypeInfo.BaseType bei in NodeSets definierten Datentypen, die UATypeDefinitions ohne Felder verwenden.
  • Problem mit NullReferenceExceptions bei der Definition Encoding-unabhängiger Datentypen (also Enumerationen) als Teil des Adressraums. Dieses Problem betrifft nur die Server-API.
  • Problem mit falsch bestimmtem ValueRank bei System.Byte[], das im Stack der Foundation als ByteString interpretiert wurde.
2.9.1.0 (freigegeben am 22.04.2020)

Behoben

  • Problem, das zu doppelt durchsuchten Referenzen zwischen übergeordneten und untergeordneten Nodes führte, die mit einem NodeSet importiert wurden.
  • Probleme mit neueren Versionen von System.ServiceModel.Primitives. Rollback der Abhängigkeit auf Version 4.5.3 in allen Zielframeworks.
  • Probleme mit nachfolgenden Lizenzen für die Evaluation, die für die Bundle-Lizenzierung verwendet werden (Client und Server).
  • Problem mit falsch bestimmtem ValueRank bei System.Byte[], das im Stack der Foundation als ByteString interpretiert wurde.
  • Problem mit dem Ergebnis von OpcNamespace.Get(int, Uri), das zu einem OpcNamespace.Value führt, der den durch den Parameter namespaceUri definierten Uri.OriginalString nicht wiedergibt.
  • Problem mit kaskadierten benutzerdefinierten Datentypen, wenn sie im DataTypeEncoding keine benutzerdefinierte NamespaceUri festlegen. Dieses Problem betrifft nur die Server-API.
  • Problem mit nicht angewendetem BrowseName in AddNodes bei Nodes der NodeClasses, die Node-Typen definieren. Dieses Problem betrifft nur die Server-API.
  • Probleme mit Nodes der NodeClasses, die Node-Typen definieren und beim AddNode falsch geprüft wurden. Dieses Problem betrifft nur die Server-API.
2.9.0.0 (freigegeben am 01.04.2020)

Neu

  • Vereinheitlichte Produktlizenzierung, die sich nicht mehr nach dem verwendeten Zielframework unterscheidet.
  • Alle Licenser-Klassen stellen ab sofort verschiedene Methoden bereit, deren Namen mit FailIf beziehungsweise ThrowIf beginnen, um bei Bedarf im benutzerdefinierten Code die verwendete Lizenz zu prüfen. Verwenden Sie die Methoden FailIf in Ihrer DEBUG-Konfiguration und die Methoden ThrowIf in Ihrer RELEASE-Konfiguration, um sich vor der nicht lizenzierten Verwendung des SDK zu schützen.
  • Neue Methoden GetNodeType(...) in OpcClient (nur für Ereignis-Node-Typen).
  • Neue Methoden GetNodeTypeSystem(...) in OpcClient (nur für Ereignis-Node-Typen).
  • Neue Methoden GetNodeType(...) in OpcNodeSet.
  • Neue Methode GetNodeTypeSystem(...) in OpcNodeSet.
  • OpcMethodNode unterstützt benutzerdefinierte Eingangs- und Ausgangsparameter, wenn die Schnittstelle IOpcMethodCommand verwendet wird.
  • Neue Methoden GetNodeType(...) und neue Methode GetNodeTypeSystem() in OpcNodeSet.
  • OpcNode vererbt ab sofort seinen OpcNode.Namespace an seine Kind-Nodes (falls diese bezüglich ihrer OpcNode.Id den Standard-Namespace verwenden).
  • Neue Spezialisierungen von OpcTypeNodeInfo: OpcObjectTypeNodeInfo und OpcVariableTypeNodeInfo.
  • Verbessertes Debugging und Inspizieren der Eigenschaften von Instanzen von OpcNodeInfo (und deren Unterklassen).
  • Browse unterstützt ab sofort das zusätzliche Lesen weiterer Attribute neben den Attributen, die bereits durch den Browse-Dienst unterstützt werden.
  • OpcNodeInfo implementiert jetzt IOpcNodeInfo, um eine flüssigere Verwendung von Node-Instanzen unabhängig von ihrem Ursprung zu ermöglichen.
  • Weitere konfigurierbare Dienste in OpcClientServices: Browse und ReadNodes.
  • Erheblich verbesserte Leistung beim Erstellen von Ereignisfiltern.
  • IOpcNodeInfo definiert jetzt weitere Methoden: AttributeValue(...), Child(...) und Children().
  • Unbeschränkte Browse-, Read- und Write-Operationen aufgrund automatischer Partitionierung von Anfragen (OpcClient).
  • Ereignis OpcClient.CertificateJudgement zur Behandlung von Problemen im Zusammenhang mit Zertifikaten, nachdem eine Verbindung hergestellt und Zertifikatsinformationen bereits erfolgreich validiert wurden.
  • OpcModel zur Darstellung von Modellinformationen in NodeSets.
  • Eigenschaft OpcMemberSwitch.Conditions zur Information über die Bedingungen, unter denen ein Switch ausgewertet wird.
  • Direkte Unterstützung von .NET Core 3.1 als eines unserer Zielframeworks.
  • Methode ReplaceNode in OpcNodeManager, um existierende Nodes rekursiv, auch bezüglich ihrer Notifier und MonitoredItems, zu ersetzen.
  • OpcNodeSet wurden zusätzliche Metadateneigenschaften (LastModified und Name) hinzugefügt.
  • Eine allgemeine Implementierung der Schnittstelle IOpcMethodCommand mit Delegaten: OpcMethodDelegateCommand.
  • Fehlende Dokumentation für Collections und einige andere Typen hinzugefügt.
  • OpcNodeSetManager.ImplementNodeCallback zum Implementieren von Nodes mithilfe eines einfachen Callbacks.
  • OpcData.GetNodeId unterstützt jetzt auch Array-Typen.
  • Kodierungsinformationen im Adressraum des Servers (intern) hinzugefügt.
  • Generische Implementierung von IOpcMethodCommand für Delegaten: OpcMethodDelegateCommand.
  • Unterstützung von System.Object und System.Object[] zum Kodieren und Dekodieren von Datentypen.
  • Unterstützung von Serialisierungs- und Deserialisierungsattributen, die in System.Runtime.Serialization für Datentypen definiert sind.
  • OpcDataTypeMembersAttribute zum Filtern von Elementen, die für Datentypen kodiert oder dekodiert werden sollen.
  • OpcDictionary<TKey, TValue> als einfacher, nicht standardmäßig verfügbarer Datentyp zum Transportieren von Wörterbüchern mit OPC UA.
  • Es ist nicht mehr notwendig, dem Namen oder der NodeId eines benutzerdefinierten Wurzel-Nodes, der in OpcNodeManager.CreateNodes(...) zurückgegeben wird, manuell den Standard-Namespace des benutzerdefinierten NodeManager zuzuweisen.
  • Berücksichtigung der Reihenfolge der Felder, wie sie innerhalb ihrer Vererbungshierarchie deklariert sind, sodass immer zuerst die Felder des Basisdatentyps definiert werden.
  • Neue Methoden GetDataType(...) in der Klasse OpcClient.
  • Neue Methoden GetDataType(...) in der Klasse OpcNodeSet.
  • IOpcNodeInfo definiert jetzt die Methoden Child(...) und Children(), um die Kind-Nodes von Instanz-Nodes abzurufen.
  • Neue Klasse OpcNamespaceCollection.
  • Eigenschaft OpcNodeSet.Namespaces, um die Namespaces bereitzustellen, auf die im NodeSet verwiesen wird.
  • IOpcMethodCommand zur Definition und Verwendung benutzerdefinierter Command-Instanzen statt der Definition eines expliziten Delegaten.
  • Klasse OpcMethodCommands, die vordefinierte Commands wie den NotImplemented-Command bereitstellt.
  • Erweiterung von OpcMethodNode zur Unterstützung von Instanzen von IOpcMethodCommand.
  • Erweiterung der generischen Klasse OpcDataTypeNode<T> zur Unterstützung von Klassen- und Struktur-Typen, die auf vorhandene OPC-UA-Strukturen abgebildet werden.
  • Neue nicht generische Klasse OpcDataTypeNode.
  • Statische Eigenschaft OpcContext.Empty zur Definition einer leeren Kontext-Instanz.
  • IOpcNamespaceResolver wurde in der Klasse OpcContext implementiert und ermöglicht so das Auflösen von Namespaces von Instanzen von OpcNodeId.
  • Klasse OpcTypeSystem, die als Basis für die existierende Klasse OpcDataTypeSystem und die neue Klasse OpcNodeTypeSystem dient.
  • Eigenschaft OpcDataTypeDictionary.Documentation.
  • Klasse OpcNodeSetManager, die das einfache Importieren und Hosten von OpcNodeSets mit OpcNodeSetManager.Create(...) unterstützt.
  • Geschützte virtuelle Methoden OpcNodeManager.ImportNodes() und OpcNodeManager.ImplementNode(IOpcNode).
  • Vereinheitlichung und Vereinfachung der Auflösung des Attributs DataType, insbesondere bei der Verwendung nicht eingebauter Datentypen bei der Definition von Variablen- und Eigenschafts-Nodes. Das betrifft die folgenden Node-Klassen: OpcDataItemNode, OpcDataItemNode<T>, OpcAnalogItemNode, OpcAnalogItemNode<T>, OpcDataVariableNode, OpcDataVariableNode<T>, OpcConditionVariableNode, OpcConditionVariableNode<T>, OpcPropertyNode, OpcPropertyNode<T> und OpcVariableNode.

Geändert

  • Lizenzschlüssel, die vor Version 2.9 ausgestellt wurden, funktionieren nicht mehr. Unsere Kunden erhalten entsprechend neue Lizenzschlüssel, die dann auch in allen Zielframeworks funktionieren.
  • OpcAttributeWriteAccess verwendet jetzt UInt32 als Basistyp.
  • Der Standardwert der Eigenschaft OpcAutomatism.AlwaysParseStringIdentifiers ist jetzt false. Dadurch wird der Wert beim Aufruf des Konstruktors OpcNodeId(string) nicht mehr automatisch geparst. Weitere Details beschreibt OpcAutomatism.AlwaysParseStringIdentifiers.
  • [Client SDK] Die Klasse OpcBrowseNode wurde vom Namespace Opc.UaFx.Client in den Namespace Opc.UaFx verschoben.
  • [Client SDK] Die Enumeration OpcBrowseNodeDegree wurde vom Namespace Opc.UaFx.Client in den Namespace Opc.UaFx verschoben.
  • [Client SDK] IOpcBrowseService und OpcBrowseRequest verwenden jetzt die Klassen OpcViewDescription und OpcBrowseNode statt der Klassen ViewDescription und BrowseDescription der Foundation.
  • OpcReadOnlyNamespaceCollection wurde vom Namespace Opc.UaFx.Server in den Namespace Opc.UaFx verschoben.
  • Der Standardwert des Attributs DataType von OpcDataTypeDictionaryNode wurde von Byte auf ByteString geändert, um der Definition der Spezifikation zu entsprechen.
  • Die Eigenschaft Description wurde in Documentation umbenannt, um die Konformität zur Spezifikation sicherzustellen. Betroffen sind IOpcDataTypeInfo, OpcDataTypeInfo und OpcDataFieldInfo.
  • OpcEncoding.All(...) erzeugt jetzt die OpcEncoding.Id anhand des Standard-BrowseNames für die verschiedenen Encoding-Typen.
  • OpcNamespace.ToString() liefert ab sofort eine Zeichenkette, die ausschließlich OpcNamespace.Value und OpcNamespace.Index (falls nicht null) enthält.
  • OpcNodeSet.GetDataTypeSystem() liefert jetzt eine Instanz von OpcDataTypeSystem, die den typischen BrowseName der jeweiligen Kodierungsart (die das System repräsentiert) verwendet.
  • IOpcTypeProvider.GetType(OpcEncoding) wurde entfernt, weil Codierungsinformationen nur auf Datentypen zutreffen.
  • OpcTypeCategory.EventType und OpcTypeCategory.ReferenceType wurden entfernt.

Behoben

  • Probleme bei der Validierung veralteter Zertifikate oder von Zertifikaten, die gegen bestimmte Richtlinien für allgemein gültige Zertifikate verstoßen. Solche Zertifikate können jetzt im Ereignis CertificateValidationFailed verarbeitet werden.
  • Problem bei der automatischen Anwendungskonfiguration, wenn die Entry-Assembly entweder kein AssemblyTitleAttribute definiert oder string.Empty als Assembly-Titel verwendet.
  • Problem bei Wertänderungen von Variablen-Nodes beim Wechsel zwischen verschiedenen komplexen Datentypen (die über ein ExtensionObject bereitgestellt werden).
  • Falsch erzeugte EncodingMask bei Datentypen mit mehr als einem optionalen Feld.
  • Falsche Interpretation von OpcArgument.IsArray und OpcArgumentInfo.IsArray.
  • Ein initial festgelegter OpcVariableNode.Timestamp wird nicht mehr während der Erstellung des Adressraums verworfen.
  • Problem mit falsch ermittelten Standardwerten und -rängen sowie Standard-Datentyp-NodeIds durch OpcDataTypes.GetValueRank(..) und OpcDataTypes.GetNodeId(...).
  • Probleme mit DataTypeDictionary-Nodes, die keine DataTypeDescription-Nodes definieren, bei der Erzeugung des DataTypeSystem beim Aufruf von OpcClient.GetDataTypeSystem().
  • Probleme bei der Dekodierung strukturierter Daten, die den neuen Typ Opc.UaFx.Bit verwenden.
  • Probleme bei der Verwendung von OpcNodeId.UriIdentifier(...), wenn der Wert von OpcNodeId.Value kein System.String-Wert ist.
  • OpcNamespace behält jetzt die ursprüngliche Zeichenkette bei, die beim Definieren einer Instanz von OpcNamespace verwendet wurde. Nachfolgende Änderungen (durch die Klasse System.Uri) werden jetzt vermieden, sodass die Eigenschaft OpcNamespace.Value immer denselben System.String-Wert liefert, der bei der Definition der Instanz verwendet wurde.
  • Probleme, die in manchen Situationen dazu führten, dass eine neu erstellte Instanz von OpcNode zu einem späteren Zeitpunkt nicht mehr umbenannt werden konnte, wenn bei ihrer Erstellung kein Name angegeben wurde.

2.8 ​

API-Änderungen: 207 neu, 25 entfernt, 47 geändert, 2 veraltet

2.8.3.1 (freigegeben am 24.01.2020)

Behoben

  • Problem mit nicht mehr funktionierenden Subscription-Handlern nach erfolgreichem erneutem Verbindungsaufbau.
  • Problem mit verworfener Socket-Instanz in verworfenen Instanzen von TcpMessageSocket.
2.8.3.0 (freigegeben am 16.01.2020)

Neu

  • Unterstützung von OpcExceptions in Delegaten, die für Methoden-Nodes verwendet werden. Das ermöglicht die Definition eines Bad-Ergebnisses, ohne dieses manuell über den Parameter OpcMethodContext setzen zu müssen.
  • Unterstützung weiterer Access Levels (StatusWrite und TimestampWrite).
  • Ergänzung der Dokumentation für OpcAccessLevel, OpcVariableNode.AccessLevel und OpcVariableNode.UserAccessLevel.
  • Unterstützung des Abbruchs einer Verbindung während eines ausstehenden Wiederverbindungsversuchs im OpcClient.
  • Änderungen, um die Verwendung mit UWP-Anwendungen in Bezug auf die .NET Native Tool Chain zu verbessern.

Geändert

  • Überarbeitete Logik zur Änderung der Eigenschaft OpcClient.State, um den Verlust einer Verbindung zum Server besser feststellen zu können.
  • Die Eigenschaft OpcClient.State ändert sich jetzt (während einer laufenden Anfrage) nur noch dann automatisch auf den Wert Disconnected, wenn der ReconnectTimeout größer als 0 ist (die Wiederverbindungslogik implementieren Sie selbst).

Behoben

  • Problem mit nicht übernommenen Statusinformationen (Code), die an einen der Konstruktoren der Klasse OpcValue übergeben wurden.
  • Problem mit TypeDictionaries, die keine NamespaceUri bereitstellen.
2.8.2.1 (freigegeben am 13.12.2019)

Behoben

  • Problem beim Veröffentlichen paralleler Subscriptions beim Aufrufen eines Methoden-Nodes im OpcClient.
  • Problem mit nicht aktualisiertem OpcVariableNode.Value, falls einem Variablen-Node kein benutzerdefinierter WriteVariableValueCallback zugeordnet ist.
  • Problem, durch das der Wert der Eigenschaft OpcClientKeepAlive.Interval nicht auf die aktuelle Sitzung angewendet wurde.
2.8.2.0 (freigegeben am 06.11.2019)

Neu

  • Einführung von Opc.UaFx.Bit als .NET-basierte Darstellung des von der Foundation definierten Werttyps Bit, für den bisher keine konkrete Implementierung existiert.

Geändert

  • Explizit kodierte Informationen, bekannt als EncodingMask eines strukturierten Datentyps, werden jetzt über den neu eingeführten Typ Opc.UaFx.Bit statt über System.Boolean abgebildet.

Behoben

  • Problem mit gemischt strukturierten Datentypen, die führende Boolean-Werte gefolgt von weiteren Nicht-Boolean-Werten verwenden und einen falsch kodierten Datenstrom ergaben.
  • Problem beim Verbindungsaufbau zu einem OPC Classic Server in OPC Watch, wenn kein benutzerdefiniertes Zertifikat verwendet wird.
  • Problem in OpcServerInfo.FromProcess(...), wenn die ProductVersion der FileVersionInfo der Instanz von ProcessModule aus Process.MainModule eine Versionszeichenkette bereitstellt, die nicht ausschließlich aus Zahlen und Punkten besteht, zum Beispiel 1.2.3.4-preview.
2.8.1.3 (freigegeben am 24.10.2019)

Behoben

  • Problem beim Austausch strukturierter Datentypen ohne Verwendung der anstehenden Unterstützung für Metadaten.
2.8.1.2 (freigegeben am 23.10.2019)

Geändert

  • Angaben zu iconUrl und licenseUrl in NuGet-Paketen aufgrund ihrer Abkündigung angepasst.

Behoben

  • Die Unterstützung von OPC Classic funktionierte nicht mehr („An internal error occurred as a result of a programming or configuration error“), weil der OPC-Classic-Client seine eingebetteten Ressourcen nicht mehr fand.
  • Problem mit der falschen Interpretation von Int32-Werten als Rückgabetyp von Methoden-Nodes.
2.8.1.1 (freigegeben am 11.10.2019)

Neu

  • Unterstützung für Methodenparameter vom Typ System.Object, die als OPC-UA-Variantenwerte interpretiert werden.

Behoben

  • Probleme mit nicht berücksichtigten Methodenparametern vom Typ System.Object.
  • Problem beim Lesen großer Datei-Nodes (die Dateien darstellen, deren Inhalt die MaxByteStringLength überschreitet).
2.8.1.0 (freigegeben am 25.09.2019)

Neu

  • Methoden RegisterNodes und UnregisterNodes in der Klasse OpcClient zur Registrierung von Nodes, für die ein OPC UA Server in der aktuellen Sitzung einen schnelleren Zugriff realisieren soll.
  • Unterstützung der OPC-Classic-API in .NET Standard, damit die API auch in .NET-Core-Anwendungen unter Windows zur Verfügung steht.
  • Neue Methoden OpcDataObject.HasField(name) und OpcDataObject.TryGetField(name, out field).
  • Verbesserte Leistung durch den Ausschluss der von der Foundation definierten Data Type Dictionaries beim Abrufen des Datentypsystems eines Servers.
  • Neue Eigenschaft OpcClient.UseDynamic und geänderter Standardwert der Eigenschaft OpcAutomatism.UseDynamic (false), um die Leistung beim Verbindungsaufbau zu steigern, wenn keine Informationen über Datentypen benötigt werden.
  • Unterstützung von Servern, die beim Abrufen der Data Type Dictionaries kein bereichsbasiertes Lesen von Daten unterstützen.

Behoben

  • Absturz durch eine nicht behandelte Ausnahme beim Aufruf von Socket.Shutdown().

Geändert

  • Die Eigenschaft OpcAutomatism.UseDynamic hat ab sofort den Standardwert false. Damit das OpcDataObject genutzt werden kann, muss diese Eigenschaft oder die Eigenschaft OpcClient.UseDynamic auf true gesetzt werden.
2.8.0.0 (freigegeben am 18.09.2019)

Neu

  • Eine Reihe neuer Klassen zur Unterstützung der Definition, Verwendung und Reflexion benutzerdefinierter Datentypen in Clientanwendungen.
  • Neue Klasse OpcNodeSet, um eine datei-, zeichenfolgen- oder streambasierte Quelle bereitzustellen, die Informationen zum Datentypsystem aus einem UANodeSet liefert.
  • Neue Eigenschaft OpcClient.NodeSet, um eine Instanz der Klasse OpcNodeSet festzulegen, aus der Informationen zum Datentypsystem abgefragt werden, statt das Datentypsystem des Servers abzufragen.
  • Methode OpcClient.GetDataTypeSystem() zum Ermitteln des Datentypsystems, das der Client zum Auflösen von Datentypinformationen verwendet.
  • Eigenschaft OpcAutomatism.UseDynamicTypeRegistration zur Steuerung der automatischen Typreflexion, mit der Client- und Serveranwendungen die verschiedenen deklarierten Daten- und Ereignistypen bestimmen.
  • Neue Eigenschaft OpcAutomatism.UseDynamic zur Steuerung der dynamischen Typauflösung bei Verwendung benutzerdefinierter, aber nicht explizit deklarierter Datentypen in Clientanwendungen.
  • Neue Klassen OpcNodeValue<T> und OpcAttributeValue<T> sowie IOpcNodeAttribute mit IOpcNodeDescriptor in Verbindung mit OpcNodeValuePair, um Node-gebundene Werte zu deklarieren.
  • Erweiterung der Klasse OpcClient um die neuen Methoden ReadNodeValue und WriteNodeValue zum Lesen und Schreiben Node-gebundener Werte.
  • Verbesserte Ausnahmebehandlung, um StackTrace-Informationen vom Benutzercode bis zur Foundation- und Kommunikationsebene beizubehalten.
  • Neue Eigenschaft OpcClient.KeepAlive samt zugehöriger Klasse OpcClientKeepAlive, um die Keep-alive-Aktionen in einer Clientanwendung zu steuern und zu überwachen.
  • Dynamische Typkonvertierung in OpcValue.As<T>().
  • Neue Methode AsValue<T>() in der Klasse OpcValue, um eine generische Definition des Werts mithilfe der neuen Klasse OpcValue<T> bereitzustellen.
  • OpcNamespace stellt die Namespace-Zeichenfolge beziehungsweise URI jetzt über die neue Eigenschaft OpcNamespace.Value bereit.
  • Die Standardgrenzen für den Transport wurden erhöht: DefaultMaxByteStringLength von 64 KB auf 5 MB und DefaultMaxMessageSize von 1 MB auf 10 MB.
  • Die intern behandelten Ausnahmen bei Verwendung der Klasse XmlSerializer beim Start wurden behoben.
  • Verbesserte Ausnahmebehandlung und -verfolgung beim Kodieren und Dekodieren von Daten (siehe OpcTypes.EncodingFailed und OpcTypes.DecodingFailed).
  • Unterstützung für das Tracing aller Kodierungsoperationen mithilfe der neuen Klassen OpcEncodingStackFrame und OpcEncodingStackTrace.
  • Unterstützung des Tracings der Dekodierung und Kodierung mithilfe der neuen Klassen OpcEncodingStackFrame und OpcEncodingStackTrace.
  • int ResolveIndex(string namespaceValue) und string ResolveValue(int namespaceIndex) zu IOpcNamespaceResolver hinzugefügt.
  • OpcClient bietet jetzt Methoden, um Aufrufe von CallMethod mithilfe der neuen generischen Methoden CallAction und CallFunc zu vereinfachen.
  • Zusätzliche Überladungen für OpcBrowseNode, um OpcNodeIds zu unterstützen, die auf bestimmte Referenztypen verweisen.
  • OpcNodeInfo bietet jetzt zusätzliche Überladungen von Children(...) und Parents(...), die einen Wert von OpcReferenceType akzeptieren.
  • OpcResult liefert jetzt mit GetBaseResult() das Root-Ergebnis.
  • OpcEventNode.EventTypeId kann jetzt mit dem hinzugefügten Setter beschrieben werden.
  • Neues OpcEventTypeAttribute zur clientseitigen Definition benutzerdefinierter Ereignistypen, die zur Verarbeitung von Ereignisbenachrichtigungsdaten in Clientanwendungen verwendet werden.
  • Falsch verwendeter Statuscode beim Dekodieren im Foundation Stack korrigiert (vorher: BadEncodingError, jetzt: BadDecodingError).
  • Fehlende Eigenschaft SourceType zu Opc.Ua.Schema.Binary.FieldType hinzugefügt.
  • Fehlende Eigenschaft BaseType zu Opc.Ua.Schema.Binary.BaseType hinzugefügt.

Behoben

  • Falsch verwendete Variable beim Konfigurieren von Opc.UaFx.Client.OpcSubscription.LifetimeCount.
  • Probleme bei der Serialisierung von Objekten vom Typ OpcException.

Geändert

  • OpcDataTypeAttribute ist jetzt auf Klassen und Strukturen anwendbar.
  • OpcNodeManager.NamespaceIndexes und OpcNodeManager.NamespaceUris wurden in der neuen Eigenschaft OpcNodeManager.Namespaces zusammengefasst.
  • IOpcReadOnlyDataStore wurde in IOpcReadOnlyNodeDataStore umbenannt.
  • Die Methoden Uri Resolve(int namespaceIndex) und int Resolve(Uri namespaceUri) von IOpcNamespaceResolver sind jetzt veraltet.

2.7 ​

API-Änderungen: 301 neu, 150 entfernt, 103 geändert

2.7.5.1 (freigegeben am 15.08.2019)

Neu

  • Verwendung der OpcNominalNodeIdFactory (über OpcNodeId.Factory) zur Auflösung von OPC-Classic-Tag-Namen mit dem serverspezifischen Tag-Separator des OPC Classic Servers.

Behoben

  • Problem mit mehrfach eingetragenen Serialisierungsdaten von Ausnahmen, das zu SerializationExceptions statt der eigentlichen Ausnahmen führte.
2.7.5.0 (freigegeben am 13.08.2019)

Neu

  • Verbesserte Dokumentation der API: IOpcNode, IOpcNodeInfo und OpcNode.
  • Änderungen am Stack, um sicherzustellen, dass Locks des Node-Managers nicht freigegeben werden, solange ein MonitoredItem angelegt, geändert oder gelöscht wird.
  • System.ServiceModel.Primitives wurde auf Version 4.5.3 aktualisiert. In System.Private.ServiceModel 4.5.x wurde ein Fehler behoben, durch den die System.Private.ServiceModel.dll bei .NET-Core-Anwendungen beim Publish für Windows (win-xxx) nicht kopiert wurde.

Behoben

  • Probleme beim Kompilieren mit der .NET Native Tool Chain.
  • Probleme mit mehrfach auftretenden Benachrichtigungen nach einer erneuten Verbindung zum Server.
  • Probleme mit inline geparsten OpcNodeIds beim Erstellen einer OpcNodeId mit einem String-Identifier.
  • Problem mit falsch verwendeter Basisadresse und Security Policies im OpcDiscoveryServer.
  • Probleme mit unnötigerweise neu erstellten Instanzen von OpcMonitoredItem, wodurch der Vergleich dieser Instanzen nicht mehr funktionierte.

Geändert

  • OpcMonitoredItem.AutoFlushCache wurde durch die neue Eigenschaft OpcMonitoredItem.QueueMode ersetzt, um den verwendeten Mechanismus beim Überlauf der Benachrichtigungsqueue klarer auszudrücken.
2.7.4.0 (freigegeben am 07.06.2019)

Neu

  • Die Auflösung von Domänennamen bei der Validierung von Client- und Server-Zertifikaten verwendet jetzt alternative Mechanismen, falls im Betriebssystem kein DNS-Server konfiguriert ist.
  • Der im Fall von HTTPS (im Stack der Foundation) nicht mehr verwendete OperationTimeout wird wieder angewendet.
  • Neue Ereignisse in der Klasse OpcNodeManager: MonitoredItemsCreated, MonitoredItemsModified und MonitoredItemsDeleted.

Behoben

  • SocketExceptions unter macOS bei der Validierung von Domänennamen in Zertifikaten, wenn im Betriebssystem kein (erreichbarer) DNS-Server eingerichtet ist.

Geändert

  • Einzelne Eigenschaften in den Klassen OpcMonitoredItem, OpcServiceCounter, OpcSessionDiagnostics und OpcServerDiagnostics liefern jetzt long- statt int-basierte Werte, um weiterhin die CLS-Konformität zu wahren, obwohl der Stack der Foundation vorzeichenlose Datentypen verwendet.
2.7.3.1 (freigegeben am 23.05.2019)

Neu

  • [Client SDK] Unterstützung von .NET Framework 4.6.

Behoben

  • Problem beim Verbinden mit Servern, die HTTPS als Protokoll verwenden, unter macOS und Linux. Das Problem äußerte sich in der OpcException „An unrecognized response was received from the server.“
2.7.3.0 (freigegeben am 17.05.2019)

Neu

  • Die lokale Instanziierung von X509Certificate2 wurde durch das Ereignis OpcCertificateManager.QueryInstance zum Laden von Zertifikatinformationen ersetzt. Das ermöglicht die benutzerdefinierte Erzeugung von Instanzen von X509Certificate2 unter Verwendung eines entsprechenden EventHandler.
  • Die neue Eigenschaft OpcCertificateStores.PathProbings ermöglicht die benutzerdefinierte Anpassung der Probing-Mechanismen, mit denen die standardmäßig verwendeten Speicherorte der Zertifikatspeicher ermittelt werden.
  • Verbesserungen bei verschiedenen (kleinen) Problemen in Subscriptions und MonitoredItems (insbesondere beim automatischen Neuverbinden des Clients).
  • Der Klasse OpcSubscription wurden weitere Überladungen von AddMonitoredItem(...) hinzugefügt.

Behoben

  • Problem beim Verbinden mit Servern, die HTTPS als Protokoll verwenden. Das Problem äußerte sich in der OpcException „An unrecognized response was received from the server.“

Geändert

  • Die Implementierung der Klassen OpcMonitoredItem und OpcSubscription wurde aktualisiert: Einige int-basierte Eigenschaften wurden auf long umgestellt, um die zugrunde liegenden uint-Eigenschaften des Foundation Stacks CLSCompliant anzubieten.
2.7.2.0 (freigegeben am 10.05.2019)

Neu

  • Unterstützung von TypeDefinition-Informationen beim Browsen von Instanz-Nodes durch die neue Klasse OpcInstanceNodeInfo.
  • Neue Eigenschaft Socket in der Klasse OpcSession zur Identifizierung der Socket-Identitätsinformationen, die für den lokalen und den entfernten Endpunkt verwendet werden.
  • Produktsymbol der NuGet-Pakete geändert.
  • [Client SDK] Aktive Unterstützung von IL2CPP in Unity-Projekten. Dadurch werden vereinzelte Überlaufausnahmen durch IL2CPP behoben.

Behoben

  • Probleme beim gleichzeitigen Browsen von mehr als einem Referenztyp, die zu einer ArgumentOutOfRangeException führten.
  • Probleme, die manchmal zu veralteten Informationen zu Subscriptions und MonitoredItems führen konnten, wenn der Client eine verlorene Verbindung zum Server automatisch wiederhergestellt hat.
  • Problem mit manchmal fehlenden Client- und Subscription-basierten Benachrichtigungsereignissen, zum Beispiel blieb NotificationReceived am OpcClient aus.
2.7.1.1 (freigegeben am 29.04.2019)

Neu

  • Aktualisierte Paketinformationen (ProjectUrl und LicenseUrl).
2.7.1.0 (freigegeben am 25.03.2019)

Neu

  • Ablehnung angeforderter NodeIds, die einen unbekannten Namespace-Index verwenden (im Dienst AddNodes, BadNodeIdInvalid).
  • Verwendung des für die NodeId zuständigen Node-Managers beim Anlegen von Nodes durch den Client. So wird sichergestellt, dass ein Node nicht zu den Nodes des Node-Managers des Eltern-Nodes hinzugefügt wird, wenn er auf einen Namespace eines anderen Node-Managers verweist.
  • Zugriffs- und Schreib-Flags eines Nodes werden ab sofort rekursiv vergeben, wenn ein Node durch einen Client angelegt wird.

Behoben

  • Problem mit der Ablehnung von NodeIds, die der Client vorgibt (Dienst AddNodes).
  • Probleme mit benutzerdefinierten Node-Attributen zum Festlegen von Zugriffs- und Schreib-Flags beim Anlegen von Nodes durch den Client.
  • Korrektur der unschön generierten Namespace-URI des Standard-Namespace (unnötige / wurden entfernt).
  • Problem mit falsch verpackten .NET-Array-Typen bei der Verwendung von Instanzen von OpcValue.
  • Problem mit falsch verpackten UA-FX-Array-Typen bei der Verwendung von Instanzen von OpcValue.
  • Problem mit fehlenden DataType-Informationen bei (nicht generischen) Instanzen von OpcVariableNode, wenn diese über den Konstruktor mit einem Initialwert initialisiert werden und anschließend ihre Eigenschaft DataType auf den entsprechenden Typ festgelegt wurde. Ergebnis: Die Eigenschaft DataType übernahm den neuen Wert nicht.
2.7.0.2 (freigegeben am 15.03.2019)

Behoben

  • Fehlerhafte Adressierung von nicht verwaltetem Speicher (bei Verwendung von OPC Classic), die insbesondere in Anwendungen fehlschlagen kann, die die Option LARGEADDRESSAWARE verwenden.
2.7.0.1 (freigegeben am 15.03.2019)

Behoben

  • Problem mit Gebietsschemata, die vom OPC Classic Server unterstützt werden, aber nicht vom Betriebssystem des OPC Clients.
  • Problem bei der Kommunikation mit einem OPC Classic Server, der auf einem 64-Bit-System ausgeführt wird.
2.7.0.0 (freigegeben am 14.03.2019)

Neu

  • Vollständige Überarbeitung der Unterstützung von AddNode im OpcClient einschließlich eines vollständig neuen Satzes von Command-Typen zu OpcAddNode wie OpcAddFolderNode, OpcAddObjectNode, OpcAddDataVariableNode, OpcAddAnalogItemNode und weiteren.
  • Erstmalige vollständige Unterstützung von AddNode-Dienstaufrufen im OpcServer, die das Erstellen von Nodes aller unterstützten Typdefinitionen im Adressraum des Servers ermöglicht.
  • Vollständige Überarbeitung der Unterstützung von DeleteNode, AddReference und DeleteReference im OpcClient einschließlich der Neuauflage der Commands OpcDeleteNode, OpcAddReference und OpcDeleteReference.
  • Überarbeitung der Unterstützung der Dienstaufrufe DeleteNode, AddReference und DeleteReference im OpcServer mit zusätzlichen Validierungen der Anfragen.
  • Neue Klasse OpcAddNodeResult, eine Spezialisierung der Klasse OpcResult, die das Ergebnis, dessen Commands und die NodeId nach der Ausführung eines AddNode-Dienstaufrufs bereitstellt.
  • Der OpcNodeManager stellt ab sofort virtuelle Methoden bereit, die beim Hinzufügen (über den Dienst AddNode) und Entfernen (über den Dienst DeleteNode) von Nodes zum beziehungsweise vom Adressraum des Managers ausgeführt werden.
  • Verbesserte Ausnahmedetails bei der Verwendung der Dienste AddNodes, DeleteNodes, AddReferences und DeleteReferences.
  • Der Konstruktor der Klasse OpcServerIdentity stellt ab sofort eine Überladung für ein string-basiertes Passwort bereit.
  • Ereignisse von OpcServer: RequestProcessing, RequestValidating, RequestValidated und RequestProcessed zur Vor- und Nachverarbeitung von Client-Anfragen und den darauf gesendeten Antworten.
  • Die OpcException stellt ab sofort Informationen über Source, StackTrace, Data und HelpLink bereit (falls verfügbar) und verwirft eine ursprünglich andere Ausnahme nicht mehr.
  • Methode IOpcNode.Child(...) zum Ermitteln einer Kind-Instanz von IOpcNode über den Namen (also den BrowseName) des Kind-Nodes.
  • Zusätzliche Methodenüberladung OpcServerIdentity.ChangePassword(string).
  • Zusätzliche Methodenüberladung OpcUserNameAcl.AddEntry(...) zur Definition einer benutzerdefinierten OpcServerIdentity.
  • Ableiten der Klasse OpcResult für benutzerdefinierte Typen.

Geändert

  • Die Eigenschaft OpcServerIdentity.Password wurde entfernt, weil es keinen Grund gibt, das intern gespeicherte Passwort nach außen weiterzugeben. Außerdem ist es keine gute Praxis, einen Verweis auf ein Array über eine Eigenschaft bereitzustellen.
  • Der Delegat OpcTransformUserPasswordDelegate wurde entfernt.
  • OpcUserNameAcl.PasswordTransform wird durch die virtuellen Methoden Matches und TransformPassword in der Klasse OpcServerIdentity ersetzt.

Behoben

  • Problem beim Schreiben eingebauter strukturierter Werte wie OpcEngineeringUnitInfo oder OpcValueRange mit OpcClient.WriteNode.
  • Problem beim Trennen einer Verbindung beziehungsweise beim Anhalten eines Clients oder Servers, das bei einem noch ausstehenden Verbindungsversuch zum Absturz führen kann.
  • Problem mit StackOverflowExceptions bei der Änderung der Instanz der Eigenschaft OpcServer.Configuration.

2.6 ​

API-Änderungen: 61 neu, 33 entfernt, 16 geändert

2.6.0.0 (freigegeben am 20.02.2019)

Neu

  • Unterstützung von OPC Classic über die Klasse OpcClient durch Angabe der Adresse im Schema opc.com://<host>(:<port>)/<progId>/<classId> (nur mit .NET Framework).
  • OpcClassicInterface, OpcClassicInterfaces, OpcClassicInterfaceCollection und OpcClassicInterfaceCategory (nur mit .NET Framework).
  • OpcClassicApplicationDescription, OpcClassicApplicationDescriptionCollection, OpcClassicEndpointDescription und OpcClassicEndpointDescriptionCollection (nur mit .NET Framework).
  • OPC Classic Discovery mit der neuen Klasse OpcClassicDiscoveryClient. Dafür wird OpcEnum.exe verwendet, eine COM-Anwendung, die Teil der OPC-Classic-Laufzeitumgebung ist (nur mit .NET Framework).
  • Erweiterung der Klasse OpcDataChangeFilter zur Unterstützung eines Triggers, des DeadbandType und eines DeadbandValue. Über die Eigenschaft Trigger lassen sich auch Änderungen des SourceTimestamp überwachen.
  • Zusätzliche Überladungen der Methode OpcClient.SubscribeDataChange und zusätzliche Überladungen der Konstruktoren von OpcDataSubscribeDataChange, die einen Wert der Enumeration OpcDataChangeTrigger akzeptieren.
  • Ein vordefinierter ApplicationName wird ab sofort als SubjectName eines Zertifikats verwendet, wenn ein neues Zertifikat (automatisch) für eine Client- oder Serveranwendung erstellt wird.
  • OpcApplicationInstance stellt eine Standardimplementierung der Schnittstelle IOpcApplicationInstance bereit.
  • OpcClient und OpcServerBase verwenden ab sofort die neue Klasse OpcApplicationInstance als gemeinsame Basisklasse.
  • OpcSecurity als generische Basisklasse für Sicherheitseinstellungen von Client- und Serveranwendungen.
  • OpcClient leitet von OpcApplicationInstance ab.
  • OpcServer leitet über seine Basisklasse OpcServerBase von OpcApplicationInstance ab.
  • Zentralisierte Anwendungskonfiguration (innerhalb des SDK) von Client- und Serveranwendungsinstanzen durch Einsatz der OpcApplicationInstance.
  • OpcTransport als generische Klasse zur Konfiguration der Transporteinstellungen, die jetzt Teil der Schnittstelle IOpcApplicationInstance ist.
  • OpcSecurity als generische Klasse zur Konfiguration der Sicherheitseinstellungen, die jetzt Teil der Schnittstelle IOpcApplicationInstance ist.
  • Die Eigenschaften Security und Transport wurden der Schnittstelle IOpcApplicationInstance hinzugefügt.
  • Das Ereignis CertificateValidationFailed wurde der Schnittstelle IOpcApplicationInstance hinzugefügt.
  • OpcSecurityPolicyCollection implementiert ab sofort einen öffentlichen Konstruktor.

Geändert

  • Die Klasse OpcClientTransport wurde entfernt (ersetzt durch die neue Klasse OpcTransport).
  • Die Klasse OpcServerTransport wurde entfernt (ersetzt durch die neue Klasse OpcTransport).
  • Die standardmäßig verwendeten Serverinformationen, die die OpcServerBase bereitstellt, bevorzugen einen vordefinierten ApplicationName.
  • OpcSecurityPolicyCollection stellt keinen Konstruktor mehr bereit, der eine Instanz von OpcServerBase erwartet. Die zugehörige Eigenschaft Owner wurde ebenfalls entfernt.

2.5 ​

2.5.7.0 (freigegeben am 06.02.2019)

Neu

  • OpcClient.WriteNode akzeptiert jetzt das direkte Schreiben von null als Node-Wert, ohne diesen zuvor in eine Instanz von OpcValue zu verpacken.
  • Die Klasse OpcServer stellt neue Konstruktorüberladungen bereit, die die Standardadresse aus opc.tcp, localhost und 4840 (dem Standardport) verwenden.
  • Der gesamte Node-Baum kann jetzt inline über neue Konstruktoren von OpcObjectNode und OpcFolderNode erzeugt werden. Dabei lassen sich die direkten Kind-Nodes beim Erstellen ihrer Eltern-Nodes übergeben.
  • Ab sofort ist sichergestellt, dass Lese- und Schreiboperationen auf Attributen abgebrochen werden, wenn benutzerdefinierte Read- oder Write-Callbacks ein Bad-Ergebnis liefern. Bei Good-Ergebnissen wird die Lese- oder Schreiboperation wie bisher fortgesetzt.
  • APIs, deren Signatur ausschließlich nodeId : string zur Identifizierung eines Nodes verwendet, interpretieren den übergebenen String-Wert inline, um eine flüssigere Verwendung der API des SDK zu gewährleisten.

Geändert

  • Anwendungszertifikate werden nicht mehr unter .\CertificateStores\Trusted, sondern (standardmäßig) unter .\CertificateStores\App gespeichert, um beim Start der Anwendung die Suche nach dem Anwendungszertifikat zu beschleunigen.
  • Bei der Ermittlung der OpcServerInfo einer Assembly wird nicht mehr die LinkTime, sondern die LastWriteTime der Assembly verwendet.

Behoben

  • Problem mit nicht übernommenem Initialwert bei Verwendung des Konstruktors OpcDataVariableNode(parent, name, value).
  • Prüfungen des Werts (die zum Beispiel zu BadTypeMismatch führen) werden jetzt beim Schreiben des Attributs Value durchgeführt.
2.5.6.0 (freigegeben am 19.10.2018 [Client SDK], 06.02.2019 [Client+Server SDK])

Neu

  • Erweiterte Linker-Unterstützung für Android-Projekte beim Linken mit der Option SDK+User.
  • Erweiterte Auswahl des Standardverzeichnisses für Zertifikate. Zuerst wird das lokale Verzeichnis auf Schreibrechte geprüft, dann CommonApplicationData und schließlich ApplicationData.
  • Zusätzliche Unterstützung von .NET Framework 4.7.1 als Zielframework, um nicht mehr von 12 weiteren System-Assemblies abhängig zu sein. Diese Abhängigkeiten entstehen durch einen Fehler in .NET Framework 4.7.1 bei der Referenzierung von .NET-Standard-Assemblies. Details beschreibt der Microsoft-Artikel Targeting .NET Framework 4.7.1 copies extra files to your bin directory.

Behoben

  • Fehler beim Prüfen, ob ein Zertifikat bereits im Zertifikatspeicher enthalten ist. Der Speicher lieferte immer den Wert true.
  • Fehler beim Browsen bei Verwendung der Linker-Option SDK+User in Android-Projekten.
2.5.5.0 (freigegeben am 11.10.2018 [Client SDK], 06.02.2019 [Client+Server SDK])

Neu

  • API für die reine Cliententwicklung aus OPC UA Advanced extrahiert.
  • Ereignis CertificateRequested in den Klassen OpcClient und OpcServerBase zum Abrufen eines alternativen Zertifikats, wenn ein existierendes Anwendungsinstanz-Zertifikat nicht gefunden oder nicht verwendet werden kann. Über dieses Ereignis lässt sich zusätzlich abrufen, warum ein neues Zertifikat benötigt wird. Außerdem kann der Client darüber seinen Benutzer informieren oder befragen.
  • Wenn auf das Verzeichnis .\CertificateStores\ (das Standardverzeichnis für Zertifikate) nicht schreibend zugegriffen werden kann, wird der Pfad $(AppData)\OPC Foundation\CertificateStores\ statt des Standardverzeichnisses verwendet, um die Zertifikate zu verwalten.
  • Erhöhte Standardlaufzeit für Zertifikate: von 12 Monaten (1 Jahr) auf 600 Monate (50 Jahre).
  • Reduzierte geforderte Standard-Schlüssellänge von 2048 auf 1024, um weiterhin ältere Zertifikate zu unterstützen.
  • Reduzierte Assembly-Größe und weniger Abhängigkeiten durch Reorganisation der intern verwendeten Lizenzierungsmechanismen für .NET Standard.
  • Wenn das Binden des Sockets fehlschlägt, wird die Ausnahme nicht mehr behandelt und auch keine allgemeine Ausnahme erzeugt. Stattdessen wird sie an den Aufrufer weitergereicht.
  • Eigenschaft Binding in der Klasse OpcServer, die eine Instanz der neuen Klasse OpcServerBinding bereitstellt.
  • Mit OpcServerBinding (Eigenschaft OpcServerBase.Binding) lässt sich beim Binden der Adresse ein Geltungsbereich angeben. Standardmäßig wird (wie zuvor) an jede IPv4- und jede IPv6-Adresse mit der angegebenen Portnummer gebunden.
  • Die Low-Level-Lese- und -Schreiboperationen des Node-Managers stellen ab sofort OpcNodeAccessTokens mit Informationen zum Ergebnis der Operation bereit.
  • Dokumentation für OpcSubscription, OpcMonitoredItem, OpcMonitoredItemEventArgs, OpcMonitoredItemEventHandler und weitere API zum Thema Subscriptions.

Geändert

  • Standardwert von MinimumCertificateKeySize von 2048 auf 1024 geändert, um kleinere Schlüssellängen älterer Zertifikate zu unterstützen.
  • Wenn das Anwendungszertifikat einer Client- oder Serverinstanz über die Eigenschaft Certificate geändert wird, ändert sich der Store-Path-Type des Zertifikatspeichers für Anwendungszertifikate auf System. Um den Store-Path-Type Directory zu verwenden, ändern Sie ihn manuell. Stellen Sie außerdem nach der Änderung der Eigenschaft Certificate sicher, dass das Zertifikat im Zertifikatspeicher für Anwendungszertifikate enthalten ist.

Behoben

  • OpcServer.Security.AutoAcceptUntrustedCertificates wurde bei der Verwendung gesicherter Endpunkt-Policies nicht für die automatische Annahme eines nicht vertrauenswürdigen Zertifikats berücksichtigt.
  • Problem beim automatischen Ermitteln der Startzeit der Node-Historie, wenn diese anzahlbasiert gelesen wird.
  • Problem beim Vergleich bisher nicht vergleichbarer Instanzen von MonitoredItems und Sitzungen.
  • Problem beim Schreiben von Rohdaten, die in einem OpcValue verpackt transportiert wurden.
  • Problem bei der Interpretation von AutoAcceptUntrustedCertificates in Serveranwendungsinstanzen.
  • Fehler, der zum Verwerfen des Store-Paths des Zertifikatspeichers für Anwendungszertifikate führte, wenn manuell ein Anwendungszertifikat festgelegt wurde.
  • Verwendung des falschen Startwerts beim Lesen historischer Werte ohne explizite Angabe einer Startzeit.
2.5.4.0 (freigegeben am 27.08.2018)

Neu

  • Unterstützung der automatischen History-Erzeugung im OpcNodeHistorian durch von Clients geschriebene Werte (Eigenschaft AutoUpdateHistory).
  • OpcNodeHistorian unterscheidet Node-Änderungen und nimmt nur noch Änderungen des Attributs Value in die Historie auf.
  • Verbesserte Code-Dokumentation der serverseitigen API für Subscriptions und MonitoredItems.
  • Instanzen von Server.OpcSubscription und Server.OpcMonitoredItem sind ab sofort vergleichbar.

Behoben

  • OpcVariableNode.IsHistorizing wird nicht mehr nach dem Aufruf von OpcNodeManager.CreateNodes zurückgesetzt.
  • Problem beim Schreiben von Variablen-Nodes mit undefiniertem Attribut DataType (funktionierte nicht und führte zu einem Fehler).

Geändert

  • OpcNode.BeforeApplyChanges und OpcNode.AfterApplyChanges werden nur noch ausgelöst, wenn Änderungen bestehen (siehe OpcNode.HasPendingChanges).
2.5.3.0 (freigegeben am 21.08.2018)

Neu

  • Automatische Ausrichtung des Werts nach dem Lesen eines Node-Werts (serverseitig) anhand des vom Client geforderten Encodings beziehungsweise Wertebereichs.
  • Neue Klasse OpcClientTransport, Zugriff über OpcClient.Transport, zur Konfiguration von Timeouts und Grenzen.
  • Neue Klasse OpcServerTransport, Zugriff über OpcServer.Transport, zur Konfiguration von Timeouts und Grenzen.

Behoben

  • Problem bei der Validierung von X509-Identity-Tokens aufgrund falscher Zertifikatsdaten.
2.5.2.5 (freigegeben am 07.08.2018)

Neu

  • NuGet-Abhängigkeiten, die dem Projekt unnötig aufgezwungen wurden, wurden entfernt (in .NET Standard).
  • Der Inhalt der Datei *.deps.json wurde vereinfacht (in .NET Standard).
2.5.2.4 (freigegeben am 31.07.2018)

Behoben

  • Problem beim Senden globaler Ereignisse über Instanzen von OpcServer und OpcNodeManager.

Neu

  • Unterstützung von Null-Instanzen von OpcName in der OpcNominalNodeIdFactory.
  • OpcContext stellt ab sofort immer eine gültige Instanz von OpcNodeIdFactory bereit (mindestens die Instanz, die über die Eigenschaft OpcNodeId.Factory festgelegt wurde).
2.5.2.3 (freigegeben am 25.07.2018)

Neu

  • NuGet aktualisiert.
2.5.2.2 (freigegeben am 23.07.2018)

Behoben

  • InvalidCastException, wenn die Assembly über Assembly.LoadFrom() geladen wurde.
2.5.2.1 (freigegeben am 13.07.2018)

Behoben

  • DllNotFoundException, wenn versucht wurde, auf bestimmte Typen zuzugreifen, bevor ein OpcClient oder OpcServer erstellt wurde.
2.5.2.0 (freigegeben am 06.07.2018)

Neu

  • Die Lizenzierung für .NET Standard wurde freigeschaltet. Sie gilt über die netstandard2.0-Assembly auch für .NET-Core-Anwendungen.
2.5.1.1 (freigegeben am 03.07.2018)

Neu

  • Die Lizenz für die Evaluation wurde erneuert, um eine neue Lizenzperiode bereitzustellen.
2.5.1.0 (freigegeben am 15.06.2018)

Neu

  • Unterstützung von MIME-Typen in OpcFileNode und in OpcFileInfo.
  • Verbesserte Leistung beim Zugriff auf Verweise auf OpcContext in OpcNodes (intern).
  • Verbesserte Leistung und geringerer Speicherbedarf beim Zugriff auf Kind-Nodes eines OpcNode (intern).
  • Standardmäßig vorbereitete Konfigurations-Nodes für historische Daten werden jetzt bei Bedarf erzeugt.
  • Interne Querverweise wurden aufgelöst und schwerfällige Callbacks durch ein Provider-Pattern ersetzt.
  • Die Schnittstelle IOpcNodeInfo wurde eingeführt, um das Erzeugen temporärer Instanzen von OpcNode überflüssig zu machen und um Leistung und Speicherbedarf zu verbessern.
  • Verwendung der Schnittstelle IOpcNodeInfo statt des eigentlichen Nodes, wenn der Verweis auf einen Node für die weiteren Operationen und Auswertungen nicht notwendig ist.
  • Einführung eines Caches für benutzerdefinierte Datentypen, damit diese nicht wiederholt reflektiert werden müssen. Das steigert die Leistung.
  • Ausnahmen bei der Ausführung von CreateNodes(...) werden nicht mehr abgefangen, sondern an den Aufruf von OpcServer.Start weitergereicht.

Geändert

  • IsNodeAccessible(..., IOpcNode node) wurde zu IsNodeAccessible(..., IOpcNodeInfo node) geändert.
2.5.0.3 (freigegeben am 24.05.2018)

Behoben

  • Problem mit fehlenden externen Verweisen, wenn mehrere Node-Manager denselben benutzerdefinierten Node als Wurzel für ihre Nodes verwenden.
2.5.0.2 (freigegeben am 23.05.2018)

Behoben

  • Problem mit fehlenden Nodes, wenn mehrere Node-Manager auf denselben System-Node verweisen.
2.5.0.1 (freigegeben am 16.05.2018)

Behoben

  • NullReferenceException in OpcMethodNode, wenn ein vordefinierter Node als Eltern-Node des Methoden-Nodes verwendet wurde.
  • Nodes vom Typ OpcDataVariableNode wurden im Adressraum des Servers nicht mehr angezeigt, wenn der Konstruktor (parent : IOpcNode, name : OpcName) verwendet wurde.

Geändert

  • Beispielprojekte wurden auf die C#-Sprachversion 6.0 zurückgestuft, um sicherzustellen, dass die Beispiele auch in älteren Versionen von Visual Studio kompilierbar sind.
2.5.0.0 (freigegeben am 10.05.2018)

Neu

  • Unterstützung zur Erstellung von Nodes mit benutzerdefinierten NodeIds.
  • Vereinheitlichung der Konstruktorüberladungen aller Node-Klassen.
  • Viele der bisher fehlenden Code-Dokumentationen der Node-Klassen wurden ergänzt.
  • Für jede Eigenschaft eines Nodes wurde die entsprechende Eigenschaft XyNode implementiert, die die Referenz auf den Eigenschafts-Node bereitstellt, der den Wert der bisher verfügbaren Eigenschaften Xy repräsentiert.
  • Unterstützung der späten Initialisierung von Nodes, mit der sich Werte der Eigenschaften Xy festlegen lassen, die beim Erzeugen der Eigenschafts-Nodes beim Start des Servers automatisch auf diese angewendet werden.
  • Komplette Überarbeitung der Klassen OpcNodeId und OpcNamespace. Beide Klassen wurden teilweise neu implementiert, um die maximale Kompatibilität zu den von der Foundation definierten Standards für NodeIds sicherzustellen, einschließlich der Features, die das SDK bietet.
  • OpcNodeId unterstützt Identifier als Byte-Arrays, GUIDs und vorzeichenlose Integer-Werte.
  • OpcNodeId drückt die Art des Identifiers in der String-Darstellung seines Identifier-Werts über OpcNodeId.ToString aus.
  • OpcNodeId unterstützt UTF-8-codierte Sonderzeichen in URL-formatierten NodeIds.
  • OpcNodeId unterstützt das Parsen von NodeIds im Format der Foundation.
  • OpcNodeId bietet weitere Eigenschaften, wie OriginalString und OriginalFormat.
  • Überarbeitete Implementierung von OpcName, die nicht mehr eine Kombination aus BrowseName, DisplayName und SymbolicName in einer Instanz beziehungsweise Klasse vereint.
  • IOpcNode, OpcNode und OpcNodeInfo stellen jetzt direkte Eigenschaften für den DisplayName (und SymbolicName) eines Nodes bereit.
  • OpcNodeInfo unterstützt das Browsen der Kinder und Eltern über eine Kombination von Werten der Enumeration OpcNodeCategory.
  • Die Methoden OpcClient.SubscribeEventRaise und OpcSubscribeEventRaise unterstützen jetzt eine Instanz von OpcEventFilter für die Ereignisfilterung.
  • Die vorhandene API zu UA Alarm und Events wurde überarbeitet und für eine flüssige und intuitive Schnittstelle einschließlich teilweise später Initialisierung (zur Leistungssteigerung) angepasst.
  • OpcEventRaiseEventArgs wurde überarbeitet und stellt über die Eigenschaft Event Snapshot-Informationen mit den Rohdaten des Ereignisses eines EventNode bereit.
  • Die Eigenschaft MonitoredItem wurde zu OpcDataChangeEventArgs und OpcEventRaiseEventArgs hinzugefügt.
  • Die Ereignisse DataChangedReceived und EventRaiseReceived wurden zur OpcSubscription hinzugefügt.
  • Enumeration OpcEventType und Klasse OpcEventTypes für den vereinfachten Zugriff auf die verschiedenen Ereignistypen.
  • Unterstützung für unterschiedliche Zustandsautomaten- und Zustands-/Übergangsvariablen-Nodes.
  • Das Ereignis DialogRequested wurde der Klasse OpcClient hinzugefügt, um die Verarbeitung von Instanzen von OpcDialogConditionNode zu vereinfachen.
  • Unterstützung von Foundation-spezifischen Ereignistypen: OpcConditionNode, OpcAcknowledgeableConditionNode, OpcDialogConditionNode, OpcAlarmConditionNode, OpcDiscreteAlarmNode, OpcLimitAlarmNode, OpcOffNormalAlarmNode, OpcSystemOffNormalAlarmNode, OpcTripAlarmNode, OpcExclusiveLimitAlarmNode, OpcNonExclusiveLimitAlarmNode, OpcExclusiveDeviationAlarmNode, OpcExclusiveLevelAlarmNode, OpcExclusiveRateOfChangeAlarmNode, OpcNonExclusiveDeviationAlarmNode, OpcNonExclusiveLevelAlarmNode und OpcNonExclusiveRateOfChangeAlarmNode.

Behoben

  • Die Methode GetOutpuArguments von OpcMethodNodeInfo wurde in GetOutputArguments umbenannt.
  • Problem mit DBNull-Werten, wenn bei Methoden-Nodes kein Argumentwert definiert wurde.

Geändert

  • Falsch geschriebene Member wurden korrigiert.
  • Vereinheitlichte API durch weitere selbstbeschreibende Bestandteile in Klassen- und Delegatnamen. Die Bezeichnungen wurden von Data auf DataSet, von DataItem auf DataSetItem und von EventRaise auf Event geändert.
  • OpcNodeId.ToString formatiert die Informationen jetzt im Format OpcNodeIdFormat.Foundation.
  • Die Reihenfolge der Subscription-Ereignisse wurde von MonitoredItem → Client → Subscription zu MonitoredItem → Subscription → Client geändert, um eine logischere Abarbeitungsreihenfolge beim Event-Bubbling sicherzustellen.
  • OpcMonitoredItem.ReceivedDataChange wurde in OpcMonitoredItem.DataChangeReceived umbenannt.
  • OpcMonitoredItem.ReceivedEventRaise wurde in OpcMonitoredItem.EventRaiseReceived umbenannt.

Kompatibilitätsbrüche durch Umbenennungen

  • OpcSubscribeEventRaise -> OpcSubscribeEvent
  • OpcDataChangeEventArgs -> OpcDataChangeReceivedEventArgs
  • OpcDataChangeEventHandler -> OpcDataChangeReceivedEventHandler
  • OpcEventRaiseEventArgs -> OpcEventReceivedEventArgs
  • OpcEventRaiseEventHandler -> OpcEventReceivedEventHandler
  • OpcNotificationEventArgs -> OpcNotificationReceivedEventArgs
  • OpcNotificationEventHandler -> OpcNotificationReceivedEventHandler
  • OpcDataChangeCallback -> OpcDataChangeReceivedCallback
  • OpcEventRaiseCallback -> OpcEventReceivedCallback
  • IOpcNotificationData -> IOpcNotificationDataSet
  • OpcNotificationData -> OpcNotificationDataSet
  • OpcNotificationDataCollection -> OpcNotificationDataSetCollection
  • OpcNotificationDataReadOnlyCollection -> OpcNotificationDataSetReadOnlyCollection
  • OpcNotificationDataItem -> OpcNotificationDataSetItem
  • OpcNotificationDataItemCollection -> OpcNotificationDataSetItemCollection
  • OpcNotificationDataItemReadOnlyCollection -> OpcNotificationDataSetItemReadOnlyCollection
  • OpcDataChange -> OpcDataChangeSet
  • OpcDataChangeItem -> OpcDataChangeSetItem
  • OpcEventRaise -> OpcEventDataSet
  • OpcEventRaiseItem -> OpcEventDataSetItem
  • OpcMonitoredItem
    • .EventRaiseReceived -> EventReceived
    • .LastEventRaise -> LastEvent
    • .OnEventRaiseReceived -> OnEventReceived
  • OpcSubscription
    • .EventRaiseReceived -> EventReceived
    • .ReceivedEventRaiseCallback -> ReceivedEventCallback
    • .OnEventRaiseReceived -> OnEventReceived
  • OpcClient
    • .EventRaiseReceived -> EventReceived
    • .OnEventRaiseReceived -> OnEventReceived
    • .SubscribeEventRaise -> SubscribeEvent

2.3 ​

2.3.2.0 (freigegeben am 13.03.2018)

Behoben

  • Problem mit fehlerhaftem DebuggerDisplayAttribute in OpcVariableNode und OpcNodeInfo.
  • Problem beim Lesen und Schreiben des Attributs DataType von OpcVariableNodes.

Geändert

  • OpcVariableNode wurde als abstrakte Basisklasse festgelegt.
  • Mehrfache Node-Referenzen der Foundation wurden entfernt, um den Speicherbedarf zu senken.

Neu

  • Erweiterung der Implementierung von OpcVariableNode speziell für Enumerations-Datentypen.
  • Neue Nodes OpcTypeNode und OpcDataTypeNode. Der OpcDataTypeNode unterstützt die Definition benutzerdefinierter Enumerations-Datentypen.
  • Erweiterte Unterstützung beim Browsen für Enumerations-Datentypen. Die neue Methode OpcTypeNodeInfo.GetEnumMembers() liefert alle Informationen über den Aufzählungstyp (siehe auch die neue Eigenschaft OpcTypeNodeInfo.IsEnum).
2.3.1.1 (freigegeben am 26.02.2018)

Behoben

  • Problem beim Laden einer OpcApplicationConfiguration aus einer Datei aufgrund des fehlenden Attributs DataContract an der Klasse OpcApplicationConfiguration, das bei älteren Versionen des SDK nicht benötigt wurde.

Neu

  • Weitere Konstruktorüberladungen in OpcEngineeringUnitInfo, um die Initialisierung für bestimmte Einheiten zu vereinfachen.
  • Überladungen von ToString in OpcEngineeringUnitInfo und OpcValueRange.
  • Eigenschaft CommonCode in OpcEngineeringUnitInfo und statische Methode GetCommonCode(int unitId).
  • Die DefaultNamespaceUri von OpcEngineeringUnitInfo wird verwendet, wenn der Konstruktor ohne expliziten Namespace-Parameter verwendet wird. Das gilt nicht für den Standardkonstruktor.
2.3.1.0 (freigegeben am 22.02.2018)

Achtung

  • Ab dieser Version muss dem Projekt ein Verweis auf das NuGet-Paket Portable.BouncyCastle (mindestens Version 1.8.1.3) oder auf die Assembly BouncyCastle.Crypto (mindestens Version 1.8.1.146) hinzugefügt werden.
  • Wenn eine Serveradresse mit dem Schema https verwendet wird, muss dem Projekt ein Verweis auf die NuGet-Pakete Microsoft.AspNetCore.Server.Kestrel (1.1.3) und Microsoft.AspNetCore.Server.Kestrel.Https (1.1.3) hinzugefügt werden.

Neu

  • Einführung des Datentyps Range als OpcValueRange.
  • Einführung des Datentyps EUInformation als OpcEngineeringUnitInfo.
  • Einführung des neuen Node-Typs AnalogItemType als OpcAnalogItemNode.
  • Unterstützung für DataValues, die die Datentypen Range und EUInformation verwenden.
  • Erweiterte Browse-Unterstützung beim Browsen von Nodes der Definition AnalogItemType über die neue Klasse OpcAnalogItemNodeInfo.
  • Auf das Zielframework .NET Framework 4.6 aktualisiert.
2.3.0.0 (freigegeben am 13.02.2018)

Neu

  • Auf den OPC UA Foundation Stack 1.03.351.0 aktualisiert.
  • Neue Sicherheitsoption für Client und Server zur Konfiguration zusätzlicher Regeln für die Zertifikatvalidierung (siehe OpcClient/OpcServer.Security.CertificateValidationRules).

Geändert

  • Das SDK unterstützt bei der Authentifizierung am OPC UA Server keine Windows-basierte Authentifizierung über die WinLogon-API mehr.
  • Anwendungszertifikate werden jetzt mit SHA256 erstellt (dem neuen Standardwert, den die Foundation vorschreibt). Das beeinflusst bestehende Anwendungen nicht. Die Änderung wirkt sich nur aus, wenn ein neues Zertifikat erstellt wird.

2.2 ​

2.2.2.0 (freigegeben am 11.12.2017)

Neu

  • Die Erstellung von Filtern wurde über Operatorüberladungen vereinfacht, um eine natürlichere API zu erhalten.
  • OpcText wurde eingeführt, um lokalisierbare und für Menschen lesbare String-Werte darzustellen.

Behoben

  • Der konfigurierte OperationTimeout wurde in OpcClient.Connect() nicht für die Discovery der Server-Endpunkte verwendet.

Geändert

  • Die Implementierung von OpcValue.ToString wurde vereinfacht, sodass nur noch die Zeichenkette null für Null-Referenzen oder Value.ToString() geliefert wird.
2.2.1.0 (freigegeben am 06.09.2017)

Neu

  • Unterstützung unvollständiger Zertifikatsketten, wenn die Gegenstelle ein von einem unbekannten Aussteller signiertes Zertifikat vorlegt. Das ist zum Beispiel beim Versuch einer Verbindung zu einer Siemens SIMOTION der Fall.
  • Erweiterte Unterstützung fehlgeschlagener Zertifikatsprüfungen über das Ereignis CertificateValidationFailed in den Klassen OpcClient und OpcServer.
2.2.0.0 (freigegeben am 01.09.2017)
  • Neu: Neue Methode GetReferenceType, um den zugehörigen OpcReferenceType für eine gegebene OpcNodeId des Typs Reference zu ermitteln.
  • Geändert: Die Spezialbehandlung des Attributs DataType in OpcNodeInfo.Attribute() wurde entfernt. Es wird also kein Wert vom Typ OpcDataType mehr bereitgestellt, sondern die datentypabhängige OpcNodeId.
  • Neu: Grundlegende Unterstützung von Objekt-Nodes, erweiterte Unterstützung von Variablen-Nodes sowie generische Unterstützung von Typ-Nodes (einschließlich ObjectTypes, VariableTypes und DataTypes) beim Browsen von Nodes.
  • Neu: Mit OpcVariableNodeInfo, OpcObjectNodeInfo und OpcTypeNodeInfo lässt sich der Adressraum jetzt mit Zusatzinformationen über die Nodes browsen. Das umfasst zum Beispiel auch die Typinformationen eines Variablen-Nodes mit allen typspezifischen Metadaten einschließlich Über- und Untertypen.
  • Neu: Das SDK wurde für die Verwendung unter .NET Standard und .NET Core 2.0 vorbereitet.
  • Neu: Neue Eigenschaft LicenseInfo in allen Licenser-Klassen, die Informationen über die verwendeten Lizenzbedingungen bereitstellt.

2.1 ​

2.1.0.0 (freigegeben am 01.08.2017)

Neu

  • Auf den OPC UA Foundation Stack 1.3.342.0 aktualisiert.

2.0 ​

2.0.1.1 (freigegeben am 07.06.2017)

Neu

  • Methoden RegisterAddress und UnregisterAddress sowie neue Methode Addresses, um die verschiedenen Basisadressen einer Instanz von OpcServerBase zu verwalten.

Behoben

  • Falsche Bezeichnung IsNodeAccessable im OpcNodeManager in IsNodeAccessible korrigiert.
  • Problem mit fehlerhaften Node-Namespaces bei Verwendung einer Namespace-URI, die nur nach Schema aufgebaut wird, wenn OpcNamespace.ToString() aufgerufen wird (FormatException).
  • Problem mit der falschen impliziten Interpretation von Statuscodes als Ergebnisinformationen.
2.0.1.0 (freigegeben am 24.05.2017)

Neu

  • Mehr Details in der Meldung einer OpcException und in der Beschreibung einer Instanz von OpcStatus beziehungsweise OpcResult, um Quelle, Grund und Ergebnis einer Operation besser darzustellen.
2.0.0.0 (freigegeben am 21.05.2017)
  • Neu: Assembly-Version auf 2.0.0.0 geändert.
  • Neu: Neue Klasse OpcCertificateSettings, um ein Anwendungsinstanz-Zertifikat zu konfigurieren, das der OpcCertificateManager erstellen kann.
  • Behoben: Problem mit falsch konfigurierten Anwendungszertifikaten bei Verwendung eines Speicherpfads, wenn das Zertifikat unter diesem Pfad nicht gefunden werden kann.
  • Behoben: Problem mit dem falsch gespeicherten Paar aus Benutzername und Passwort in der UserName-ACL (Access Control List), das zu einer fehlgeschlagenen Benutzerauthentifizierung führte.
  • Behoben: Problem beim Erstellen einer OpcNodeId aus dem Paar string und int32, bei dem der int32-Wert nicht als Namespace-Index der neuen NodeId verwendet wurde.
  • Behoben: Problem mit OpcServerBase.Certificate und OpcClient.Certificate, wenn das Zertifikat nicht im ApplicationStore des Zertifikatspeichers gespeichert ist.
  • Neu: Neue Klassen OpcClientCertificateStores (verfügbar über OpcClient.CertificateStores) und OpcServerCertificateStores (verfügbar über OpcServerBase.CertificateStores), um eine flüssige API für Client und Server zum Verwalten und Pflegen ihrer Zertifikatspeicher bereitzustellen.
  • Neu: Neue Klasse OpcClientServices (verfügbar über OpcClient.Services), um eine dienstbasierte API zum Aufbau der verschiedenen vom Client genutzten Dienste bereitzustellen.
  • Entfernt: OpcValue.SourceLabel und OpcValue.ServerLabel. Damit existiert auch die Klasse OpcValueLabel nicht mehr. Die von ihr bereitgestellten Eigenschaften stellt jetzt direkt die Klasse OpcValue bereit. Verwenden Sie die Eigenschaften OpcValue.ServerXy und OpcValue.SourceXy.
  • Neu: IOpcWriteNodesService unterstützt jetzt die automatische Ermittlung des Werts, den der Server für den SourceTimestamp eines OpcValue erwartet. Die automatische Ermittlung lässt sich deaktivieren, indem Sie über die Eigenschaft IOpcWriteNodesService.TimestampSource eine explizite OpcTimestampSource festlegen. Hinweis: Auf die Instanz von IOpcWriteNodesService greifen Sie über die Eigenschaft OpcClient.Services.WriteNodes zu.
  • Neu: Die veraltete Methode ResolveNodeId wird nicht mehr verwendet. Stattdessen gibt es die neue Methode Resolve an der OpcNodeId, die den voll qualifizierten Node bei Bedarf über das Namespace-Array des Servers bestimmt. Damit ist der Zugriff auf Nodes über die voll qualifizierte NodeId möglich, ohne den Index des zugehörigen Node-Namespaces zu kennen.
  • Neu: Zusätzliche Überladung der Methode UpdateCertificate, um manuell festzulegen, ob das Zertifikat erstellt werden soll, falls es fehlt oder ungültig ist. Bisher war das nur über die statische Eigenschaft AutoCreateCertificate möglich.
  • Neu: Neue Eigenschaften OpcClient.Certificate (um direkt ein benutzerdefiniertes Clientzertifikat festzulegen) und OpcClient.Security (um die Sicherheitsoptionen des Clients in einer Klasse einzurichten).
  • Geändert: Die Eigenschaft OpcSecurity.Policies wurde in OpcSecurity.EndpointPolicies umbenannt, um dem Modell von OpcClientSecurity.EndpointPolicy zu entsprechen.
  • Geändert: Der Standardwert von OpcCertificateManager.AutoCreateCertificate ist jetzt true.
  • Neu: Neue Eigenschaften in Opc.UaFx.Server.OpcSecurity: AutoAcceptUntrustedCertificates und AutoCreateCertificate.
  • Neu: Neue Eigenschaft OpcServer.Certificate, um demselben API-Modell zu entsprechen, das der OpcClient implementiert.
  • Geändert: Das Verhalten bei der Auswahl eines Endpunkts, mit dem eine Verbindung hergestellt werden soll, wurde geändert, sodass es nicht mehr verhandelbar ist, wenn eine explizite Endpunkt-Policy definiert ist.
  • Geändert: Der Standardwert von AutoAcceptUntrustedCertificates in der SecurityConfiguration ist jetzt true.
  • Neu: Unterstützung eines DefaultNodeManager. Das ist entweder der erste Manager in der Liste der definierten Manager oder der intern definierte Standard-Node-Manager, der den Namespace als <serveraddress>/nodes/ definiert. Außerdem lässt sich jetzt auch nur eine Callback-Methode definieren, um die Nodes für den Adressraum des Standard-Node-Managers bereitzustellen.
  • Verschoben: Eigenschaft OpcClient.PreferredPolicy nach OpcClient.Security.EndpointPolicy.
  • Verschoben: Eigenschaft OpcClient.UseDomainChecks nach OpcClient.Security.VerifyServersCertificateDomains, Standardwert auf false geändert.
  • Verschoben: Eigenschaft OpcClient.UserIdentity nach OpcClient.Security.UserIdentity, Typ vom Foundation-Typ IUserIdentity in OpcUserIdentity geändert.
  • Verschoben: Eigenschaft OpcClient.UseOnlySecureEndpoints nach OpcClient.Security.UseOnlySecureEndpoints, Standardwert auf false geändert.
  • Entfernt: Veraltete Eigenschaft OpcClient.UseAutoNodeIdResolution.
  • Neu: Überarbeitung der Ableitungen von OpcIdentity: OpcCertificateIdentity, OpcWindowsIdentity, OpcServerIdentity und OpcClientIdentity sind jetzt Ableitungen von OpcUserIdentity (bisher verwendeten sie nur OpcIdentity als Basisklasse). Außerdem wurde ihr Konstruktionsverhalten geändert, um die Erstellung von Identitäten auf Client- und Serverseite zu vereinfachen.
  • Behoben: OpcRequestType.Call war bisher als OpcRequestType.Cancel definiert. Dadurch funktionierte OpcRequestType.Call nicht, weil es wie OpcRequestType.Cancel verwendet wurde.
  • Entfernt: Eigenschaft OpcCertificateManager.AutoCreateCertificate, weil sie jetzt je Instanz über OpcClient.Security.AutoCreateCertificate oder OpcServer.Security.AutoCreateCertificate verwendet wird. Diese Eigenschaften sind standardmäßig ebenfalls auf true gesetzt.
  • Entfernt: Eigenschaft OpcServer.Security.Owner, um überflüssige Informationen zu reduzieren und die API zu vereinfachen.
  • Umbenannt: Server.OpcSecurity in Server.OpcServerSecurity.
  • Umbenannt: OpcServerSecurity.Anonymous in OpcServerSecurity.AnonymousAcl.
  • Umbenannt: OpcServerSecurity.Certificate in OpcServerSecurity.CertificateAcl.
  • Umbenannt: OpcServerSecurity.IssuedToken in OpcServerSecurity.IssuedTokenAcl.
  • Umbenannt: OpcServerSecurity.UserName in OpcServerSecurity.UserNameAcl.
  • Umbenannt: OpcClient.PreferredLocales in OpcClient.Locales.
  • Umbenannt: OpcClient.ReceivedNotification in OpcClient.NotificationReceived.
  • Umbenannt: OpcClient.OnReceivedNotification in OpcClient.OnNotificationReceived.
  • Umbenannt: OpcSubscription.ReceivedNotification in OpcSubscription.NotificationReceived.
  • Umbenannt: OpcSubscription.OnReceivedNotification in OpcSubscription.OnNotificationReceived.
  • Verschoben: OpcNodeCommand von Opc.UaFx.Client nach Opc.UaFx.Services.
  • Verschoben: OpcNodeAttributeCommand von Opc.UaFx.Client nach Opc.UaFx.Services.
  • Umbenannt: OpcNodeCommand in OpcNodeServiceCommand.
  • Umbenannt: OpcNodeAttributeCommand in OpcNodeAttributeServiceCommand.
  • Umbenannt: Member von OpcStatusCode mit den Präfixen Bad, Good und Uncertain, wie die OPC Foundation sie verwendet, um Statuscodes in diese drei Kategorien zu unterteilen.
  • Neu: Zusätzliche Überladungen von ReadNode, um die numerische NodeId zusammen mit einem Namespace-Index und dem zu lesenden Attribut anzugeben.
  • Neu: Neue Methoden ReadNodes, um mehrere Nodes mit einem bestimmten Attribut zu lesen.

1.0–1.6 (2015–2017) ​

1.6 ​

1.6.5.2 (freigegeben am 07.02.2017)

Geändert

  • Implizite Interpretationen einer numerischen NodeId, die als String codiert ist, wurden entfernt.
1.6.5.1 (freigegeben am 08.12.2016)

Neu

  • Erweiterte Behandlung von Timeouts für Read-History-Anfragen des OpcClients. Das ist notwendig, um dem Server mehr Zeit zum Sammeln der historischen Daten zu geben, falls das länger als gewöhnlich dauert und der Server aufeinanderfolgende Fortsetzungspunkte bereitstellt, bis die Datensammlung abgeschlossen ist.
1.6.5.0 (freigegeben am 07.12.2016)

Neu

  • Erweiterte Navigation in der Node-Historie bei einem festgelegten Zeitfenster (in dem StartTime und EndTime nicht gleich MinDate sind). Historische Node-Werte werden dabei für jede Seitenanfrage gesammelt, solange der Server einen Fortsetzungspunkt bereitstellt, bis entweder der Server keinen Fortsetzungspunkt mehr bereitstellt oder die Seite ihre Seitengröße erreicht hat.
1.6.4.0 (freigegeben am 12.10.2016)

Neu

  • Die Schnittstellendefinition von IOpcNode wurde an die aktuelle öffentliche API von OpcNode angepasst.
  • Neue Methode Children() : IEnumerable<IOpcNode> in IOpcNode, um physische Kinder im Node-Baum zu bestimmen.
1.6.3.0 (freigegeben am 06.10.2016)
  • Neu: Neue Methode OpcFileMethods.IsFileNode, um zu bestimmen, ob auf einen Node wie auf einen FileType zugegriffen werden kann.
  • Behoben: Out-of-Memory-Problem bei der Verwendung von OpcFile.ReadAllText und OpcFile.ReadAllLines.
  • Neu: Verbesserte Leistung von OpcFile.ReadAllText: Der Text wird nicht mehr aus den Zeilen einer Datei zusammengesetzt, sondern aus dem binären Datenstrom der Datei gelesen.
  • Neu: Allgemein höhere Geschwindigkeit beim Lesen und Schreiben von Dateikomponenten durch Verwendung der vom Client konfigurierten MaxByteStringLength.
  • Behoben: Problem beim Browsen von Nodes, die Remote-Nodes enthalten, das zur Ausnahme „Cannot cast an absolute ExpandedNodeId to a NodeId. Use ExpandedNodeId.ToNodeId instead.“ führte.
1.6.2.0 (freigegeben am 04.10.2016)
  • Neu: Neue Methode CreateTempCertificate, die auch verwendet wird, wenn AutoCreateCertificate auf true gesetzt und das Dienstprogramm zur Zertifikatgenerierung nicht installiert ist. Das Dienstprogramm muss daher zum Testen und Entwickeln nicht mehr zusammen mit OPC-Anwendungen bereitgestellt werden.
  • Behoben: Problem beim Öffnen von Dateien zum Schreiben: Die Zugriffsmaske wurde falsch geprüft.
  • Neu: Neuer Session Resource Manager, der alle sitzungsbezogenen Ressourcen freigibt, nachdem eine Sitzung abläuft oder geschlossen wird. Eine solche Ressource ist das interne Datei-Handle beim Zugriff auf Datei-Nodes über OPC. Wenn der Client die Verbindung zum Server aus irgendeinem Grund verwirft, gibt der Session Manager jetzt alle von der Sitzung belegten Ressourcen wieder frei.
1.6.1.0 (freigegeben am 14.09.2016)

Neu

  • Neue Methode OpcNodeManager.Browse, um benutzerdefiniertes Browsen in abgeleiteten Klassen zu unterstützen.
1.6.0.0 (freigegeben am 25.08.2016)
  • Neu: Attribute ohne Wert werden beim Schreiben eines Node-Werts von der automatischen Aktualisierung der Quelle des Werts ausgenommen. Workarounds mit einem expliziten OpcValue sind damit überflüssig.
  • Neu: Neue Ableitung OpcBrowseNodeContext speziell für das Browsen von Nodes. Der bisherige OpcNodeContext wurde auf eine eher generische Implementierung für weitere Ableitungen reduziert. Der neue OpcBrowseNodeContext enthält jetzt die NodeId des Nodes, von dem die Browse-Operation ursprünglich ausging.
  • Neu: Neue Methode OpcValue.As<T>, um den repräsentierten Wert als bestimmten Typ abzufragen, indem der Wert in den durch T angegebenen Typ umgewandelt wird.
  • Neu: Neue Klasse OpcResult, die Instanzen von ServiceResult repräsentiert.
  • Neu: Neue Unterklasse OpcMethodContext von OpcContext, um Systeminformationen zu bestimmen, die für Methodenaufrufe relevant sind, einschließlich des aufgerufenen Methoden-Nodes und seines Ziels. Das umfasst auch das Speichern des Ergebnisses des Aufrufs der Callback-Methode.
  • Neu: Unterstützung des Dateisystemzugriffs auf Objekte vom Typ OpcFileNode aus Clientsicht. Das umfasst eine einfache 1:1-API-Schicht in der Klasse OpcFileMethods und ein SafeOpcFileHandle, das sicherstellt, dass zugeteilte Datei-Handles freigegeben werden. Dazu kommen die Klasse OpcFile, die OPC-basierte Dienstmethoden analog zur Klasse System.IO.File implementiert, die Klasse OpcFileInfo, die ein OPC-basiertes Objekt analog zur Klasse System.IO.FileInfo implementiert, und die Klasse OpcFileStream, die einen OPC-basierten Datenstrom analog zu System.IO.FileStream implementiert. OpcFileStream leitet von der Klasse System.IO.Stream ab und lässt sich daher mit allen Klassen StreamReader und StreamWriter verwenden, die das .NET Framework bereitstellt.
  • Neu: Neue Klassen OpcPropertyNode und OpcPropertyNode<T>.
  • Geändert: Der Typ OpcVariableValue benötigt jetzt einen generischen Typparameter für den repräsentierten Werttyp. Die Klasse OpcVariableNode wurde entsprechend angepasst.
  • Neu: Neue Klasse OpcFileNode einschließlich ihrer Kind-Nodes wie der Methoden-Nodes Open, Close, GetPosition, SetPosition, Read und Write.

1.5 ​

1.5.11.7 (freigegeben am 28.07.2016)

Behoben

  • Problem mit Remote-NodeIds in OpcNodeId.
  • Problem beim Vergleichen von NodeIds verschiedener Typen in OpcNodeId.
1.5.11.6 (freigegeben am 17.06.2016)

Neu

  • Neue Methode Child in OpcNodeInfo, um die Nachfolger eines Nodes über seinen OpcName abzurufen. Das umfasst BrowseName, DisplayName und SymbolicName eines Nodes.
  • Neue Methode Parent in OpcNodeInfo, um die Vorfahren eines Nodes über seinen OpcName abzurufen. Das umfasst BrowseName, DisplayName und SymbolicName eines Nodes.
  • Neue Methode Children in OpcNodeInfo, um die Nachfolger eines Nodes einer bestimmten OpcNodeCategory abzurufen.
  • Neue Methode Parents in OpcNodeInfo, um die Vorfahren eines Nodes einer bestimmten OpcNodeCategory abzurufen.
1.5.11.5 (freigegeben am 13.06.2016)

Neu

  • Impliziter Cast-Operator für ExpandedNodeIds.
  • Zusätzliche Überladung der Methode Get in OpcNamespace, um Node-Namespaces über URI oder Index abzurufen.

Behoben

  • Problem mit ExpandedNodeIds in OpcValues, deren Behandlung wurde vereinfacht.
1.5.11.4 (freigegeben am 30.05.2016)

Neu

  • Weniger Lock-Bedingungen beim Lesen und Schreiben von Nodes.
1.5.11.3 (freigegeben am 02.05.2016)

Neu

  • Die Lizenz für die Evaluation wurde erneuert, um eine neue Lizenzperiode bereitzustellen.
1.5.11.2 (freigegeben am 18.04.2016)

Behoben

  • Problem mit MonitoredItems beim Lesen des Initialwerts eines Nodes (der Server lief bei ungefilterten MonitoredItems in eine NullReferenceException).
1.5.11.1 (freigegeben am 31.03.2016)

Neu

  • Ereignis Changed in OpcStatus implementiert.

Behoben

  • Problem mit nicht synchronisiertem OPC-Status zwischen SDK und Foundation Stack (in OpcValue und OpcVariableNode).
1.5.11.0 (freigegeben am 23.03.2016)
  • Neu: OpcNamespace, der die gesamten Namespace-Informationen einer NodeId repräsentiert (Namespace-Index und Namespace-URI).
  • Neu: IOpcNamespaceResolver, implementiert von OpcNodeManager, OpcClient und OpcServer. Diese Schnittstelle stellt eine spät gebundene Namespace-Auflösung bereit, nachdem der OpcServer gestartet oder der OpcClient verbunden wurde. Jede OpcNodeId, deren Namespace aufgelöst wurde, stellt die voll qualifizierte URL des Namespace zusammen mit der NodeId bereit.
  • Neu: Eigenschaft OpcNodeId.Namespace, die den zugehörigen OpcNamespace bereitstellt.
  • Geändert: OpcAttribute.Historizing wurde in OpcAttribute.IsHistorizing umbenannt.
  • Neu: OpcNode: Überwachung von Node-Änderungen über die Eigenschaften HasPendingChanges und PendingChanges einschließlich der Methode IsChangePending.
  • Neu: Unterstützung der History für OpcVariableNode und seine Unterklassen.
  • Neu: Weitere Konstruktorüberladungen von OpcStatusCollection, um eine neue Instanz über OpcStatusCodes deutlich einfacher zu erstellen.
  • Neu: HDA-Methoden im Client zum Lesen und Aktualisieren der Node-Historie.
  • Neu: HDA-Schnittstelle im Server, um die benötigte Logik für den Zugriff auf historische Daten bereitzustellen.
  • Neu: HDA-Dienste: IOpcReadNodesHistoryService und IOpcUpdateNodesHistoryService.
  • Neu: HDA-Befehle: OpcCreateNodeHistory, OpcDeleteNodeHistory, OpcDeleteNodeHistoryAtTime, OpcDeleteNodeHistoryModified, OpcReadNodeHistory, OpcReplaceNodeHistory und OpcUpdateNodeHistory. Alle davon sind Unterklassen von OpcNodeHistoryCommand.
1.5.10.0 (freigegeben am 03.02.2016)

Neu

  • OPC Watch zum Assembly-Archiv hinzugefügt.
1.5.9.1 (freigegeben am 25.01.2016)

Behoben

  • Problem mit einer fälschlich geschlossenen und freigegebenen Sitzung, obwohl sie bei einer Neuverbindung wiederverwendet werden kann.
1.5.9.0 (freigegeben am 21.01.2016)
  • Behoben: Mögliche Multithreading-Probleme im Keep-alive einer Sitzung im OpcClient.
  • Geändert: Das Ereignis BreakDetected wird jetzt nur ausgelöst, wenn der Timeout für die Neuverbindung gleich null ist.
  • Behoben: Wenn eine bereits verworfene Sitzung des OPC Clients geschlossen und freigegeben wurde, konnte das in manchen Fällen zu einer unerwünschten Neuverbindung zum Server führen, ausgelöst durch eine ObjectDisposedException der bereits verworfenen Client-Sitzung.
1.5.8.0 (freigegeben am 18.01.2016)

Neu

  • Lizenzierungslogik aktualisiert.
1.5.7.1 (freigegeben am 14.01.2016)

Behoben

  • Problem mit dem kleinstmöglichen PublishingInterval in der Klasse OpcSubscription.
1.5.7.0 (freigegeben am 09.01.2016)
  • Behoben: Problem mit einer NullReferenceException in OpcCertificateManager.CreateCertificate, wenn als applicationUri eine Null-Referenz (Nothing in Visual Basic) übergeben wird.
  • Behoben: Problem mit nicht eindeutig generierten OpcNodeIds für InputArguments und OutputArguments der Instanzen von OpcMethodNode. Dadurch wurden beim Browsen oder Lesen der Eigenschaften der Methodenargumente nur die Argumente des zuletzt bereitgestellten OpcMethodNode veröffentlicht.
  • Geändert: Die OpcNodeId für die Nodes InputArgument und OutputArgument von Instanzen von OpcMethodNode. Weitere Informationen enthält der vorherige Eintrag.
  • Geändert: Die Klasse OpcReadOnlyNodeCollection stellt jetzt Instanzen von IOpcNode statt der internen Instanzen von NodeState der Foundation bereit.
  • Neu: Eine OpcNodeId kann jetzt aus Instanzen von OpcName erstellt werden, deren SymbolicName eine Null-Referenz (Nothing in Visual Basic) ist. In diesem Fall wird statt des SymbolicName der BrowseName verwendet.
  • Neu: Die OpcReadNodesRequest liefert jetzt standardmäßig beide Zeitstempel (Quelle und Server) zurück.
  • Neu: Neue Methoden in OpcNodeManager: AddNode, RemoveNode und IsNodeAccessable.
  • Behoben: Problem mit zeitweisen Duplikaten von ACEs (Access Control Entries), wenn ein ACE angefordert wird, der bereits zu einer ACL hinzugefügt wurde.
1.5.6.8 (freigegeben am 17.12.2015)

Behoben

  • Problem mit fehlender Aktualisierung des TimeStamp beim Schreiben von Node-Werten.
  • Problem mit fehlenden TimeStamp-Daten beim Lesen von Node-Werten.
1.5.6.7 (freigegeben am 17.12.2015)

Neu

  • Neue Methode ChangePassword in OpcServerIdentity, um das Benutzerpasswort nach dem Anlegen einer Identität zu ändern.
  • Neue geschützte Eigenschaft SystemContext im OpcNodeManager, um einen alternativen Kontext bereitzustellen, in dem systeminterne Änderungen vorgenommen werden können.
  • Die Klasse OpcWriteNode setzt jetzt beim Schreiben eines Nodes automatisch den Quellzeitstempel.

Geändert

  • Das OpcValueLabel ist jetzt nicht mehr als Struktur, sondern als Klasse definiert.
1.5.6.6 (freigegeben am 16.12.2015)

Neu

  • Neue Methoden AddNode und RemoveNode im OpcNodeManager, um das dynamische Bereitstellen von Nodes nach dem Aufruf von CreateNodes zu unterstützen.
1.5.6.5 (freigegeben am 10.12.2015)

Neu

  • Zusätzliche Sitzungsinformationen in OpcOperationContext beim Aufruf von IsNodeAccessable im OpcNodeManager.
1.5.6.4 (freigegeben am 09.12.2015)

Neu

  • Neue Methode IsNodeAccessable im OpcNodeManager, um benutzerdefiniert festzulegen, ob innerhalb der View auf einen Node zugegriffen werden kann.
1.5.6.3 (freigegeben am 08.12.2015)

Behoben

  • Problem mit ACE-Duplikaten beim manuellen Hinzufügen zusätzlicher Einträge auf Anforderung.
1.5.6.2 (freigegeben am 12.10.2015)

Behoben

  • Problem beim Lesen und Schreiben von Instanzen und Arrays von OpcValue als Node-Werte auf Client- und Serverseite.
  • Problem bei der anonymen Benutzeranmeldung auf der Serverseite beim Erstellen eines Objekts vom Typ OpcSession.

Neu

  • Umleitung für den Fall, dass der an den Konstruktor (string, int) der Klasse OpcNodeId übergebene String-Wert einen numerischen Identifier angibt. Die OpcNodeId wird dann mit dem numerischen Identifier statt mit dem String-Wert initialisiert.
1.5.6.1 (freigegeben am 08.09.2015)

Behoben

  • Problem, wenn die ACLs Anonymous und UserName gleichzeitig aktiviert sind.

Neu

  • Zusätzliche Überladungen von CreateCertificate im OpcCertificateManager.
1.5.6.0 (freigegeben am 07.09.2015)
  • Geändert: Die Eigenschaft BuiltInType wurde in OpcAttributeInfo in DataType umbenannt.
  • Neu: Das Browsen des Attributs DataType liefert jetzt einen Wert der Enumeration OpcDataType.
  • Neu: OpcValue als Ersatz für die Klasse DataValue.
  • Neu: Neue statische Methode CreateCertificate im OpcCertificateManager, um Zertifikate ohne weitere Konfiguration zu erstellen.
  • Neu: Die Klasse OpcStatus stellt jetzt die neue Enumeration OpcStatusCode als Code bereit.
  • Neu: Unterstützung der folgenden OpcDataTypes: ExtensionObject, Value und Variant.
  • Geändert: DataValue wurde in OpcDataTypes in Value umbenannt.
  • Neu: Unterstützung für den direkten Beginn des Browsens bei einem Methoden-Node.
  • Geändert: OpcDiscoveryClient wurde in den Namespace Opc.UaFx.Client verschoben.
  • Behoben: Problem mit der NullReferenceException beim Browsen nicht zwischengespeicherter Nodes.
  • Neu: Unterstützung einer Null-Referenz als Anwendungs-URI beim Erstellen von Zertifikaten.
  • Neu: Neue Abstraktionsschicht für verschiedene Typen von OPC Servern (OpcServerBase).
  • Neu: Neue Spezialisierung eines OPC Servers: OPC Discovery Server.
  • Behoben: Problem im OPC Client beim Zugriff auf die interne Sitzungsinstanz, obwohl diese verworfen wurde.
1.5.5.3 (freigegeben am 25.08.2015)

Neu

  • Vereinfachte Verwendung von OpcVariableClass in Lese- und Schreib-Callbacks, indem Status und Zeitstempel (falls kein anderer angegeben wurde) der Node-Instanz ermittelt werden.
1.5.5.2 (freigegeben am 24.08.2015)

Behoben

  • Problem, wenn die ACLs Anonymous und UserName gleichzeitig aktiviert sind.

Neu

  • Das Member Default von OpcAccessControlMode wurde entfernt und seine Verwendung durch Blacklist ersetzt.
1.5.5.1 (freigegeben am 24.08.2015)

Behoben

  • Problem mit dem Null-DataType in VariableNodes.
1.5.5.0 (freigegeben am 24.08.2015)

Neu

  • Verschiedene Callback-Eigenschaften zum Lesen und Schreiben von Attributen von OpcNode.
  • Geschützte virtuelle Methoden zum Lesen und Schreiben von Attributen von OpcNode.
  • Spezifische Callback-Eigenschaften zum Lesen und Schreiben von Attributen von OpcVariableNode.
  • Geschützte virtuelle Methoden zum Lesen und Schreiben des Wertattributs von OpcVariableNode.
  • Die Klasse OpcSession stellt jetzt die Eigenschaften UsedIdentity und SuppliedIdentity bereit.
  • Neue Methode Update in OpcStatus.
  • Der OpcContext stellt jetzt eine Eigenschaft Identity bereit.
  • Neue Klasse OpcMonitoredItem im Server-Namespace.
  • OnMonitoredItemCreated/Deleted/Modified stellt jetzt eigene Klassen statt der Klassen der Foundation bereit.

Geändert

  • Die Klassen Identity und ImpersonationContext wurden vom Namespace Opc.UaFx.Server in den Namespace Opc.UaFx verschoben.
1.5.2.0 (freigegeben am 18.06.2015)

Neu

  • Kein automatisches Aktualisieren des Endpunkts vor dem Verbinden, wenn im OpcClient ein bevorzugter Endpunkt definiert ist.
  • Neue Endpunkt-Identitätssicherheit in OpcSecurity, um verschiedene Endpunkte für einen oder mehrere ACEs zu aktivieren oder zu deaktivieren. Außerdem wurden einige existierende Methoden umbenannt.
  • Neues Ereignis StateChanged in OpcClient.
1.5.1.1 (freigegeben am 16.06.2015)

Neu

  • Neue Methode InvokeService in OpcClient, die Dienstroutinen in einem try-catch-finally-Block aufruft. So ist sichergestellt, dass die Statuseigenschaft des Clients auch bei einer Ausnahme den Verbindungsstatus wiedergibt, zum Beispiel einen Timeout oder eine verlorene Verbindung.

Behoben

  • Problem mit Null-Referenzen als DisplayName und BrowseName in OpcReferenceDescription.
1.5.1.0 (freigegeben am 15.06.2015)

Neu

  • Neue Methode SaveCertificate im OpcCertificateManager.
  • Überarbeitung der kompletten Argumentbindung, um auch out- und ref-Parameter in OpcMethodNode zu unterstützen.
  • Unterstützung von ByRef-Typen in OpcMethodNode.
  • Neues lokales Server-Ereignis CertificateValidationFailed, um benutzerdefinierte Aktionen bei fehlgeschlagener Zertifikatvalidierung zu unterstützen.
  • Neue Klasse OpcMethodNodeInfo, abgeleitet von OpcNodeInfo, zum Browsen der Argumente von Methoden-Nodes.
  • Neue Klassen OpcCertificateValidationFailedEventArgs und OpcCertificateValidationFailedEventHandler.
  • Neue Eigenschaft DataType in OpcDataVariableNode.
  • Neue Eigenschaften InputArguments und OutputArguments in der Klasse OpcMethodNode. Außerdem erweiterte Unterstützung von Instanzen von OpcArgument mit dem OpcArgumentAttribute in benutzerdefinierten Delegaten.
  • Unterstützung von Null-Referenzen in allen impliziten Cast-Operatoren, die mit Referenztypen arbeiten.
1.5.0.0 (freigegeben am 10.06.2015)
  • Neu: Logik, um beim Start eine für den Server vollständige Konfiguration zu generieren.
  • Neu: Komplette Überarbeitung der Endpunktauswahl über den OpcDiscoveryClient und die benutzerdefiniert bevorzugte OpcSecurityPolicy.
  • Neu: Verbesserte automatische Vervollständigung der Konfiguration abhängig vom Anwendungstyp.
  • Neu: Einführung der Transportprofilinformationen.
  • Neu: Die Konfiguration der UserTokenPolicies wurde beim Start in den OpcServer verschoben, und die Nachvollziehbarkeit der Eigenschaft IsEnabled wurde verbessert.
  • Behoben: Problem mit leeren Pfaden für Zertifikatspeicher.
  • Neu: Komplette Überarbeitung des Mechanismus für Node-Referenzen, um beim Erstellen der Node-Referenzen mehr Informationen bereitzustellen und OPC-Interna aus der Benutzer-API zu entfernen.
  • Neu: Komplette Überarbeitung der bisherigen Node-Implementierungen. Ihre Basisklassenreferenz wurde in eine interne Referenz verschoben, um die Verwendung des SDK zu verbessern und durch nützlichere APIs besser CLSCompliant zu entsprechen.
  • Neu: Unterstützung der Konfiguration von Basisadressen für Discovery Server.
  • Neu: Verbesserte Standardwerte der Konfiguration, auch beim Laden einer Konfiguration über eine der Methoden Load. Außerdem Standardunterstützung von DiscoveryServerConfigurations.
  • Neu: Weitere Vereinfachung der API.
  • Neu: Einführung von OpcStatus als Ersatz für StatusCode.
  • Neu: OpcDiscoveryClient verwendet statt Factory-Methoden jetzt Konstruktoren, um eine einheitliche Schnittstelle zwischen allen Server- und Client-Klassen bereitzustellen.

1.4 ​

1.4.0.0 (freigegeben am 09.06.2015)

Neu

  • Zusammenlegung von Opc.ClientFx.Advanced und Opc.ServerFx.Advanced zu Opc.UaFx.Advanced.

1.0 ​

1.0.0.0 (freigegeben am 11.01.2015)

Neu

  • Erstellung von Opc.ClientFx.Advanced und Opc.ServerFx.Advanced.