Referenz
Auf neue Version umsteigen
Alle Änderungen des OPC UA .NET SDK, die beim Umstieg auf eine neuere Version bestehenden Code betreffen, gefiltert nach Von- und Auf-Version.
Referenz
Auf neue Version umsteigen
Diese Seite listet alle Änderungen, die beim Umstieg auf eine neuere Version des OPC UA .NET SDK bestehenden Code betreffen können: geänderte Schnittstellen und geändertes Verhalten, Umbenennungen und neue Voraussetzungen. Wählen Sie die Version, die Sie heute einsetzen, und die Version, auf die Sie umsteigen. Die Liste zeigt dann die Änderungen dazwischen in der Reihenfolge, in der sie hinzugekommen sind.
Die Einträge stammen aus der Versionshistorie. Die Versionsnummer über jedem Abschnitt führt zu den vollständigen Release-Notizen der Version, einschließlich neuer Funktionen und Fehlerbehebungen.
1.5
- Die Klassen
IdentityundImpersonationContextwurden vom NamespaceOpc.UaFx.Serverin den NamespaceOpc.UaFxverschoben. - Das
OpcValueLabelist jetzt nicht mehr als Struktur, sondern als Klasse definiert.
1.6
- Implizite Interpretationen einer numerischen NodeId, die als String codiert ist, wurden entfernt.
2.2
- Die Implementierung von
OpcValue.ToStringwurde vereinfacht, sodass nur noch die Zeichenkettenullfür Null-Referenzen oderValue.ToString()geliefert wird.
2.3
- 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.
- 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. OpcVariableNodewurde als abstrakte Basisklasse festgelegt.- Mehrfache Node-Referenzen der Foundation wurden entfernt, um den Speicherbedarf zu senken.
2.5
- 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.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
- Beispielprojekte wurden auf die C#-Sprachversion 6.0 zurückgestuft, um sicherzustellen, dass die Beispiele auch in älteren Versionen von Visual Studio kompilierbar sind.
IsNodeAccessible(..., IOpcNode node)wurde zuIsNodeAccessible(..., IOpcNodeInfo node)geändert.OpcNode.BeforeApplyChangesundOpcNode.AfterApplyChangeswerden nur noch ausgelöst, wenn Änderungen bestehen (sieheOpcNode.HasPendingChanges).- 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. - 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.
2.6
- 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.7
- 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.- Die Implementierung der Klassen
OpcMonitoredItemundOpcSubscriptionwurde aktualisiert: Einigeint-basierte Eigenschaften wurden auflongumgestellt, um die zugrunde liegendenuint-Eigenschaften des Foundation StacksCLSCompliantanzubieten. - 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. OpcMonitoredItem.AutoFlushCachewurde durch die neue EigenschaftOpcMonitoredItem.QueueModeersetzt, um den verwendeten Mechanismus beim Überlauf der Benachrichtigungsqueue klarer auszudrücken.
2.8
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. - Die Eigenschaft
OpcAutomatism.UseDynamichat ab sofort den Standardwertfalse. Damit dasOpcDataObjectgenutzt werden kann, muss diese Eigenschaft oder die EigenschaftOpcClient.UseDynamicauftruegesetzt werden. - Angaben zu
iconUrlundlicenseUrlin NuGet-Paketen aufgrund ihrer Abkündigung angepasst. - Explizit kodierte Informationen, bekannt als
EncodingMaskeines strukturierten Datentyps, werden jetzt über den neu eingeführten TypOpc.UaFx.Bitstatt überSystem.Booleanabgebildet. - Ü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).
2.9
- 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.
2.10
OpcNode.OnAfterApplyChangesundOpcNode.OnBeforeApplyChangesnutzen jetztOpcNodeChangesEventArgsstattEventArgs.OpcNode.AfterApplyChangesundOpcNode.BeforeApplyChangesübergeben jetztOpcNodeChangesEventArgsstattEventArgsan Ereignishandler.
2.11
- 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). - 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. - Der Datentyp der Eigenschaften
OpcNode.Read/WriteDescriptionCallbackwurde vonStringaufOpcTextgeändert. OpcDataChangeDataSetItem.ClientIDvonInt32inInt64geändert, um dem beiOpcMonitoredItem.ClientIDverwendeten Typ zu entsprechen.
2.12
- 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). - Bidirektionale Verweise zwischen DataTypeDescription-, DataTypeEncoding- und DataType-Nodes werden jetzt unidirektional exportiert (mit den Standard-Exportoptionen).
2.14
- Doppelte Verweise auf
DataTypeNodesbei Verwendung der KlasseOpcAddressSpacewurden entfernt.
2.18
- 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. OpcNodeIdvergleicht NodeIds jetzt gemäß der OPC-UA-Spezifikation unter Berücksichtigung der Groß- und Kleinschreibung von Identifier und Namespace.OpcClassicDiscoveryClientverwendet jetzt dieOpcException, um stackbezogene Ausnahmen bereitzustellen.
2.19
- 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.
OpcFileReadMethodNode.FileReadCallbackundOpcFileReadMethodNode.FileReadExCallbackgeben jetzt einen ByteString statt eines Byte-Arrays zurück.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). - 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[]. - Möglicher Bruch:
IOpcReadOnlyNodeDataStoreerfordert jetzt auch die Implementierung vonIOpcNamespaceResolver. - Unnötige Zeilenumbrüche in der String-Darstellung von Instanzen von
OpcExceptionwurden entfernt.
2.20
OpcInstanceNodebestimmt jetzt seineDefaultTypeDefinitionIdanhand des Node-Typs, der zum Erstellen des Instanz-Nodes verwendet wird.OpcMemberOriginsdefiniert jetzt ein zusätzliches Enum-MemberMethodfür Methoden.
2.24
- 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.
2.25
- 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.
2.28
- Die Deaktivierung von
OpcAutomatism.UseDynamicTypeRegistrationführte zu einer verzögerten dynamischen Typregistrierung, wenn ein benutzerdefinierter Datentyp manuell registriert wurde.
2.29
OpcNode.AddNotifierwird bei anderen Typen alsOpcObjectNodesund deren Unterklassen nicht mehr unterstützt.
2.30
- 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).
2.31
- 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.
2.33
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.41
- Die Benutzerauthentifizierung im
OpcServerwird jetzt nur noch einmal währendActivateSessiondurchgeführt, statt für jede Anfrage einzeln. - Die Abhängigkeit
Microsoft.AspNetCore.Server.Kestrel.Corewurde auf Version 2.1.25 aktualisiert, um eine Sicherheitslücke zu beheben.
2.42
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.- Die Abhängigkeit
Portable.BouncyCastlewurde auf Version 1.9.0 aktualisiert, um eine Sicherheitslücke zu beheben.
2.50
- 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(). - 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.- 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.
- Die Eigenschaft
Modelund die übrige API zuOpcNodeModelwurden vonOpcInstanceNodenachOpcNodeverschoben, um eine korrekte Initialisierung der Nodes sicherzustellen. - 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.
2.51
- 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.
2.54
- 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.
2.55
- 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.
2.58
- 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. - 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. - 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. 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. - 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. 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.- 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. OpcClient.ReconnectTimeoutundDefaultReconnectTimeoutsind als veraltet (obsolete) gekennzeichnet. Verwenden Sie stattdessenReconnectIntervalundDefaultReconnectInterval. Code, der sie verwendet, erhält eine Compiler-Warnung und mitTreatWarningsAsErrorseinen Compiler-Fehler.- 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. 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.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.- 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 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 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.
2.59
- 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. - 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. - 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. 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.- 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. OpcEventContextentfällt; das SDK hat diesen Typ nie erstellt oder zurückgegeben. Code, derOpcEventContextverwendet, lässt sich nicht mehr kompilieren.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. 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.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.- 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. OpcClient.BrowseNode(OpcBrowseNode)undOpcClient.BrowseNodeslösen für einen Command, dernullist, eineArgumentNullExceptionaus. Bisher wurde eineNullReferenceExceptionausgelöst. Code, der dieNullReferenceExceptionabfängt, muss jetzt dieArgumentNullExceptionabfangen.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.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.- 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. - 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. OpcNode.ReadAttributeValueCoreundOpcNode.WriteAttributeValueCorelösen für einen Wert, dernullist, eineArgumentNullExceptionaus. Bisher wurde eineNullReferenceExceptionausgelöst. Eine abgeleitete Klasse, die dieNullReferenceExceptionabfängt, muss jetzt dieArgumentNullExceptionabfangen.- 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. OpcClient.CreateSubscriptionlöst eineOpcExceptionmitBadServerNotConnectedaus, wenn der Client nicht verbunden oder bereits getrennt wurde. Bisher wurde eineNullReferenceExceptionausgelöst. Code, der dieNullReferenceExceptionabfängt, muss jetzt dieOpcExceptionabfangen.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.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.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.- 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. 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.- 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. - 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
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
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. - 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. - 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. - 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 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.

