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.ServerCapabilitiesTypeundOpcObjectTypes.ServerDiagnosticsType. Sie bezeichnen die Objekttypen ServerCapabilitiesType und ServerDiagnosticsType und liefern die Bezeichner der zugehörigen Nodes. Bisher waren die Eigenschaften der KlassenOpcObjectTypes.OpcServerCapabilitiesTypeundOpcObjectTypes.OpcServerDiagnosticsTypenicht 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 durchBouncyCastle.Cryptography(Version 2.7.0) ersetzt. Deren Assembly heißtBouncyCastle.Cryptography.dllstattBouncyCastle.Crypto.dll.CertificateFactoryRandomGeneratorbietet zusätzlichAddSeedMaterial(ReadOnlySpan<byte>)undNextBytes(Span<byte>), die derIRandomGeneratorvonBouncyCastle.Cryptographyab .NET 6 deklariert. Anwendungen, die die Assemblies selbst verteilen, müssenBouncyCastle.Cryptography.dllstattBouncyCastle.Crypto.dllverteilen. Anwendungen, diePortable.BouncyCastleselbst referenzieren und dessen Typen verwenden, müssen aufBouncyCastle.Cryptographyumstellen, weil beide Pakete dieselben Typen enthalten. - Die Abhängigkeit von
System.Managemententfällt. - Bruch: Die Operatoren
<,<=,>,>=und==vonOpcFilterOperandlösen eineArgumentNullExceptionaus, wenn der linke Operandnullist. Die Konstruktoren vonOpcContentFilterElementlösen eineArgumentNullExceptionfür Operanden aus, dienullsind. Bisher wurde eineNullReferenceExceptionausgelöst. Code, der dieNullReferenceExceptionabfängt, muss jetzt dieArgumentNullExceptionabfangen. - 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.SetEndpointPolicylöst eineArgumentNullExceptionaus, wenn die Endpunkt-Policynullist. Der Indexer vonOpcSecurityPolicyCollectionlöst eineArgumentNullExceptionaus, wenn ihmnullzugewiesen wird. Bisher lösteSetEndpointPolicyeineNullReferenceExceptionaus, und der Indexer speicherte einen Eintrag ohne Policy. Code, der dieNullReferenceExceptionabfängt, muss jetzt dieArgumentNullExceptionabfangen. Code, der über den Indexernullzuweist, schlägt jetzt fehl. - Bruch: Das Ereignis
CertificateRequestedvonOpcServerundOpcClienttritt auch ein, wenn das Anwendungszertifikat vorhanden, aber ungültig ist, mit dem GrundInvalid,UseNotAllowed,Revoked,TimeInvalid,IssuerUseNotAllowed,IssuerRevokedoderIssuerTimeInvalid(zum BeispielTimeInvalidbei einem abgelaufenen Zertifikat). Das Zertifikat wird nie automatisch ersetzt (AutoCreateCertificateder Ereignisdaten istfalse). 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:
OpcEventContextentfällt; das SDK hat diesen Typ nie erstellt oder zurückgegeben. Code, derOpcEventContextverwendet, lässt sich nicht mehr kompilieren. - Bruch:
ExtensionObjectExtensions.To<T>löst für ein Extension Object, dasnullist, eineArgumentNullExceptionstatt einerNullReferenceExceptionaus.ChildrenvonOpcAddObjectTypeNodeundOpcAddVariableTypeNodelösen eineArgumentNullExceptionstatt einerNullReferenceExceptionaus, wenn ein Command hinzugefügt oder zugewiesen wird, dernullist. Code, der dieNullReferenceExceptionabfängt, muss jetzt dieArgumentNullExceptionabfangen. - Ein eigener
IOpcNodeHistoryProvidersollte 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 weiterhinBadNoData. - Bruch:
OpcNodeHistory<T>verwendet als Standardkapazität -1 (unbegrenzt) statt 0. Mit 0 schlug jeder Aufruf vonAddfehl. Eine Kapazität von 0 oder kleiner als -1 wird jetzt mit einerArgumentOutOfRangeExceptionabgelehnt, auch von den Konstruktoren vonOpcNodeHistorian. Code, der die Kapazität 0 übergibt (zum Beispielnew OpcNodeHistory<T>(0, values)), schlägt jetzt mit einerArgumentOutOfRangeExceptionfehl. - Bruch:
OpcNodeHistorian.ModifiedHistoryist einOpcModifiedNodeHistorystatt einesOpcNodeHistory<OpcModifiedHistoryValue>. Code, der die Eigenschaft alsOpcNodeHistory<OpcModifiedHistoryValue>verwendet, muss angepasst werden:GetValues(DateTime)ersetzt den Indexer nach Zeitstempel,RemoveAt(DateTime),Replaceund das EreignisReplacedgibt 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 mitOpcClient.DeleteNodeHistoryModified) der geänderten Historie einesOpcNodeHistorianbeziehen 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)undOpcClient.BrowseNodeslösen für einen Command, dernullist, eineArgumentNullExceptionaus. Bisher wurde eineNullReferenceExceptionausgelöst. Code, der dieNullReferenceExceptionabfängt, muss jetzt dieArgumentNullExceptionabfangen. - Bruch:
OpcClient.CallFunclöst eineInvalidCastExceptionaus, wenn das erste Ausgabeargumentnullist und der Ergebnistyp ein Werttyp ist, der nichtnullsein kann. Bisher wurde eineNullReferenceExceptionausgelöst. Code, der dieNullReferenceExceptionabfängt, muss jetzt dieInvalidCastExceptionabfangen. - Bruch:
OpcClient.CallMethodslöst für einen Command, dernullist, eineArgumentNullExceptionaus. 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 Commandsnullwaren, schlug mit einerOpcExceptionmitBadNothingToDofehl. Code, der einen Command übergibt, dernullist, 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,DeleteNodeHistoryAtTimeundDeleteNodeHistoryModifiedlösen für einen Command, dernullist, eineArgumentNullExceptionmit demParamNamecommandaus. Bisher lautete derParamNamecommands.Item, undCallMethod(OpcCallMethod)schlug mit einerOpcExceptionmitBadNothingToDofehl. Code, der für einen Command, dernullist, dieOpcExceptionvonCallMethod(OpcCallMethod)abfängt, muss jetzt dieArgumentNullExceptionabfangen. - Bruch: Die Konstruktoren von
OpcServer, die eine Folge von Nodes übernehmen, lösen für einen Node, dernullist, eineArgumentNullExceptionaus. Bisher schlugOpcServer.Start()mit einerOpcExceptionfehl. Die Ausnahme tritt jetzt beim Erstellen des Servers auf und ist eineArgumentNullExceptionstatt einerOpcException. - Bruch:
OpcNode.ReadAttributeValueCoreundOpcNode.WriteAttributeValueCorelösen für einen Wert, dernullist, eineArgumentNullExceptionaus. Bisher wurde eineNullReferenceExceptionausgelöst. Eine abgeleitete Klasse, die dieNullReferenceExceptionabfängt, muss jetzt dieArgumentNullExceptionabfangen. - Bruch: Die aus Commands erstellten Dienstanfragen (zum Beispiel
OpcCallMethodsRequest,OpcReadNodesRequestoderOpcWriteNodesRequest) lösen für einen Command, dernullist, eineArgumentNullExceptionaus. Bisher wurde ein solcher Command übersprungen, sodass die Ergebnisse der folgenden Commands dem falschen Command zugeordnet wurden. Code, der einen Command übergibt, dernullist, schlägt jetzt fehl, statt verschobene Ergebnisse zu erhalten. - Bruch:
OpcClient.CreateSubscriptionlöst eineOpcExceptionmitBadServerNotConnectedaus, wenn der Client nicht verbunden oder bereits getrennt wurde. Bisher wurde eineNullReferenceExceptionausgelöst. Code, der dieNullReferenceExceptionabfängt, muss jetzt dieOpcExceptionabfangen. - Bruch:
OpcEventFilterFactory.Selectlöst für Operanden, dienullsind, eineArgumentNullExceptionaus. Bisher wurde eineNullReferenceExceptionausgelöst, während der Client verbunden war. Code, der dieNullReferenceExceptionabfängt, muss jetzt dieArgumentNullExceptionabfangen. - Bruch:
OpcEventFilterConstrainedFactory.Whereverknüpft die angegebene Bedingung mit der Bedingung der Factory durch ein logisches UND, wie ein einzelnesWheremit 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 vonWhereschränkt die Ereignisse jetzt nach allen Bedingungen ein, sodass ein MonitoredItem möglicherweise weniger Ereignisse erhält als bisher. - Bruch:
OpcClientApplication.Exittrennt den Client auch in den ZuständenConnecting,ReconnectingundReconnected(der Zustand, den der Client nach einer Wiederverbindung mit derselben Sitzung annimmt). Während sich der Client verbindet, wartetExit, bis der Verbindungsaufbau abgeschlossen ist. In einer nicht interaktiven Umgebung beendetExitauchRun, wenn der Client bereits getrennt ist, zum Beispiel weil die Wiederverbindung fehlgeschlagen ist. Bisher tatExitin diesen Zuständen nichts: Der Client blieb verbunden oder versuchte weiter, sich wieder zu verbinden, undRunkehrte in einer nicht interaktiven Umgebung nicht zurück (zum Beispiel wurde ein Dienst nicht beendet). Die EreignisseExitingundExitedtreten jetzt auch in den ZuständenConnecting,ReconnectingundReconnectedein. - Bruch: Die Konstruktoren von
OpcClientApplication,OpcServerApplicationundOpcServerServiceApplicationprüfen ihre Argumente, bevor die Anwendung für den aktuellen Thread registriert wird. Bisher blieb nach einem Konstruktor, der eineArgumentNullExceptionauslöste, die fehlgeschlagene Instanz registriert:OpcApplication.Currentlieferte sie, und der nächste Konstruktor im selben Thread löste eineInvalidOperationExceptionaus, bis die Garbage Collection die Instanz freigegeben hatte. Nach einem fehlgeschlagenen Erstellen liefertOpcApplication.Currentjetztnullstatt der fehlgeschlagenen Instanz. - Eine Anwendung, die ohne Aufruf von
Exitvon 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 eineArgumentExceptionaus. - Anwendungen lassen sich gleichzeitig in mehreren Threads erstellen und beenden. Bisher konnte das die Registrierung beschädigen, sodass
OpcApplication.Currentdie Anwendung eines anderen Threads lieferte oder eine Ausnahme ausgelöst wurde. - Bruch:
OpcServerApplication.Exitstoppt den Server auch im ZustandSuspended. Bisher tatExitin diesem Zustand nichts, sodass der Server angehalten blieb undRunin einer nicht interaktiven Umgebung nicht zurückkehrte. Die EreignisseExitingundExitedtreten jetzt auch in diesem Zustand ein. OpcNodeManager.SyncRoot,GetNode(string)undIsNodeReadyToPublishlösen eineInvalidOperationExceptionaus, 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 eineNullReferenceExceptionausgelöst.OpcClient.BrowseNodeundBrowseNodesverwendenOpcBrowseNode.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|vonOpcContentFilterElement, die ein Element mit einem über seinen Konstruktor erstelltenOpcContentFilterverknüpfen (zum Beispielnew OpcContentFilter(element1) & element2). Die Verknüpfung schlug mit einerNullReferenceExceptionfehl. 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 Beispiela.Between(1, 5), ob 1 zwischenaund 5 liegt, statt obazwischen 1 und 5 liegt. Die Operanden werden jetzt in der Reihenfolge übergeben, die OPC UA festlegt. Code, der das Problem ausgeglichen hat, indem erBetweenauf der unteren Grenze aufruft (zum Beispiellower.Between(a, upper)), prüft jetzt, ob die untere Grenze zwischenaund der oberen Grenze liegt, und muss aufa.Between(lower, upper)umgestellt werden. - Problem mit der Meldung der
NotSupportedException, die der Operator!=vonOpcFilterOperandauslö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 EigenschaftValueweiterhin 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 EigenschaftValueweiterhin den vorherigen Wert lieferte. Der Historienwert verwendet jetzt eine Kopie der Daten. Code, der einenOpcValuenach der Übergabe anCreateändert oder einen mitCreateerstellten Historienwert ändert, ändert die Daten des jeweils anderen Werts nicht mehr. - Problem mit dem Konstruktor von
OpcCertificateStoreInfo, der mit einerNullReferenceExceptionfehlschlug, wenn der SpeichertypOpcCertificateStoreType.Applicationund der Pfad eines Zertifikatspeichers des Betriebssystems (zum BeispielCurrentUser\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 einerArgumentOutOfRangeExceptionfehl. Die Methode kopiert jetzt alle Policies ab dem angegebenen Index in das Array, wieList<T>.CopyTo, und löst eineArgumentExceptionaus, 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 eineArgumentException. - Bruch: Problem mit dem Ereignis
CertificateRequestedvonOpcServerundOpcClient, bei dem ein überAlternativeCertificateder 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, dieAlternativeCertificateauf 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 einerNullReferenceExceptionfehlschlug. Jetzt wird eineInvalidOperationExceptionausgelöst, die den Datentyp, das Feld und die Struktur nennt. Code, der in diesem Fall dieNullReferenceExceptionabfängt, fängt dieInvalidOperationExceptionnicht 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 vonOpcEnumFieldwurden verändert. Wie in C# folgt ein Feld ohne Wert jetzt dem Wert des vorherigen Felds (A, B, C = 5, Dergibt 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.Valueeines ohne Wert angegebenenOpcEnumFieldbleibt 0, undGetFieldsliefert Kopien. - Problem mit
EnumStringsvonOpcMultiStateDiscreteNode: Das Lesen der Eigenschaft eines Nodes, dessen Variable EnumStrings keinen Wert hat, löste eineArgumentNullExceptionaus. Die Eigenschaft liefert in diesem Fall jetztnull. Das Problem bestand seit Version 2.53.0.0. - Problem mit
AvailableStatesundAvailableTransitionsvonOpcFiniteStateMachineNode: Das Lesen der Eigenschaft eines Zustandsautomaten ohne die optionale Variable AvailableStates oder AvailableTransitions oder ohne deren Wert löste eineArgumentNullExceptionaus. Die Eigenschaft liefert in diesem Fall jetztnull. 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 Beispieluint), endete mit einerStackOverflowException, wenn der Unterzustandsautomat eines Zustands erstellt wurde. Die Zustandsnummer wird jetzt inTumgewandelt und anCreateSubStatesMachineNode(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.GetMemberseines Subtyps): Das Lesen vonParenteines geerbten Variablen- oder Objekt-Members endete mit einerStackOverflowException, die die Anwendung beendete.Parentliefert 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 einerNullReferenceExceptionfehlschlug. 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 ListeoutputArgumentswurde 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 DeleteReferencesBadUnexpectedError). 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,BadReferenceTypeIdInvalidoderBadMethodInvalid). Das Problem bestand seit Version 2.7.0.0, bei Call seit Version 2.50.5.0. Eine solche Anfrage wird nicht mehr abgelehnt:RequestValidatingtritt mit einem guten Ergebnis ein, die Anfrage wird verarbeitet und nicht inRejectedRequestsCountder 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 NodeClassUnspecifiednicht als ungültige NodeClass ablehnte. Der Server meldet für einen solchen Node jetztBadNodeClassInvalid, 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 StatusGoodund ohne NodeId als hinzugefügt meldete. Der Server meldet für einen solchen Node jetztBadNotSupported. Das Problem bestand seit Version 2.7.0.0. - Problem mit
OpcNodeHistory<T>.Enumerate(DateTime?)undEnumerate(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?)undRemoveRange(DateTime?, DateTime?), die keinen Wert entfernten, wenn eine Grenzenull,DateTime.MinValueoderDateTime.MaxValuewar. Dadurch entfernteRemoveRange(DateTime?)nie einen Wert. Eine solche Grenze schränkt den Zeitraum jetzt nicht ein. EinOpcNodeHistorianmeldet 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 mitOpcClient.ReadNodeHistoryProcessed) von einemOpcServer: Ein Zeitpunkt zwischen zwei Werten ergabBadNoDatastatt eines interpolierten Werts.OpcNodeHistorian.ReadHistoryliefert 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 mitReturnBoundsliefert jetzt die Grenzwerte stattBadBoundNotFound. - Problem mit den Historiendiensten von
OpcNodeHistorianfür einen Node mit dem ValueRankAny,ScalarOrOneDimensionoderOneOrMoreDimensions, die jeden Wert mitBadTypeMismatchablehnten. Ein Wert wird jetzt angenommen, wenn sein ValueRank für den ValueRank des Nodes gültig ist. - Problem mit
OpcNodeHistorian, derPercentDataBadundPercentDataGoodder 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 vonOpcReadNodeHistoryRawDetails), dessen Setter unabhängig vom übergebenen Werttruesetzte. Dadurch ließen sich die Grenzwerte nicht mehr abschalten, nachdem sie einmal angefordert waren. - Problem mit dem Konstruktor von
OpcNodeHistorian, derHistoryReadOrWritezuAccessLevelundUserAccessLeveldes Nodes hinzufügte undIsHistorizingsetzte, bevor er eine ungültige Kapazität mit einerArgumentOutOfRangeExceptionablehnte. Die Argumente werden jetzt geprüft, bevor der Node geändert wird, und die Ausnahme nennt bei einem ungültigenmodifiedCapacityden ParametermodifiedCapacitystattcapacity. - Problem beim Löschen der Rohwerte oder der geänderten Werte der Historie eines Nodes in einem Zeitraum (zum Beispiel mit
OpcClient.DeleteNodeHistoryoderOpcClient.DeleteNodeHistoryModifiedmit Start- oder Endzeit) in einemOpcServer, 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.CreateNodeHistoryoderOpcClient.ReplaceNodeHistory) in einemOpcServer, der jedes Einfügen und Ersetzen als Aktualisierung verarbeitete. Das Einfügen eines Werts am Zeitstempel eines vorhandenen Werts ersetzte diesen, stattBadEntryExistszu ergeben, und das Ersetzen eines Werts an einem Zeitstempel ohne Wert fügte ihn ein, stattBadNoEntryExistszu ergeben. Das Problem bestand seit Version 2.7.0.0. - Problem mit
OpcUpdateNodeHistoryDataDetailsundOpcUpdateNodeHistoryStructureDataDetailseiner Anfrage, die einOpcServerempfängt (zum Beispiel im EreignisRequestValidating), derenValuesnullwaren. - Problem mit den Historiendiensten von
OpcNodeHistorian(CreateHistory,UpdateHistory,ReplaceHistoryundDeleteHistory), die ab dem zweiten Wert eines Aufrufs mit einerArgumentExceptionfehlschlugen, weil die geänderte Historie nur einen Wert je Änderungszeitpunkt speicherte. Ein Client erhielt für den NodeBadUnexpectedError, 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 einerFormatExceptionablehnte. NullReferenceExceptioninOpcClientIdentity.Matchesfür eine Identität, die mit dem Passwortnullerstellt wurde. Eine solche Identität passt jetzt zu keinem Passwort.- Problem mit
OpcAccessControlEntry.EndpointAccessMode, das denOperationAccessModedes 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 eineArgumentOutOfRangeExceptionauslöste, wenn die Diagnose bei laufendem Server abgeschaltet wurde, während der Server noch die Diagnosedaten mindestens einer Subscription hielt. - Problem mit
OpcDataTypeSystem.DefaultundOpcNodeTypeSystem.Default(zum BeispielGetTypes), die mit einerFileNotFoundExceptionfehlschlugen, weil die vordefinierten Nodes von OPC UA (RessourceOpc.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. (nurOpc.UaFx.Client) - Problem mit
EnumValuesvonOpcMultiStateValueDiscreteNodeundValuevonOpcEnumValuesPropertyNode, die eineArgumentNullExceptionauslösten, wenn die Variable EnumValues keinen Wert hatte. Ein Server mit einem solchen Node startete deshalb nicht. Beide liefern in diesem Fall jetztnull. - Problem mit
OpcFiniteStateMachineNode, das mit einerNullReferenceExceptionfehlschlug, wenn sein Typ für einen Zustand einen Unterzustandsautomaten deklarierte, die Klasse dafür aber keinen Node erstellte (sieheCreateSubStatesMachineNode). 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 einemOpcServerstammt die Organisation ausOpcServerInfo.CompanyName. Ohne bekannte Organisation bleibt das Subject wie bisher. - Neue Member
OpcRequestProcessedEventArgs.RequestTypeundIsUnsupportedServicesowie die neuen MemberRegisterServer,RegisterServer2undFindServersOnNetworkvonOpcRequestType. Damit erkennt ein Server, welchen Dienst eine Anfrage aufgerufen hat, auch bei Diensten, die er nicht unterstützt. - Neues Ereignis
SessionActivationFaileddesOpcServer. 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 (Standardwertfalse). - Neu:
OpcServer.DiscoverymitOpcServerDiscovery.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.DiscoverEndpointsundDiscoverServers, die nach Transportprofil und Server-URI filtern. OpcBrowseNode.IncludeSubtypesist jetzt öffentlich (Standardwertfalse), undOpcViewDescriptionbietet öffentliche Konstruktoren, um eine View zu browsen.IncludeSubtypeswirkt in dieser Version nur überclient.Services.Browse;BrowseNodeundBrowseNodeswerten die Eigenschaft noch nicht aus.- Neue Methode
OpcClient.ChangeUserIdentity, um die Benutzeridentität einer verbundenen Sitzung zu wechseln. - Neu:
OpcClient.ReconnectIntervallegt die Zeit zwischen zwei Versuchen fest, die Verbindung wiederherzustellen (bisherReconnectTimeout, das als verborgener Alias erhalten bleibt).OpcClient.MaxReconnectDurationbeendet 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.Encodekodiert eine Struktur alsOpcRawObject. Code, der für den Wert einer unbekannten Struktur ein Byte-Array oder einXmlElementerwartet hat, erhält jetzt einOpcRawObject. DessenRawDataenthält, was bisher zurückgegeben wurde. - Bruch: Neue Attribute
RolePermissions,UserRolePermissions,AccessRestrictionsundAccessLevelExinOpcAttributeundOpcAttributes, das neue MemberDataTypeDefinitionvonOpcAttributessowie die neuen TypenOpcRolePermissionundOpcPermissions. Das Lesen des Attributs DataTypeDefinition liefert jetzt einOpcDataTypeInfostatt einerStructureDefinitionoderEnumDefinitiondes Stacks. Das Lesen von RolePermissions oder UserRolePermissions liefert ein Array vonOpcRolePermissionstattRolePermissionType. - Neue Einstellung
OpcServerSecurity.IsAuditingEnabled(Standardwertfalse) sowie die Audit-Ereignisse der Secure-Channel-Dienste (AuditOpenSecureChannelEventType, AuditChannelEventType). - Das Trace-Ereignis des Stacks (
Opc.Ua.Tracing.Instance.TraceEventHandler) liefert die protokollierte Ausnahme inTraceEventArgs.Exception.
Geändert
- Bruch: Die
CertificateFactorydes 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, derCertificateFactoryverwendet, lässt sich nicht mehr kompilieren. - Bruch:
OpcSecurityAlgorithm.Autosowie die Standardendpunkte des Discovery-Servers und des OPC-Classic-Wrapper-Servers verwendenBasic256Sha256statt der veralteten PoliciesBasic256(Sign) undBasic128Rsa15(SignAndEncrypt). Ein Client mitAutoverbindet sich nicht mehr mit einem Server, der nur die veralteten Policies anbietet. - Das Zertifikat, das das SDK für einen
OpcServererstellt, 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
OpcServermeldet Audit-Ereignisse nur noch, solangeOpcServerSecurity.IsAuditingEnabledden Werttruehat. Er meldet sie nur an Clients, die überSignAndEncryptoder HTTPS mit einem Benutzer in der Rolle SecurityAdmin verbunden sind, wie OPC UA es festlegt. Audit-Ereignisse zu Sitzungen meldet ein Server erst, nachdemIsAuditingEnabledauftruegesetzt wurde. - Bruch:
State,StateChangedundBreakDetecteddesOpcClientfolgen einem Verbindungsverlust, den ein fehlschlagender Dienstaufruf erkennt (zum BeispielBadConnectionClosedoderBadSessionIdInvalid), 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,EnumerationoderImage). Jeder Datentyp nennt seinen Supertyp alsBaseType. Felder von Datentypen, die von einem eingebauten Typ abgeleitet sind (zum BeispielDuration,UtcTimeoderLocaleId), werden jetzt dekodiert. Eingebaute Typen und die Strukturen von OPC UA nennen ihren Supertyp jetzt alsBaseType, bisher nannten sie keinen. Ein Feld eines vonByteStringabgeleiteten Typs liefert einByteStringstatt eines Byte-Arrays. - Der
OpcServermeldet 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.ReconnectTimeoutundDefaultReconnectTimeoutsind als veraltet (obsolete) gekennzeichnet. Verwenden Sie stattdessenReconnectIntervalundDefaultReconnectInterval. Code, der sie verwendet, erhält eine Compiler-Warnung und mitTreatWarningsAsErrorseinen Compiler-Fehler. - Bruch: Die Historiendienste für einzelne Nodes
OpcClient.ReadNodeHistoryProcessed,ReadNodeHistoryAtTimeundReadNodeHistoryModifiedlösen für einen Node, den der Server abgelehnt hat, eineOpcExceptionmit dem Statuscode des Servers aus (zum BeispielBadAggregateNotSupported). Für einen Node, den der Server ohne Werte akzeptiert hat, liefern sie ein leeres Ergebnis. Bisher wurde in beiden Fällen eineKeyNotFoundExceptionausgelöst. Code, der dieKeyNotFoundExceptionabfängt, muss jetzt dieOpcExceptionabfangen. - Bruch:
OpcDiscoveryClient(DiscoverEndpoints,DiscoverServersund seine Konstruktoren) löst eineOpcExceptionmit dem Grund aus (zum BeispielBadSecureChannelClosed), 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 vonOpcClient.ReadNodeHistoryundReadEventHistorylösen eineOpcExceptionmitBadCommunicationErroraus, wenn eine Seite nicht innerhalb der maximalen Anzahl von Anfragen abgeschlossen wurde. Bisher wurde dieServiceResultExceptiondes Stacks ausgelöst. Code, der dieServiceResultExceptionabfängt, muss jetzt dieOpcExceptionabfangen. - Bruch:
OpcViewDescription.Defaultist jetzt ein statisches, schreibgeschütztes Feld (static readonly), damit sich die Standard-View nicht ersetzen lässt. Code, derOpcViewDescription.Defaulteinen Wert zuweist, lässt sich nicht mehr kompilieren. Code, der gegen eine ältere Version kompiliert wurde undOpcViewDescription.Defaultliest, 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 mitOpcNodeSetManager.ImplementNodeCallback) und ein Argument mit dem ValueRankAny,ScalarOrOneDimensionoderOneOrMoreDimensionsdeklarieren. Jeder Aufruf einer solchen Methode schlug mit einerIndexOutOfRangeExceptionfehl. 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 alsByteString[]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.AddNotifierNodehinzugefü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 ValueRankOneDimension), 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 dieServerConfigurationder Anwendung veränderte. Dadurch bot ein Neustart anonymen Zugriff an, obwohl nur dieOpcUserNameAclaktiviert war. Der Server arbeitet jetzt mit einer Kopie der Konfiguration. Code, derConfiguration.ServerConfigurationnach dem Start liest, sieht die Werte, die er selbst gesetzt hat, statt der verwendeten Policies. - Problem mit
OpcClient.Connect, das mit einerIndexOutOfRangeExceptionfehlschlug, 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 MonitoredItemsMonitoredItemsDeletedstattMonitoredItemsModifiedauslö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 BeispielRSA_DH_AesGcm) vor einer unterstützten anbietet. - Problem mit dem
OpcServer, der mit einerStackOverflowExceptionbeendet 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 mitBadTimestampsToReturnInvalidablehnen. 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 alsOpcReadNodeHistoryRawDetailsstatt alsOpcReadNodeHistoryModifiedDetailsankam. 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 ZustandReconnectingblieb, 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.
NameundXmlNameeines 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 lieferteOpcClient.GetDataTypefü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
InvalidCastExceptionfehlschlug. 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 mitSignoderSignAndEncryptfehlschlugen. 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. KeyNotFoundExceptionin den Diensten zum Aktualisieren der Historie einzelner NodesOpcClient.CreateNodeHistory,ReplaceNodeHistory,UpdateNodeHistory,DeleteNodeHistory,DeleteNodeHistoryAtTimeundDeleteNodeHistoryModifiedbei einer NodeId, die nur einen Namespace-Index angibt (zum Beispielns=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
OpcExceptionnennt 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
NotificationFailedinOpcSubscriptionundOpcClientsowie der zugehörige HandlerOpcSubscriptionSetup.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 dieOpcSubscriptionaus, zu der die Benachrichtigung gehört, und, wenn es dort nicht behandelt wird, derOpcClient. Eine Benachrichtigung, deren Subscription (noch) nicht bekannt ist, meldet nur derOpcClient. - 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 überschrittenenMaxStringLengthoder dem StatuscodeBadEncodingLimitsExceededfehl. - 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,UInt16oderString). Das Dekodieren einer solchen Struktur schlug mit einerArgumentNullExceptionfehl, der gesamte Lesevorgang mit dem StatuscodeBadUnknownResponse. 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 alsOpcConditionstatt alsOpcDialogConditionoder eine Alarm-Condition alsOpcAcknowledgeableConditionstatt alsOpcAlarmCondition. - Problem, durch das
OpcClient.Connect()fehlschlug, wennUseDynamicaktiviert ist und der Server dieselbe HasSubtype- oder HasEncoding-Referenz eines Datentyps mehrfach sendet. NullReferenceExceptionimOpcClientbei Servern, die einen Endpunkt ohne URL liefern.
2.57.0.0 (freigegeben am 14.09.2026)
Behoben
- Problem mit strukturierten Datentypen, die
OpcEncodingMaskKind.Autoverwenden und deren erstes optionales Member nicht gesetzt ist. Werte, die nach einem solchen Member dekodiert wurden, konnten falsch sein, oder die Dekodierung schlug mit einerEndOfStreamExceptionoder einerServiceResultExceptionfehl, die eine überschritteneMaxStringLengthmeldete. - Problem mit Membern eines strukturierten Datentyps, die als einer der Wrapper-Typen
OpcText,OpcName,OpcNodeId,OpcValueoderOpcEngineeringUnitInfodeklariert 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?oderDateTime?). Der Wert eines solchen Members bleibt jetzt erhalten. NullReferenceExceptionbeim Dekodieren eines strukturierten Datentyps mit einem Array-Member, das nicht optional ist und eine Null-Referenz enthält.InvalidCastExceptionbeim Dekodieren eines Arrays vonGuid-Werten.- Problem mit leeren Arrays der Wrapper-Typen
OpcText,OpcName,OpcValueundOpcEngineeringUnitInfo. 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
RetainStatenicht automatisch durch einen anderen Unterzustand als denEnableStateaktualisiert wird, wenn dieRetainPolicyden WertManualhat. - Fehlerhaft behandelte
nodeChangesinOpcNode.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 überOpcNamespace.GetId, wobei der Instanz vonOpcNamespacekein Namespace-Index zugewiesen ist). Dadurch wurden immer Instanzen vonOpcEventempfangen statt des spezifischen Subtyps vonOpcEventoder 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.IsRetainedPolicyinOpcConditionNode. Sie überschreibt die Standardlogik, die den Wert der EigenschaftOpcConditionNode.IsRetainedabhängig von den Zuständen der Condition-Nodes steuert (zum BeispielEnableState,ActiveState,AckedStateundConfirmState). Der Standardwert dieser Eigenschaft hängt vom verwendeten Subtyp vonOpcConditionNodeab. Mit dem WertOpcConditionRetainPolicy.Manualfür die EigenschaftIsRetainedPolicyerhalten Sie die volle Kontrolle über die EigenschaftIsRetained.
Geändert
- Der Initialwert der Eigenschaft
OpcConditionNode.IsRetainedund ihrer Subtypen (OpcAcknowledgeableConditionNodeundOpcAlarmConditionNode) 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 EnumerationOpcConditionRetainPolicy. Der jeweilige Condition-Typ verwendet standardmäßig die passende Policy, um konforme Initialwerte zu liefern. Um das zu überschreiben, setzen Sie die EigenschaftOpcConditionNode.IsRetainedPolicyauf den WertOpcConditionRetainPolicy.Manual. Damit erhalten Sie die volle Kontrolle über die EigenschaftIsRetained.
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
StackOverflowExceptionin der neuen KlasseOpcFiniteStateMachineNode<T>bei Verwendung vonChangeStateTo.
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
InheritReferenceTypeIdfürOpcInstanceNodes, die steuert, ob dieDefaultReferenceTypeIdan 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
OpcServerbei strukturierten Datentypen mit optionalen Feldern undOpcEncodingMaskKind.Explicit. - Problem mit falscher Kodierung optionaler Felder im
OpcClient, wennUseDynamicaktiviert ist und der Server keinTypeDictionarybereitstellt. - Problem, bei dem die Methode
OpcNodeSet.GetNodenur Nodes ausgehend vom Root-Node fand. Die Methode findet jetzt jeden Node im geladenen NodeSet. - Problem beim Abrufen von Nodes mit der Methode
OpcNodeSet.GetNodenach dem Laden eines NodeSets ohne benutzerdefinierten Kontext mit passenden Namespace-URIs.
2.54.0.0 (freigegeben am 25.06.2026)
Neu
- Neue Eigenschaft
SupportedTokenTypesinOpcEndpointDescription. Sie liefert eine aufzählbare Folge der unterstütztenOpcAccessControlTokenType-Werte, über die sich die unterstützten Zugriffssteuerungslisten des vom Server bereitgestellten Endpunkts ermitteln lassen. Die Werte lassen sich mitOpcDiscoveryClient.DiscoverEndpoints(...)abfragen. - Neue Eigenschaften
AvailableStatesundAvailableTransitionsinOpcFiniteStateMachineNode. - Neue Eigenschaft
SupportCurrentStatefü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 MethodeChangeStateTo. Der CurrentState-Node liefert dannBadals Statuscode undBADals Wert, sein Kind-Node „Id“ liefert eine Null-Referenz als Wert. - Unterstützung für die Bereitstellung der Ereignis-Historie im
OpcServerüber die SchnittstelleIOpcEventHistoryProviderund für das Lesen der Ereignis-Historie imOpcClientüber die MethodeReadEventHistory. - 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.UseExclusiveAddresssteuert 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.
ArgumentNullExceptionimOpcServer, 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 denQueryEventsCallbacknicht implementiert.- Problem mit fehlenden strukturierten Datentypen in
OpcNodeSetnach dem Import einer DateiNodeSet2.xml, die mehrere Datentypen nur überDataTypeDefinitionsund teilweise über zusätzlicheDataTypeDescriptionsdefiniert. DieseDataTypeDescriptionswerden nicht vonDataTypeEncodingsreferenziert, die ihrerseits keine inversen Referenzen auf ihren kodierten Datentyp-Node verwenden. In solchen Fällen ignoriert die API jedeDataTypeDescriptionund liefert die Informationen zum Datentyp aus der DataTypeDefinition des Datentyp-Nodes. NullReferenceExceptionbeim Aufruf vonOpcServer.GetDataTypes(), wenn ein NodeSet geladen wurde, das eine leere Strukturdefinition enthält.NullReferenceExceptionbeim 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 TypparameterTein Wrapper-Typ wieOpcTextwar und ein Konstruktor mit Eltern-Node verwendet wurde.- Die Methoden
OpcText.Equals()und.CompareTo()konnten eineNullReferenceExceptionauslösen und ein falsches Vergleichsergebnis liefern. - Der
OpcServerkonnte 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
OpcServeroder einesOpcClientmit aktivierter dynamischer Typregistrierung. - Problem, bei dem benutzerdefinierten Nodes, die nach dem Start des
OpcServermitOpcNodeManager.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.UseDynamiczusammen mit den TypenOpcStruct,OpcStructField,OpcEnumundOpcEnumField, mit denen sich Datentypen für denOpcServerdynamisch definieren lassen. - Neuer Typ
OpcEnumValue, der Enumerationswerte mit dem OPC-UA-DatentypEnumValueTypedarstellt. - Zwei neue statische Methoden (Shared in Visual Basic) in
OpcEnum, die die Enumerationswerte einer typisierten Enumeration liefern. Wie die Informationen ermittelt werden, steuern die AttributeOpcEnumAttribute,OpcEnumMemberAttributeundEnumMemberAttribute. - Neuer
OpcEnumValuesPropertyNode, um benutzerdefinierteOpcEnumValuesim Adressraum des Servers zu veröffentlichen. - Neue Nodes
OpcMultiStateDiscreteNodeundOpcMultiStateValueDiscreteNodemit 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 denenOpcPrincipalsMitglied sein können. - Neue Klasse
OpcServerSecurityRoles, die alle Standardrollen bereitstellt, die derOpcServerüblicherweise kennt. - Neue Eigenschaften
RolesundAccessControlRolesinOpcServerSecurity: Die erste liefert alle Standardrollen von OPC UA, die zweite die Rollen, die derOpcServeraktuell verwendet. In dieser Implementierung sind alle Instanzen der Standardrollen in der EigenschaftAccessControlRolesenthalten. - Neue Methoden
AssignundRevokeinOpcAccessControlEntry, die die Rollenmitgliedschaften des Principals im Eintrag steuern. - Neue Methode
IsInRoleinOpcPrincipal, 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
CertificateChangedinOpcServer, das ausgelöst wird, wenn eine Sitzung mit einer Identität, die Mitglied der RolleSecurityAdminist, das Zertifikat des Servers ändert. - Unterstützung für GDS Push Management mit
ServerConfigurationType,UpdateCertificate,TrustListund rollenbasierter Authentifizierung über die RolleSecurityAdmin. Um GDS Push Management zu aktivieren, muss die benutzerdefinierte Implementierung desOpcServermindestens einen ACL-Eintrag bereitstellen, der der RolleSecurityAdminzugewiesen ist.
Behoben
- Problem mit doppelten Kind-Referenzen bei Nodes, die eingebettete, von der Foundation definierte Instanzen von
NodeStatefür einen ganzen Node-Baum verwenden, wobei die Kind-Nodes durch denNodeStateund 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
OpcDiscreteItemNodeundOpcDiscreteItemNode<T>der BasisklasseOpcDataItemNode. - Neuer Subtyp
OpcTwoStateDiscreteNodeder BasisklasseOpcDiscreteItemNode. - Unterstützung der neuen Security-Policy-Algorithmen
Aes128_Sha256_RsaOaepundAes256_Sha256_RsaPss.
Behoben
- CTT-Problem mit falschem Statuscode
BadSessionClosedstattBadNoSubscription, wenn eine Sitzung ein Publish ohne Subscription anfordert. - Problem mit nicht funktionierender automatischer Zuweisung der NodeId für
ShelvingStateinOpcAlarmConditionNode. - Problem mit nicht initialisiertem Attribut ValueRank nach dem Erstellen einer nicht generischen Instanz von
OpcVariableNodeohne Ü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.EstimatedReturnTimezur Unterstützung der CTT-Konformität. Die Eigenschaft aktualisiert direkt den Wert des zugehörigen Nodes unterObjects/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
OpcNodeModelmit zusätzlichen Überladungen fürCreateByDefault,OmitByDefaultundOmitOptionalsmit einem zusätzlichen booleschen Parameterrecursive. 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
OpcOperationLimiterwurde überarbeitet und liefert praktikablere Standardgrenzen, wennAutoDetermineLimitsaktiviert ist.
2.51.3.0 (freigegeben am 12.02.2026)
Neu
- Clientseitige Unterstützung von
ResendDataüberOpcSubscription.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
OpcNodeIdin Definitionen strukturierter Datentypen seit Version 2.50.0 aufExpandedNodeIdstatt auf NodeId abgebildet wurde. - Problem, durch das mit
OpcVariableNode.Valuegesetzte Werte bei einem benutzerdefinierten Datentyp unter Umständen nicht in die Historie desOpcNodeHistorianaufgenommen 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, wennUseDynamicaktiviert ist und der Server einen oder mehrere TypeDictionary-Nodes bereitstellt, die beim Lesen den StatusBadNotReadableliefern. 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
ActivateSessionbei ungültigem Sitzungsbezeichner oder leerer Client-Signatur (CTT-Konformität). - Die
PolicyIdderUserTokenPolicy-Einträge war in den vonGetEndpointsgelieferten Endpunktbeschreibungen innerhalb des Servers nicht eindeutig (CTT-Konformität). - Wenn ein Client ein
UserNameIdentityTokenmit leerem Benutzernamen sendet, wird jetzt der StatuscodeBadIdentityTokenInvalidzurü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 ParametertimeFlowsBackwardden Werttruehat.
Behoben
- Problem, durch das das Lesen des
ServerDiagnosticsNodeden StatusBadOutOfServicelieferte, obwohl die Diagnose imOpcServeraktiviert war. - Problem, durch das eingehende Verbindungen zum
OpcServermitBadUserTokenRejectedfehlschlugen, wenn einehttps:-URL verwendet wurde. - Wenn ein Client eine HistoryRead-Anfrage mit einem Wert für
maxCountsendet, 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
UseNodeNameAsDefaultDescriptionundUseNodeNameAsDefaultSymbolicNameinOpcAutomatismfür die bedingte Initialisierung des Attributs Description und der EigenschaftSymbolicNamevonOpcNode.
Geändert
- Verbesserte CTT-Konformität bei der Standardinitialisierung von
OpcNode: Die Standardwerte für das Attribut Description und die EigenschaftSymbolicNameentfallen unter bestimmten Bedingungen. Für das bisherige Verhalten aktivieren Sie die entsprechenden Eigenschaften inOpcAutomatism.
Behoben
- Problem mit überschriebenen Attributen von Variablen-Nodes, die über ein
OpcNodeModelbereitgestellt werden.
2.50.6.2 (freigegeben am 06.10.2025)
Behoben
- Problem mit
InvalidOperationExceptionoderNullReferenceExceptionbeim Erstellen einesOpcConditionNodeoder einesOpcHistoryConfigurationNode.
2.50.6.1 (freigegeben am 25.09.2025)
Behoben
- Problem mit
NullReferenceExceptionbei NodeSet-Variablen mit undefinierten Array-Dimensionen.
2.50.6.0 (freigegeben am 21.09.2025)
Neu
IOpcNodeInfoum die EigenschaftenWriteAccessundUserWriteAccesserweitert, die auch die Werte dieser Attribute liefern.- Neue Schnittstelle
IOpcVariableNodeInfoals Subtyp vonIOpcNodeInfo, 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
OpcAnalogUnitRangeNodeundOpcAnalogUnitNode.
Geändert
- Die Eigenschaft
Modelund die übrige API zuOpcNodeModelwurden vonOpcInstanceNodenachOpcNodeverschoben, 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
OpcNodeModelfür weitere Unterklassen:OpcConditionNode(einschließlich seiner Unterklassen),OpcOrderedObjectNodeundOpcFileNode.
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
NullReferenceExceptioninOpcContext, wenn er aus einemOpcOperationContexterstellt wurde. - Problem mit
NullReferenceExceptioninOpcNodeId, wennValueAsStringauf der InstanzOpcNodeId.Nullabgefragt wird. - Problem mit
NullReferenceException(seit Version 2.50.4) beim Erstellen einesOpcDataItemNode(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 dieProductUriin der Variablen BuildInfo der VariablenServerStatuszu 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
DefaultReferenceTypeIdvonOpcFolderNodewar fälschlich Organizes; stattdessen wird jetzt HasComponent verwendet. Diese Änderung dient der CTT-Konformität. ServerDiagnosticsliefert keine Kind-Nodes mehr, und jede explizite Lese- oder Schreiboperation auf die Kind-Nodes über ihre NodeId führt zuBadOutOfService. Dieses Verhalten gilt bei deaktivierterServerDiagnosticsund 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 einesOpcAnalogItemNode. - 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
InverseNamevonReferenceTypes: Jetzt wirdBadAttributeIdInvalidstatt einer Null-Referenz (Nothing in Visual Basic) geliefert. - Falscher Statuscode in Server-Subscriptions beim Zugriff auf die Subscription einer anderen Sitzung: statt
BadSessionIdInvalidjetztBadSubscriptionIdInvalid. - Falscher Statuscode, wenn die Impersonation eines Identity-Tokens fehlschlägt: statt
BadIdentityTokenInvalidjetztBadIdentityTokenRejected. Diese Änderung dient der CTT-Konformität.
2.50.3.0 (freigegeben am 17.07.2025)
Behoben
- Problem mit
NullReferenceExceptionbeim Erstellen einer Instanz vonOpcAlarmConditionNode(oder einer ihrer Unterklassen) imOpcServer.
2.50.2.0 (freigegeben am 07.07.2025)
Neu
- Der
OpcServerliefert jetzt die Informationen zur lokalen Zeitzone des Servers in der EigenschaftLocalTimedes 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(...)undOpcNode.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 vonOpcFiniteStateMachineNode.- Problem beim Empfang von Daten zu
ModelChangeEventund GeneralModelChangeEvent imOpcClient. - Problem mit
NullReferenceExceptioninOpcGeneralModelChange, wenn die EigenschaftChangesdes 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 imOpcServerund inOpcContext. - 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.
OpcFiniteStateMachineNodeermittelt 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 EigenschaftOpcContext.Current) für Szenarien, in denen einOpcContextbenötigt, aber über keinen Parameter übergeben wird. Das gilt derzeit nur für Servercode. - Neue Eigenschaften
OpcNodeManager.NodeSetImportOptionsundOpcNodeSetManager.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.DefaultAutozur Vereinfachung generischer Encoding-Definitionen. - Thread-lokaler
OpcContext(über die neue EigenschaftOpcContext.Current) für Szenarien, in denen einOpcContextbenö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 MethodenAddChildundRemoveChildinOpcInstanceNodeden 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 anAddChildundRemoveChildübergeben wird. - Neue Methoden
OpcServer.RegisterNamespaceundOpcServer.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
OpcSessionzu ihrenOpcSubscriptionsund von dort zu derenOpcMonitoredItems. - 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.UseOnlySecureEndpointsauftruegesetzt ist, wählt derOpcClientjetzt nur noch Endpunkte mit dem ModusSignAndEncryptund nicht mehr solche mit dem ModusSign, da Letzterer keine Vertraulichkeit bietet. Für das bisherige Verhalten (Endpunkte mitSignoderSignAndEncrypt) setzen Sieclient.Security.EndpointPolicyauf eine Policy mit diesem Modus undOpcClient.Security.AutoUpgradeEndpointPolicyauftrue. Alternativ setzen SieOpcClient.Security.UseHighLevelEndpointauftrue, 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 vonBaseEventTypeverwendet (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 SieOpcEventFieldSelectOptions.UseExplicitEventTypeIdsanOpcEventFilterFactory.Select().
Behoben
NullReferenceExceptionbeim Import eines NodeSets mit einerFiniteStateMachineohne den Kind-Node LastTransition.NullReferenceExceptionsbeim 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
BadNotSupportederhielten, wenn sie eine neue Verbindung zum Server aufbauen wollten, nachdem ein Client Audit-Ereignisse abonniert hatte. - Problem, durch das
OpcEngineeringUnitInfo.CommonCodeeine Zeichenkette mit einem NUL-Zeichen liefern konnte. - Problem, das eine
OpcExceptionbeim Lesen eines strukturierten Datentyps mit einem Array verschachtelter strukturierter Datentypen verursachen konnte, wennOpcClient.UseDynamicaktiviert war. - Problem, durch das der
OpcServerClientverbindungen mit nicht vertrauenswürdigen Zertifikaten akzeptieren konnte, obwohlOpcSecurity.AutoAcceptUntrustedCertificatesauffalsegesetzt war. - Problem, durch das sich der
OpcClientmit Endpunkten mit dem Policy-ModusNoneverbinden konnte, wenn der Server nur diese Policy anbot, obwohlOpcClientSecurity.UseOnlySecureEndpointsauftruegesetzt war. - Problem beim Dekodieren strukturierter Datentypen, wenn für ein Array-Feld ein Null-Wert auftrat.
- Problem mit
InvalidCastExceptionbeim Lesen eines strukturierten Datentyps, der ein Array strukturierter Datentypen enthält. IndexOutOfRangeExceptionbeim Import eines NodeSets, in dem einVariableNodeeinen 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
UserIdentityTokennachOpcIdentityTokenhinzugefügt.
Geändert
- Die Abhängigkeit
Portable.BouncyCastlewurde 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.Statebeim Aufruf vonOpcClient.Disconnect()im ZustandConnectingstehen bleiben konnte, wenn gleichzeitig ein anderer Thread Methoden wieOpcClient.CallMethod()aufruft.
2.42.2.0 (freigegeben am 22.08.2024)
Neu
- Von den Klassen
OpcAccessControlListundOpcUserIdentitykann jetzt abgeleitet werden, und benutzerdefinierte Instanzen vonOpcAccessControlListlassen sich über die MethodeOpcServerSecurity.AddAccessControlList()zu einemOpcServerhinzufü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
InvalidOperationExceptioninOpcFiniteStateMachine.ChangeStateTo()aufgrund eines falschen Vergleichs vonOpcNodeId-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 auftruegesetzt 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 EigenschaftOpcAutomatism.UseNullInsteadOfEmptyArraysauffalsegesetzt werden. Das führt zu leeren Array-, Listen- und Collection-Werten, die mit der Array-Größe null kodiert werden.
Geändert
OpcArgument.ArrayDimensionsundOpcArgumentInfo.ArrayDimensionsunterstützen jetzt Null-Referenzen (Nothing in Visual Basic), wenn das überOpcAutomatism.UseNullInsteadOfEmptyArraysaktiviert ist. Wenn ein Server den Wertnullfür dieArrayDimensionsangibt, gibt diese Eigenschaft jetzt also ebenfalls eine Null-Referenz (Nothing in Visual Basic) zurück.
Behoben
- Der
OpcClientwä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.Idzu einer anderen Objektinstanz wechselte, wenn ein Client das Attribut NodeId eines Nodes las. - Problem, bei dem in der
DataTypeIdeines 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 vonOpcNodeManagerverwaltet 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.Corewurde auf Version 2.1.25 aktualisiert, um eine Sicherheitslücke zu beheben.
Behoben
- Problem, das ein Speicherleck im
OpcClientverursachte, wennOpcClient.BrowseNodes()wiederholt aufgerufen oder mit den KlassenOpcFileMethods,OpcFileStreamoderOpcFileInfoauf Datei-Nodes zugegriffen wurde. - Problem, durch das der
OpcClientfä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
OpcServerwird jetzt nur noch einmal währendActivateSessiondurchgeführt, statt für jede Anfrage einzeln.
Behoben
- Problem mit
OpcVariableNodeInfo.IsArrayundOpcVariableNode.IsArray, die bei einem Array mit 3 oder mehr Dimensionen fälschlicherweisefalsezurückgaben (Ersteres seit Version 2.33.0). - Problem mit einem Deadlock, der beim Aufruf von
OpcClient.Disconnect()oderOpcClient.Dispose()auftrat, während gleichzeitig Ereignis-Subscriptions aktiv waren. - Problem, durch das
OpcClient.Statenicht aufReconnectingwechselte, wenn eine Verbindungsunterbrechung erkannt wurde, während eine Operation wieReadNodes()noch ausgeführt wurde. - Problem, das die Erstellung eines Ereignisfilters aus einer
OpcNodeIdverhinderte, wenn ein aufgelöster Namespace verwendet wurde. - Problem, das ein Speicherleck verursachte, wenn wiederholt Instanzen von
OpcMethodNodeerstellt (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. OpcDataTypeInfowurde erweitert, umExtensionObjectsauch als Systemtyp zu unterstützen (EigenschaftIsSystemType).- 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
ExtensionObjectsin 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
DataTypeDescriptionsundDataTypeDefinitionsdefiniert 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
OpcEventFilterangegeben 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
OpcNodeContextwurde um die neue EigenschaftNodeManagererweitert, die auf denOpcNodeManagerim 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(...)undWrite(...)zum Aufrufen der implementierten Methoden einesOpcFileNodemit 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.SessionIdliefert keine Null-Referenz (Nothing in Visual Basic) mehr, sondernOpcNodeId.Null.- Die Zugriffsmodifizierer der Methoden
OpcNodeManager.AddNode(...)undOpcNodeManager.RemoveNode(...)wurden vonprotectedaufpublicgeändert, um die Verwendung zu vereinfachen. - Die Auswertung von
OpcVariableNodeInfo.IsArrayverwendet 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,AuthorizationServiceundProxyCapabilitiesim Anwendungscode. - Neue Eigenschaft
NameinOpcDataTypeAttribute, 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
OpcDatamit einem Standardkonstruktor. - Neue Eigenschaft
IsUnioninIOpcDataTypeInfo, die angibt, ob ein Datentyp ein Union-Datentyp ist. - Neue Schnittstelle
IOpcUnionzur Implementierung benutzerdefinierter Union-Datentypen. - Typisierte Unterstützung für den abstrakten Datentyp Number, der die Kodierung aller primitiven numerischen Datentypen unterstützt.
- Neue Klasse
OpcSubscriptionSetupfür die Erstellung einer neuen Subscription mit allen vordefinierten Eigenschaften. - Neue Methode
OpcClient.CreateSubscription(...), die einOpcSubscriptionSetupverwendet, um eine neueOpcSubscriptionzu erstellen.
Behoben
- Verweis auf
System.Text.Encodings.Web4.5.1 (für das NuGet-Paket) hinzugefügt, um eine Warnung vor einer Sicherheitslücke zu beheben, die durch den transitiven Verweis überMicrosoft.AspNetCore.Server.Kestrel2.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
ApplyChangesmitOpcEventNode.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
UseDynamicund Subscriptions mit strukturierten Datentypen, die mit der KlasseOpcDataObjectdargestellt werden.
2.31
API-Änderungen: keine
2.31.0.0 (freigegeben am 17.05.2023)
Geändert
- Abhängigkeit
Newtonsoft.Jsonauf 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 vonclassIDundprogIDabgeleitet, sondern es wird eine freie dynamische Portnummer ermittelt. Das erleichtert die gleichzeitige Verwendung mehrererOpcClientsmit derselbenopc.com:-URL.
Behoben
- Problem bei der Aktualisierung der
ApplicationUridesOpcServeraus dem ausgewählten Zertifikat: Sie wurde erst beim zweiten statt beim ersten Start angewendet, wodurch der Reconnect-Mechanismus desOpcClientfehlschlug.
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.InheritParentNamespacewurde 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.InheritParentNamespaceden Werttruehat (der Standardwert).
Geändert
- Das Verhalten beim Starten und Beenden eines OPC Classic UA Wrapper Servers ist jetzt deterministischer, da jeder
OpcClienteinen eigenen Wrapper Server verwendet, der jetzt auch gestoppt wird, wenn derOpcClientdie Verbindung trennt. - Die Methode
OpcCertificateIdentity.Matches()ist jetzt virtuell, um einen benutzerdefinierten Identitätsvergleich zu ermöglichen. - Die Eigenschaft
OpcEvent.EventIdliefert 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 einOpcFiniteStateMachineNodeerstellt wird, ohne Zustände über Attribute zu definieren. - Problem mit
NullReferenceException, wenn einOpcFiniteStateMachineNodeerstellt wird, nachdem derOpcServerbereits gestartet wurde. OpcEvent.GetValue<T>(string)gibt jetzt korrekt einen ByteString-Wert zurück, wenn für den TypparameterTder TypOpc.UaFx.ByteStringverwendet wird.- Problem mit
ArgumentExceptioninOpcClient.Connect(), wenn der Anzeigename (Friendly Name) der aktuellenAppDomainZeichen 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.UseBreakMonitoringhinzugefü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 numerischenOpcNodeIdaus demOpcNamespace. - Eine Reihe neuer Attribute für spezifische Zustände von
OpcStateMachineNodeund deren Übergänge. - Neue Klasse
OpcStateNodezur Darstellung des in OPC UA definiertenStateType. - Neue Klasse
OpcTransitionNodezur Darstellung des in OPC UA definiertenTransitionType. - Unterstützung für die Konfiguration benutzerdefinierter
OpcFiniteStateMachineNodesmit 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 derStateMachinein 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.AddNotifierwird bei anderen Typen alsOpcObjectNodesund 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()mitOPC_BROWSE_TOaufrief, obwohlOpcClient.Interfaces.DataAccess.SupportsBrowseToauffalsegesetzt 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
DataTypeDictionaryNodeswurde 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.TypeResolveundOpcClient.TypeResolveaufgelöst, unter Verwendung der zugehörigen Kodierungskennung undOpcNodeId.Nullfür die Datentypkennung.
Geändert
- Die Deaktivierung von
OpcAutomatism.UseDynamicTypeRegistrationführte zu einer verzögerten dynamischen Typregistrierung, wenn ein benutzerdefinierter Datentyp manuell registriert wurde.
Behoben
- Problem mit
ArgumentException, wenn die EigenschaftValueeinesOpcStateVariableNodeoderOpcFiniteStateVariableNodegeä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.TypeResolvenicht 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.UseDynamicTypeRegistrationdeaktiviert wurde. - Probleme mit Aufzählungen, die in einem anderen
DataTypeDictionaryals 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, aberAlgorithm != 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
NumberInListinOpcOrderedObjectNode, 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
IOpcDataTypeMapperund seiner StandardimplementierungOpcDataTypeMapper. - Neue Methode in
OpcDatazur Registrierung, Bestimmung und Aufhebung der Registrierung benutzerdefinierter Datentyp-Mapper. - Neue Methoden
OpcDataTypeMapper.ConvertibleundOpcDataType.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
BadNodeIdUnknownbei 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.Childund 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
OpcDataTypeAttributeermöglicht jetzt festzulegen, welche Datentypen über Datentypdefinitionen, über Datentypbeschreibungen oder über beides deklariert werden. - Neue Eigenschaft
DeclarationsinOpcDataTypeInfo, 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.Resolutionzur Konfiguration, wie NodeIds aufgelöst werden, wenn keine benutzerdefinierten NodeIds verwendet werden. - Neue Ereignisse
BeforeAddundAfterAddinOpcNodezur 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
OpcOrderedObjectListNodeals Standardimplementierung desOrderedListType. - Einführung des abstrakten
OpcOrderedObjectNodeals Standardimplementierung vonIOrderedObjectTypeundIOpcOrderedObjectNode.
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
OpcClientSecurityzur Konfiguration desAuthenticationLevelundImpersonationLevel, 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
OpcDataTypeMemberSwitchAttributeals 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
IOpcAsyncMethodCommandzur Implementierung asynchroner Befehle. - Neue Methode
OpcMethodCommands.Executezur Bereitstellung einer benutzerdefinierten generischen Befehlsmethode, die mit einem Befehlsobjekt ausgeführt werden kann. - Neue Methode
OpcMethodCommands.ExecuteAsynczur Bereitstellung einer benutzerdefinierten generischen Befehlsmethode, die asynchron mit einem Befehlsobjekt ausgeführt werden kann. - Unterstützung von
IOpcAsyncMethodCommandund Delegaten, die auf eine Methode verweisen, die einenTaskoderTask<T>zurückgibt. Beide werden beim Methodenaufruf asynchron ausgeführt. - Neue Eigenschaft
OpcAutomatism.UseAsyncMethodCallszur globalen Steuerung der Ausführung von Methodenaufrufen für jeden Server und alle seine Node-Manager. - Neue Eigenschaft
OpcNodeManager.UseAsyncMethodCallszur 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 StrukturOpcRange. OpcReadNodewurde um die neue EigenschaftRangeerweitert, um das Lesen eines Bereichs von Elementen in einem Attribut zu unterstützen.OpcWriteNodewurde um die neue EigenschaftRangeerweitert, um das Schreiben eines Bereichs von Elementen in einem Attribut zu unterstützen.- Zusätzliche Überladungen der Methode
OpcClient.ReadNode, um eineOpcRangezum Lesen eines Bereichs von Elementen in einem Attribut anzugeben. - Zusätzliche Überladungen der Methode
OpcClient.WriteNode, um eineOpcRangezum Schreiben eines Bereichs von Elementen in einem Attribut anzugeben.
Geändert
- Die Eigenschaft
OpcNodeAccessToken.IndexRangeist jetzt veraltet. Verwenden Sie stattdessen die neue EigenschaftOpcNodeAccessToken.Range. - Der Typ der Eigenschaft
OpcReadVariableValueContext(<T>).Rangewurde vonUa.NumericRangeinOpcRangegeändert. - Der Typ der Eigenschaft
OpcWriteVariableValueContext(<T>).Rangewurde vonUa.NumericRangeinOpcRangegeändert. - Der Typ der Eigenschaft
OpcReadPropertyValueContext(<T>).Rangewurde vonUa.NumericRangeinOpcRangegeändert. - Der Typ der Eigenschaft
OpcWritePropertyValueContext(<T>).Rangewurde vonUa.NumericRangeinOpcRangegeä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
TaginOpcServiceCommandzur Zuweisung benutzerdefinierter Metadaten, die an einen bestimmten Befehl gebunden sind. - Neue Methoden
Load,ParseundTryParsefürOpcDataTypeDictionary, um ein XML-serialisiertes Dictionary von Datentypen auf verschiedene Weise einzulesen. - Überarbeitung von
OpcReadHistoryDetails,OpcReadNodeHistoryDetails,OpcReadNodeHistoryRawDetailsundOpcReadNodeHistoryModifiedDetails. - Fehlende Dokumentation zu
OpcReadHistoryDetails,OpcReadNodeHistoryDetails,OpcReadNodeHistoryRawDetailsundOpcReadNodeHistoryModifiedDetailshinzugefügt. - Neue Eigenschaft
ReturnBoundsinOpcReadNodeHistoryDetails. - Neue Methoden
ReadNode[s]History[Modified] inOpcClient, um benutzerdefinierteOpcReadHistoryDetailszu unterstützen.
Behoben
- OPC-Classic-Verbindungen geben jetzt
RPC_C_AUTHN_LEVEL_PKT_INTEGRITYfü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,ConfirmundAddCommentauf Instanzen vonOpcConditionundOpcAcknowledgeableCondition.
2.22.0.0 (freigegeben am 11.02.2022)
Neu
- Neue Methode
CreateArrayinOpcArrayDimensions. - Neue Methoden
GetDataTypeinOpcContext, um kontextabhängige Datentypinformationen zu ermitteln. - Unterstützung von
OpcModelChangeEvent[Node] undOpcGeneralModelChangeEvent[Node] einschließlich der zugehörigenOpcModelChangeItemundOpcModelChangeActions. - Benutzerdefinierte Veröffentlichung und Behandlung von Modelländerungsereignissen mit den neuen Klassen
OpcModelChangeEventNodeundOpcGeneralModelChangeEventNode. - Inline-Komprimierung von Modelländerungsereignissen, wenn ein Ereignis-Snapshot eines
OpcGeneralModelChangeEventNodebereitgestellt werden soll.
Behoben
- Problem mit falscher Definition des
ValueRankbei Verwendung des Konstruktors vonOpcArguments, 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
DataTypeDictionariesundDataTypeDescriptionseinschließlich derDataTypeEncodingsweiterhin 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
DataTypeDictionariesundDataTypeDescriptionseinschließlich derDataTypeEncodingsweiterhin 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
BadNodeIdUnknownbenachrichtigt, wenn ein abonnierter Node später gelöscht wird.
2.20.3.0 (freigegeben am 04.01.2022)
Behoben
- Problem mit
OpcNamespace.Resolve(), durch dasOpcNamespaceCollection.ResolveValue()nicht richtig funktionierte. IndexOutOfRangeException, wenn ein nicht generischerOpcAnalogItemNodeim Server verwendet wird.- Problem mit
StackOverflowException, wenn (implizit) einByte[]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
OpcMethodNodebei 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 dasOpcEnumAttributeEigenschaften, 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
OpcClientliefert jetzt Informationen zum Node-Typ für Ereignis-, Objekt- und Variablentypen.OpcNodebietet die neuen MethodenRegisterTypeundUnregisterType, um benutzerdefinierte Node-Typen zu verwalten.OpcNodebietet die neuen MethodenGetTypeundGetTypeInfozur Ermittlung von Instanzen vonSystem.TypeundOpcNodeTypeInfo, die einen Node-Typ definieren oder beschreiben.OpcInstanceNodebietet die neuen MethodenGetNodeValueundSetNodeValuezum Ändern des Wertattributs eines bestimmtenOpcVariableNode, der ein Kind des Instanz-Nodes ist.- Das Ableiten von
OpcObjectNodezur 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
OpcTypeNodezur Definition benutzerdefinierter Node-Typen (OpcNodeTypeundOpcNodeType<T>). - Neue Attribute zur Beschreibung benutzerdefinierter Node-Typen (
OpcNodeTypeAttribute,OpcNodeTypeIgnoreMemberAttribute,OpcNodeTypeMemberAttribute,OpcNodeTypeOptionalMemberAttribute). - Die Klasse
OpcNodeTypeSystemwurde 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
OpcArgumentwurde erweitert, um auch spät initialisierte benutzerdefinierte Datentypen zu unterstützen.
Geändert
OpcInstanceNodebestimmt jetzt seineDefaultTypeDefinitionIdanhand des Node-Typs, der zum Erstellen des Instanz-Nodes verwendet wird.OpcMemberOriginsdefiniert jetzt ein zusätzliches Enum-MemberMethodfür Methoden.
Behoben
- Problem mit spät definierten benutzerdefinierten Datentypen, die für Argumente in
OpcMethodNodesverwendet werden. - Problem mit
BadNodeIdUnknownbeim Zugriff auf die InputArguments und OutputArguments vonOpcMethodNodes, die erstellt wurden, bevor der zugehörigeOpcNamespaceinitialisiert und im Server definiert wurde (zum Beispiel bevorOpcNodeManager.CreateNodesausgefü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>inOpcNamePath. - 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 vonBrowseNameszu ermitteln. - Neue Eigenschaft
ServiceNameinOpcServiceRequestundOpcServiceResponse. - Neue Methoden
GetResultsundGetResultExceptionsinOpcServiceResponse, um anfrage- und befehlsbezogene Ausnahmeinformationen zu ermitteln. - Neues Ereignis
OpcServer.RequestJudgementzur 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 EigenschaftDismissdoch zulassen.
Geändert
- Unnötige Zeilenumbrüche in der String-Darstellung von Instanzen von
OpcExceptionwurden 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
BaseTypevonBaseEventTypegleichBaseEventType). - Mögliche
NullReferenceExceptionsbei Verwendung der MethodenOpcClient.GetDataTypeundOpcClient.GetNodeTypemit einer Null-Referenz (Nothing in Visual Basic) statt einer gültigen Instanz der KlasseOpcNodeId. - Problem, durch das zu wenige
HistoryValueszurü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
GetValuein der KlasseOpcEventermöglicht es Unterklassen, den Wert einer Eigenschaft einem Node-Wert des Ereignisses zuzuordnen, ohne den zugehörigenNamespaceIndexfü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 MethodeDataStore.Getverwenden, 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:
IOpcReadOnlyNodeDataStoreerfordert jetzt auch die Implementierung vonIOpcNamespaceResolver.
Behoben
- Problem mit der Auflösung des zugehörigen benutzerdefinierten Typs beziehungsweise der zugehörigen benutzerdefinierten Instanz von
OpcEventfü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.FileReadCallbackundOpcFileReadMethodNode.FileReadExCallbackgeben jetzt einen ByteString statt eines Byte-Arrays zurück. - Bruch:
OpcFileWriteMethodNode.FileWriteCallbackundOpcFileWriteMethodNode.FileWriteExCallbackakzeptieren jetzt einen ByteString für den Datenparameter statt eines Byte-Arrays. - Parameter von
OpcFilterOperand.OfTypevonvalue : objectintypeId : OpcNodeIdgeändert, um sicherzustellen, dass einOfType-Operand wie erwartet ausgewertet wird (also mit einerOpcNodeId).
Behoben
- Bruch: Regression beim Zugriff auf
OpcFileNodemit Lese- und Schreiboperationen, nachdem der Foundation Stack die Verwendung von ByteString für ByteString undByte[]fürByte[]erzwingt statt ByteString fürByte[]. - Problem, durch das keine historischen Werte zurückgegeben wurden, wenn der Server den Statuscode
GoodNoDatamit 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 mitOpcValue.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
OpcExceptionundBadServerNotConnectedbei aktivierter OptionOpcClient.UseDynamicwä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>inOpcMethodNodes. - Neuer Indexer mit einem
Int32, um ein bestimmtesOpcDataFieldin einemOpcDataObjectzu adressieren. - Das Ereignis
OpcClient.SubscriptionsChangedwird jetzt ausgelöst, wennOpcClient.Subscriptionsgeleert 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.Connectedausgelöst wurde. - Problem mit der erweiterten Unterstützung von
byte[], durch das die Unterstützung vonsbyte[]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 alsByte[]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:IgnoreNamespaceIndexundIgnoreNamespaceIndexIgnoreCase.
Geändert
OpcClassicDiscoveryClientverwendet jetzt dieOpcException, 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
ByteStringszu übertragen.
2.18.2.0 (freigegeben am 17.06.2021)
Neu
- Neue Methoden
TranslateinOpcServerGlobalization, 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 überOpcNodeIdComparisonbenutzerdefiniert vergleichen lassen.
Geändert
OpcNodeIdvergleicht 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
OpcSessionnach 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
OpcServervor dem Start der Instanz.
2.18.1.0 (freigegeben am 02.06.2021)
Neu
- Der fehlende Setter der Eigenschaft
OpcBrowseNode.Degreewurde hinzugefügt. - Neue Eigenschaft
OpcClient.Interfaceszur Konfiguration der Kommunikation über die OPC-Classic-Schnittstellen. - Die neue Klasse
OpcClassicDataAccessOptionsstellt 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 undByteString[]oder einzelne davon als Datentyp von Methodenargumenten oder Variablen-Nodes verwendet werden. - Unterstützung der Eigenschaft
OpcDataTypeInfo.Documentationanhand des AttributsOpcDataTypeNode.Description. - Die neuen Methoden
OpcReferenceTypes.GetReferenceTypeName(OpcNodeId)undGetReferenceType(OpcName)wurden eingeführt. - Vollständige Überarbeitung und Erweiterung der Typen
OpcRelativePathundOpcRelativePathElement. - Unterstützung der Übersetzung von Browse-Pfaden mit dem Dienst
TranslateBrowsePath. OpcClientunterstützt jetzt die Übersetzung von Browse-Pfaden über die neuen MethodenTranslatePathundTranslatePaths.
Geändert
- Das Format von ByteString wurde von Base64-basierter Kodierung in hexadezimale Formatierung (
X2) geändert, um der binär kodierten Darstellung einesByteStringder Foundation zu entsprechen.
Behoben
- Falsch initialisierte Attribute ArrayDimensions und ValueRank von Methodenargumenten und Variablen-Nodes, die
Byte[], ByteString oderByteString[]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
NullReferenceExceptionbeim 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.Typebeiout-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
TypeIddes Elementtyps imArrayTypedes 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
OpcMethodContextsum einen Verweis auf den Owner, um Zugriff auf die zugrunde liegende Instanz vonOpcServerzu 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
NamespaceArraysverwenden. - Problem mit zurückgesetzter
OpcNode.Description, zum Beispiel beiOpcDataVariableNode<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
TypeInitializationExceptionbei der Prüfung auf Verwendung der Unity-Runtime in manchen Szenarien mit dynamisch geladenen Assemblies. - Problem mit
InvalidOperationExceptionimBufferManagerder 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
NullReferenceExceptionsbeim 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
OpcNominalNodeIdFactorywurde erweitert, um zusätzliche benutzerdefinierte Logik auf den verwendetenOpcNameanzuwenden, anhand dessen dieOpcNodeIderstellt wird.
Behoben
- Problem mit weiterhin existierenden Instanzen von
OpcSubscriptioninOpcClient.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 SchnittstelleIOpcFileInfo.
Behoben
- Problem beim Deklarieren von und Zugreifen auf Variablen-Nodes, die
ExpandedNodeIdals 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 desOpcNamesignoriert. - Neue statische Methode
OpcNodeId.IsNullOrEmpty, die bei der Auswertung die Namespace-Informationen derOpcNodeIdsignoriert. - 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 vonOpcDataTypeNodesauf nicht generischem Weg zu erstellen.
Geändert
- Doppelte Verweise auf
DataTypeNodesbei Verwendung der KlasseOpcAddressSpacewurden entfernt.
Behoben
- Problem mit fehlerhaften oder zu vielen Subscriptions, das den
OpcClientdaran hinderte, sich nach Verlust einer Verbindung automatisch neu zu verbinden. - Problem mit inline initialisierten
OpcDataTypeNodesbei 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
OpcDataTypeIgnoreMemberAttributewurde eingeführt, um Member eines Typs explizit von der Kodierung und Dekodierung auszuschließen. - Die Eigenschaften
OpcDataTypeAttribute.NamespaceUriundOpcDataTypeAttribute.UseDataTypeDescriptionwurden 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
OpcNodeExportOptionszur 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.DisplayNamesundOpcNode.Descriptionsstellen 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
ProductVersionundFileVersioneinschlossen. - Problem mit dem Überschreiben von
OpcNode.SymbolicName, wenn ein Node importiert wird, der für die EigenschaftSymbolicNameeinen 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
ParentNodeIdin 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
NamespacesinIOpcApplicationInstanceundOpcApplicationInstance, um die verwendeten Namespaces bereitzustellen. - Neue Eigenschaft
NamespacesimOpcClient, um die Namespaces des verbundenen Servers abzubilden. - Neue Eigenschaft
NamespacesimOpcServer, um die Namespaces bereitzustellen, die die Node-Manager des Servers zur Organisation des Adressraums verwenden. - Neue Eigenschaft
NamespacesinOpcContext, um die im aktuellen Kontext gültigen Namespaces bereitzustellen. - Die Schnittstelle
IOpcNamespaceResolverwurde in derOpcNamespaceCollectionundOpcReadOnlyNamespaceCollectionimplementiert. - Methode
ResolveinIOpcNamespaceResolver, um einen anderen (online) Namespace anhand der Metadaten eines offline beziehungsweise lokal definierten Namespaces aufzulösen. OpcNamespacestellt jetzt immer dann eine URI bereit, wennOpcNamespace.Valueeine 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.UserIdentityeingestellt wurde. OpcClientundOpcClassicDiscoveryClientunterstützen jetzt die Verwendung einer Hostidentität zur DCOM-Authentifizierung. Hinweis: BeimOpcClientwird die unterOpcClient.Security.UserIdentityeingestellte Identität ebenfalls zur DCOM-Authentifizierung verwendet.- Neue Eigenschaft
ScopeinOpcNamespace, die den Kontext beschreibt, in dem der Namespace erstellt wurde und in dem seine Metadaten gelten. - Verbesserte Geschwindigkeit bei der Initialisierung von
OpcNodeswährend des Starts desOpcServers. - Die Verwendung von
OpcNodeManager.ctor(OpcNamespace, ...)mit einem Namespace, der einen expliziten Namespace-Index besitzt, führt zu einerArgumentException, da es Aufgabe des Servers ist, den verwendeten Namespaces den zugehörigen Namespace-Index zuzuweisen. - Die Instanzen von
OpcNamespaceimOpcNodeManagerwerden jetzt mit den Instanzen vonOpcNamespaceder neuen EigenschaftOpcServer.Namespacessynchronisiert. In der Startphase des Servers können sich die Instanzen inOpcNodeManager.Namespacesdeshalb ändern. Spätestens beim Aufruf von Methoden wieOpcNodeManager.CreateNodes(...)sind alleOpcNodeManager.Namespacesmit denOpcServer.Namespacessynchronisiert.
Geändert
- Der Namespace
OpcNamespace.Defaultstellt 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
IOpcNamespaceResolversowie deren Implementierung inOpcClient,OpcServer,OpcContextundOpcNodeManagerwurden entfernt. - Übergänge von
OpcClient.Statefinden nicht mehr statt (bei Verwendung des standardmäßig aktivierten Reconnect-Mechanismus), wenn während eines Wiederverbindungsversuchs zum BeispielReadNodeaufgerufen 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 derOpcClient(wie bisher) das EreignisReconnectedaus. Wenn der Client eine neue Sitzung erstellen muss (zum Beispiel, weil diese abgelaufen ist), löst derOpcClientjetzt das EreignisConnectedstattReconnectedaus. So lassen sich diese Situationen im Benutzercode unterscheiden. - Vergleiche von
OpcNodeIdundOpcNamespacemit 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://:4840als 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
DataTypeEncodingfestzulegen. - 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
OpcNamespaceindirekt 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
ParentNodebereits durch eine Referenz über dieReferenceTypeIddes Kind-Nodes referenziert wird.
Behoben
- Problem mit
NullReferenceExceptionsimOpcServer, wenn ein Client versucht, einen neuen Node anzulegen, und dabei auf einenParentNodemit 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
ParentNodeIdverzichtet, wennchild.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 AttributParentNodeIdund die Referenzen).
2.11.4.0 (freigegeben am 15.12.2020)
Neu
- Neue Eigenschaft
OpcContext.Owner, die auf Instanzen vonIOpcApplicationInstancewieOpcClientoderOpcSerververweist, zu denen der Kontext gehört (soweit verfügbar). - Neue Eigenschaft
OpcException.Context, die eine Instanz der KlasseOpcContextbereitstellt, ü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.ClientIDergänzt. - Fehlende Code-Dokumentation von
OpcSecurityPolicy,OpcSecurityModeundOpcSecurityAlgorithmergänzt. - Neue Eigenschaft
PreferredLocalesinOpcContext,OpcOperationContextundOpcSession. - Neue Eigenschaften
OpcNode.Read/WriteDisplayNameCallback. - Neue Methode
OpcServer.GetSession(sessionId)zum Abfragen einer bestimmten Sitzung über deren Session-ID. - Neue Eigenschaft
OpcServer.Globalizationzur besseren Bereitstellung lokalisierter Informationen und Daten.
Geändert
- Der Datentyp der Eigenschaften
OpcNode.Read/WriteDescriptionCallbackwurde vonStringaufOpcTextgeändert. OpcDataChangeDataSetItem.ClientIDvonInt32inInt64geändert, um dem beiOpcMonitoredItem.ClientIDverwendeten Typ zu entsprechen.
Behoben
- Problem mit fehlender
OpcNotification.Data, wennOpcNotification.GetDataChanges()verwendet wird, ohne zuvor auf dieOpcNotification.Datazugegriffen zu haben. - Problem bei der Typinitialisierung in
OpcClientunter Unity mit IL2CPP: Typen wurden in einer abweichenden Reihenfolge initialisiert.
2.11.2.0 (freigegeben am 10.11.2020)
Neu
- Experimentelle Methode
OpcNodeManager.ExportNodeszur Generierung von Instanzen vonOpcNodeSetanhand 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.DisposeundOpcServer.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
SynchronizationContextszur 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
OpcServerkann jetzt auch gestoppt werden, wenn er pausiert wurde. - Eigenschaft zur Konfiguration der
TimestampsToReturnfür alle ReadNodesHistory-Anfragen überOpcClient.Services.ReadNodesHistory.TimestampsToReturn. - Eigenschaft
OpcCertificateInfo.ApplicationUrizum Abrufen derApplicationUri, die als Erweiterung „Subject Alternative Name“ in Zertifikaten enthalten ist. - Eigenschaft
OpcClientSecurity.AutoUpgradeEndpointPolicyzum 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
OpcCertificateJudgementEventArgsprüft nicht mehr, ob eines der übergebenen Zertifikate eine Null-Referenz (Nothing in Visual Basic) ist, weil manche Server für Endpunkte mit der PolicyNone(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 StatusSuspendedzu versetzen. - Neue Methode
OpcServer.Resume(), um den Server aus dem StatusSuspendedwieder in den StatusStartedzu versetzen. - Neue Werte in der Enumeration
OpcServerState:SuspendingundSuspended. - 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.Closeschließt ab sofort die Sitzung und macht den sitzungsbezogenen Identifier ungültig. - Methoden von
OpcClientvalidieren ab sofort den Verbindungsstatus mit einerOpcException(mitBadServerNotConnected) statt einerInvalidOperationException. - Der Standardwert der Eigenschaft
QueueSizeder Instanz vonOpcMonitoredItem, die überOpcClient.SubscribeEvent(s) erstellt wird, wurde vonint.MaxValueaufuint.MaxValuegeä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 Wertsint.MaxValue. - Die Eigenschaft
OpcMonitoredItemStatus.DataItemQueueSizewurde inQueueSizeumbenannt, um der Benennung der entsprechenden Eigenschaft in der KlasseOpcMonitoredItemzu entsprechen. Diese repräsentiert die angeforderte Größe, die Eigenschaft inOpcMonitoredItemStatusdie revidierte Größe. - Der Rückgabetyp der Eigenschaft
OpcMonitoredItemStatus.Idwurde vonInt32inInt64geändert, damit er den zugrunde liegenden, nicht CLS-konformenUInt32des Stacks der Foundation abbilden kann. - Die letzten API-Änderungen an
OpcMonitoredItemwurden aufOpcMonitoredItemStatusübertragen: Die EigenschaftOpcMonitoredItemStatus.AutoFlushCachewurde inQueueModeumbenannt (wie in der KlasseOpcMonitoredItem).
Behoben
- Für Kommunikationsfehler wurde der falsche Statuscode verwendet: Statt
BadNotConnectedwird jetztBadCommunicationErrorverwendet. - Der
OpcClientverband sich mit einem (möglicherweise unsicheren) Fallback-Endpunkt, wenn eine vordefinierteSecurityPolicyvom Server nicht unterstützt wird. - Der Wert der Eigenschaft
OpcSubscription.TimestampsToReturnwurde 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
AddNodeshinzugefü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 ParameterfilePathermittelt. - Neue Methoden
OpcValueRange.Of, um die zugehörigeOpcValueRangefür einen bestimmten Datentyp dynamisch zu ermitteln. - Nicht generische
OpcAnalogItemNodeskönnen jetzt auch selbstständig die zugehörigenOpcValueRangesfürInstrumentRangeundEngineeringUnitRangefestlegen (über das Attribut DataType). - Unterstützung für die Kodierung und Dekodierung von
System.Decimal(von OPC UA 1.03 nicht unterstützt) überSystem.Double. Das betrifft Felder von Datenstrukturen. - Eigenschaft
ProductUriinOpcClientundOpcServerzur 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.UpdateChangeszur Benachrichtigung über Änderungen an einem Node (und seinen Kind-Nodes). - Fehlende Dokumentation für verschiedene Typen ergänzt.
Geändert
OpcNode.OnAfterApplyChangesundOpcNode.OnBeforeApplyChangesnutzen jetztOpcNodeChangesEventArgsstattEventArgs.OpcNode.AfterApplyChangesundOpcNode.BeforeApplyChangesübergeben jetztOpcNodeChangesEventArgsstattEventArgsan Ereignishandler.
Behoben
- Problem beim Schreiben von
AnalogItemNodes, die über einen benutzerdefinierten Node-Manager ohneInstrumentalRangebereitgestellt werden: Beim Schreiben wurde keine Validierung des Werts durchgeführt. - Problem mit nur einmal aktualisiertem
SourceTimestampinOpcValues(wenn nicht explizit einSourceTimestampangegeben 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-NodesHistoryConfigurationoderAggregateConfigurationfehlten. - Problem beim Linken der Assembly in C++-CLR-Projekten mit C++/CLI, das den Fehler C2686 auslöst.
- Problem mit
NullReferenceExceptionsunter .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.UseDynamicauftruegesetzt ist.
2.9.2.0 (freigegeben am 06.05.2020)
Neu
- Weitere Überladungen der Konstruktoren der Klasse
OpcArgument, die einen Wert der EnumerationOpcDataType, 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
ArrayDimensionsin der KlasseOpcVariableNode). - Unterstützung von Null-Referenzen als Feldwert für Felder, die einen Referenz-Datentyp als Feldwert verwenden.
- Unterstützung der NodeClass
ObjectTypeim Dienst AddNodes. - Unterstützung der NodeClass
VariableTypeim Dienst AddNodes.
Behoben
- Problem bei der automatischen Definition des
ValueRankbei n-dimensionalen benutzerdefinierten strukturierten Datentypen. - Problem im Stack bei der Unterstützung n-dimensionaler benutzerdefinierter strukturierter Datentypen.
- Probleme beim Laden von
UANodeSetsmit erweiterten Werten für die Attribute AccessLevel und UserAccessLevel in UAVariable-Einträgen (bezieht sich auf den Stack 1.04). - Problem mit
NullReferenceExceptionsbeim Abruf vonOpcDataTypeInfo.BaseTypebei in NodeSets definierten Datentypen, dieUATypeDefinitionsohne Felder verwenden. - Problem mit
NullReferenceExceptionsbei 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 einemOpcNamespace.Valueführt, der den durch den ParameternamespaceUridefiniertenUri.OriginalStringnicht wiedergibt. - Problem mit kaskadierten benutzerdefinierten Datentypen, wenn sie im
DataTypeEncodingkeine benutzerdefinierte NamespaceUri festlegen. Dieses Problem betrifft nur die Server-API. - Problem mit nicht angewendetem BrowseName in
AddNodesbei Nodes derNodeClasses, die Node-Typen definieren. Dieses Problem betrifft nur die Server-API. - Probleme mit Nodes der
NodeClasses, die Node-Typen definieren und beimAddNodefalsch 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
FailIfbeziehungsweiseThrowIfbeginnen, um bei Bedarf im benutzerdefinierten Code die verwendete Lizenz zu prüfen. Verwenden Sie die MethodenFailIfin Ihrer DEBUG-Konfiguration und die MethodenThrowIfin Ihrer RELEASE-Konfiguration, um sich vor der nicht lizenzierten Verwendung des SDK zu schützen. - Neue Methoden
GetNodeType(...)inOpcClient(nur für Ereignis-Node-Typen). - Neue Methoden
GetNodeTypeSystem(...)inOpcClient(nur für Ereignis-Node-Typen). - Neue Methoden
GetNodeType(...)inOpcNodeSet. - Neue Methode
GetNodeTypeSystem(...)inOpcNodeSet. OpcMethodNodeunterstützt benutzerdefinierte Eingangs- und Ausgangsparameter, wenn die SchnittstelleIOpcMethodCommandverwendet wird.- Neue Methoden
GetNodeType(...)und neue MethodeGetNodeTypeSystem()inOpcNodeSet. OpcNodevererbt ab sofort seinenOpcNode.Namespacean seine Kind-Nodes (falls diese bezüglich ihrerOpcNode.Idden Standard-Namespace verwenden).- Neue Spezialisierungen von
OpcTypeNodeInfo:OpcObjectTypeNodeInfoundOpcVariableTypeNodeInfo. - 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.
OpcNodeInfoimplementiert jetztIOpcNodeInfo, um eine flüssigere Verwendung von Node-Instanzen unabhängig von ihrem Ursprung zu ermöglichen.- Weitere konfigurierbare Dienste in
OpcClientServices: Browse undReadNodes. - Erheblich verbesserte Leistung beim Erstellen von Ereignisfiltern.
IOpcNodeInfodefiniert jetzt weitere Methoden:AttributeValue(...),Child(...)undChildren().- Unbeschränkte Browse-, Read- und Write-Operationen aufgrund automatischer Partitionierung von Anfragen (
OpcClient). - Ereignis
OpcClient.CertificateJudgementzur Behandlung von Problemen im Zusammenhang mit Zertifikaten, nachdem eine Verbindung hergestellt und Zertifikatsinformationen bereits erfolgreich validiert wurden. OpcModelzur Darstellung von Modellinformationen in NodeSets.- Eigenschaft
OpcMemberSwitch.Conditionszur Information über die Bedingungen, unter denen ein Switch ausgewertet wird. - Direkte Unterstützung von .NET Core 3.1 als eines unserer Zielframeworks.
- Methode
ReplaceNodeinOpcNodeManager, um existierende Nodes rekursiv, auch bezüglich ihrer Notifier und MonitoredItems, zu ersetzen. OpcNodeSetwurden zusätzliche Metadateneigenschaften (LastModifiedundName) hinzugefügt.- Eine allgemeine Implementierung der Schnittstelle
IOpcMethodCommandmit Delegaten:OpcMethodDelegateCommand. - Fehlende Dokumentation für Collections und einige andere Typen hinzugefügt.
OpcNodeSetManager.ImplementNodeCallbackzum Implementieren von Nodes mithilfe eines einfachen Callbacks.OpcData.GetNodeIdunterstützt jetzt auch Array-Typen.- Kodierungsinformationen im Adressraum des Servers (intern) hinzugefügt.
- Generische Implementierung von
IOpcMethodCommandfür Delegaten:OpcMethodDelegateCommand. - Unterstützung von
System.ObjectundSystem.Object[] zum Kodieren und Dekodieren von Datentypen. - Unterstützung von Serialisierungs- und Deserialisierungsattributen, die in
System.Runtime.Serializationfür Datentypen definiert sind. OpcDataTypeMembersAttributezum 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 benutzerdefiniertenNodeManagerzuzuweisen. - 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 KlasseOpcClient. - Neue Methoden
GetDataType(...)in der KlasseOpcNodeSet. IOpcNodeInfodefiniert jetzt die MethodenChild(...)undChildren(), um die Kind-Nodes von Instanz-Nodes abzurufen.- Neue Klasse
OpcNamespaceCollection. - Eigenschaft
OpcNodeSet.Namespaces, um die Namespaces bereitzustellen, auf die im NodeSet verwiesen wird. IOpcMethodCommandzur Definition und Verwendung benutzerdefinierter Command-Instanzen statt der Definition eines expliziten Delegaten.- Klasse
OpcMethodCommands, die vordefinierte Commands wie den NotImplemented-Command bereitstellt. - Erweiterung von
OpcMethodNodezur Unterstützung von Instanzen vonIOpcMethodCommand. - 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.Emptyzur Definition einer leeren Kontext-Instanz. IOpcNamespaceResolverwurde in der KlasseOpcContextimplementiert und ermöglicht so das Auflösen von Namespaces von Instanzen vonOpcNodeId.- Klasse
OpcTypeSystem, die als Basis für die existierende KlasseOpcDataTypeSystemund die neue KlasseOpcNodeTypeSystemdient. - Eigenschaft
OpcDataTypeDictionary.Documentation. - Klasse
OpcNodeSetManager, die das einfache Importieren und Hosten vonOpcNodeSetsmitOpcNodeSetManager.Create(...)unterstützt. - Geschützte virtuelle Methoden
OpcNodeManager.ImportNodes()undOpcNodeManager.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>undOpcVariableNode.
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.
OpcAttributeWriteAccessverwendet jetztUInt32als Basistyp.- Der Standardwert der Eigenschaft
OpcAutomatism.AlwaysParseStringIdentifiersist jetztfalse. Dadurch wird der Wert beim Aufruf des KonstruktorsOpcNodeId(string)nicht mehr automatisch geparst. Weitere Details beschreibtOpcAutomatism.AlwaysParseStringIdentifiers. - [Client SDK] Die Klasse
OpcBrowseNodewurde vom NamespaceOpc.UaFx.Clientin den NamespaceOpc.UaFxverschoben. - [Client SDK] Die Enumeration
OpcBrowseNodeDegreewurde vom NamespaceOpc.UaFx.Clientin den NamespaceOpc.UaFxverschoben. - [Client SDK]
IOpcBrowseServiceundOpcBrowseRequestverwenden jetzt die KlassenOpcViewDescriptionundOpcBrowseNodestatt der KlassenViewDescriptionundBrowseDescriptionder Foundation. OpcReadOnlyNamespaceCollectionwurde vom NamespaceOpc.UaFx.Serverin den NamespaceOpc.UaFxverschoben.- Der Standardwert des Attributs DataType von
OpcDataTypeDictionaryNodewurde von Byte auf ByteString geändert, um der Definition der Spezifikation zu entsprechen. - Die Eigenschaft
Descriptionwurde inDocumentationumbenannt, um die Konformität zur Spezifikation sicherzustellen. Betroffen sindIOpcDataTypeInfo,OpcDataTypeInfoundOpcDataFieldInfo. OpcEncoding.All(...)erzeugt jetzt dieOpcEncoding.Idanhand des Standard-BrowseNames für die verschiedenen Encoding-Typen.OpcNamespace.ToString()liefert ab sofort eine Zeichenkette, die ausschließlichOpcNamespace.ValueundOpcNamespace.Index(falls nicht null) enthält.OpcNodeSet.GetDataTypeSystem()liefert jetzt eine Instanz vonOpcDataTypeSystem, 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.EventTypeundOpcTypeCategory.ReferenceTypewurden 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
CertificateValidationFailedverarbeitet werden. - Problem bei der automatischen Anwendungskonfiguration, wenn die Entry-Assembly entweder kein
AssemblyTitleAttributedefiniert oderstring.Emptyals Assembly-Titel verwendet. - Problem bei Wertänderungen von Variablen-Nodes beim Wechsel zwischen verschiedenen komplexen Datentypen (die über ein
ExtensionObjectbereitgestellt werden). - Falsch erzeugte
EncodingMaskbei Datentypen mit mehr als einem optionalen Feld. - Falsche Interpretation von
OpcArgument.IsArrayundOpcArgumentInfo.IsArray. - Ein initial festgelegter
OpcVariableNode.Timestampwird nicht mehr während der Erstellung des Adressraums verworfen. - Problem mit falsch ermittelten Standardwerten und -rängen sowie Standard-Datentyp-NodeIds durch
OpcDataTypes.GetValueRank(..)undOpcDataTypes.GetNodeId(...). - Probleme mit DataTypeDictionary-Nodes, die keine DataTypeDescription-Nodes definieren, bei der Erzeugung des
DataTypeSystembeim Aufruf vonOpcClient.GetDataTypeSystem(). - Probleme bei der Dekodierung strukturierter Daten, die den neuen Typ
Opc.UaFx.Bitverwenden. - Probleme bei der Verwendung von
OpcNodeId.UriIdentifier(...), wenn der Wert vonOpcNodeId.ValuekeinSystem.String-Wert ist. OpcNamespacebehält jetzt die ursprüngliche Zeichenkette bei, die beim Definieren einer Instanz vonOpcNamespaceverwendet wurde. Nachfolgende Änderungen (durch die KlasseSystem.Uri) werden jetzt vermieden, sodass die EigenschaftOpcNamespace.Valueimmer denselbenSystem.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
OpcNodezu 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
OpcExceptionsin Delegaten, die für Methoden-Nodes verwendet werden. Das ermöglicht die Definition eines Bad-Ergebnisses, ohne dieses manuell über den ParameterOpcMethodContextsetzen zu müssen. - Unterstützung weiterer Access Levels (
StatusWriteundTimestampWrite). - Ergänzung der Dokumentation für
OpcAccessLevel,OpcVariableNode.AccessLevelundOpcVariableNode.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 WertDisconnected, wenn derReconnectTimeoutgröß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 benutzerdefinierterWriteVariableValueCallbackzugeordnet ist. - Problem, durch das der Wert der Eigenschaft
OpcClientKeepAlive.Intervalnicht auf die aktuelle Sitzung angewendet wurde.
2.8.2.0 (freigegeben am 06.11.2019)
Neu
- Einführung von
Opc.UaFx.Bitals .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
EncodingMaskeines strukturierten Datentyps, werden jetzt über den neu eingeführten TypOpc.UaFx.Bitstatt überSystem.Booleanabgebildet.
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 dieProductVersionderFileVersionInfoder Instanz vonProcessModuleausProcess.MainModuleeine Versionszeichenkette bereitstellt, die nicht ausschließlich aus Zahlen und Punkten besteht, zum Beispiel1.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
iconUrlundlicenseUrlin 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
RegisterNodesundUnregisterNodesin der KlasseOpcClientzur 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)undOpcDataObject.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.UseDynamicund geänderter Standardwert der EigenschaftOpcAutomatism.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.UseDynamichat ab sofort den Standardwertfalse. Damit dasOpcDataObjectgenutzt werden kann, muss diese Eigenschaft oder die EigenschaftOpcClient.UseDynamicauftruegesetzt 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 einemUANodeSetliefert. - Neue Eigenschaft
OpcClient.NodeSet, um eine Instanz der KlasseOpcNodeSetfestzulegen, 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.UseDynamicTypeRegistrationzur Steuerung der automatischen Typreflexion, mit der Client- und Serveranwendungen die verschiedenen deklarierten Daten- und Ereignistypen bestimmen. - Neue Eigenschaft
OpcAutomatism.UseDynamiczur Steuerung der dynamischen Typauflösung bei Verwendung benutzerdefinierter, aber nicht explizit deklarierter Datentypen in Clientanwendungen. - Neue Klassen
OpcNodeValue<T>undOpcAttributeValue<T>sowieIOpcNodeAttributemitIOpcNodeDescriptorin Verbindung mitOpcNodeValuePair, um Node-gebundene Werte zu deklarieren. - Erweiterung der Klasse
OpcClientum die neuen MethodenReadNodeValueundWriteNodeValuezum Lesen und Schreiben Node-gebundener Werte. - Verbesserte Ausnahmebehandlung, um StackTrace-Informationen vom Benutzercode bis zur Foundation- und Kommunikationsebene beizubehalten.
- Neue Eigenschaft
OpcClient.KeepAlivesamt zugehöriger KlasseOpcClientKeepAlive, 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 KlasseOpcValue, um eine generische Definition des Werts mithilfe der neuen KlasseOpcValue<T>bereitzustellen. OpcNamespacestellt die Namespace-Zeichenfolge beziehungsweise URI jetzt über die neue EigenschaftOpcNamespace.Valuebereit.- Die Standardgrenzen für den Transport wurden erhöht:
DefaultMaxByteStringLengthvon 64 KB auf 5 MB undDefaultMaxMessageSizevon 1 MB auf 10 MB. - Die intern behandelten Ausnahmen bei Verwendung der Klasse
XmlSerializerbeim Start wurden behoben. - Verbesserte Ausnahmebehandlung und -verfolgung beim Kodieren und Dekodieren von Daten (siehe
OpcTypes.EncodingFailedundOpcTypes.DecodingFailed). - Unterstützung für das Tracing aller Kodierungsoperationen mithilfe der neuen Klassen
OpcEncodingStackFrameundOpcEncodingStackTrace. - Unterstützung des Tracings der Dekodierung und Kodierung mithilfe der neuen Klassen
OpcEncodingStackFrameundOpcEncodingStackTrace. int ResolveIndex(string namespaceValue)undstring ResolveValue(int namespaceIndex)zuIOpcNamespaceResolverhinzugefügt.OpcClientbietet jetzt Methoden, um Aufrufe vonCallMethodmithilfe der neuen generischen MethodenCallActionundCallFunczu vereinfachen.- Zusätzliche Überladungen für
OpcBrowseNode, umOpcNodeIdszu unterstützen, die auf bestimmte Referenztypen verweisen. OpcNodeInfobietet jetzt zusätzliche Überladungen vonChildren(...)undParents(...), die einen Wert vonOpcReferenceTypeakzeptieren.OpcResultliefert jetzt mitGetBaseResult()das Root-Ergebnis.OpcEventNode.EventTypeIdkann jetzt mit dem hinzugefügten Setter beschrieben werden.- Neues
OpcEventTypeAttributezur 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
SourceTypezuOpc.Ua.Schema.Binary.FieldTypehinzugefügt. - Fehlende Eigenschaft
BaseTypezuOpc.Ua.Schema.Binary.BaseTypehinzugefügt.
Behoben
- Falsch verwendete Variable beim Konfigurieren von
Opc.UaFx.Client.OpcSubscription.LifetimeCount. - Probleme bei der Serialisierung von Objekten vom Typ
OpcException.
Geändert
OpcDataTypeAttributeist jetzt auf Klassen und Strukturen anwendbar.OpcNodeManager.NamespaceIndexesundOpcNodeManager.NamespaceUriswurden in der neuen EigenschaftOpcNodeManager.Namespaceszusammengefasst.IOpcReadOnlyDataStorewurde inIOpcReadOnlyNodeDataStoreumbenannt.- Die Methoden
Uri Resolve(int namespaceIndex)undint Resolve(Uri namespaceUri)vonIOpcNamespaceResolversind 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(überOpcNodeId.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
SerializationExceptionsstatt der eigentlichen Ausnahmen führte.
2.7.5.0 (freigegeben am 13.08.2019)
Neu
- Verbesserte Dokumentation der API:
IOpcNode,IOpcNodeInfoundOpcNode. - Ä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.Primitiveswurde auf Version 4.5.3 aktualisiert. InSystem.Private.ServiceModel4.5.x wurde ein Fehler behoben, durch den dieSystem.Private.ServiceModel.dllbei .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
OpcNodeIdsbeim Erstellen einerOpcNodeIdmit 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.AutoFlushCachewurde durch die neue EigenschaftOpcMonitoredItem.QueueModeersetzt, 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
OperationTimeoutwird wieder angewendet. - Neue Ereignisse in der Klasse
OpcNodeManager:MonitoredItemsCreated,MonitoredItemsModifiedundMonitoredItemsDeleted.
Behoben
SocketExceptionsunter 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,OpcSessionDiagnosticsundOpcServerDiagnosticsliefern jetztlong- stattint-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
X509Certificate2wurde durch das EreignisOpcCertificateManager.QueryInstancezum Laden von Zertifikatinformationen ersetzt. Das ermöglicht die benutzerdefinierte Erzeugung von Instanzen vonX509Certificate2unter Verwendung eines entsprechendenEventHandler. - Die neue Eigenschaft
OpcCertificateStores.PathProbingsermö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
OpcSubscriptionwurden weitere Überladungen vonAddMonitoredItem(...)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
OpcMonitoredItemundOpcSubscriptionwurde aktualisiert: Einigeint-basierte Eigenschaften wurden auflongumgestellt, um die zugrunde liegendenuint-Eigenschaften des Foundation StacksCLSCompliantanzubieten.
2.7.2.0 (freigegeben am 10.05.2019)
Neu
- Unterstützung von
TypeDefinition-Informationen beim Browsen von Instanz-Nodes durch die neue KlasseOpcInstanceNodeInfo. - Neue Eigenschaft
Socketin der KlasseOpcSessionzur 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
ArgumentOutOfRangeExceptionfü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
NotificationReceivedamOpcClientaus.
2.7.1.1 (freigegeben am 29.04.2019)
Neu
- Aktualisierte Paketinformationen (
ProjectUrlundLicenseUrl).
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 EigenschaftDataTypeauf den entsprechenden Typ festgelegt wurde. Ergebnis: Die EigenschaftDataTypeü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
LARGEADDRESSAWAREverwenden.
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
AddNodeimOpcClienteinschließlich eines vollständig neuen Satzes von Command-Typen zuOpcAddNodewieOpcAddFolderNode,OpcAddObjectNode,OpcAddDataVariableNode,OpcAddAnalogItemNodeund weiteren. - Erstmalige vollständige Unterstützung von
AddNode-Dienstaufrufen imOpcServer, die das Erstellen von Nodes aller unterstützten Typdefinitionen im Adressraum des Servers ermöglicht. - Vollständige Überarbeitung der Unterstützung von
DeleteNode,AddReferenceundDeleteReferenceimOpcClienteinschließlich der Neuauflage der CommandsOpcDeleteNode,OpcAddReferenceundOpcDeleteReference. - Überarbeitung der Unterstützung der Dienstaufrufe
DeleteNode,AddReferenceundDeleteReferenceimOpcServermit zusätzlichen Validierungen der Anfragen. - Neue Klasse
OpcAddNodeResult, eine Spezialisierung der KlasseOpcResult, die das Ergebnis, dessen Commands und die NodeId nach der Ausführung einesAddNode-Dienstaufrufs bereitstellt. - Der
OpcNodeManagerstellt ab sofort virtuelle Methoden bereit, die beim Hinzufügen (über den DienstAddNode) und Entfernen (über den DienstDeleteNode) von Nodes zum beziehungsweise vom Adressraum des Managers ausgeführt werden. - Verbesserte Ausnahmedetails bei der Verwendung der Dienste
AddNodes,DeleteNodes,AddReferencesundDeleteReferences. - Der Konstruktor der Klasse
OpcServerIdentitystellt ab sofort eine Überladung für ein string-basiertes Passwort bereit. - Ereignisse von
OpcServer:RequestProcessing,RequestValidating,RequestValidatedundRequestProcessedzur Vor- und Nachverarbeitung von Client-Anfragen und den darauf gesendeten Antworten. - Die
OpcExceptionstellt ab sofort Informationen überSource,StackTrace,DataundHelpLinkbereit (falls verfügbar) und verwirft eine ursprünglich andere Ausnahme nicht mehr. - Methode
IOpcNode.Child(...)zum Ermitteln einer Kind-Instanz vonIOpcNodeü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 benutzerdefiniertenOpcServerIdentity. - Ableiten der Klasse
OpcResultfür benutzerdefinierte Typen.
Geändert
- Die Eigenschaft
OpcServerIdentity.Passwordwurde 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
OpcTransformUserPasswordDelegatewurde entfernt. OpcUserNameAcl.PasswordTransformwird durch die virtuellen MethodenMatchesundTransformPasswordin der KlasseOpcServerIdentityersetzt.
Behoben
- Problem beim Schreiben eingebauter strukturierter Werte wie
OpcEngineeringUnitInfooderOpcValueRangemitOpcClient.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
StackOverflowExceptionsbei der Änderung der Instanz der EigenschaftOpcServer.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
OpcClientdurch Angabe der Adresse im Schemaopc.com://<host>(:<port>)/<progId>/<classId>(nur mit .NET Framework). OpcClassicInterface,OpcClassicInterfaces,OpcClassicInterfaceCollectionundOpcClassicInterfaceCategory(nur mit .NET Framework).OpcClassicApplicationDescription,OpcClassicApplicationDescriptionCollection,OpcClassicEndpointDescriptionundOpcClassicEndpointDescriptionCollection(nur mit .NET Framework).- OPC Classic Discovery mit der neuen Klasse
OpcClassicDiscoveryClient. Dafür wirdOpcEnum.exeverwendet, eine COM-Anwendung, die Teil der OPC-Classic-Laufzeitumgebung ist (nur mit .NET Framework). - Erweiterung der Klasse
OpcDataChangeFilterzur Unterstützung eines Triggers, desDeadbandTypeund einesDeadbandValue. Über die EigenschaftTriggerlassen sich auch Änderungen desSourceTimestampüberwachen. - Zusätzliche Überladungen der Methode
OpcClient.SubscribeDataChangeund zusätzliche Überladungen der Konstruktoren vonOpcDataSubscribeDataChange, die einen Wert der EnumerationOpcDataChangeTriggerakzeptieren. - Ein vordefinierter
ApplicationNamewird ab sofort alsSubjectNameeines Zertifikats verwendet, wenn ein neues Zertifikat (automatisch) für eine Client- oder Serveranwendung erstellt wird. OpcApplicationInstancestellt eine Standardimplementierung der SchnittstelleIOpcApplicationInstancebereit.OpcClientundOpcServerBaseverwenden ab sofort die neue KlasseOpcApplicationInstanceals gemeinsame Basisklasse.OpcSecurityals generische Basisklasse für Sicherheitseinstellungen von Client- und Serveranwendungen.OpcClientleitet vonOpcApplicationInstanceab.OpcServerleitet über seine BasisklasseOpcServerBasevonOpcApplicationInstanceab.- Zentralisierte Anwendungskonfiguration (innerhalb des SDK) von Client- und Serveranwendungsinstanzen durch Einsatz der
OpcApplicationInstance. OpcTransportals generische Klasse zur Konfiguration der Transporteinstellungen, die jetzt Teil der SchnittstelleIOpcApplicationInstanceist.OpcSecurityals generische Klasse zur Konfiguration der Sicherheitseinstellungen, die jetzt Teil der SchnittstelleIOpcApplicationInstanceist.- Die Eigenschaften
SecurityundTransportwurden der SchnittstelleIOpcApplicationInstancehinzugefügt. - Das Ereignis
CertificateValidationFailedwurde der SchnittstelleIOpcApplicationInstancehinzugefügt. OpcSecurityPolicyCollectionimplementiert ab sofort einen öffentlichen Konstruktor.
Geändert
- Die Klasse
OpcClientTransportwurde entfernt (ersetzt durch die neue KlasseOpcTransport). - Die Klasse
OpcServerTransportwurde entfernt (ersetzt durch die neue KlasseOpcTransport). - Die standardmäßig verwendeten Serverinformationen, die die
OpcServerBasebereitstellt, bevorzugen einen vordefiniertenApplicationName. OpcSecurityPolicyCollectionstellt keinen Konstruktor mehr bereit, der eine Instanz vonOpcServerBaseerwartet. Die zugehörige EigenschaftOwnerwurde ebenfalls entfernt.
2.5
2.5.7.0 (freigegeben am 06.02.2019)
Neu
OpcClient.WriteNodeakzeptiert jetzt das direkte Schreiben vonnullals Node-Wert, ohne diesen zuvor in eine Instanz vonOpcValuezu verpacken.- Die Klasse
OpcServerstellt neue Konstruktorüberladungen bereit, die die Standardadresse ausopc.tcp,localhostund4840(dem Standardport) verwenden. - Der gesamte Node-Baum kann jetzt inline über neue Konstruktoren von
OpcObjectNodeundOpcFolderNodeerzeugt 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 : stringzur 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\Appgespeichert, um beim Start der Anwendung die Suche nach dem Anwendungszertifikat zu beschleunigen. - Bei der Ermittlung der
OpcServerInfoeiner Assembly wird nicht mehr dieLinkTime, sondern dieLastWriteTimeder Assembly verwendet.
Behoben
- Problem mit nicht übernommenem Initialwert bei Verwendung des Konstruktors
OpcDataVariableNode(parent, name, value). - Prüfungen des Werts (die zum Beispiel zu
BadTypeMismatchfü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
CommonApplicationDataund schließlichApplicationData. - 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
CertificateRequestedin den KlassenOpcClientundOpcServerBasezum 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
Bindingin der KlasseOpcServer, die eine Instanz der neuen KlasseOpcServerBindingbereitstellt. - Mit
OpcServerBinding(EigenschaftOpcServerBase.Binding) lässt sich beim Binden der Adresse ein Geltungsbereich angeben. Standardmäßig wird (wie zuvor) an jedeIPv4- und jedeIPv6-Adresse mit der angegebenen Portnummer gebunden. - Die Low-Level-Lese- und -Schreiboperationen des Node-Managers stellen ab sofort
OpcNodeAccessTokensmit Informationen zum Ergebnis der Operation bereit. - Dokumentation für
OpcSubscription,OpcMonitoredItem,OpcMonitoredItemEventArgs,OpcMonitoredItemEventHandlerund weitere API zum Thema Subscriptions.
Geändert
- Standardwert von
MinimumCertificateKeySizevon 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
Certificategeändert wird, ändert sich der Store-Path-Type des Zertifikatspeichers für Anwendungszertifikate aufSystem. Um den Store-Path-TypeDirectoryzu verwenden, ändern Sie ihn manuell. Stellen Sie außerdem nach der Änderung der EigenschaftCertificatesicher, dass das Zertifikat im Zertifikatspeicher für Anwendungszertifikate enthalten ist.
Behoben
OpcServer.Security.AutoAcceptUntrustedCertificateswurde 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
OpcValueverpackt transportiert wurden. - Problem bei der Interpretation von
AutoAcceptUntrustedCertificatesin 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
OpcNodeHistoriandurch von Clients geschriebene Werte (EigenschaftAutoUpdateHistory). OpcNodeHistorianunterscheidet 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.OpcSubscriptionundServer.OpcMonitoredItemsind ab sofort vergleichbar.
Behoben
OpcVariableNode.IsHistorizingwird nicht mehr nach dem Aufruf vonOpcNodeManager.CreateNodeszurückgesetzt.- Problem beim Schreiben von Variablen-Nodes mit undefiniertem Attribut DataType (funktionierte nicht und führte zu einem Fehler).
Geändert
OpcNode.BeforeApplyChangesundOpcNode.AfterApplyChangeswerden nur noch ausgelöst, wenn Änderungen bestehen (sieheOpcNode.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 überOpcClient.Transport, zur Konfiguration von Timeouts und Grenzen. - Neue Klasse
OpcServerTransport, Zugriff überOpcServer.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.jsonwurde vereinfacht (in .NET Standard).
2.5.2.4 (freigegeben am 31.07.2018)
Behoben
- Problem beim Senden globaler Ereignisse über Instanzen von
OpcServerundOpcNodeManager.
Neu
- Unterstützung von Null-Instanzen von
OpcNamein derOpcNominalNodeIdFactory. OpcContextstellt ab sofort immer eine gültige Instanz vonOpcNodeIdFactorybereit (mindestens die Instanz, die über die EigenschaftOpcNodeId.Factoryfestgelegt 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 überAssembly.LoadFrom()geladen wurde.
2.5.2.1 (freigegeben am 13.07.2018)
Behoben
DllNotFoundException, wenn versucht wurde, auf bestimmte Typen zuzugreifen, bevor einOpcClientoderOpcServererstellt 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
OpcFileNodeund inOpcFileInfo. - Verbesserte Leistung beim Zugriff auf Verweise auf
OpcContextinOpcNodes(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
IOpcNodeInfowurde eingeführt, um das Erzeugen temporärer Instanzen vonOpcNodeüberflüssig zu machen und um Leistung und Speicherbedarf zu verbessern. - Verwendung der Schnittstelle
IOpcNodeInfostatt 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 vonOpcServer.Startweitergereicht.
Geändert
IsNodeAccessible(..., IOpcNode node)wurde zuIsNodeAccessible(..., 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
NullReferenceExceptioninOpcMethodNode, wenn ein vordefinierter Node als Eltern-Node des Methoden-Nodes verwendet wurde.- Nodes vom Typ
OpcDataVariableNodewurden 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
XyNodeimplementiert, die die Referenz auf den Eigenschafts-Node bereitstellt, der den Wert der bisher verfügbaren EigenschaftenXyrepräsentiert. - Unterstützung der späten Initialisierung von Nodes, mit der sich Werte der Eigenschaften
Xyfestlegen lassen, die beim Erzeugen der Eigenschafts-Nodes beim Start des Servers automatisch auf diese angewendet werden. - Komplette Überarbeitung der Klassen
OpcNodeIdundOpcNamespace. 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. OpcNodeIdunterstützt Identifier als Byte-Arrays, GUIDs und vorzeichenlose Integer-Werte.OpcNodeIddrückt die Art des Identifiers in der String-Darstellung seines Identifier-Werts überOpcNodeId.ToStringaus.OpcNodeIdunterstützt UTF-8-codierte Sonderzeichen in URL-formatierten NodeIds.OpcNodeIdunterstützt das Parsen von NodeIds im Format der Foundation.OpcNodeIdbietet weitere Eigenschaften, wieOriginalStringundOriginalFormat.- Überarbeitete Implementierung von
OpcName, die nicht mehr eine Kombination aus BrowseName, DisplayName undSymbolicNamein einer Instanz beziehungsweise Klasse vereint. IOpcNode,OpcNodeundOpcNodeInfostellen jetzt direkte Eigenschaften für den DisplayName (undSymbolicName) eines Nodes bereit.OpcNodeInfounterstützt das Browsen der Kinder und Eltern über eine Kombination von Werten der EnumerationOpcNodeCategory.- Die Methoden
OpcClient.SubscribeEventRaiseundOpcSubscribeEventRaiseunterstützen jetzt eine Instanz vonOpcEventFilterfü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.
OpcEventRaiseEventArgswurde überarbeitet und stellt über die EigenschaftEventSnapshot-Informationen mit den Rohdaten des Ereignisses einesEventNodebereit.- Die Eigenschaft
MonitoredItemwurde zuOpcDataChangeEventArgsundOpcEventRaiseEventArgshinzugefügt. - Die Ereignisse
DataChangedReceivedundEventRaiseReceivedwurden zurOpcSubscriptionhinzugefügt. - Enumeration
OpcEventTypeund KlasseOpcEventTypesfür den vereinfachten Zugriff auf die verschiedenen Ereignistypen. - Unterstützung für unterschiedliche Zustandsautomaten- und Zustands-/Übergangsvariablen-Nodes.
- Das Ereignis
DialogRequestedwurde der KlasseOpcClienthinzugefügt, um die Verarbeitung von Instanzen vonOpcDialogConditionNodezu vereinfachen. - Unterstützung von Foundation-spezifischen Ereignistypen:
OpcConditionNode,OpcAcknowledgeableConditionNode,OpcDialogConditionNode,OpcAlarmConditionNode,OpcDiscreteAlarmNode,OpcLimitAlarmNode,OpcOffNormalAlarmNode,OpcSystemOffNormalAlarmNode,OpcTripAlarmNode,OpcExclusiveLimitAlarmNode,OpcNonExclusiveLimitAlarmNode,OpcExclusiveDeviationAlarmNode,OpcExclusiveLevelAlarmNode,OpcExclusiveRateOfChangeAlarmNode,OpcNonExclusiveDeviationAlarmNode,OpcNonExclusiveLevelAlarmNodeundOpcNonExclusiveRateOfChangeAlarmNode.
Behoben
- Die Methode
GetOutpuArgumentsvonOpcMethodNodeInfowurde inGetOutputArgumentsumbenannt. - 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
DataaufDataSet, vonDataItemaufDataSetItemund vonEventRaiseaufEventgeändert. OpcNodeId.ToStringformatiert die Informationen jetzt im FormatOpcNodeIdFormat.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.ReceivedDataChangewurde inOpcMonitoredItem.DataChangeReceivedumbenannt.OpcMonitoredItem.ReceivedEventRaisewurde inOpcMonitoredItem.EventRaiseReceivedumbenannt.
Kompatibilitätsbrüche durch Umbenennungen
OpcSubscribeEventRaise->OpcSubscribeEventOpcDataChangeEventArgs->OpcDataChangeReceivedEventArgsOpcDataChangeEventHandler->OpcDataChangeReceivedEventHandlerOpcEventRaiseEventArgs->OpcEventReceivedEventArgsOpcEventRaiseEventHandler->OpcEventReceivedEventHandlerOpcNotificationEventArgs->OpcNotificationReceivedEventArgsOpcNotificationEventHandler->OpcNotificationReceivedEventHandlerOpcDataChangeCallback->OpcDataChangeReceivedCallbackOpcEventRaiseCallback->OpcEventReceivedCallbackIOpcNotificationData->IOpcNotificationDataSetOpcNotificationData->OpcNotificationDataSetOpcNotificationDataCollection->OpcNotificationDataSetCollectionOpcNotificationDataReadOnlyCollection->OpcNotificationDataSetReadOnlyCollectionOpcNotificationDataItem->OpcNotificationDataSetItemOpcNotificationDataItemCollection->OpcNotificationDataSetItemCollectionOpcNotificationDataItemReadOnlyCollection->OpcNotificationDataSetItemReadOnlyCollectionOpcDataChange->OpcDataChangeSetOpcDataChangeItem->OpcDataChangeSetItemOpcEventRaise->OpcEventDataSetOpcEventRaiseItem->OpcEventDataSetItemOpcMonitoredItem.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
DebuggerDisplayAttributeinOpcVariableNodeundOpcNodeInfo. - Problem beim Lesen und Schreiben des Attributs DataType von
OpcVariableNodes.
Geändert
OpcVariableNodewurde als abstrakte Basisklasse festgelegt.- Mehrfache Node-Referenzen der Foundation wurden entfernt, um den Speicherbedarf zu senken.
Neu
- Erweiterung der Implementierung von
OpcVariableNodespeziell für Enumerations-Datentypen. - Neue Nodes
OpcTypeNodeundOpcDataTypeNode. DerOpcDataTypeNodeunterstü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 EigenschaftOpcTypeNodeInfo.IsEnum).
2.3.1.1 (freigegeben am 26.02.2018)
Behoben
- Problem beim Laden einer
OpcApplicationConfigurationaus einer Datei aufgrund des fehlenden Attributs DataContract an der KlasseOpcApplicationConfiguration, 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
ToStringinOpcEngineeringUnitInfoundOpcValueRange. - Eigenschaft
CommonCodeinOpcEngineeringUnitInfound statische MethodeGetCommonCode(int unitId). - Die
DefaultNamespaceUrivonOpcEngineeringUnitInfowird 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 AssemblyBouncyCastle.Crypto(mindestens Version 1.8.1.146) hinzugefügt werden. - Wenn eine Serveradresse mit dem Schema
httpsverwendet wird, muss dem Projekt ein Verweis auf die NuGet-PaketeMicrosoft.AspNetCore.Server.Kestrel(1.1.3) undMicrosoft.AspNetCore.Server.Kestrel.Https(1.1.3) hinzugefügt werden.
Neu
- Einführung des Datentyps Range als
OpcValueRange. - Einführung des Datentyps
EUInformationalsOpcEngineeringUnitInfo. - Einführung des neuen Node-Typs
AnalogItemTypealsOpcAnalogItemNode. - Unterstützung für
DataValues, die die Datentypen Range undEUInformationverwenden. - 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.
OpcTextwurde eingeführt, um lokalisierbare und für Menschen lesbare String-Werte darzustellen.
Behoben
- Der konfigurierte
OperationTimeoutwurde inOpcClient.Connect()nicht für die Discovery der Server-Endpunkte verwendet.
Geändert
- Die Implementierung von
OpcValue.ToStringwurde vereinfacht, sodass nur noch die Zeichenkettenullfür Null-Referenzen oderValue.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
CertificateValidationFailedin den KlassenOpcClientundOpcServer.
2.2.0.0 (freigegeben am 01.09.2017)
- Neu: Neue Methode
GetReferenceType, um den zugehörigenOpcReferenceTypefür eine gegebeneOpcNodeIddes Typs Reference zu ermitteln. - Geändert: Die Spezialbehandlung des Attributs DataType in
OpcNodeInfo.Attribute()wurde entfernt. Es wird also kein Wert vom TypOpcDataTypemehr bereitgestellt, sondern die datentypabhängigeOpcNodeId. - Neu: Grundlegende Unterstützung von Objekt-Nodes, erweiterte Unterstützung von Variablen-Nodes sowie generische Unterstützung von Typ-Nodes (einschließlich
ObjectTypes,VariableTypesundDataTypes) beim Browsen von Nodes. - Neu: Mit
OpcVariableNodeInfo,OpcObjectNodeInfoundOpcTypeNodeInfolä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
LicenseInfoin 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
RegisterAddressundUnregisterAddresssowie neue MethodeAddresses, um die verschiedenen Basisadressen einer Instanz vonOpcServerBasezu verwalten.
Behoben
- Falsche Bezeichnung
IsNodeAccessableimOpcNodeManagerinIsNodeAccessiblekorrigiert. - 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
OpcExceptionund in der Beschreibung einer Instanz vonOpcStatusbeziehungsweiseOpcResult, 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 derOpcCertificateManagererstellen 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
OpcNodeIdaus dem Paarstringundint32, bei dem derint32-Wert nicht als Namespace-Index der neuen NodeId verwendet wurde. - Behoben: Problem mit
OpcServerBase.CertificateundOpcClient.Certificate, wenn das Zertifikat nicht imApplicationStoredes Zertifikatspeichers gespeichert ist. - Neu: Neue Klassen
OpcClientCertificateStores(verfügbar überOpcClient.CertificateStores) undOpcServerCertificateStores(verfügbar überOpcServerBase.CertificateStores), um eine flüssige API für Client und Server zum Verwalten und Pflegen ihrer Zertifikatspeicher bereitzustellen. - Neu: Neue Klasse
OpcClientServices(verfügbar überOpcClient.Services), um eine dienstbasierte API zum Aufbau der verschiedenen vom Client genutzten Dienste bereitzustellen. - Entfernt:
OpcValue.SourceLabelundOpcValue.ServerLabel. Damit existiert auch die KlasseOpcValueLabelnicht mehr. Die von ihr bereitgestellten Eigenschaften stellt jetzt direkt die KlasseOpcValuebereit. Verwenden Sie die EigenschaftenOpcValue.ServerXyundOpcValue.SourceXy. - Neu:
IOpcWriteNodesServiceunterstützt jetzt die automatische Ermittlung des Werts, den der Server für denSourceTimestampeinesOpcValueerwartet. Die automatische Ermittlung lässt sich deaktivieren, indem Sie über die EigenschaftIOpcWriteNodesService.TimestampSourceeine expliziteOpcTimestampSourcefestlegen. Hinweis: Auf die Instanz vonIOpcWriteNodesServicegreifen Sie über die EigenschaftOpcClient.Services.WriteNodeszu. - Neu: Die veraltete Methode
ResolveNodeIdwird nicht mehr verwendet. Stattdessen gibt es die neue MethodeResolvean derOpcNodeId, 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 EigenschaftAutoCreateCertificatemöglich. - Neu: Neue Eigenschaften
OpcClient.Certificate(um direkt ein benutzerdefiniertes Clientzertifikat festzulegen) undOpcClient.Security(um die Sicherheitsoptionen des Clients in einer Klasse einzurichten). - Geändert: Die Eigenschaft
OpcSecurity.Policieswurde inOpcSecurity.EndpointPoliciesumbenannt, um dem Modell vonOpcClientSecurity.EndpointPolicyzu entsprechen. - Geändert: Der Standardwert von
OpcCertificateManager.AutoCreateCertificateist jetzttrue. - Neu: Neue Eigenschaften in
Opc.UaFx.Server.OpcSecurity:AutoAcceptUntrustedCertificatesundAutoCreateCertificate. - Neu: Neue Eigenschaft
OpcServer.Certificate, um demselben API-Modell zu entsprechen, das derOpcClientimplementiert. - 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
AutoAcceptUntrustedCertificatesin derSecurityConfigurationist jetzttrue. - 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.PreferredPolicynachOpcClient.Security.EndpointPolicy. - Verschoben: Eigenschaft
OpcClient.UseDomainChecksnachOpcClient.Security.VerifyServersCertificateDomains, Standardwert auffalsegeändert. - Verschoben: Eigenschaft
OpcClient.UserIdentitynachOpcClient.Security.UserIdentity, Typ vom Foundation-TypIUserIdentityinOpcUserIdentitygeändert. - Verschoben: Eigenschaft
OpcClient.UseOnlySecureEndpointsnachOpcClient.Security.UseOnlySecureEndpoints, Standardwert auffalsegeändert. - Entfernt: Veraltete Eigenschaft
OpcClient.UseAutoNodeIdResolution. - Neu: Überarbeitung der Ableitungen von
OpcIdentity:OpcCertificateIdentity,OpcWindowsIdentity,OpcServerIdentityundOpcClientIdentitysind jetzt Ableitungen vonOpcUserIdentity(bisher verwendeten sie nurOpcIdentityals Basisklasse). Außerdem wurde ihr Konstruktionsverhalten geändert, um die Erstellung von Identitäten auf Client- und Serverseite zu vereinfachen. - Behoben:
OpcRequestType.Callwar bisher alsOpcRequestType.Canceldefiniert. Dadurch funktionierteOpcRequestType.Callnicht, weil es wieOpcRequestType.Cancelverwendet wurde. - Entfernt: Eigenschaft
OpcCertificateManager.AutoCreateCertificate, weil sie jetzt je Instanz überOpcClient.Security.AutoCreateCertificateoderOpcServer.Security.AutoCreateCertificateverwendet wird. Diese Eigenschaften sind standardmäßig ebenfalls auftruegesetzt. - Entfernt: Eigenschaft
OpcServer.Security.Owner, um überflüssige Informationen zu reduzieren und die API zu vereinfachen. - Umbenannt:
Server.OpcSecurityinServer.OpcServerSecurity. - Umbenannt:
OpcServerSecurity.AnonymousinOpcServerSecurity.AnonymousAcl. - Umbenannt:
OpcServerSecurity.CertificateinOpcServerSecurity.CertificateAcl. - Umbenannt:
OpcServerSecurity.IssuedTokeninOpcServerSecurity.IssuedTokenAcl. - Umbenannt:
OpcServerSecurity.UserNameinOpcServerSecurity.UserNameAcl. - Umbenannt:
OpcClient.PreferredLocalesinOpcClient.Locales. - Umbenannt:
OpcClient.ReceivedNotificationinOpcClient.NotificationReceived. - Umbenannt:
OpcClient.OnReceivedNotificationinOpcClient.OnNotificationReceived. - Umbenannt:
OpcSubscription.ReceivedNotificationinOpcSubscription.NotificationReceived. - Umbenannt:
OpcSubscription.OnReceivedNotificationinOpcSubscription.OnNotificationReceived. - Verschoben:
OpcNodeCommandvonOpc.UaFx.ClientnachOpc.UaFx.Services. - Verschoben:
OpcNodeAttributeCommandvonOpc.UaFx.ClientnachOpc.UaFx.Services. - Umbenannt:
OpcNodeCommandinOpcNodeServiceCommand. - Umbenannt:
OpcNodeAttributeCommandinOpcNodeAttributeServiceCommand. - Umbenannt: Member von
OpcStatusCodemit den PräfixenBad,GoodundUncertain, 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
StartTimeundEndTimenicht gleichMinDatesind). 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
IOpcNodewurde an die aktuelle öffentliche API vonOpcNodeangepasst. - Neue Methode
Children():IEnumerable<IOpcNode>inIOpcNode, 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.ReadAllTextundOpcFile.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
ExpandedNodeIdto a NodeId. UseExpandedNodeId.ToNodeIdinstead.“ führte.
1.6.2.0 (freigegeben am 04.10.2016)
- Neu: Neue Methode
CreateTempCertificate, die auch verwendet wird, wennAutoCreateCertificateauftruegesetzt 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
OpcValuesind damit überflüssig. - Neu: Neue Ableitung
OpcBrowseNodeContextspeziell für das Browsen von Nodes. Der bisherigeOpcNodeContextwurde auf eine eher generische Implementierung für weitere Ableitungen reduziert. Der neueOpcBrowseNodeContextenthä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 durchTangegebenen Typ umgewandelt wird. - Neu: Neue Klasse
OpcResult, die Instanzen vonServiceResultrepräsentiert. - Neu: Neue Unterklasse
OpcMethodContextvonOpcContext, 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
OpcFileNodeaus Clientsicht. Das umfasst eine einfache 1:1-API-Schicht in der KlasseOpcFileMethodsund einSafeOpcFileHandle, das sicherstellt, dass zugeteilte Datei-Handles freigegeben werden. Dazu kommen die KlasseOpcFile, die OPC-basierte Dienstmethoden analog zur KlasseSystem.IO.Fileimplementiert, die KlasseOpcFileInfo, die ein OPC-basiertes Objekt analog zur KlasseSystem.IO.FileInfoimplementiert, und die KlasseOpcFileStream, die einen OPC-basierten Datenstrom analog zuSystem.IO.FileStreamimplementiert.OpcFileStreamleitet von der KlasseSystem.IO.Streamab und lässt sich daher mit allen KlassenStreamReaderundStreamWriterverwenden, die das .NET Framework bereitstellt. - Neu: Neue Klassen
OpcPropertyNodeundOpcPropertyNode<T>. - Geändert: Der Typ
OpcVariableValuebenötigt jetzt einen generischen Typparameter für den repräsentierten Werttyp. Die KlasseOpcVariableNodewurde entsprechend angepasst. - Neu: Neue Klasse
OpcFileNodeeinschließlich ihrer Kind-Nodes wie der Methoden-NodesOpen,Close,GetPosition,SetPosition,ReadundWrite.
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
ChildinOpcNodeInfo, um die Nachfolger eines Nodes über seinenOpcNameabzurufen. Das umfasst BrowseName, DisplayName undSymbolicNameeines Nodes. - Neue Methode
ParentinOpcNodeInfo, um die Vorfahren eines Nodes über seinenOpcNameabzurufen. Das umfasst BrowseName, DisplayName undSymbolicNameeines Nodes. - Neue Methode
ChildreninOpcNodeInfo, um die Nachfolger eines Nodes einer bestimmtenOpcNodeCategoryabzurufen. - Neue Methode
ParentsinOpcNodeInfo, um die Vorfahren eines Nodes einer bestimmtenOpcNodeCategoryabzurufen.
1.5.11.5 (freigegeben am 13.06.2016)
Neu
- Impliziter Cast-Operator für
ExpandedNodeIds. - Zusätzliche Überladung der Methode
GetinOpcNamespace, um Node-Namespaces über URI oder Index abzurufen.
Behoben
- Problem mit
ExpandedNodeIdsinOpcValues, 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
ChangedinOpcStatusimplementiert.
Behoben
- Problem mit nicht synchronisiertem OPC-Status zwischen SDK und Foundation Stack (in
OpcValueundOpcVariableNode).
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 vonOpcNodeManager,OpcClientundOpcServer. Diese Schnittstelle stellt eine spät gebundene Namespace-Auflösung bereit, nachdem derOpcServergestartet oder derOpcClientverbunden wurde. JedeOpcNodeId, deren Namespace aufgelöst wurde, stellt die voll qualifizierte URL des Namespace zusammen mit der NodeId bereit. - Neu: Eigenschaft
OpcNodeId.Namespace, die den zugehörigenOpcNamespacebereitstellt. - Geändert:
OpcAttribute.Historizingwurde inOpcAttribute.IsHistorizingumbenannt. - Neu:
OpcNode: Überwachung von Node-Änderungen über die EigenschaftenHasPendingChangesundPendingChangeseinschließlich der MethodeIsChangePending. - Neu: Unterstützung der History für
OpcVariableNodeund seine Unterklassen. - Neu: Weitere Konstruktorüberladungen von
OpcStatusCollection, um eine neue Instanz überOpcStatusCodesdeutlich 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:
IOpcReadNodesHistoryServiceundIOpcUpdateNodesHistoryService. - Neu: HDA-Befehle:
OpcCreateNodeHistory,OpcDeleteNodeHistory,OpcDeleteNodeHistoryAtTime,OpcDeleteNodeHistoryModified,OpcReadNodeHistory,OpcReplaceNodeHistoryundOpcUpdateNodeHistory. Alle davon sind Unterklassen vonOpcNodeHistoryCommand.
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
BreakDetectedwird 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
ObjectDisposedExceptionder 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
PublishingIntervalin der KlasseOpcSubscription.
1.5.7.0 (freigegeben am 09.01.2016)
- Behoben: Problem mit einer
NullReferenceExceptioninOpcCertificateManager.CreateCertificate, wenn alsapplicationUrieine Null-Referenz (Nothing in Visual Basic) übergeben wird. - Behoben: Problem mit nicht eindeutig generierten
OpcNodeIdsfürInputArgumentsundOutputArgumentsder Instanzen vonOpcMethodNode. Dadurch wurden beim Browsen oder Lesen der Eigenschaften der Methodenargumente nur die Argumente des zuletzt bereitgestelltenOpcMethodNodeveröffentlicht. - Geändert: Die
OpcNodeIdfür die NodesInputArgumentundOutputArgumentvon Instanzen vonOpcMethodNode. Weitere Informationen enthält der vorherige Eintrag. - Geändert: Die Klasse
OpcReadOnlyNodeCollectionstellt jetzt Instanzen vonIOpcNodestatt der internen Instanzen vonNodeStateder Foundation bereit. - Neu: Eine
OpcNodeIdkann jetzt aus Instanzen vonOpcNameerstellt werden, derenSymbolicNameeine Null-Referenz (Nothing in Visual Basic) ist. In diesem Fall wird statt desSymbolicNameder BrowseName verwendet. - Neu: Die
OpcReadNodesRequestliefert jetzt standardmäßig beide Zeitstempel (Quelle und Server) zurück. - Neu: Neue Methoden in
OpcNodeManager:AddNode,RemoveNodeundIsNodeAccessable. - 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
TimeStampbeim 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
ChangePasswordinOpcServerIdentity, um das Benutzerpasswort nach dem Anlegen einer Identität zu ändern. - Neue geschützte Eigenschaft
SystemContextimOpcNodeManager, um einen alternativen Kontext bereitzustellen, in dem systeminterne Änderungen vorgenommen werden können. - Die Klasse
OpcWriteNodesetzt jetzt beim Schreiben eines Nodes automatisch den Quellzeitstempel.
Geändert
- Das
OpcValueLabelist jetzt nicht mehr als Struktur, sondern als Klasse definiert.
1.5.6.6 (freigegeben am 16.12.2015)
Neu
- Neue Methoden
AddNodeundRemoveNodeimOpcNodeManager, um das dynamische Bereitstellen von Nodes nach dem Aufruf vonCreateNodeszu unterstützen.
1.5.6.5 (freigegeben am 10.12.2015)
Neu
- Zusätzliche Sitzungsinformationen in
OpcOperationContextbeim Aufruf vonIsNodeAccessableimOpcNodeManager.
1.5.6.4 (freigegeben am 09.12.2015)
Neu
- Neue Methode
IsNodeAccessableimOpcNodeManager, 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
OpcValueals 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. DieOpcNodeIdwird 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
UserNamegleichzeitig aktiviert sind.
Neu
- Zusätzliche Überladungen von
CreateCertificateimOpcCertificateManager.
1.5.6.0 (freigegeben am 07.09.2015)
- Geändert: Die Eigenschaft
BuiltInTypewurde inOpcAttributeInfoinDataTypeumbenannt. - Neu: Das Browsen des Attributs DataType liefert jetzt einen Wert der Enumeration
OpcDataType. - Neu:
OpcValueals Ersatz für die KlasseDataValue. - Neu: Neue statische Methode
CreateCertificateimOpcCertificateManager, um Zertifikate ohne weitere Konfiguration zu erstellen. - Neu: Die Klasse
OpcStatusstellt jetzt die neue EnumerationOpcStatusCodeals Code bereit. - Neu: Unterstützung der folgenden
OpcDataTypes:ExtensionObject,ValueundVariant. - Geändert:
DataValuewurde inOpcDataTypesinValueumbenannt. - Neu: Unterstützung für den direkten Beginn des Browsens bei einem Methoden-Node.
- Geändert:
OpcDiscoveryClientwurde in den NamespaceOpc.UaFx.Clientverschoben. - Behoben: Problem mit der
NullReferenceExceptionbeim 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
OpcVariableClassin 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
UserNamegleichzeitig aktiviert sind.
Neu
- Das Member
DefaultvonOpcAccessControlModewurde entfernt und seine Verwendung durchBlacklistersetzt.
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
OpcSessionstellt jetzt die EigenschaftenUsedIdentityundSuppliedIdentitybereit. - Neue Methode
UpdateinOpcStatus. - Der
OpcContextstellt jetzt eine EigenschaftIdentitybereit. - Neue Klasse
OpcMonitoredItemim Server-Namespace. OnMonitoredItemCreated/Deleted/Modifiedstellt jetzt eigene Klassen statt der Klassen der Foundation bereit.
Geändert
- Die Klassen
IdentityundImpersonationContextwurden vom NamespaceOpc.UaFx.Serverin den NamespaceOpc.UaFxverschoben.
1.5.2.0 (freigegeben am 18.06.2015)
Neu
- Kein automatisches Aktualisieren des Endpunkts vor dem Verbinden, wenn im
OpcClientein 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
StateChangedinOpcClient.
1.5.1.1 (freigegeben am 16.06.2015)
Neu
- Neue Methode
InvokeServiceinOpcClient, 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
SaveCertificateimOpcCertificateManager. - Überarbeitung der kompletten Argumentbindung, um auch
out- undref-Parameter inOpcMethodNodezu unterstützen. - Unterstützung von
ByRef-Typen inOpcMethodNode. - Neues lokales Server-Ereignis
CertificateValidationFailed, um benutzerdefinierte Aktionen bei fehlgeschlagener Zertifikatvalidierung zu unterstützen. - Neue Klasse
OpcMethodNodeInfo, abgeleitet vonOpcNodeInfo, zum Browsen der Argumente von Methoden-Nodes. - Neue Klassen
OpcCertificateValidationFailedEventArgsundOpcCertificateValidationFailedEventHandler. - Neue Eigenschaft
DataTypeinOpcDataVariableNode. - Neue Eigenschaften
InputArgumentsundOutputArgumentsin der KlasseOpcMethodNode. Außerdem erweiterte Unterstützung von Instanzen vonOpcArgumentmit demOpcArgumentAttributein 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
OpcDiscoveryClientund die benutzerdefiniert bevorzugteOpcSecurityPolicy. - Neu: Verbesserte automatische Vervollständigung der Konfiguration abhängig vom Anwendungstyp.
- Neu: Einführung der Transportprofilinformationen.
- Neu: Die Konfiguration der
UserTokenPolicieswurde beim Start in denOpcSerververschoben, und die Nachvollziehbarkeit der EigenschaftIsEnabledwurde 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
CLSCompliantzu 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 vonDiscoveryServerConfigurations. - Neu: Weitere Vereinfachung der API.
- Neu: Einführung von
OpcStatusals Ersatz fürStatusCode. - Neu:
OpcDiscoveryClientverwendet 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.AdvancedundOpc.ServerFx.AdvancedzuOpc.UaFx.Advanced.
1.0
1.0.0.0 (freigegeben am 11.01.2015)
Neu
- Erstellung von
Opc.ClientFx.AdvancedundOpc.ServerFx.Advanced.

