Skip to content

Reference

Version history

All releases of the OPC UA .NET SDK with new features, changes, and fixes, grouped by version series and minor version.

This content was machine translated and may contain errors. Read in German

Reference

Version history ​

The releases are grouped by version series and minor version. The releases of the current version 2.59 are expanded; older releases can be expanded one by one.

The Upgrade to a new version page summarizes which changes affect existing code when you upgrade from an older version.

2.50–2.59 (2025–2026) ​

2.59 ​

API changes: 3 added, 2 removed, 3 changed

2.59.0.0 (released on November 9, 2026) ​

New

  • Introduced OpcObjectTypes.ServerCapabilitiesType and OpcObjectTypes.ServerDiagnosticsType, which identify the object types ServerCapabilitiesType and ServerDiagnosticsType and provide the identifiers of the nodes related to them. Before, the properties of the classes OpcObjectTypes.OpcServerCapabilitiesType and OpcObjectTypes.OpcServerDiagnosticsType were not reachable, because no instance of them was provided.
  • Introduced OpcModifiedNodeHistory, which keeps the modified values (OpcModifiedHistoryValue) of a node, including several modifications of a value at the same timestamp. The values are sorted by their timestamp and, for the same timestamp, from the most recent to the oldest modification. When the capacity is reached, the oldest modification is removed.

Changed

  • Breaking: Replaced the outdated dependency Portable.BouncyCastle (version 1.9.0) with BouncyCastle.Cryptography (version 2.7.0), whose assembly is named BouncyCastle.Cryptography.dll instead of BouncyCastle.Crypto.dll. CertificateFactoryRandomGenerator additionally provides AddSeedMaterial(ReadOnlySpan<byte>) and NextBytes(Span<byte>), which the IRandomGenerator of BouncyCastle.Cryptography declares for .NET 6 and later. Applications that deploy the assemblies themselves must deploy BouncyCastle.Cryptography.dll instead of BouncyCastle.Crypto.dll. Applications that reference Portable.BouncyCastle themselves and use its types must change to BouncyCastle.Cryptography, since both packages provide the same types.
  • Removed the dependency on System.Management.
  • Breaking: The operators <, <=, >, >=, and == of OpcFilterOperand throw an ArgumentNullException for a left operand that is null, and the constructors of OpcContentFilterElement throw an ArgumentNullException for operands that are null. Before, a NullReferenceException was thrown. Code that catches the NullReferenceException must catch the ArgumentNullException instead.
  • Breaking: Removed the class OpcContentFilterElementFactory, which had no public members. Code that names the type no longer compiles; an instance of the type could never be obtained.
  • Breaking: EndpointDescriptionExtensions.SetEndpointPolicy throws an ArgumentNullException for an endpoint policy that is null, and the indexer of OpcSecurityPolicyCollection throws an ArgumentNullException when null is set. Before, SetEndpointPolicy threw a NullReferenceException and the indexer stored an entry without a policy. Code that catches the NullReferenceException must catch the ArgumentNullException instead, and code that sets null using the indexer now fails.
  • Breaking: The CertificateRequested event of OpcServer and OpcClient also occurs when the application certificate exists but is not valid, with the reason Invalid, UseNotAllowed, Revoked, TimeInvalid, IssuerUseNotAllowed, IssuerRevoked, or IssuerTimeInvalid (for example TimeInvalid for an expired certificate). The certificate is never replaced automatically (AutoCreateCertificate of the event data is false); unless the handler provides an alternative certificate, it remains in use and a trace entry is written. Before, such a certificate was used without notice. The event now also occurs when a server starts or a client connects with an invalid application certificate, so handlers that handle each reason like a missing certificate are called in this case too.
  • Breaking: Removed OpcEventContext, which the SDK never created or returned. Code that references OpcEventContext no longer compiles.
  • Breaking: ExtensionObjectExtensions.To<T> throws an ArgumentNullException instead of a NullReferenceException for an extension object that is null, and the Children of OpcAddObjectTypeNode and OpcAddVariableTypeNode throw an ArgumentNullException instead of a NullReferenceException when a command that is null is added or set. Code that catches the NullReferenceException must catch the ArgumentNullException instead.
  • A custom IOpcNodeHistoryProvider should also return the value directly before and the value directly after the requested time range, so that the server can interpolate values when the history is read at specific times or processed. Otherwise such reads still result in BadNoData.
  • Breaking: OpcNodeHistory<T> uses -1 (unlimited) as its default capacity instead of 0, with which each call to Add failed. A capacity of 0 or less than -1 is now rejected with an ArgumentOutOfRangeException, also by the constructors of OpcNodeHistorian. Code that passes a capacity of 0 (for example new OpcNodeHistory<T>(0, values)) now fails with an ArgumentOutOfRangeException.
  • Breaking: OpcNodeHistorian.ModifiedHistory is an OpcModifiedNodeHistory instead of an OpcNodeHistory<OpcModifiedHistoryValue>. Code that uses the property as an OpcNodeHistory<OpcModifiedHistoryValue> must be changed: GetValues(DateTime) replaces the indexer by timestamp, while RemoveAt(DateTime), Replace, and the Replaced event are no longer available. Code compiled against a previous version must be recompiled.
  • Breaking: Reading (for example with OpcClient.ReadNodeHistoryModified) and deleting (for example with OpcClient.DeleteNodeHistoryModified) the modified history of an OpcNodeHistorian refer to the timestamps of the values instead of the modification times. Several modifications of a value are returned from the most recent to the oldest one, also when reading backward. Code that reads or deletes the modified history using a time range of modification times now receives or deletes other values.
  • Breaking: OpcClient.BrowseNode(OpcBrowseNode) and OpcClient.BrowseNodes throw an ArgumentNullException for a command that is null. Before, a NullReferenceException was thrown. Code that catches the NullReferenceException must catch the ArgumentNullException instead.
  • Breaking: OpcClient.CallFunc throws an InvalidCastException if the first output argument is null and the result type is a non-nullable value type. Before, a NullReferenceException was thrown. Code that catches the NullReferenceException must catch the InvalidCastException instead.
  • Breaking: OpcClient.CallMethods throws an ArgumentNullException for a command that is null. Before, such a command was skipped, so that the results of the following commands were returned at the index of the previous command, and a call of commands that are all null failed with an OpcException stating BadNothingToDo. Code that passes a command that is null now fails instead of receiving shifted results.
  • Breaking: The single-command overloads OpcClient.CallMethod(OpcCallMethod), ReadNodeHistory(..., OpcReadNodeHistory), CreateNodeHistory, ReplaceNodeHistory, UpdateNodeHistory, DeleteNodeHistory, DeleteNodeHistoryAtTime, and DeleteNodeHistoryModified throw an ArgumentNullException with the ParamName command for a command that is null. Before, the ParamName stated commands.Item, and CallMethod(OpcCallMethod) failed with an OpcException stating BadNothingToDo. Code that catches the OpcException of CallMethod(OpcCallMethod) for a command that is null must catch the ArgumentNullException instead.
  • Breaking: The OpcServer constructors that take a sequence of nodes throw an ArgumentNullException for a node that is null. Before, OpcServer.Start() failed with an OpcException. The exception now occurs when the server is constructed and is an ArgumentNullException instead of an OpcException.
  • Breaking: OpcNode.ReadAttributeValueCore and OpcNode.WriteAttributeValueCore throw an ArgumentNullException for a value that is null. Before, a NullReferenceException was thrown. A derived class that catches the NullReferenceException must catch the ArgumentNullException instead.
  • Breaking: The service requests built from commands (for example OpcCallMethodsRequest, OpcReadNodesRequest, or OpcWriteNodesRequest) throw an ArgumentNullException for a command that is null. Before, such a command was skipped, so that the results of the following commands were assigned to the wrong command. Code that passes a command that is null now fails instead of receiving shifted results.
  • Breaking: OpcClient.CreateSubscription throws an OpcException stating BadServerNotConnected when the client has not been connected or has been disconnected. Before, a NullReferenceException was thrown. Code that catches the NullReferenceException must catch the OpcException instead.
  • Breaking: OpcEventFilterFactory.Select throws an ArgumentNullException for operands that are null. Before, a NullReferenceException was thrown while the client was connected. Code that catches the NullReferenceException must catch the ArgumentNullException instead.
  • Breaking: OpcEventFilterConstrainedFactory.Where combines the specified constraint with the constraint of the factory using a logical AND, like a single Where with both constraints combined using the & operator. Before, the elements of the specified constraint were only appended, so that the root element of the filter was still the first constraint and element operands of the appended constraint referred to wrong elements. An event filter built using chained Where calls now restricts the events by all constraints, so that a MonitoredItem may receive fewer events than before.
  • Breaking: OpcClientApplication.Exit disconnects the client also in the states Connecting, Reconnecting, and Reconnected (the state the client takes after a reconnect with the same session); while the client connects, Exit waits until connecting has completed. In a non-interactive environment, Exit also ends Run if the client has already been disconnected, for example because reconnecting failed. Before, Exit did nothing in these states, so that the client stayed connected or kept reconnecting and Run did not return in a non-interactive environment (for example a service did not stop). The events Exiting and Exited are now raised in the states Connecting, Reconnecting, and Reconnected as well.
  • Breaking: The constructors of OpcClientApplication, OpcServerApplication, and OpcServerServiceApplication check their arguments before the application is registered for the current thread. Before, a constructor that threw an ArgumentNullException left the failed instance registered, so that OpcApplication.Current returned it and the next constructor on the same thread threw an InvalidOperationException until the instance was garbage collected. After a failed construction, OpcApplication.Current now returns null instead of the failed instance.
  • An application that has been garbage collected without a call of Exit no longer prevents the creation of the next application on the same thread. Before, the next constructor threw an ArgumentException.
  • Applications can be created and exited on several threads at the same time. Before, this could corrupt the registration, so that OpcApplication.Current returned the application of another thread or an exception was thrown.
  • Breaking: OpcServerApplication.Exit stops the server also in the state Suspended. Before, Exit did nothing in this state, so that the server stayed suspended and Run did not return in a non-interactive environment. The events Exiting and Exited are now raised in this state as well.
  • OpcNodeManager.SyncRoot, GetNode(string), and IsNodeReadyToPublish throw an InvalidOperationException when the server using the node manager has not yet been started, like the other members of the node manager that require a started server. Before, a NullReferenceException was thrown.
  • OpcClient.BrowseNode and BrowseNodes use OpcBrowseNode.IncludeSubtypes once it has been set, as the Browse service does. A command without the value set follows the subtypes of its reference types as before.
  • Breaking: The HTTPS endpoints of OpcServer let the operating system choose the TLS versions instead of offering TLS 1.0, 1.1, and 1.2. Clients that only support TLS 1.0 or 1.1 can no longer connect over HTTPS where the operating system has disabled these versions.

Fixed

  • Issue with the operators & and | of OpcContentFilterElement combining an element with an OpcContentFilter created using its constructor (for example new OpcContentFilter(element1) & element2), which failed with a NullReferenceException. The element is now combined with the existing elements of the filter.
  • Breaking: Issue with OpcFilterOperand.Between, which passed the operands in the order lower bound, operand, upper bound, so that, for example, a.Between(1, 5) determined whether 1 is between a and 5 instead of whether a is between 1 and 5. The operands are now passed in the order defined by OPC UA. Code that compensated for the issue by calling Between on the lower bound (for example lower.Between(a, upper)) now determines whether the lower bound is between a and the upper bound and must be changed to a.Between(lower, upper).
  • Issue with the message of the NotSupportedException thrown by the operator != of OpcFilterOperand, which suggested the expression (a < b || a > b), which does not compile. The message now suggests (a < b) | (a > b).
  • Issue with the overload of OpcHistoryValue.CreateModified that takes a value, which also set the value in the data of the history value it was called on, while its Value property still returned the previous value. The modified value now uses a copy of the data, and the history value remains unchanged.
  • Breaking: Issue with OpcHistoryValue.Create(OpcValue), which created a history value sharing the data of the specified value, so that setting the value of one of them changed the data of the other, while its Value property still returned the previous value. The history value now uses a copy of the data. Code that changes an OpcValue after passing it to Create, or a history value created by Create, no longer changes the data of the other value.
  • Issue with the constructor of OpcCertificateStoreInfo, which failed with a NullReferenceException for the store type OpcCertificateStoreType.Application and a path of a certificate store of the operating system (for example CurrentUser\My).
  • Breaking: Issue with OpcSecurityPolicyCollection.CopyTo, which copied each policy from the specified array index on to the same index of the array, so that the policies before that index were missing, and which failed with an ArgumentOutOfRangeException for an empty array. The method now copies all policies to the array starting at the specified index, like List<T>.CopyTo, and throws an ArgumentException if the array is too small. Code that passes an array index greater than zero receives all policies starting at that index instead of a part of them at their own index, and code that passes an array that is too small for all policies receives an ArgumentException.
  • Breaking: Issue with the CertificateRequested event of OpcServer and OpcClient, where a certificate provided using AlternativeCertificate of the event data was not used: a server without an application certificate failed to start ("Server does not have an instance certificate assigned"), and otherwise the certificate of the application store remained in use. The provided certificate is now used, also on later starts and connects; it must contain its private key. Handlers that set AlternativeCertificate to another certificate now change the certificate the application uses.
  • Breaking: Issue with OpcStruct, where creating the data type of a structure with an array field whose data type is unknown failed with a NullReferenceException. An InvalidOperationException that names the data type, the field, and the structure is now thrown. Code that catches the NullReferenceException in this case does not catch the InvalidOperationException.
  • Breaking: Issue with OpcEnum, where fields defined without a value got the value 0 if another field was defined with a value other than 0, and where the specified OpcEnumField instances were changed. Like in C#, a field defined without a value now follows the value of the field before it (A, B, C = 5, D results in 0, 1, 5, 6), and the specified instances remain unchanged. Enumerations with fields defined without a value next to fields defined with a value, and enumerations whose fields are all defined with the value 0, get other values; the Value of an OpcEnumField specified without a value remains 0, and GetFields returns copies.
  • Issue with EnumStrings of OpcMultiStateDiscreteNode, where reading the property of a node whose EnumStrings variable has no value threw an ArgumentNullException. The property now provides null in this case. The issue existed since version 2.53.0.0.
  • Issue with AvailableStates and AvailableTransitions of OpcFiniteStateMachineNode, where reading the property of a state machine without the optional AvailableStates or AvailableTransitions variable, or without its value, threw an ArgumentNullException. The property now provides null in this case. The issue existed since version 2.54.0.0.
  • Issue with OpcFiniteStateMachineNode<T>, where a state machine whose states are identified by a type that is not an enumeration (for example uint) ended in a StackOverflowException when the sub-state machine of a state was created. The state number is now converted to T and passed to CreateSubStatesMachineNode(T). The issue existed since version 2.54.1.0.
  • Issue with the members a node type inherits from its base type (for example returned by OpcNodeTypeInfo.GetMembers of a subtype), where reading Parent of an inherited variable or object member ended in a StackOverflowException that terminated the application. Parent now provides the parent of the member declared by the base type. The issue existed since version 2.50.4.0.
  • Issue with the constructor of OpcClassicInterface, where an interface specification without a name and without a version failed with a NullReferenceException. The version 1.0 and a name made of the category and that version are now used in this case. The issue existed since version 2.6.0.0.
  • Issue with OpcMethodNode.Call, where each entry of a non-empty outputArguments list was added to the list a second time before the output arguments of the method. The method now adds only its output arguments to the list. The issue existed since version 2.33.0.0.
  • Breaking: Issue with OpcServer, where a request of the services AddNodes, AddReferences, DeleteNodes, DeleteReferences, or Call that contained a command with a null identifier was rejected as a whole (BadNothingToDo, for AddNodes, DeleteNodes, and DeleteReferences BadUnexpectedError). The other commands are now executed, and the command with the null identifier has the status defined by OPC UA (BadParentNodeIdInvalid, BadNodeIdInvalid, BadSourceNodeIdInvalid, BadTargetNodeIdInvalid, BadReferenceTypeIdInvalid, or BadMethodInvalid). The issue existed since version 2.7.0.0, for Call since version 2.50.5.0. Such a request is no longer rejected, so that RequestValidating is raised with a good result, the request is processed, and it is not counted in RejectedRequestsCount of the server diagnostics. Server applications that relied on the rejection must handle commands with a null identifier themselves.
  • Issue with the AddNodes service of OpcServer, where a node of the node class Unspecified was not rejected as an invalid node class. The server now reports BadNodeClassInvalid for such a node, as defined by OPC UA. The issue existed since version 2.7.0.0.
  • Issue with the AddNodes service of OpcServer, where a node the server could not create was reported as added with the status Good and without a node identifier. The server now reports BadNotSupported for such a node. The issue existed since version 2.7.0.0.
  • Issue with OpcNodeHistory<T>.Enumerate(DateTime?) and Enumerate(DateTime?, DateTime?), which returned values outside of the time range if a bound was not the timestamp of a value, for example all values before the start time or after the end time. The methods now return the values within the time range, including its bounds.
  • Issue with OpcNodeHistory<T>.RemoveRange(DateTime?) and RemoveRange(DateTime?, DateTime?), which removed no value if a bound was null, DateTime.MinValue, or DateTime.MaxValue, so that RemoveRange(DateTime?) never removed a value. Such a bound now does not limit the time range. As a result, an OpcNodeHistorian no longer reports values as deleted without deleting them when a client deletes the history of a node without a start or end time.
  • Issue with reading the history of a node at specific times (for example with OpcClient.ReadNodeHistoryAtTime) or processed (for example with OpcClient.ReadNodeHistoryProcessed) from an OpcServer, where a time between two values resulted in BadNoData instead of an interpolated value. OpcNodeHistorian.ReadHistory now also provides the value directly before and the value directly after the time range, from which the server determines the value at or before a requested time. Reading the raw history with ReturnBounds now returns the bounding values instead of BadBoundNotFound.
  • Issue with the history services of OpcNodeHistorian for a node with the ValueRank Any, ScalarOrOneDimension, or OneOrMoreDimensions, which rejected each value with BadTypeMismatch. A value is now accepted if its value rank is valid for the value rank of the node.
  • Issue with OpcNodeHistorian, which set PercentDataBad and PercentDataGood of the AggregateConfiguration of the node to 0 or 100 only. The percentages are now calculated from the numbers of bad and good values.
  • Issue with OpcSubscriptionDiagnostics.RepublishMessageRequestCount, which the server increased twice per republish request.
  • Issue with OpcReadNodeHistoryDetails.ReturnBounds (for example of OpcReadNodeHistoryRawDetails), whose setter set the value true regardless of the value passed, so that the bounding values could not be turned off again once requested.
  • Issue with the constructor of OpcNodeHistorian, which added HistoryReadOrWrite to the AccessLevel and UserAccessLevel of the node and set its IsHistorizing before rejecting an invalid capacity with an ArgumentOutOfRangeException. The arguments are now checked before the node is changed, and for an invalid modifiedCapacity the exception names the parameter modifiedCapacity instead of capacity.
  • Issue with deleting the raw or modified history of a node within a time range (for example with OpcClient.DeleteNodeHistory or OpcClient.DeleteNodeHistoryModified with a start or end time) from an OpcServer, which deleted the whole history of the node instead. The issue existed since version 2.7.0.0.
  • Issue with inserting or replacing the history of a node (for example with OpcClient.CreateNodeHistory or OpcClient.ReplaceNodeHistory) in an OpcServer, which processed each insert or replace as an update. Inserting a value at the timestamp of an existing value replaced it instead of resulting in BadEntryExists, and replacing a value at a timestamp without a value inserted it instead of resulting in BadNoEntryExists. The issue existed since version 2.7.0.0.
  • Issue with OpcUpdateNodeHistoryDataDetails and OpcUpdateNodeHistoryStructureDataDetails of a request received by an OpcServer (for example in the RequestValidating event), whose Values were null.
  • Issue with the history services of OpcNodeHistorian (CreateHistory, UpdateHistory, ReplaceHistory, and DeleteHistory), which failed with an ArgumentException from the second value of a call on, because the modified history kept one value per modification time. A client received BadUnexpectedError for the node, while the values before had already been changed. Each modification is now kept.
  • Issue with OpcServer.RegisterNamespace(Uri), which registered a URI that is not a valid namespace in the namespace table before rejecting it with a FormatException.
  • NullReferenceException in OpcClientIdentity.Matches for an identity that has been created with a password that is null. Such an identity now matches no password.
  • Issue with OpcAccessControlEntry.EndpointAccessMode, which returned the OperationAccessMode of the entry instead of the access mode of the endpoints. The access control itself was not affected: whether an endpoint is enabled or disabled for a principal was already evaluated using the access mode of the endpoints.
  • Issue with OpcServerDiagnostics.IsEnabled, which threw an ArgumentOutOfRangeException when the diagnostics were disabled while the server was running and held the diagnostics of at least one subscription.
  • Issue with OpcDataTypeSystem.Default and OpcNodeTypeSystem.Default (for example GetTypes), which failed with a FileNotFoundException, because the predefined nodes of OPC UA (resource Opc.Ua.PredefinedNodes.uanodes) were not embedded in the assembly. The resource is now embedded, and its data type nodes, which also state the DataTypeDefinition attribute, are read correctly. (Opc.UaFx.Client only)
  • Issue with EnumValues of OpcMultiStateValueDiscreteNode and Value of OpcEnumValuesPropertyNode, which threw an ArgumentNullException when the EnumValues variable had no value, so that a server with such a node failed to start. Both return null in this case now.
  • Issue with OpcFiniteStateMachineNode, which failed with a NullReferenceException when its type declared a sub-state machine for a state without the class creating a node for it (see CreateSubStatesMachineNode), so that a server with such a state machine failed to start.

2.58 ​

API changes: 44 added, 1 removed, 1 changed, 2 obsoleted

2.58.0.0 (released on October 30, 2026)

New

  • Introduced OpcCertificateSettings.Organization, which adds the organization (O) to the subject of the application instance certificate the SDK creates, as required by OPC UA. For an OpcServer, it is taken from OpcServerInfo.CompanyName. Without a known organization, the subject remains as before.
  • Introduced OpcRequestProcessedEventArgs.RequestType and IsUnsupportedService, and the members RegisterServer, RegisterServer2, and FindServersOnNetwork of OpcRequestType, so that a server can tell which service a request called, including services it does not support.
  • Introduced the SessionActivationFailed event of OpcServer, which occurs for each rejected session activation and states the identity the client used (OpcUserNameIdentityTokenInfo, OpcCertificateIdentityTokenInfo) without its password or token data.
  • Introduced OpcServerDiagnostics.IsEnabled to turn on the diagnostics of sessions and subscriptions (default false).
  • Introduced OpcServer.Discovery with OpcServerDiscovery.RegistrationInterval, the interval of the registration at the local discovery server (default 30000 ms; 0 disables the registration).
  • Introduced overloads of OpcDiscoveryClient.DiscoverEndpoints and DiscoverServers that filter by transport profile and server URI.
  • OpcBrowseNode.IncludeSubtypes is now public (default false), and OpcViewDescription provides public constructors to browse a view. In this version, IncludeSubtypes only takes effect through client.Services.Browse; BrowseNode and BrowseNodes do not evaluate the property yet.
  • Introduced OpcClient.ChangeUserIdentity to change the user identity of a connected session.
  • Introduced OpcClient.ReconnectInterval, the time between two reconnect attempts (formerly ReconnectTimeout, which remains as a hidden alias), and OpcClient.MaxReconnectDuration, which ends the reconnect attempts after the specified time (default 0, unlimited).
  • Introduced OpcDataFieldInfo.GetLength, which states the maximum length of each dimension of a field.
  • Breaking: Introduced OpcRawObject, which represents a value of a structure the SDK cannot decode (an unknown data type or a field without a fixed ValueRank) with its encoding and encoded body, and OpcData.Encode to encode a structure as an OpcRawObject. Code that expected an array of bytes or an XmlElement for a value of an unknown structure now receives an OpcRawObject; its RawData holds what was returned before.
  • Breaking: Introduced the attributes RolePermissions, UserRolePermissions, AccessRestrictions, and AccessLevelEx in OpcAttribute and OpcAttributes, the member DataTypeDefinition of OpcAttributes, and the types OpcRolePermission and OpcPermissions. Reading the DataTypeDefinition attribute now yields an OpcDataTypeInfo instead of a StructureDefinition or EnumDefinition of the stack, and reading RolePermissions or UserRolePermissions yields an array of OpcRolePermission instead of RolePermissionType.
  • Introduced OpcServerSecurity.IsAuditingEnabled (default false) and the audit events of the secure channel services (AuditOpenSecureChannelEventType, AuditChannelEventType).
  • The trace event of the stack (Opc.Ua.Tracing.Instance.TraceEventHandler) provides the traced exception in TraceEventArgs.Exception.

Changed

  • Breaking: Removed the CertificateFactory of the stack from the public API of the package, since the SDK does not provide CA signing or CRL generation. Code that uses CertificateFactory no longer compiles.
  • Breaking: OpcSecurityAlgorithm.Auto and the default endpoints of the discovery server and of the OPC Classic wrapper server use Basic256Sha256 instead of the deprecated Basic256 (Sign) and Basic128Rsa15 (SignAndEncrypt). A client using Auto no longer connects to a server that offers only the deprecated policies.
  • The certificate the SDK creates for an OpcServer also names the fully qualified name of the machine, so that clients that connect by that name accept it. An existing certificate remains unchanged.
  • Breaking: OpcServer reports audit events only while OpcServerSecurity.IsAuditingEnabled is true, and only to clients connected over SignAndEncrypt or HTTPS with a user in the SecurityAdmin role, as defined by OPC UA. A server reports session audit events only after IsAuditingEnabled has been set to true.
  • Breaking: State, StateChanged, and BreakDetected of OpcClient follow a lost connection detected by a failing service call (for example BadConnectionClosed or BadSessionIdInvalid) at once instead of with the next keep-alive, and a recreated session reconnects to a restarted server within one interval. Code that relied on the state changing only with the keep-alive now sees the change earlier.
  • Breaking: The data type system of OPC UA provides all predefined data types (for example Integer, UInteger, Enumeration, or Image), each data type states its supertype as BaseType, and fields of data types derived from a built-in type (for example Duration, UtcTime, or LocaleId) are decoded. Built-in types and the structures of OPC UA now state their supertype as BaseType instead of none, and a field of a type derived from ByteString yields a ByteString instead of an array of bytes.
  • OpcServer no longer traces a connection reset by a client as an error, neither during a read nor when it closes the socket.
  • Breaking: OpcClient.ReconnectTimeout and DefaultReconnectTimeout are obsolete; use ReconnectInterval and DefaultReconnectInterval instead. Code that uses them receives a compiler warning, and a compiler error with TreatWarningsAsErrors.
  • Breaking: The single-node history services OpcClient.ReadNodeHistoryProcessed, ReadNodeHistoryAtTime, and ReadNodeHistoryModified throw an OpcException with the status code of the server (for example BadAggregateNotSupported) for a node the server rejected, and return an empty result for a node the server accepted without values. Before, a KeyNotFoundException was thrown in both cases. Code that catches the KeyNotFoundException must catch the OpcException instead.
  • Breaking: OpcDiscoveryClient (DiscoverEndpoints, DiscoverServers, and its constructors) throws an OpcException stating the reason (for example BadSecureChannelClosed) when the server cannot be reached, closes the channel during the handshake, or the discovery URL uses an unsupported scheme. The history navigators of OpcClient.ReadNodeHistory and ReadEventHistory throw an OpcException stating BadCommunicationError when a page was not finished within the maximum number of requests. Before, the ServiceResultException of the stack was thrown. Code that catches the ServiceResultException must catch the OpcException instead.
  • Breaking: OpcViewDescription.Default is now a static readonly field, so that the default view cannot be replaced. Code that assigns OpcViewDescription.Default no longer compiles. Code compiled against an older version that reads OpcViewDescription.Default must be recompiled, because the property has become a field.

Fixed

  • Issue with methods in OpcServer that are implemented by a command (for example a method of an imported NodeSet implemented using OpcNodeSetManager.ImplementNodeCallback) and declare an argument with the ValueRank Any, ScalarOrOneDimension, or OneOrMoreDimensions. Each call of such a method failed with an IndexOutOfRangeException. The value of such an argument is now passed to the command as a scalar or an array according to the value received, for example an array of ByteStrings as ByteString[], as with an argument declared as a one-dimensional array.
  • Issue with nodes created with the model of their type (for example instances of companion specifications), whose variables did not take the access levels and write masks of the NodeSet and could be written regardless. The issue existed since version 2.50.6.0.
  • Issue with notifiers added using OpcNodeManager.AddNotifierNode, which a client browsing the notifier hierarchy from the Server object did not find.
  • Issue with arrays of object (for example a method argument of the data type BaseDataType and the ValueRank OneDimension), which were encoded as an array of structures instead of an array of variants.
  • Issue with OpcServer, which offered an endpoint several times when an endpoint policy was configured more than once. The server keeps the first policy and removes the repeated ones when it starts.
  • Issue with OpcServer, which traced the error "Could not load CertificateTrustList for UserTokenPolicy" on every start.
  • Breaking: Issue with OpcServer, where a start changed the ServerConfiguration of the application, so that a restart offered anonymous access although only the OpcUserNameAcl was enabled. The server now works with a copy of the configuration. Code that reads Configuration.ServerConfiguration after the start sees the values it set itself instead of the policies in use.
  • Issue with OpcClient.Connect, which failed with an IndexOutOfRangeException on a server whose data type dictionaries state a NamespaceUri not at all or several times. A dictionary that cannot be loaded is left out and traced. The issue existed since version 2.8.0.0.
  • Issue with OpcNodeManager, which raised MonitoredItemsDeleted instead of MonitoredItemsModified when a MonitoredItem was modified. The issue existed since version 2.7.4.0.
  • Issue with OpcClient, which failed to connect to a server offering a user token policy with an unsupported security policy (for example RSA_DH_AesGcm) before a supported one.
  • Issue with OpcServer, which terminated with a StackOverflowException when diagnostics were enabled, a client monitored the session or subscription diagnostics, and another session called a session service.
  • Breaking: Issue with reading processed history (for example OpcClient.ReadNodeHistoryProcessed), which requested both timestamps, so that a server could reject the request with BadTimestampsToReturnInvalid. The issue existed since version 1.5.11.0. The processed values no longer carry a server timestamp.
  • Issue with OpcServer, where a request to read the modified history arrived as OpcReadNodeHistoryRawDetails instead of OpcReadNodeHistoryModifiedDetails. The issue existed since version 2.7.0.0.
  • Issue with multi-dimensional fields of a structure (for example UInt16[2,3,2]), which were left out of its encoding. The issue existed since version 2.8.0.0.
  • Issue with an OpcStatusCode, which could not be passed as a method argument or written as a value.
  • Issue with OpcClient, which remained in the Reconnecting state when the server rejected one of its subscriptions after a reconnect. The issue existed since version 2.32.0.0.
  • Breaking: Issue with a structure described in a data type dictionary whose field refers to a data type known by its DataTypeDefinition only, which the client could not resolve. The issue existed since version 2.40.0.0. The Name and XmlName of such a data type now state the namespace of its node instead of the namespace of OPC UA.
  • Issue with fields declared with a data type that has no definition of its own (for example a vendor's subtype of Byte), which stated the nearest supertype instead of their declared data type, and with OpcClient.GetDataType, which provided no data type for such a data type.
  • Issue with a variable node of an array type created without a value (for example new OpcDataVariableNode<int[]>(name)), which stated a scalar ValueRank and no array dimensions. The issue existed since version 2.52.0.0.
  • Issue with a matrix of structures, which failed to encode with an InvalidCastException. The issue existed since version 2.9.2.0.
  • Issue with the retain policies of conditions, which did not retain a condition for every state they name, so that, for example, an active alarm was no longer retained once it had been acknowledged. The issue existed since version 2.55.0.0.
  • Issue with the GDS Push Management of OpcServer: CreateSigningRequest rejected a subject name passed by the client and requested neither the organization nor the application URI of the certificate, UpdateCertificate refused a certificate whose subject differed from the current one in more than the common name, and ApplyChanges left the server without the new certificate or without its private key, so that connections using Sign or SignAndEncrypt failed. The issue existed since version 2.53.0.0.
  • Issue with the GDS Push Management of OpcServer, which stated no supported private key formats unless formats were configured (now PFX and PEM), and refused CreateSigningRequest and UpdateCertificate without a certificate type for a certificate group of a single type. The issue existed since version 2.53.0.0.
  • KeyNotFoundException in the single-node history update services OpcClient.CreateNodeHistory, ReplaceNodeHistory, UpdateNodeHistory, DeleteNodeHistory, DeleteNodeHistoryAtTime, and DeleteNodeHistoryModified for a NodeId stating a namespace index only (for example ns=2;s=Value). The results of the history update services are now keyed by the NodeId of the command.
  • Endless history read when the server rejects a node on a subsequent page, because the continuation point of the rejected node was requested again on each page. The issue existed since version 1.6.5.0.
  • Issue with a new subscription whose MonitoredItems the server rejected. If the subsequent deletion of the subscription failed too, its error replaced the one of the MonitoredItems. The OpcException now states the reason why the MonitoredItems were rejected. The issue existed since version 2.32.0.0.
  • Exception on Linux with newer OpenSSL versions when creating an application certificate.

2.57 ​

API changes: 8 added

2.57.1.0 (released on October 23, 2026)

New

  • Introduced the NotificationFailed event in OpcSubscription and OpcClient, and the corresponding handler OpcSubscriptionSetup.NotificationFailed, which occurs when a notification message from the server failed to be received, for example because a value in it cannot be decoded. Before, the data changes and events of such a message were dropped without notice. The event is first raised by the OpcSubscription the message belongs to and, if not handled, by the OpcClient. A message whose subscription is not known (yet) is reported by the OpcClient only.
  • Introduced OpcAttribute.DataTypeDefinition to read the DataTypeDefinition attribute of a data type node.

Fixed

  • Issue with structured data types known only by their DataTypeDefinition (for example when using OpcClient.UseDynamic) that declare a member of another structured data type. Since version 2.57.0, such a member was decoded without its fields, so that the values decoded after it could be wrong, events holding such a structure were dropped without notice, or decoding failed with an exceeded MaxStringLength or the status code BadEncodingLimitsExceeded.
  • Issue with structured data types known only by their DataTypeDefinition that declare a member of a simple data type without a definition of its own (for example a vendor-specific subtype of Byte, UInt16, or String). Decoding such a structure failed with an ArgumentNullException and the whole read with the status code BadUnknownResponse. Such a member is now decoded as the nearest supertype the client knows.
  • Deadlock between Browse requests and node manager changes made while holding the node manager lock.
  • Issue with events of a built-in event type in OpcClient. Since version 2.56.0, such an event was created as an instance of one of the base types of its event type, for example a dialog condition as OpcCondition instead of OpcDialogCondition or an alarm condition as OpcAcknowledgeableCondition instead of OpcAlarmCondition.
  • Issue that caused OpcClient.Connect() to fail when UseDynamic is enabled and the server sends the same HasSubtype or HasEncoding reference of a data type more than once.
  • NullReferenceException in OpcClient with servers that return an endpoint without a URL.
2.57.0.0 (released on September 14, 2026)

Fixed

  • Issue with structured data types using OpcEncodingMaskKind.Auto whose first optional member is not set. Values decoded after such a member could be wrong, or decoding failed with an EndOfStreamException or a ServiceResultException reporting an exceeded MaxStringLength.
  • Issue with members of a structured data type declared as one of the wrapper types OpcText, OpcName, OpcNodeId, OpcValue or OpcEngineeringUnitInfo. Such a member is now encoded and decoded consistently, whether it holds a value or a null reference.
  • Issue with members of a structured data type declared as a nullable value type (for example int?, short?, double? or DateTime?). The value of such a member is now preserved.
  • NullReferenceException while decoding a structured data type with an array member which is not optional and holds a null reference.
  • InvalidCastException while decoding an array of Guid values.
  • Issue with empty arrays of the wrapper types OpcText, OpcName, OpcValue and OpcEngineeringUnitInfo. As a member of a structured data type such an array is now encoded as an empty array instead of a null reference, and as a parameter of a method call it is now passed as an array of the type the called method declares, which a server accepts. Before, only a null reference was accepted for such a parameter.
  • Issue with an empty array of OpcNodeId values being passed as an array of expanded node identifiers.

2.56 ​

API changes: none

2.56.0.0 (released on August 19, 2026)

Fixed

  • Ensured that the RetainState is not automatically updated by any sub-state different than the EnableState if the RetainPolicy is Manual.
  • Incorrectly handled nodeChanges in OpcNode.UpdateChanges: The specified parameter was not passed to the handlers used and was therefore omitted. Only the already pending changes were forwarded to the handlers used for data change notifications.
  • Issue with wrong event type resolution in OpcClient if an event type is registered using only an expanded node identifier (for example using OpcNamespace.GetId, where the OpcNamespace instance does not have a namespace index assigned). This results in always receiving OpcEvent instances instead of the specific sub-type of OpcEvent or a custom typed event data storage.

2.55 ​

API changes: 2 added

2.55.0.0 (released on August 7, 2026)

New

  • Introduced new OpcConditionNode.IsRetainedPolicy property in OpcConditionNode to override the default logic used to control the value of the OpcConditionNode.IsRetained property according to the different states defined by condition nodes (for example EnableState, ActiveState, AckedState, ConfirmState). The default value used for this property depends on the subtype of the OpcConditionNode used. This way you can gain full control of the IsRetained property using the value OpcConditionRetainPolicy.Manual for the IsRetainedPolicy property.

Changed

  • The initial value of the OpcConditionNode.IsRetained property and its subtypes (OpcAcknowledgeableConditionNode and OpcAlarmConditionNode) including the traversal subtypes might be different starting with this version. This ensures the correct initial value according to the condition type's specific state machine. To understand the different conditions see OPC UA Part 9. In addition the documentation of the new OpcConditionRetainPolicy enumeration provides additional details. However the specific condition type uses by default the corresponding policy to provide compliant initial values. To override that you can use the value OpcConditionRetainPolicy.Manual for the OpcConditionNode.IsRetainedPolicy property to gain full control of the IsRetained property.

Fixed

  • StackOverflowException when the machine is under load.

2.54 ​

API changes: 93 added, 10 removed, 9 changed

2.54.1.1 (released on July 27, 2026)

Fixed

  • StackOverflowException in the new OpcFiniteStateMachineNode<T> class when using ChangeStateTo.
2.54.1.0 (released on July 22, 2026)

New

  • Added support for dynamic data types which use recursive references to themselves.
  • Introduced new protected virtual property InheritReferenceTypeId for OpcInstanceNodes to control whether the DefaultReferenceTypeId is to be inherited by its direct children.
  • Introduced new OpcNodeSet.GetNodes method to retrieve the whole address space defined by a NodeSet.

Fixed

  • Issue with incorrectly generated DataTypeDefinition attribute in the OpcServer when using structured data types with optional fields using OpcEncodingMaskKind.Explicit.
  • Issue with incorrect encoding of optional fields in the OpcClient when enabling UseDynamic and the server doesn't provide a TypeDictionary.
  • Issue with only root node based node retrieval using the method OpcNodeSet.GetNode. The method now retrieves any node in the NodeSet loaded.
  • Issue with node retrieval using the method OpcNodeSet.GetNode after loading a NodeSet without a custom context with matching namespace URIs.
2.54.0.0 (released on June 25, 2026)

New

  • Added new SupportedTokenTypes property to OpcEndpointDescription to provide an enumerable sequence of supported OpcAccessControlTokenType values to identify the supported access control list using the endpoint provided by the server. This can be discovered using OpcDiscoveryClient.DiscoverEndpoints(...).
  • Added new properties AvailableStates and AvailableTransitions to OpcFiniteStateMachineNode.
  • Added new property SupportCurrentState to support implementation of state machines which do not support the mandatory CurrentState node using a custom override of the property to disable the CurrentState support including calls to the method ChangeStateTo. In addition the CurrentState node delivers Bad as status code and BAD as value, while its child node "Id" provides a null reference as value.
  • Added support for providing event history in the OpcServer using the IOpcEventHistoryProvider interface, and for reading event history in the OpcClient using the ReadEventHistory method.
  • Added property OpcServerBinding.UseExclusiveAddress that specifies whether only one process is allowed to bind to the port.

Changed

  • Enhanced certificate validation especially for application instance certificates to support compliant validation of basic constraint extensions. This is required for CTT compliance.
  • By default, the listener socket now uses an exclusive address when binding to the port. This behavior can be controlled with the new OpcServerBinding.UseExclusiveAddress property.

Fixed

  • Issue with undefined array dimensions in NodeSet files of variable nodes and structured data type definitions, which define a ValueRank greater than the value of zero. The ArrayDimensions attribute is now initialized with an empty array dimensions array using the value of the ValueRank attribute.
  • ArgumentNullException occurred in the OpcServer when a client calls ConditionRefresh. Note: A side effect of this fix is that when a client calls ConditionRefresh, the SDK may now automatically send event data even if the application doesn't implement the QueryEventsCallback.
  • Issue with missing structured data types in OpcNodeSet after importing a NodeSet2.xml file which defines several data types using only DataTypeDefinitions and partially using (additional) DataTypeDescriptions which are not referenced by DataTypeEncodings which themselves do not use inverse references back to their encoded DataType node. Please note that in such cases the API ignores any DataTypeDescription and will provide the DataType related information using the DataTypeDefinition of the DataType node.
  • NullReferenceException occurred while calling OpcServer.GetDataTypes() when a NodeSet has been loaded that contains an empty structure definition.
  • NullReferenceException occurred when importing NodeSets that use a string as namespace URI which cannot be parsed as URI.
  • OpcPropertyNode<T> was not visible in the address space when type parameter T was a wrapper type like OpcText, and when using a constructor that takes a parent node.
  • OpcText.Equals() and .CompareTo() methods could throw a NullReferenceException and could return a wrong comparison result.
  • The OpcServer could return too many history values when the size was limited.

2.53 ​

API changes: 32 added, 2 removed, 13 changed

2.53.1.0 (released on May 6, 2026)

Fixed

  • Exception occurred when some types in user assemblies couldn't be loaded when using an OpcServer, or OpcClient while dynamic type registration is enabled.
  • Issue where user-defined nodes added with OpcNodeManager.AddNode() after starting the OpcServer sometimes missed the hierarchical reference from the parent node.
2.53.0.0 (released on April 16, 2026)

New

  • Introduced property OpcServer.UseDynamic together with types OpcStruct, OpcStructField, OpcEnum, OpcEnumField, which allow you to dynamically define data types for the OpcServer.
  • Introduced new OpcEnumValue type to represent enumeration values using the OPC UA data type EnumValueType.
  • Introduced in OpcEnum two static (Shared in Visual Basic) methods to retrieve the enumeration values of a typed enumeration. The way the information is retrieved can be controlled using the attributes OpcEnumAttribute, OpcEnumMemberAttribute and EnumMemberAttribute.
  • Introduced new OpcEnumValuesPropertyNode to support publishing custom OpcEnumValues as part of the server's address space.
  • Introduced new OpcMultiStateDiscreteNode and OpcMultiStateValueDiscreteNode including generic implementations for each of them. These nodes correspond in their use to the corresponding OPC UA defined node types with the names MultiStateDiscreteType and MultiStateValueDiscreteType.
  • Introduced new OpcAccessControlRole to represent default roles and define custom roles which OpcPrincipals can be a member of.
  • Introduced new OpcServerSecurityRoles to provide all default roles which are usually known by the OpcServer.
  • Introduced new OpcServerSecurity properties Roles and AccessControlRoles: the first provides a set of all default OPC UA roles and the latter provides the roles currently used by the OpcServer (within this implementation all instances provided by the set of default roles are in the AccessControlRoles property).
  • Introduced new OpcAccessControlEntry methods Assign and Revoke to control the role memberships of the principal in the entry.
  • Introduced in OpcPrincipal the new method IsInRole to determine if the principal is a member of a dedicated role.
  • Introduced automatic role assignment for the anonymous principal to be assigned to the Anonymous role.
  • Introduced automatic role assignment for all other principals to be assigned to the AuthenticatedUser role (custom access control lists must ensure that authenticated principals are assigned to this role as well).
  • Introduced new OpcServer event CertificateChanged which is raised whenever a session with an identity which is a member of the SecurityAdmin role changes the certificate of the server.
  • Introduced support for GDS Push Management using ServerConfigurationType, UpdateCertificate, TrustList and role-based authentication using the SecurityAdmin role. To enable GDS Push Management the custom implementation of the OpcServer must provide at least one ACL entry which is assigned to the SecurityAdmin role.

Fixed

  • Issue with duplicated child references for nodes which use inline default foundation defined NodeState instances representing a whole tree of nodes, where children are defined by the NodeState and not by the user code. This applies since version 2.51.4.1 to user-code created complex foundation nodes which are not imported from a NodeSet.

2.52 ​

API changes: 5 added

2.52.0.0 (released on March 13, 2026)

New

  • Introduced new abstract subtypes OpcDiscreteItemNode and OpcDiscreteItemNode<T> of the base class OpcDataItemNode.
  • Introduced new subtype OpcTwoStateDiscreteNode of the base class OpcDiscreteItemNode.
  • Introduced support for new security policy algorithms Aes128_Sha256_RsaOaep and Aes256_Sha256_RsaPss.

Fixed

  • CTT issue with wrong status code BadSessionClosed instead of BadNoSubscription if a session requests a publish without any subscription.
  • Issue with automatic node identifier assignment not working for ShelvingState in OpcAlarmConditionNode.
  • Issue with not initialized ValueRank attribute after creating a non-generic OpcVariableNode instance without passing a value.

2.51 ​

API changes: 6 added, 3 changed

2.51.4.1 (released on February 18, 2026)

Fixed

  • Issue with duplicated child references for nodes imported from NodeSets, especially using HasComponent references.
2.51.4.0 (released on February 18, 2026)

New

  • Introduced new OpcServer.EstimatedReturnTime property to support CTT compliance. This new property will directly update the value of the corresponding node at Objects/Server/EstimatedReturnTime to support clients to subscribe to value changes of the node to receive the latest estimated return time of the server, before it is about to shut down and to handle any reconnect logic accordingly.
  • Enhanced OpcNodeModel with additional overloads to CreateByDefault, OmitByDefault and OmitOptionals with an additional boolean parameter recursive to control whether the defaults and directives are to be applied to the model and to its children or not.
  • Added support for model conditional creation of the optional LastTransition node in state machine nodes.
  • Added logic to support server related operation limits (using OpcServer.OperationLimits.AutoDetermineLimits) according to CTT compliance.
  • Revised implementation of internal OpcOperationLimiter to provide more practical default limits, if AutoDetermineLimits is enabled.
2.51.3.0 (released on February 12, 2026)

New

  • Introduced client-side support of ResendData using OpcSubscription.ResendData to query current values of MonitoredItems in reporting mode.

Fixed

  • Issue in the OPC UA server to correctly handle pending ResendData requests, especially if the current value did not change in the meantime.
  • Issue which caused type OpcNodeId in structured data type definitions to be mapped to ExpandedNodeId instead of NodeId since version 2.50.0.
  • Issue that could cause values set using OpcVariableNode.Value not to be added to the OpcNodeHistorian's history when using a custom data type.
  • Issue in traversal automatic node identifier assignment introduced with version 2.50 if standard nodes are created with children whose relative tree depth is greater than one.
  • Issue with importing NodeSets that contain type definitions which are not in hierarchical order.
2.51.2.0 (released on January 12, 2026)

Fixed

  • Issue that could cause OpcClient.Connect() to fail when UseDynamic is enabled and the server provides one or more type dictionary nodes that returned a BadNotReadable status when reading them. In that case, the error is now ignored and an empty type dictionary is used.
2.51.1.0 (released on November 27, 2025)

Fixed

  • Wrong status code returned by ActivateSession when an invalid session identifier or an empty client signature was specified (CTT compliance).
  • PolicyId of UserTokenPolicy entries was not unique within the server in the endpoint descriptions provided by GetEndpoints (CTT compliance).
  • When a client sends a UserNameIdentityToken with an empty user name, status code BadIdentityTokenInvalid is now returned (CTT compliance).
2.51.0.0 (released on November 24, 2025)

Changed

  • When using .NET Framework, version 4.7.2 or higher is now required.
  • New parameters have been added to the method IOpcNodeHistoryProvider.ReadHistory() to support streaming of history values, instead of buffering all values in memory. In particular, the implementation now needs to return the values in reversed order when parameter timeFlowsBackward is true.

Fixed

  • Issue that caused reading the ServerDiagnosticsNode to return a BadOutOfService status even when diagnostics were enabled in the OpcServer.
  • Issue that caused incoming connections to the OpcServer to fail with BadUserTokenRejected when using an https: URL.
  • When a client sends a HistoryRead request with a maxCount value, that value is now correctly handled to split up the history values when sending the response.
  • Updated ASP.NET Core dependencies to 2.3.6.

2.50 ​

API changes: 439 added, 9 removed, 38 changed

2.50.7.0 (released on October 22, 2025)

New

  • Performance improvements during the creation of variable nodes (streamlined and unified initialization).
  • Introduced new OpcAutomatism properties UseNodeNameAsDefaultDescription and UseNodeNameAsDefaultSymbolicName to support conditional initialization of the Description attribute and SymbolicName property of OpcNode instances.

Changed

  • Improved CTT compliance regarding OpcNode default initialization and conditionally removed defaults for the Description attribute and for the SymbolicName property. To enable the previous behavior, enable the corresponding properties in OpcAutomatism.

Fixed

  • Issue with overwritten variable node attributes provided through an OpcNodeModel.
2.50.6.2 (released on October 6, 2025)

Fixed

  • Issue with InvalidOperationException/NullReferenceException when creating an OpcConditionNode or an OpcHistoryConfigurationNode.
2.50.6.1 (released on September 25, 2025)

Fixed

  • Issue with NullReferenceException in case of NodeSet variables with undefined array dimensions.
2.50.6.0 (released on September 21, 2025)

New

  • Enhanced IOpcNodeInfo with WriteAccess and UserWriteAccess properties to provide the values of these attributes as well.
  • Introduced new IOpcVariableNodeInfo as a sub-type of IOpcNodeInfo to distinguish variables from other nodes and provide variable node specific attributes.
  • Introduced model attribute support to initialize nodes using initial attribute values defined by a model.
  • Introduced new node type implementations OpcAnalogUnitRangeNode and OpcAnalogUnitNode.

Changed

  • Moved Model property and all other OpcNodeModel related API from OpcInstanceNode to OpcNode to ensure correct node initialization.
2.50.5.0 (released on September 17, 2025)

New

  • Enhanced authentication with several mechanisms to protect against brute force attempts.
  • Introduced new property OpcServer.AuthenticationLimits to control new brute force protection limits applied while authenticating.
  • Updated node types to version 1.05.03.
  • Introduced BadUserAccessDenied in case of an invalid identity used to change the identity of an existing session (CTT compliance).
  • Introduced new constructors to support additional subclasses using an OpcNodeModel parameter for OpcConditionNode (including its subclasses), OpcOrderedObjectNode and OpcFileNode.

Changed

  • Reworked request validation to validate first the contents of the request and then validate if the operation requested is granted. In addition, any diagnostics (including null references) are provided only if requested. This addresses CTT compliance.

Fixed

  • Issue with NullReferenceException in OpcContext if created from an OpcOperationContext.
  • Issue with NullReferenceException in OpcNodeId when ValueAsString is queried on an OpcNodeId.Null instance.
  • Issue with NullReferenceException (since version 2.50.4) when creating an OpcDataItemNode (or one of its subclasses) after the server has started.
  • Issue with duplicated parent-child references while importing NodeSet files using typed instances.
2.50.4.0 (released on September 9, 2025)

New

  • Added property OpcServerInfo.ProductUri for setting the ProductUri in the BuildInfo variable of the ServerStatus variable.
  • Introduced new generic implementation of OpcMethodNode: The OpcMethodNode<T> supports typed delegates and the change of the target callback to use.
  • Introduced support for ResendData(...) on the MonitoredItems of subscriptions.
  • Introduced new OpcServer.OperationLimits property to control the operation limits of the server (for the moment only with "unlimited" or automatically determined limits according to available system resources).

Changed

  • Wrong DefaultReferenceTypeId Organizes of OpcFolderNode and adopted use of HasComponent instead. This change addresses CTT compliance.
  • ServerDiagnostics no longer provides children and any explicit read/write operations on the child nodes using their NodeId result in BadOutOfService. This behavior applies for disabled ServerDiagnostics and addresses CTT compliance.

Fixed

  • Issue with SemanticsChanged status code (0x4000) not reported for MonitoredItems when writing values to semantic properties, for example of an OpcAnalogItemNode.
  • Issue with duplicated references while browsing the address space of imported nodes. This was especially the case for method nodes regarding their Output-/InputArguments.
  • Issue with non-compliant read results of the InverseName attribute of ReferenceTypes to assure that a BadAttributeIdInvalid is provided instead of a null reference (Nothing in Visual Basic).
  • Wrong status code from BadSessionIdInvalid to BadSubscriptionIdInvalid used in server subscriptions when accessing the subscription of a different session.
  • Wrong status code from BadIdentityTokenInvalid to BadIdentityTokenRejected in cases where the impersonation of an identity token fails. This change addresses CTT compliance.
2.50.3.0 (released on July 17, 2025)

Fixed

  • Issue with NullReferenceException when creating an OpcAlarmConditionNode instance (or one of its subclasses) in the OpcServer.
2.50.2.0 (released on July 7, 2025)

New

  • The OpcServer now provides the server's local time zone information in the LocalTime property of the Server object.
  • Introduced support for model change tracking and reporting.
  • Added OpcAutomatism.RaiseModelChangeEvents property to globally enable or disable model change tracking and reporting.
  • Added OpcNode.SuspendModelChangeEvents(...) and OpcNode.ResumeModelChangeEvents(...) methods to control model change tracking and reporting on node level.

Fixed

  • Issue with decoding structured data types when the first field is optional.
  • OpcNodeManager.GetNode(string) did not always return OpcFiniteStateMachineNode instances.
  • Issue receiving ModelChangeEvent and GeneralModelChangeEvent data in OpcClient.
  • Issue with NullReferenceException in OpcGeneralModelChange when the Changes property of the data store was a null reference (Nothing in Visual Basic).
2.50.1.0 (released on June 16, 2025)

New

  • Added support of method members in NodeType reflection.

Fixed

  • Issue with state machines with zero as their transition number for every transition.
  • Issue with state machines with states where zero is an invalid state number.
2.50.0.0 (released on June 12, 2025)

New

  • Introduced support of NodeTypeSystem information in the OpcServer and OpcContext.
  • Implemented support of typed node instance creation when importing nodes from a NodeSet file.
  • Improved dynamic creation of typed node instances while loading a NodeSet.
  • Enhanced the OpcFiniteStateMachineNode to determine states and transitions from node type information if no attributes are given to define states and transitions for the state machine.
  • Introduced thread local OpcContext (using new OpcContext.Current property) to support scenarios where an OpcContext is required but not given by any parameter. This currently applies to server code only.
  • Added properties OpcNodeManager.NodeSetImportOptions and OpcNodeSetManager.ImportOptions to specify to include structure fields from parent types in DataTypeDefinition attributes when importing them from NodeSets.
  • Added new OpcEncoding.Empty() method to provide empty encoding arrays.
  • Added new OpcEncodingMask.DefaultAuto to simplify generic encoding definitions.
  • Introduced thread local OpcContext (using new OpcContext.Current property) to support scenarios where an OpcContext is required but not given by any parameter, for example in the constructor of some node.
  • Introduced OpcContext.OfNode method to switch into the context of a dedicated node. In addition, enhanced AddChild and RemoveChild methods in OpcInstanceNode to add/remove the child to/from the node manager whose context is used for this operation. As a result, the child node is added/removed to/from the same node manager as the node whose context is passed to AddChild and RemoveChild.
  • Added OpcServer.RegisterNamespace and OpcServer.RegisterNamespaces methods to preregister known namespaces to ensure they are registered in a specific order to assign specific namespace indexes per namespace.
  • Introduced OpcNodeManager.IsNodeReadyToPublish(...) to determine whether any applied node changes are waiting to be published by at least one MonitoredItem.
  • Introduced the recursive support to get from an OpcSession to its OpcSubscriptions and from them to their OpcMonitoredItems.
  • Introduced new OpcNode.ChangesUnhandled event which is raised whenever changes are to be applied on a node, but there exists no MonitoredItem accepting (for example by filtering) and handling the node changes.

Changed

  • When OpcClientSecurity.UseOnlySecureEndpoints is set to true, the OpcClient now only selects endpoints with a SignAndEncrypt mode, and no longer selects ones with a Sign mode, because the latter does not provide confidentiality. To use the previous behavior of selecting endpoints with a Sign or SignAndEncrypt policy, set client.Security.EndpointPolicy to one with that mode, and set OpcClient.Security.AutoUpgradeEndpointPolicy to true. Alternatively, to select the "best" endpoint offered by the server, set OpcClient.Security.UseHighLevelEndpoint to true (but note that this does not provide security).
  • When creating an event filter with OpcEventFilterFactory.Select(), the type identifier of the BaseEventType is now used by default in the simple attribute operands (as it was before version 2.32.0.0), to ensure that when specifying multiple event types that may have fields with the same name, all fields can be received. To use the previous behavior of specifying the actual event type identifier in the simple attribute operands, specify OpcEventFieldSelectOptions.UseExplicitEventTypeIds in OpcEventFilterFactory.Select().

Fixed

  • NullReferenceException when importing a NodeSet containing a FiniteStateMachine without a LastTransition child node.
  • NullReferenceExceptions while comparing two Number struct values if the underlying value is a null reference (Nothing in Visual Basic).
  • Issue which caused clients to receive a BadNotSupported error when trying to establish a new connection to the server after one client subscribed to audit events.
  • Issue which could cause OpcEngineeringUnitInfo.CommonCode to return a string containing a NUL character.
  • Issue which could cause an OpcException when reading a structured data type with an array of nested structured data types when OpcClient.UseDynamic was enabled.
  • Issue which could cause the OpcServer to accept client connections using untrusted certificates even when OpcSecurity.AutoAcceptUntrustedCertificates was set to false.
  • Issue which could cause the OpcClient to connect to endpoints with a None policy mode when that was the only policy offered by the server, even if OpcClientSecurity.UseOnlySecureEndpoints was set to true.
  • Issue with decoding structured data types when a null value occurred for an array field.
  • Issue with InvalidCastException when reading a structured data type containing an array of structured data types.
  • IndexOutOfRangeException when importing a NodeSet where a VariableNode specifies a ValueRank of 0.
  • [Client SDK] The OpcData.Decode<T>(...) methods that were intended to be added with version 2.40.0.0 were missing in the Client SDK (Opc.UaFx.Client).

2.40–2.42 (2023–2024) ​

2.42 ​

API changes: 16 added, 12 changed

2.42.5.0 (released on December 3, 2024)

Fixed

  • NullReferenceException that was thrown and caught internally when processing an empty publish response.
2.42.4.0 (released on October 21, 2024)

New

  • Introduced implicit cast operator from UserIdentityToken to OpcIdentityToken.

Changed

  • Updated Portable.BouncyCastle dependency to version 1.9.0, to fix a vulnerability.

Fixed

  • Invalid generated SwitchValue field for union types in the DataTypeDefinition attribute.
2.42.3.0 (released on September 10, 2024)

New

  • Added support for subscription licenses.

Fixed

  • Issue that could cause OpcClient.State to be stuck in Connecting when calling OpcClient.Disconnect(), while at the same time another thread calls methods like OpcClient.CallMethod().
2.42.2.0 (released on August 22, 2024)

New

  • Classes OpcAccessControlList and OpcUserIdentity are now subclassable, and custom OpcAccessControlList instances can be added to the OpcServer via OpcServerSecurity.AddAccessControlList().
2.42.1.0 (released on July 25, 2024)

Fixed

  • Issue where a side-effect in an internal class could cause the OpcNodeIdFactory.Create() method not to be called for certain node instances.
  • Issue causing an InvalidOperationException in OpcFiniteStateMachine.ChangeStateTo() due to an incorrect OpcNodeId comparison.
2.42.0.1 (released on June 7, 2024)

Fixed

  • Invalid generated length field for arrays in the DataTypeDefinition attribute in subclasses when the field is declared in the base class.
2.42.0.0 (released on June 5, 2024)

New

  • Introduced new property OpcAutomatism.UseNullInsteadOfEmptyArrays to control several array / list / collection properties regarding their supported / encoded values. When setting this property to the value true, some properties will no longer set a null reference (Nothing in Visual Basic) to an empty array / list / collection. In addition they encode these values using an array size equal to -1. If a server / client "requires" an empty array / list / collection, the OpcAutomatism.UseNullInsteadOfEmptyArrays property has to be set to the value false. This results in empty array / list / collection values which are encoded using an array size equal to zero.

Changed

  • OpcArgument.ArrayDimensions and OpcArgumentInfo.ArrayDimensions now support null references (Nothing in Visual Basic) when enabled via OpcAutomatism.UseNullInsteadOfEmptyArrays. This means whenever a server provides a value of null for the ArrayDimensions this property will now return a null reference (Nothing in Visual Basic) as well.

Fixed

  • The OpcClient no longer selects an endpoint with an unknown security algorithm (which would fail to connect) when using default settings and there is at least one endpoint available with a known security algorithm.
  • Issue that caused OpcNode.Id to change to a different object instance when a client read the NodeId attribute of a node.
  • Issue causing an invalid namespace index to be specified in the DataTypeId of a structured data type pointing to another structured data type.
  • OpcNodeManager.GetNode(string) will now also find child nodes that exist in a different namespace (as long as the namespaces are managed by the same OpcNodeManager instance).
  • Invalid generated length field for arrays in the DataTypeDefinition attribute.
  • Memory leak in OpcServer that occurred every time a client sent a GetEndpoints request.
  • Added a workaround for some OPC Classic servers that don't support reading specific properties together with other, regular properties.

2.41 ​

API changes: 2 added, 1 changed

2.41.1.0 (released on January 18, 2024)

Changed

  • Updated Microsoft.AspNetCore.Server.Kestrel.Core dependency to version 2.1.25, to fix a vulnerability.

Fixed

  • Issue that caused a memory leak in the OpcClient when repeatedly calling OpcClient.BrowseNodes() or accessing file nodes with class OpcFileMethods, OpcFileStream or OpcFileInfo.
  • Issue that could cause the OpcClient to incorrectly send Read requests (from the keep-alive timer) even when the ActivateSession call hasn't completed yet.
2.41.0.0 (released on December 2, 2023)

Changed

  • User authentication in the OpcServer is now done only once during ActivateSession, instead of doing it for each request separately.

Fixed

  • Issue with OpcVariableNodeInfo.IsArray and OpcVariableNode.IsArray incorrectly returning false (the former since version 2.33.0) for an array with 3 or more dimensions.
  • Issue with a deadlock occurring when calling OpcClient.Disconnect() or OpcClient.Dispose() while at the same time event subscriptions were active.
  • Issue that caused the OpcClient.State not changing to Reconnecting when a connection break was detected while an operation like ReadNodes() was still executing.
  • Issue that prevented creating an event filter from an OpcNodeId if it was using a resolved namespace.
  • Issue that caused a memory leak when repeatedly creating (and throwing away) OpcMethodNode instances where a Delegate instance is passed.
  • Issue that caused reflected type fields to be declared in a wrong order when the type implements an interface.

2.40 ​

API changes: 9 added, 3 removed, 2 changed

2.40.0.0 (released on October 23, 2023)

New

  • Introduced new OpcContext.Enter(...) methods to enter into a local context to perform non client / server scenarios.
  • Enhanced OpcDataTypeInfo to support ExtensionObjects as system type as well (IsSystemType property).
  • Introduced new OpcData.Decode<T>(...) methods to manually decode a binary encoded data stream/buffer to a structured object.
  • Introduced explicit support for encoding/decoding/use of ExtensionObjects.
  • Improved performance when receiving custom event data for the first time.
  • Introduced new OpcNodeSet.Load(string, OpcNodeSetLoadOptions) method to provide more details about the NodeSet file to load.

Fixed

  • Issue with wrongly calculated encoding mask when using explicit encoding.
  • Issue with encoding/decoding subtypes of built-in data types according to their base types.
  • Issues with encoding/decoding ExtensionObjects in custom structured data types.
  • Issue with nested event type fields like ActiveState/Id not being reported correctly since version 2.32.0.
  • Issue with mixed data types which are defined using DataTypeDescriptions and DataTypeDefinitions while the definitions use different field types. The descriptions are now prioritized.
  • Issue with event subscriptions not working since version 2.29.0 when no OpcEventFilter was specified.

2.30–2.33 (2022–2023) ​

2.33 ​

API changes: 8 added, 4 changed

2.33.0.0 (released on September 11, 2023)

New

  • Enhanced OpcNodeContext with new NodeManager property which references the OpcNodeManager in whose context an operation is executed.
  • Introduced OpcMethodNode.Call(...) method to invoke an implemented method node using a custom context independent from a "client call".
  • Introduced the methods Close(...), GetPosition(...), Open(...), Read(...), SetPosition(...) and Write(...) to invoke the implemented methods of an OpcFileNode using a custom context independent from "client calls".
  • Improved performance of event filter creation using only event types of the node type system provided by the server.
  • Introduced support of data types which are only declared using a data type definition and no longer a data type description.
  • Introduced support of dynamic union data type resolution and representation using the OpcDataObject class.

Changed

  • OpcContext.Empty.SessionId no longer provides a null reference (Nothing in Visual Basic). Instead it provides OpcNodeId.Null.
  • Changed access modifiers of OpcNodeManager.AddNode(...) and OpcNodeManager.RemoveNode(...) methods from protected to public for improved usability.
  • Evaluation of OpcVariableNodeInfo.IsArray now uses the ValueRank value instead of the ArrayDimensions to decide whether the Value attribute provides an array.

2.32 ​

API changes: 16 added

2.32.0.0 (released on August 28, 2023)

New

  • Enhanced DCOM security options with properties to configure AuthenticationService, AuthorizationService and ProxyCapabilities from user code.
  • Introduced new Name property in OpcDataTypeAttribute to define a different name per DataType as used by the implementing .NET type.
  • Introduced support of lazy initialization of custom OpcData store implementations with support of a default constructor.
  • Introduced new IsUnion property in IOpcDataTypeInfo to indicate whether a data type is a union data type.
  • Introduced new interface IOpcUnion to implement custom union data types using this interface type.
  • Introduced typed support of the abstract Number data type which supports the encoding of all primitive numeric data types.
  • Introduced new OpcSubscriptionSetup class to create a new subscription with all properties preset at once.
  • Introduced new OpcClient.CreateSubscription(...) method which uses an OpcSubscriptionSetup to create a new OpcSubscription.

Fixed

  • Added a reference to System.Text.Encodings.Web 4.5.1 (for the NuGet package), to fix a vulnerability warning caused by the transitive reference through Microsoft.AspNetCore.Server.Kestrel 2.1.3/1.1.3.
  • Issue with not reported events at the "Server" node as long as no MonitoredItem has been created to monitor the event expected in its node hierarchy where it resides.
  • Missing implicit call to ApplyChanges using OpcEventNode.ReportEvent(...).
  • Issue with always used type identifier of the BaseEventType in the simple attribute operands in an EventFilter.
  • Issue to assure that equal Start and End times when reading processed history values do not result in an infinite loop and memory consumption.
  • Issues with deadlocks when using UseDynamic and subscriptions consuming structured data types represented using the OpcDataObject class.

2.31 ​

API changes: none

2.31.0.0 (released on May 17, 2023)

Changed

  • Updated Newtonsoft.Json dependency to version 13.0.3, to fix a vulnerability.
  • The UA Wrapper Server for OPC Classic connections will now always generate a new application certificate, instead of trying to load one from the client's certificate store.
  • When no port is specified on an opc.com: URL, the port for the classic wrapper server is no longer derived from the classID and progID, but instead a free dynamic port number is determined. This facilitates using multiple OpcClients with the same opc.com: URL at the same time.

Fixed

  • Issue when updating the OpcServer's ApplicationUri from the selected certificate, which would only be applied for the second start instead of for the first start, which would cause the Reconnect mechanism of the OpcClient to fail.

2.30 ​

API changes: 1 added, 2 changed

2.30.0.0 (released on December 7, 2022)

New

  • Added debug-level trace logging when using break monitoring with the OPC Classic UA Wrapper Server.
  • Introduced OpcNodeId.Resolution.InheritParentNamespace property to control the inheritance of the namespace of parent nodes to their children.
  • The default node identifier resolution now uses the namespace (if not a default namespace) of the parent node to define the "automatic" node identifier of a node (if OpcNodeId.Resolution.InheritParentNamespace is true; the default value).

Changed

  • The behavior of starting and stopping an OPC Classic UA Wrapper Server is now more deterministic, as each OpcClient uses a dedicated wrapper server, which is now also stopped when the OpcClient disconnects.
  • The method OpcCertificateIdentity.Matches() is now virtual to enable custom identity comparison.
  • The OpcEvent.EventId property now provides the underlying ByteString instead of a byte-array (before the ByteString was introduced).

Fixed

  • Issue with ArgumentOutOfRangeException being thrown when creating an OpcFiniteStateMachineNode without defining states via attributes.
  • Issue with NullReferenceException when an OpcFiniteStateMachineNode is created after the OpcServer has already been started.
  • OpcEvent.GetValue<T>(string) correctly returns a ByteString value when type parameter T is Opc.UaFx.ByteString.
  • Issue with ArgumentException in OpcClient.Connect() when the current AppDomain's friendly name contains non-path characters (for example, in an Office VSTO add-on).

2.20–2.29 (2021–2022) ​

2.29 ​

API changes: 11 added, 1 changed

2.29.0.0 (released on September 16, 2022)

New

  • Added property OpcClientInterfaces.UseBreakMonitoring to temporarily stop the UA Wrapper Server for OPC Classic connections while a (DCOM) connection break to the OPC Classic server is detected.
  • Introduced OpcNamespace.GetNextId() method to query the next free numerical OpcNodeId from the OpcNamespace.
  • Introduced a set of new attributes to specify OpcStateMachineNode specific states and their transitions.
  • Introduced new OpcStateNode class to represent the OPC UA StateType.
  • Introduced new OpcTransitionNode class to represent the OPC UA TransitionType.
  • Introduced support to configure custom OpcFiniteStateMachineNodes using the new state / transition attributes to set up the initial state, the state nodes and the transition nodes using numerical or enumeration values.
  • Introduced OpcFiniteStateMachineNode.ChangeStateTo() method to change the current state of the StateMachine to another state. The method checks whether the target state exists and whether a transition exists from the current state to the new state.

Changed

  • OpcNode.AddNotifier is no longer supported on other types than OpcObjectNodes and their subclasses.

Fixed

  • Issues with missing data type information for the abstract data type "Structure" (i=22).
  • Issues accessing the OpcTransitionVariableNode.VariableId/Node properties.
  • Issues accessing the OpcFiniteTransitionVariableNode.VariableId/Node properties.
  • Issues accessing the OpcStateVariableNode.VariableId/Node properties.
  • Issues accessing the OpcFiniteStateVariableNode.VariableId/Node properties.

2.28 ​

API changes: none

2.28.1.0 (released on September 2, 2022)

New

  • Introduced inline initialization of encoding mask related "reserved" fields using a bit-array.

Fixed

  • Issue with hostname/IP address not taken into account when generating the port for the OPC Classic UA Wrapper Server.
  • Issue with OPC Classic client still calling IOPCBrowseServerAddressSpace.ChangeBrowsePosition() with OPC_BROWSE_TO even though OpcClient.Interfaces.DataAccess.SupportsBrowseTo was set to false.
  • Issue with wrong ValueRank and ArrayDimensions in data type definitions of structures using another field to define the length of an array-field.
2.28.0.0 (released on August 19, 2022)

New

  • Enhanced inline definition of DataTypeDictionaryNodes to only provide one if a data type description of a data type is to be published.
  • Unknown (user) defined data types are now resolved using the events OpcData.TypeResolve and OpcClient.TypeResolve using the corresponding encoding identifier and OpcNodeId.Null for the data type identifier.

Changed

  • Disabling OpcAutomatism.UseDynamicTypeRegistration resulted in a deferred dynamic type registration at the time a custom data type is manually registered.

Fixed

  • Issue with ArgumentException whenever the Value property of an OpcStateVariableNode or OpcFiniteStateVariableNode has been changed.
  • Issue with OpcData.TypeResolve where the event arguments passed provided the encoding identifier as the type identifier. This has been solved and the encoding identifier is provided as part of the Encoding supplied.
  • Issue with OpcClient.TypeResolve not being invoked for every data type.
  • Issue with not encoded dynamically resolved data types.
  • Issue with missing leading array length if a data type uses a fixed length field.
  • Issues with inline registered data types although OpcAutomatism.UseDynamicTypeRegistration has been disabled.
  • Issues with enumerations described in a different DataTypeDictionary than structured data types when using fully qualified data type identifiers (value and namespace URI).
  • Issue with importing NodeSets using structure data type definitions without an explicit base type identifier.
  • Issue with data type load errors in some third party clients when accessing DataTypeDictionaries only declaring enumerations.
  • Issues when selecting an endpoint by constraints, to ignore endpoints that have Mode == None but Algorithm != None and fallback if there is no other endpoint available.

2.27 ​

API changes: 20 added

2.27.0.0 (released on June 27, 2022)

New

  • Added new NumberInList property to OpcOrderedObjectNode to determine the current position of a node within the server.
  • Added new OpcClient.TypeResolve event to resolve user defined types according to client / session related conditions.
  • Improved OpcDataTypeDictionary.GetType(OpcEncoding) to consider encodings without expanded node identifiers.
  • Introduced new protected static (Shared in Visual Basic) OpcNode.DefineModel methods to define node type dependent modeling rules for its whole node model.
  • Introduced IOpcDataTypeMapper and its default implementation OpcDataTypeMapper.
  • Introduced new OpcData method to register, determine and unregister custom data type mappers.
  • Introduced new OpcDataTypeMapper.Convertible and OpcDataType.Delegate methods to construct simple custom data type mappers.

Fixed

  • Issue with OpcPropertyNode<T> not being added to its parent if the type parameter represents a custom data type.
  • Issue with BadNodeIdUnknown on EnumStrings if a custom enumeration type is defined using EnumStrings.
  • Issue of multiple hierarchical references between parent and child nodes if a subtype of the default reference type is used for a child node.
  • Regression with enhancement of IOpcNodeInfo.Child overloads and their implementations.

2.26 ​

API changes: 15 added, 1 changed

2.26.0.1 (released on April 13, 2022)

Fixed

  • Regression which disables subclassing of custom data types without data type attributes.
2.26.0.0 (released on April 13, 2022)

New

  • Introduced option to manually define which data types are to be defined using data type definitions and/or data type descriptions using the OpcDataTypeAttribute.
  • Added new Declarations property to OpcDataTypeInfo to indicate in which way the data type has been declared.
  • Added support for arrays of Bit members to define the encoding bits no longer only using scalar encoding bit members.
  • Enhanced OPC Watch with new upload button to write a file to a file node (the existing file content is truncated before).
  • Introduced new OpcNodeId.Resolution property to configure the ways node identifiers are resolved if no custom node identifiers are used.
  • Introduced new OpcNode events BeforeAdd and AfterAdd to handle conditions/states at the time a node is being or has been added to the address space of the server.
  • Introduced new OpcNode.Implement method to finalize the node creation before it can be used for the first time.
  • Enabled support of implementing standard OPC UA interfaces.
  • Introduced OpcOrderedObjectListNode as default implementation of the OrderedListType.
  • Introduced abstract OpcOrderedObjectNode as default implementation of the IOrderedObjectType / IOpcOrderedObjectNode.

Fixed

  • Issue with not respected custom data type encoding identifiers.
  • Issue with cached application certificates using a custom application store path.

2.25 ​

API changes: 5 added

2.25.0.0 (released on March 22, 2022)

New

  • Updated OPC UA Stack Types to version 1.04.368.
  • The server defined data type nodes no longer provide a data type definition in case of an opaque data type. Any read request results in BadAttributeIdInvalid and now behaves the same way as built-in opaque data type nodes behave.
  • Introduced IOpcData<T> to provide a way to subclass data types which are programmatically not inheritable.
  • Different improvements for lazy and cached data type metadata processing to improve performance of encode/decode operations.
  • Introduced new OpcClientSecurity related properties to configure the AuthenticationLevel and ImpersonationLevel the client shall use when connecting to an OPC Classic server.

Changed

  • Default size of (auto) encoding mask from one bit to 32 bit to improve usability of the by default expected 32 bit encoding mask.

Fixed

  • Issue with (auto) bit number used when a data type member is marked as optional using OpcDataTypeMemberSwitchAttribute.
  • Issue with reloading the server's data type system after a connection has been lost and re-established.

2.24 ​

API changes: 55 added, 2 changed, 1 obsoleted

2.24.0.0 (released on March 9, 2022)

New

  • Introduced new IOpcAsyncMethodCommand interface to implement asynchronous commands.
  • Introduced new default OpcMethodCommands.Execute to provide a custom generic command method to be executed using a command object.
  • Introduced new default OpcMethodCommands.ExecuteAsync to provide an async custom generic command method to be executed asynchronously using a command object.
  • Introduced support of IOpcAsyncMethodCommand and delegates pointing to a method which returns a Task or Task<T>. Either are executed asynchronously on method call.
  • Introduced new OpcAutomatism.UseAsyncMethodCalls property to globally control the execution of method calls for every server and all its node managers.
  • Introduced new OpcNodeManager.UseAsyncMethodCalls property to locally control the execution of method calls of methods defined by the node manager.
  • Introduced support for OPC UA NumericRange information using the new OpcRange structure.
  • Enhanced OpcReadNode with new Range property to support reading a range of elements in an attribute.
  • Enhanced OpcWriteNode with new Range property to support writing a range of elements in an attribute.
  • Introduced additional OpcClient.ReadNode method overloads to provide an OpcRange to read a range of elements in an attribute.
  • Introduced additional OpcClient.WriteNode method overloads to provide an OpcRange to write a range of elements in an attribute.

Changed

  • The OpcNodeAccessToken.IndexRange is now obsolete, use new OpcNodeAccessToken.Range property instead.
  • The property type of OpcReadVariableValueContext(<T>).Range has been changed from Ua.NumericRange to OpcRange.
  • The property type of OpcWriteVariableValueContext(<T>).Range has been changed from Ua.NumericRange to OpcRange.
  • The property type of OpcReadPropertyValueContext(<T>).Range has been changed from Ua.NumericRange to OpcRange.
  • The property type of OpcWritePropertyValueContext(<T>).Range has been changed from Ua.NumericRange to OpcRange.

Fixed

  • Issues with strict XmlReflectionImporter used in Mono/Xamarin while mapping class information (including expected attributes and property types).

2.23 ​

API changes: 10 added

2.23.0.0 (released on March 2, 2022)

New

  • Introduced new Tag property in OpcServiceCommand to assign custom metadata bound to a specific command.
  • Introduced Load, Parse and TryParse methods on OpcDataTypeDictionary to provide different ways to consume an XML serialized dictionary in any possible way.
  • Overall review of OpcReadHistoryDetails, OpcReadNodeHistoryDetails, OpcReadNodeHistoryRawDetails and OpcReadNodeHistoryModifiedDetails.
  • Added missing documentation to OpcReadHistoryDetails, OpcReadNodeHistoryDetails, OpcReadNodeHistoryRawDetails and OpcReadNodeHistoryModifiedDetails.
  • Introduced new ReturnBounds property in OpcReadNodeHistoryDetails.
  • Introduced new ReadNode[s]History[Modified] methods to OpcClient to support custom OpcReadHistoryDetails.

Fixed

  • OPC Classic connections now specify RPC_C_AUTHN_LEVEL_PKT_INTEGRITY for DCOM to handle the hardening changes for CVE-2021-26414.

2.22 ​

API changes: 28 added

2.22.0.1 (released on February 25, 2022)

Fixed

  • Issue calling Acknowledge, Confirm and AddComment on OpcCondition and OpcAcknowledgeableCondition instances.
2.22.0.0 (released on February 11, 2022)

New

  • Introduced new CreateArray method in OpcArrayDimensions.
  • Introduced new GetDataType methods in OpcContext to determine context sensitive data type information.
  • Introduced support of OpcModelChangeEvent[Node] and OpcGeneralModelChangeEvent[Node] including its OpcModelChangeItem and OpcModelChangeActions.
  • Custom model change event propagation/handling using the new OpcModelChangeEventNode and OpcGeneralModelChangeEventNode.
  • Introduced inline event compression of model change events whenever an event snapshot of an OpcGeneralModelChangeEventNode is to be reported.

Fixed

  • Issue with wrong definition of ValueRank using OpcArguments constructor accepting custom array dimensions.
  • Issue with new DataTypeDefinition when defining a custom enumeration type before it is used for the first time.

2.21 ​

API changes: 1 added

2.21.0.0 (released on February 1, 2022)

New

  • Client API: Prepared OPC UA 1.04 compatible support of data type definitions using data type nodes' new DataTypeDefinition attribute. This enhancement is backward compatible with OPC UA 1.03, because DataTypeDictionaries and DataTypeDescriptions including the DataTypeEncodings are still used to determine declared and described data type information.
  • Server API: Introduced OPC UA 1.04 compatible support of data type definitions using data type nodes' new DataTypeDefinition attribute. This enhancement is backward compatible with OPC UA 1.03, because DataTypeDictionaries and DataTypeDescriptions including the DataTypeEncodings are still used to declare and describe a data type.

2.20 ​

API changes: 47 added, 44 changed

2.20.4.0 (released on January 14, 2022)

New

  • Clients are now notified with the status code BadNodeIdUnknown when a node subscribed is deleted later.
2.20.3.0 (released on January 4, 2022)

Fixed

  • Issue with OpcNamespace.Resolve() that caused OpcNamespaceCollection.ResolveValue() not to work correctly.
  • IndexOutOfRangeException when using a non-generic OpcAnalogItemNode in the server.
  • Issue with StackOverflowException when (implicitly) converting a Byte[] as a null reference to ByteString.
2.20.2.0 (released on October 20, 2021)

Fixed

  • Issue with duplicated error strings in OpcException.Message.
  • Issue with OpcMethodNode using wrong callback target.
2.20.1.0 (released on October 8, 2021)

New

  • Introduced new OpcEnumAttribute to control the definition of the enum members using EnumStrings or EnumValues. Additionally the OpcEnumAttribute provides properties to control the existing automatisms per enumeration type.

Fixed

  • Issue when connecting to a server using https: URLs on .NET Framework.
2.20.0.0 (released on September 17, 2021)

New

  • OpcClient now provides node type information for event, object and variable types.
  • OpcNode provides new RegisterType and UnregisterType methods to define/undefine custom node types.
  • OpcNode provides new GetType and GetTypeInfo methods to determine System.Type and OpcNodeTypeInfo instances used to define/describe a node type.
  • OpcInstanceNode provides new GetNodeValue and SetNodeValue methods to change the Value attribute of a dedicated OpcVariableNode which is a child of the instance node.
  • Subclassing an OpcObjectNode using the subclass as a custom node type definition as well results in inline created property/variable nodes for properties/fields defined in the subclass.
  • Subclasses of OpcTypeNode were introduced to define custom node types (OpcNodeType and OpcNodeType<T>).
  • Introduced new attributes to describe custom node types (OpcNodeTypeAttribute, OpcNodeTypeIgnoreMemberAttribute, OpcNodeTypeMemberAttribute, OpcNodeTypeOptionalMemberAttribute).
  • Enhanced OpcNodeTypeSystem class to provide Default and Current node type system related node type information.
  • Members in OpcNodeTypeInfo to provide additional information about the type and its children/members.
  • Extended data type resolution of OpcArgument to support lazy initialized custom data types as well.

Changed

  • OpcInstanceNode now determines its DefaultTypeDefinitionId using the node type used to create the instance node.
  • OpcMemberOrigins now defines an additional enum member Method for method origins.

Fixed

  • Issue with lazy defined custom data types used for arguments in OpcMethodNodes.
  • Issue with BadNodeIdUnknown while accessing/browsing the InputArguments/OutputArguments of OpcMethodNodes created before its dedicated OpcNamespace has been initialized and defined in the server (for example, before OpcNodeManager.CreateNodes has been executed).

2.10–2.19 (2020–2021) ​

2.19 ​

API changes: 36 added, 1 removed, 10 changed

2.19.2.0 (released on September 10, 2021)

New

  • Introduced support of IEnumerable<OpcName> in OpcNamePath.
  • Introduced new OpcClient.GetType(s) methods to determine any type information associated with a node identifier.
  • Introduced new OpcClient.IsSubtypeOf method to determine whether a type is a subtype of another type.
  • Introduced new IOpcNodeInfo.Child(OpcNamePath) method to determine a child node using a path of BrowseNames to follow and look up the corresponding child.
  • Introduced new ServiceName property in OpcServiceRequest and OpcServiceResponse.
  • Introduced new methods GetResults and GetResultExceptions in OpcServiceResponse to determine request and command related exception information.
  • Introduced new OpcServer.RequestJudgement event to handle request issues and decide whether an impeachment is to be dismissed. For example, an outdated request (BadInvalidTimestamp) can still be allowed through the Dismiss property.

Changed

  • Removed unnecessary new lines in the string representation of OpcException instances.

Fixed

  • Misleading use of the same base type (that is, the topmost node type) for the topmost base type when examining the type hierarchy of a node type (for example, BaseType of BaseEventType was BaseEventType).
  • Possible NullReferenceExceptions using the OpcClient.GetDataType and OpcClient.GetNodeType methods with a null reference (Nothing in Visual Basic) instead of a valid instance of the OpcNodeId class.
  • Issue with too few HistoryValues being returned when the server sent no values but a continuation point in one of the responses.
2.19.1.0 (released on September 1, 2021)

New

  • Introduced new GetValue method in OpcEvent for subclasses to determine the correct value according to its event type definition and using its property name as the name of the node whose value is to be retrieved. However, the same method can be used to resolve the value using the qualified name syntax as known/supported using the DataStore.Get methods. This assures that custom event types no longer need to know the namespace index in any case.

Changed

  • Possibly breaking: IOpcReadOnlyNodeDataStore now requires the implementation of IOpcNamespaceResolver as well.

Fixed

  • Issue with resolving the corresponding custom OpcEvent type/instance for a custom event declared using the expanded node identifier of the event type.
  • Issue with hangs observed when connecting to OPC Classic servers.
2.19.0.0 (released on August 27, 2021)

Breaking: Clients and servers since version 2.17.0.0 do not access or provide file nodes according to the OPC UA specification. They use a byte array instead of ByteString to read and write file contents. This issue has been fixed in this version.

New

  • Enhanced node type and data type resolution to support expanded (that is, resolved) node identifiers as well.

Changed

  • Breaking: OpcFileReadMethodNode.FileReadCallback and OpcFileReadMethodNode.FileReadExCallback now return a ByteString instead of an array of bytes.
  • Breaking: OpcFileWriteMethodNode.FileWriteCallback and OpcFileWriteMethodNode.FileWriteExCallback now accept a ByteString for the data parameter instead of an array of bytes.
  • Parameter of OpcFilterOperand.OfType from value : object to typeId : OpcNodeId to assure that an OfType operand is evaluated as expected (that is, using an OpcNodeId).

Fixed

  • Breaking: Regression issue using OpcFileNode access using Read and Write operations after enforcing the Foundation's stack to use ByteString for ByteString and Byte[] for Byte[] instead of using ByteString for Byte[].
  • Issue with no history values being returned when the server reports status code GoodNoData with a continuation point.
  • Issue with infinite history values being returned when the server allows re-using continuation points.

2.18 ​

API changes: 61 added, 4 changed

2.18.5.0 (released on August 13, 2021)

New

  • Introduced support of encoding-based data type retrieval using OpcClient.GetDataType with, for example, OpcValue.DataTypeId.
  • Enhanced processing of (structured) data type information to support duplicate data type declarations to redirect to data type descriptions where referenced.
  • Simplified property node definition without manually adding the node to the children of a parent node.

Fixed

  • Regression in version 2.18.4.0 with OpcException and BadServerNotConnected with enabled OpcClient.UseDynamic option while connecting to a server.
  • Issues with Siemens OPC UA servers using a custom server interface setup with custom structured data types. This resolution requires the option "enable standard SIMATIC server interface" as well to support the custom server interface setup and its data types used.
2.18.4.0 (released on August 9, 2021)

New

  • Introduced support of Expression<TDelegate> compiled delegates in OpcMethodNodes.
  • Introduced indexer using an Int32 to address a dedicated OpcDataField in an OpcDataObject.
  • The OpcClient.SubscriptionsChanged event is now raised whenever OpcClient.Subscriptions are cleared.
  • Removed obsolete code no longer supported in .NET 5.0.
  • Improved exception handling/message when importing a UANodeSet.

Fixed

  • Issue with late loaded custom type information after the OpcClient.Connected event has been raised.
  • Issue with enhanced byte[] support which led to no longer working sbyte[] support as variable node value (reason of the issue: .NET does not distinguish between signed and unsigned types using pattern matching).
  • Issue writing Byte[] values to variable nodes, because the Foundation's stack enforces the use of Variant to consume byte arrays as Byte[] instead of a ByteString. However, doing so results in wrong type validations writing a variable node using an array of bytes as data type / value. Solved that by considering the subsequent stack code accordingly.
2.18.3.0 (released on June 28, 2021)

New

  • Enhanced exception details using inner and aggregate exceptions to populate reasons of OPC Classic connectivity issues when using an OPC Classic to OPC UA wrapper server within the same process.
  • Introduced additional OpcNodeIdComparison options: IgnoreNamespaceIndex and IgnoreNamespaceIndexIgnoreCase.

Changed

  • OpcClassicDiscoveryClient now uses OpcException to represent all stack related exceptions.

Fixed

  • Issues with OpcServerInfo if the SDK is used by bundled assemblies.
  • Issue when connecting to OPC Classic servers on remote machines.
  • Issues with missing nodes while browsing an OPC Classic server with a flat node organization.
  • Issue transporting a byte array to a method node, because the Foundation's stack transfers such a value by default as a ByteString instead of using it as it is.
2.18.2.0 (released on June 17, 2021)

New

  • Introduced new Translate methods in OpcServerGlobalization to provide mechanisms to localize custom resources.
  • Introduced support of enum arrays, which is missing in OPC Stack 1.03.
  • Introduced OpcNodeIdComparison and new OpcNodeId.Equals methods to compare node identifiers using different comparison methods.

Changed

  • OpcNodeId now matches the OPC UA specification and compares node identifiers and namespaces case-sensitively.

Fixed

  • Issue with missing preferred locales in OpcSession after activating a session. The locales were only internally updated and used.
  • Issues with ServerHalted exceptions when accessing properties of an instance of the OpcServer class before starting the instance.
2.18.1.0 (released on June 2, 2021)

New

  • Added additional setter to the OpcBrowseNode.Degree property.
  • Introduced new OpcClient.Interfaces property to configure the communication using OPC Classic interfaces.
  • The OpcClassicDataAccessOptions class provides options to configure the type of organization to use and whether the server supports the BrowseTo service.

Fixed

  • Issue when running on Mono and connecting to an OPC UA server that doesn't send a certificate.
  • Issue with missing subscription based notifications after an automatic reconnection.
  • Issue with using a byte array in an OpcValue, which results in a ByteString encoded byte array upon the underlying stack API.
  • Issue with encoding the Value attribute of non-generic OpcVariableNodes using an array of ByteString values.
2.18.0.0 (released on May 26, 2021)

New

  • Improved scenarios where Byte[], ByteString and ByteString[] or some of them are used as the data type of a method argument or a variable node.
  • Introduced support for OpcDataTypeInfo.Documentation used for the OpcDataTypeNode.Description attribute.
  • Introduced new OpcReferenceTypes.GetReferenceTypeName(OpcNodeId) and GetReferenceType(OpcName) methods.
  • Completely reviewed and enhanced the types OpcRelativePath and OpcRelativePathElement.
  • Introduced support for browse path translation using the TranslateBrowsePath service.
  • OpcClient now supports browse path translation using the new TranslatePath and TranslatePaths methods.

Changed

  • Format of ByteString from Base64 encoding to hex (X2) encoded / formatted strings, which matches the Foundation's binary encoded representation of a ByteString.

Fixed

  • Incorrectly initialized ArrayDimensions and ValueRank attributes of method arguments and variable nodes using Byte[], ByteString or ByteString[] or some of them as the data type.
  • Incorrectly initialized DataTypeDictionary node regarding its ArrayDimensions and ValueRank attributes after introducing the new explicit ByteString data type.
  • An avoidable NullReferenceException while initializing encodable data types is no longer thrown.
  • Issues with incorrectly determined OpcArgument metadata used to define array-based method arguments.
  • Issues with reflecting System.Type information which is defined by-reference, for example, using an out parameter in the delegate of a method node.
  • Issues with importing UANodeSets whose references use aliases to address a dedicated node.
  • Issue with missing type identifier whenever inspecting fields of data types where the type of the field is an array type. The array type did not provide the type identifier of its element type.
  • Issues in applications with third-party components using attribute types which are not loadable. This fixes TypeLoadExceptions whenever custom data / event types are inspected.

2.17 ​

API changes: 2 added, 3 changed

2.17.0.0 (released on May 4, 2021)

New

  • Added support for custom subtypes of the OpcFileInfo class.
  • Enhanced OpcMethodContext with Owner information to gain access to the underlying OpcServer instance.
  • Enhanced encoding/decoding support for structured data types using their base type information.
  • Introduced support of namespaces with null references using OpcNamespace.Create.
  • Introduced explicit support of the ByteString data type to simplify differentiation between byte array and ByteString values.

Fixed

  • Issue with servers supplying null references in their array of namespaces.
  • Issue with reset OpcNode.Description when using, for example, OpcDataVariableNode<T> with a custom data type.
  • Issue with uninitialized event nodes used in "off-address-space" scenarios, for example, for "lightweight" events.
  • Issue with firewall aware and therefore DNS safe host names used to create a new session using the raw discovered endpoint URL instead.
  • Issue with TypeInitializationException while testing for Unity in some dynamic assembly load scenarios.
  • Issue with InvalidOperationException in the Foundation's BufferManager whenever a still locked buffer is to be returned without a preceding unlock.
  • Issue with unresolved data type information in method node arguments using expanded node identifiers for the data types.
  • Issue with unresolved data type encoding in the server's type tree using expanded node identifiers for the data type encoding.
  • Issue with comparing expanded node identifiers with the same identifier using different namespaces.
  • Issue with querying type information from a custom type whose name is already in use by a different custom type in a different namespace.
  • Issue with NullReferenceExceptions when trying to translate resources without any localized resource information.
  • Issue with missing custom data types which are defined among multiple (dynamic) node managers.
  • Issue with default reference type inheritance using the OpcFolderNodes default reference type Organizes, which was no longer applied to its direct child nodes after the most recent update of the Foundation's stack.
  • Subsequent issue with declaring/accessing variable nodes using ExpandedNodeId/NodeId as DataType.
  • Threading issue when starting multiple OpcServer instances asynchronously.
  • Wrong ArrayDimensions attribute value on the InputArguments and OutputArguments nodes of OpcMethodNodes.

2.16 ​

API changes: 9 added

2.16.1.0 (released on April 21, 2021)

New

  • Enhanced OpcNominalNodeIdFactory to apply custom logic to the OpcName used to define the OpcNodeId created.

Fixed

  • Issue with still existing OpcSubscription instances in OpcClient.Subscriptions although the client has been disconnected.
2.16.0.0 (released on April 20, 2021)

New

  • Introduced support for custom OpcFileNode sources using the new IOpcFileInfo interface.

Fixed

  • Issue with declaring/accessing variable nodes using ExpandedNodeId as DataType.
  • Issue with FileNotFoundExceptions using some third-party assemblies while dynamic type registration is enabled.

2.15 ​

API changes: 6 added

2.15.0.0 (released on March 31, 2021)

New

  • Introduced new Opc.UaFx.Client.OpcSubscription.Client property to get access to the client which is the owner of a subscription.
  • Introduced new OpcServer.Binding.Addresses property to define explicit IP addresses of the network interfaces to bind to and listen on.
  • Introduced OpcNodeCollection.TryGet method to try to look up a node using its node identifier.
  • Introduced OpcNodeManager.GetNode methods to query nodes using their node identifier or a path which represents a slash (/) combined sequence of browse and/or symbolic names to describe the path to the node to determine.

Fixed

  • Issue with creating property nodes without a parent node.

2.14 ​

API changes: 12 added

2.14.0.0 (released on March 4, 2021)

New

  • Introduced new static OpcName.IsNullOrEmpty method which ignores the namespace information associated with the OpcName.
  • Introduced new static OpcNodeId.IsNullOrEmpty method which ignores the namespace information associated with the OpcNodeId.
  • Introduced new OpcNamespace.GetId(object) method to determine a new node identifier without knowing which type of value it is.
  • Introduced dynamic resolution of data type information when using not registered data types.
  • Introduced additional non-generic OpcData.RegisterType methods to no longer enforce the use of the generic type parameter.
  • Introduced new OpcDataTypeNode.Create(...) methods to provide a non-generic way to initialize new OpcDataTypeNode instances.

Changed

  • Removed duplicate references to DataTypeNodes when using the OpcAddressSpace class to describe the nodes of the server.

Fixed

  • Issue with "malformed" or "TooMany" subscriptions preventing the OpcClient from automatically reconnecting after connection loss.
  • Issue with inline initialized OpcDataTypeNodes using new dynamic resolution of data type information.
  • Issue with missing custom enumeration type references in the global data type system.

2.13 ​

API changes: 4 added

2.13.0.0 (released on March 1, 2021)

New

  • Improved dynamic resolution of the data type attribute supporting expanded node identifiers as well.
  • Improved dynamic data type encoding / decoding to support subclassing and cascaded custom structured data types.
  • Introduced new OpcDataTypeIgnoreMemberAttribute to explicitly exclude a member from being encoded or decoded.
  • Introduced new OpcDataTypeAttribute.NamespaceUri and OpcDataTypeAttribute.UseDataTypeDescription properties to define the target namespace used for the data type dictionary of the data type and to define whether the data type needs to be described in a custom data type dictionary.
  • Introduced support of custom target namespaces for custom enumeration types.
  • Introduced support for embedded custom data types when using dynamic data exchange using container types like Variant and/or ExtensionObject.

Fixed

  • Issue with missing target namespace reference in the data type dictionary when using custom data types without target namespace information.

2.12 ​

API changes: 34 added, 2 removed, 4 changed

2.12.3.0 (released on February 17, 2021)

New

  • Enhanced support of IL2CPP regarding issues with embedded string evaluation.

Fixed

  • Issues using default certificate probing paths in Unity using UWP.
  • Issue with calling method nodes after introduction of argument localization.
2.12.2.0 (released on February 15, 2021)

New

  • Implemented localization support for arguments of a method node.

Fixed

  • Issue with missing localized information if a client uses the locale of a neutral culture.
  • Issue with null references (Nothing in Visual Basic) when reading localizable attributes without localization information.
2.12.1.0 (released on February 11, 2021)

New

  • Introduced new OpcNodeExportOptions to set up the information exported while exporting nodes to a NodeSet.
  • OpcNodeManager.ExportNodes(OpcNodeExportOptions) method overload to specify custom node export options.
  • Introduced new OpcNodeGlobalization class to maintain the resources used to localize the attributes of a dedicated node.
  • OpcNode.DisplayNames and OpcNode.Descriptions properties to provide an instance to control the localization on node level per localizable attribute.

Changed

  • Bidirectional references between DataTypeDescription, DataTypeEncoding and DataType nodes are now unidirectional (using default export options).

Fixed

  • Issue with automatically determined server information using the process related version information including an evaluation of the ProductVersion and the FileVersion.
  • Issue with overridden OpcNode.SymbolicName if the node has been imported with a different SymbolicName than the DisplayName.
  • Issue with no longer multi-line Base64 encoded DataTypeDictionary (using default export options).
  • Issue with removed ParentNodeId attributes in NodeSets (using default export options).
  • Issue with re-ordered nodes (using their NodeId) in exported NodeSets. Now they are exported in the order of their definition / implementation.
  • Issue with missing supertypes while importing nodes once exported to a NodeSet (because of re-ordered nodes).
2.12.0.0 (released on February 4, 2021)

New

  • Introduced new Namespaces property in IOpcApplicationInstance and OpcApplicationInstance to provide the namespaces used.
  • Introduced new Namespaces property in OpcClient to reflect the namespaces defined by the server connected to.
  • Introduced new Namespaces property in OpcServer to provide the namespaces used by the node managers of the server to organize the address space.
  • Introduced new Namespaces property in OpcContext to provide the namespaces currently valid within a given context.
  • Implemented IOpcNamespaceResolver in OpcNamespaceCollection and OpcReadOnlyNamespaceCollection.
  • Resolve method in IOpcNamespaceResolver to resolve another ("online") namespace using the metadata from an (offline / local) defined namespace.
  • OpcNamespace now provides a URI whenever OpcNamespace.Value is a valid URI.
  • Connections to OPC Classic servers through an inline used wrapper server are now secured using the same user identity set up in OpcClient.Security.UserIdentity.
  • OpcClient and OpcClassicDiscoveryClient now support the use of a host identity for DCOM authentication. Note: For the OpcClient, the OpcClient.Security.UserIdentity is used for DCOM authentication as well.
  • Introduced new Scope property in OpcNamespace to describe the context in which the namespace has been created and to which its metadata applies.
  • Improved performance initializing OpcNodes during the startup of the OpcServer.
  • Using OpcNodeManager.ctor(OpcNamespace, ...) with a namespace which references an explicit namespace index results in an ArgumentException, because the server will define the namespace indexes associated with the different namespaces used.
  • The OpcNamespace instances in the OpcNodeManager are now synchronized with the OpcNamespace instances in the new OpcServer.Namespaces property. Note that until the server is about to start, the instances in OpcNodeManager.Namespaces might be exchanged with the instances in the OpcServer.Namespaces property. In fact, in methods like OpcNodeManager.CreateNodes(...), all OpcNodeManager.Namespaces are already in sync with the OpcServer.Namespaces.

Changed

  • The OpcNamespace.Default namespace now provides the default value and URI used to identify the Foundation's default namespace.
  • Removed obsolete methods from IOpcNamespaceResolver and all its implementations in OpcClient, OpcServer, OpcContext and OpcNodeManager.
  • OpcClient.State no longer transitions (using the reconnect mechanism activated by default) when calling, for example, ReadNode while the OpcClient is about to re-establish a broken connection.
  • In case of a broken connection, the OpcClient tries (by default) to re-establish the connection and re-use the previously used session. If this works, the OpcClient will raise the Reconnected event as before. If the client has been forced to create a new session (for example, upon timeout of the previous session), the OpcClient will now raise the Connected event instead of the Reconnected event to provide a way to distinguish these conditions in user code.
  • Comparison in OpcNodeId and OpcNamespace to provide results typically used by .NET APIs when comparing to a null reference (this differs from the implementation used by the Foundation).

Fixed

  • Issue with "collapsed" endpoint URLs when discovering a server which returns, for example, opc.tcp://:4840.
  • Issue with unresolved node identifiers used when manually creating MonitoredItems being added to a subscription.
  • Issue with "over-resolved" node identifiers through resolving a node identifier always to a new node identifier instead of overriding namespace information in existing node identifiers.
  • Issue in OPC Classic Stack with a growing number of threads (especially in MTA applications) in case of connection loss while communicating with OPC Classic servers.
  • Issue with providing custom data types without defining an explicit NamespaceUri in their DataTypeEncoding.
  • Issue with lost OpcNamespace information after inline re-initializing the node identifier of a node whose Foundation node identifier has been changed in the meantime.
  • Issue in applications where multiple servers are accessed or a client and server are implemented in the same process; however, all involved namespaces did not match every use case. This has now been solved through no longer inline resolving the namespace of an existing node identifier and OpcNamespace instance. If this is desired, the user now has to resolve the namespace on their own.

2.11 ​

API changes: 47 added, 4 removed, 8 changed, 1 obsoleted

2.11.5.0 (released on December 21, 2020)

New

  • Optimized usage of aliases in exported UA NodeSets (unused ones are now removed from the UA NodeSets generated).
  • Removed redundant node information by comparing DisplayName and Description. If both are equal, the Description attribute is no longer exported to the UA NodeSet generated.
  • Removed redundant ParentNodeId attribute from the UA NodeSets generated if the parent node is already referenced using the ReferenceTypeId of the child node.

Fixed

  • Issue with NullReferenceExceptions in OpcServer when trying to add a new node (through a client) with an unknown / invalid parent node identifier.
  • Issue with missing node references (to nodes which are defined within a different node manager) in UA NodeSets when exporting nodes whose node identifier has been implicitly assigned.
  • Issue with exporting nodes which refer to each other using the ParentNodeId attribute and an explicit node reference (the ParentNodeId is now omitted in such a case if child.ReferenceTypeId [the default reference type between parent and child nodes] is the reference to declare in the UA NodeSet). Importing the resulting UA NodeSets led to an address space with multiple references between the nodes (which were defined by the ParentNodeId attribute and the references defined).
2.11.4.0 (released on December 15, 2020)

New

  • Introduced new OpcContext.Owner property which refers to an IOpcApplicationInstance like OpcClient or OpcServer the context belongs to (if available).
  • Introduced new OpcException.Context property which offers an instance of the OpcContext class and therefore provides additional context-sensitive information regarding an exception thrown/caught.

Fixed

  • Issue using abstract methods as delegate for method nodes (caused by an issue in the .NET Framework using GetCustomAttribute<T> extension methods).
2.11.3.1 (released on November 27, 2020)

Fixed

  • Issue connecting to servers evaluating endpoint URLs using case-sensitive comparison and not supporting / terminated URLs.
2.11.3.0 (released on November 23, 2020)

New

  • Added missing OpcEventDataSetItem.ClientID property.
  • Added missing code documentation of OpcSecurityPolicy, OpcSecurityMode and OpcSecurityAlgorithm.
  • Introduced new PreferredLocales property to OpcContext, OpcOperationContext and OpcSession.
  • Introduced new OpcNode.Read/WriteDisplayNameCallback property.
  • Introduced new OpcServer.GetSession(sessionId) method to query a specific session using its session identifier.
  • Introduced new OpcServer.Globalization property to provide a more advanced way to localize data and information.

Changed

  • Used data type in OpcNode.Read/WriteDescriptionCallback property from String to OpcText.
  • OpcDataChangeDataSetItem.ClientID from Int32 to Int64 to match the used type in OpcMonitoredItem.ClientID.

Fixed

  • Issue with missing OpcNotification.Data using OpcNotification.GetDataChanges() without accessing OpcNotification.Data before.
  • Issue with type initialization in OpcClient using Unity with IL2CPP, which results in a different type initialization order.
2.11.2.0 (released on November 10, 2020)

New

  • Experimental OpcNodeManager.ExportNodes method to generate OpcNodeSet instances from the address space defined by a node manager. Use the method where required and send us feedback in case of any issues or desired enhancements.

Fixed

  • Issue that could lead to a hang in OpcClient.Dispose() when a subscription was active.
  • Possibility of exceptions in OpcClient.Dispose and OpcServer.Dispose.
  • Issue validating license information using IL2CPP and .NET Standard 2.0 as scripting backend in Unity.
  • Issue which prevented use of an existing SynchronizationContext to process notifications in the same context a subscription was created from.
  • Issue adding nodes with additional node references (references were not added to the address space).
2.11.1.0 (released on November 5, 2020)

New

  • The OpcServer is now able to get stopped while it is in the suspended state.
  • Property to configure the TimestampsToReturn for all requests using OpcClient.Services.ReadNodesHistory.TimestampsToReturn.
  • Property to query the ApplicationUri contained in the subject alternate name extension of certificates using the OpcCertificateInfo.ApplicationUri property.
  • Property OpcClientSecurity.AutoUpgradeEndpointPolicy to enable endpoint selection using a match (default) and next-best technique to determine an endpoint which at least satisfies the policy configured.

Changed

  • The constructor of OpcCertificateJudgementEventArgs no longer verifies if the specified certificates are a null reference (Nothing in Visual Basic), because some servers might supply no certificate data for endpoints with the policy None (mode and algorithm).

Fixed

  • Issue with no longer stored last notifications in subscriptions / MonitoredItems if they are not (or no longer) created for the current session.
  • Issue with missing or faulty security policies after restarting the OpcServer.
2.11.0.0 (released on October 6, 2020)

New

  • Introduced method OpcServer.Suspend() to change the server's state to Suspended.
  • Introduced method OpcServer.Resume() to change the server's state back to Started.
  • Enumeration members Suspending and Suspended in OpcServerState.
  • Enhanced OpcSession.Close to no longer only discard session related diagnostic data. Instead, this method now really closes the session.
  • Added missing code documentation to subscription related types in the Client namespace.

Changed

  • OpcSession.Close closes the session and invalidates the session-related identifier.
  • OpcClient methods validate the connection state using an OpcException (with BadServerNotConnected) instead of using an InvalidOperationException.
  • Default QueueSize of OpcMonitoredItem created using OpcClient.SubscribeEvent(s) from int.MaxValue to uint.MaxValue to enforce that the server uses the maximum queue size supported for event notifications (which was initially intended with the wrong int.MaxValue).
  • Renamed OpcMonitoredItemStatus.DataItemQueueSize to QueueSize to match the naming used in OpcMonitoredItem (which defines the requested size while the status gives the revised size).
  • Returned type of OpcMonitoredItemStatus.Id from Int32 to Int64 to cover the underlying non-CLS compliant UInt32 of the Foundation's stack.
  • Adopted recently reviewed API of OpcMonitoredItem to OpcMonitoredItemStatus and reworked OpcMonitoredItemStatus.AutoFlushCache to QueueMode (as in OpcMonitoredItem).

Fixed

  • Wrong status code used for communication errors (BadNotConnected -> BadCommunicationError).
  • The OpcClient connected to a fallback/unsecure endpoint if a preset SecurityPolicy is not supported by a server.
  • Issue with not applied OpcSubscription.TimestampsToReturn without changing the MonitoredItems of a subscription.
  • Typos in RegisterNode(s) code documentation.

2.10 ​

API changes: 12 added, 4 changed

2.10.0.3 (released on September 11, 2020)

Fixed

  • Issue connecting to OPC Classic servers.
2.10.0.2 (released on September 9, 2020)

Fixed

  • Issue with comparing OpcNodeIds using a byte array as node identifier value.
2.10.0.1 (released on July 15, 2020)

New

  • Updated description in NuGet.
2.10.0.0 (released on July 14, 2020)

New

  • Enabled auto-initialization features of nodes added using the AddNodes service. This results in the same behavior as used when adding a node within a custom node manager.
  • Enhanced OpcCertificateManager.SaveCertificate method to determine format of certificate using the file extension of the specified filePath parameter.
  • Introduced OpcValueRange.Of methods to dynamically determine the corresponding OpcValueRange for a specific type of data.
  • Non-generic OpcAnalogItemNodes can now define the corresponding OpcValueRanges for the InstrumentRange and EngineeringUnitRange on their own as well (using the DataType attribute).
  • Added support to encode/decode System.Decimal (not supported by OPC UA 1.03) using System.Double. This applies to fields in data structures.
  • ProductUri property in OpcClient and OpcServer to simplify the configuration of it.
  • Added automatic initialization of ProductUri information in client and server applications.
  • Introduced use/support of an existing SynchronizationContext to process notifications in the same context a subscription was created from.
  • Improved developer experience in GUI applications (like Windows Forms) regarding correct multi-threading in GUI applications to handle received notifications.
  • Introduced OpcNode.UpdateChanges methods to notify about changes on behalf of a node (and its children).
  • Added missing documentation to different types.

Changed

  • OpcNode.OnAfterApplyChanges and OpcNode.OnBeforeApplyChanges use OpcNodeChangesEventArgs instead of EventArgs.
  • OpcNode.AfterApplyChanges and OpcNode.BeforeApplyChanges pass OpcNodeChangesEventArgs instead of EventArgs to event handlers.

Fixed

  • Issue writing an analog item node which is offered by a custom node manager without providing an InstrumentalRange to validate values written to the node.
  • Issue with only once updated SourceTimestamp in OpcValues (if there was no SourceTimestamp explicitly defined) written to the variable node.
  • Issue in OpcNodeHistorian if a NodeSet imported node with enabled historizing is attached to a new OpcNodeHistorian while the node is missing HistoryConfiguration and/or AggregateConfiguration nodes.
  • Issue linking assembly in C++ CLR projects using C++/CLI, which results in C2686.
  • Issue with NullReferenceExceptions using .NET Core 3.1 while receiving event notification data.
  • Issue with not expanded node identifiers in namespace index one (reserved for the core/application namespace).

2.0–2.9 (2017–2020) ​

2.9 ​

API changes: 182 added, 41 removed, 50 changed

2.9.2.1 (released on May 8, 2020)

Fixed

  • Issue reading a structured data type which uses an array as a field while OpcClient.UseDynamic is true.
2.9.2.0 (released on May 6, 2020)

New

  • Added additional constructor overloads to OpcArgument to support the use of an OpcDataType enumeration value, the identifier of a data type and custom array dimensions as well.
  • Added support for n-dimensional (that is, multi-dimensional) arrays of structured data types.
  • Added support for n-dimensional variable nodes (this includes the new ArrayDimensions property on OpcVariableNode as well).
  • Added support of null references as field values for fields using a reference type as the type of value.
  • Added support of the ObjectType NodeClass in calls to the add nodes service.
  • Added support of the VariableType NodeClass in calls to the add nodes service.

Fixed

  • Issue with automatic definition of the ValueRank of variable nodes in case of n-dimensional custom structured types.
  • Issues in the stack to support n-dimensional custom structured types.
  • Issue loading UANodeSets with extended values for AccessLevel and UserAccessLevel in UAVariable entries (belongs to stack 1.04).
  • Issue with NullReferenceExceptions in OpcDataTypeInfo.BaseType in case of data types defined in a NodeSet using UATypeDefinitions without any field.
  • Issue with NullReferenceExceptions if an encoding-independent data type (that is, an enum) is defined in the address space. This issue belongs to the server API only.
  • Issue with wrongly determined ValueRank in case of System.Byte[], because it was matched with the ByteString by the foundation stack.
2.9.1.0 (released on April 22, 2020)

Fixed

  • Issue which led to duplicate browsed references between parent/child nodes imported using a NodeSet.
  • Issues with newer versions of System.ServiceModel.Primitives. Rolled back dependency to version 4.5.3 in all target frameworks.
  • Issues with subsequent evaluation licenses used for bundle licensing (client and server).
  • Issue with wrongly determined ValueRank in case of System.Byte[], because it was matched with the ByteString by the foundation stack.
  • Issue with result of OpcNamespace.Get(int, Uri) which resulted in an OpcNamespace.Value which did not express the Uri.OriginalString as defined by the namespaceUri parameter.
  • Issue with cascaded custom data types if they do not define a custom NamespaceUri in their DataTypeEncoding. This issue belongs to the server API only.
  • Issue with not applied BrowseName in AddNodes in case of type NodeClasses. This issue belongs to the server API only.
  • Issues with type NodeClasses regarding wrong AddNode command validation. This issue belongs to the server API only.
2.9.0.0 (released on April 1, 2020)

New

  • Unified product licensing which no longer differs between frameworks.
  • All Licenser classes now offer different FailIf and ThrowIf methods to verify the used license on demand by user code. Use FailIf methods in your DEBUG configurations and use ThrowIf methods in your RELEASE configurations to protect yourself from the unlicensed use of the SDK.
  • Added new GetNodeType(...) methods to OpcClient (only for event node types).
  • Added new GetNodeTypeSystem(...) methods to OpcClient (only for event node types).
  • Added new GetNodeType(...) methods to OpcNodeSet.
  • Added new GetNodeTypeSystem(...) method to OpcNodeSet.
  • OpcMethodNode now supports custom defined input and output arguments when using IOpcMethodCommand.
  • Added new GetNodeType(...) methods and GetNodeTypeSystem() method to OpcNodeSet.
  • OpcNode now inherits the OpcNode.Namespace to its child nodes (if they use the default namespace determined by their OpcNode.Id).
  • Introduced new specializations of OpcTypeNodeInfo: OpcObjectTypeNodeInfo and OpcVariableTypeNodeInfo (subclassing OpcTypeNodeInfo).
  • Improved experience while debugging and inspecting the properties of OpcNodeInfo instances (and its subclasses).
  • Browsing now supports reading additional attributes besides the attributes supported by the browse services.
  • OpcNodeInfo now implements IOpcNodeInfo to provide a more fluent use of node instances independent from their source.
  • Additional configurable services in OpcClientServices: Browse and ReadNodes.
  • Significantly improved performance when constructing event filters.
  • IOpcNodeInfo now defines the additional methods: AttributeValue(...), Child(...) and Children().
  • Unlimited browse, read and write operations upon automatic request partitioning (OpcClient).
  • OpcClient.CertificateJudgement event to handle certificate issues after a connection has been established and certificate information has been successfully validated first.
  • OpcModel representing the model information in NodeSets.
  • OpcMemberSwitch.Conditions property to inform about the condition under which a switch is evaluated.
  • Direct support of .NET Core 3.1 as one of our target frameworks.
  • Implemented ReplaceNode method in OpcNodeManager to replace an existing node recursively in nodes, notifiers and MonitoredItems.
  • Added additional metadata properties (LastModified and Name) to OpcNodeSet.
  • A general implementation of the IOpcMethodCommand interface using callbacks: OpcMethodDelegateCommand.
  • Added missing documentation to collection and some other types.
  • OpcNodeSetManager.ImplementNodeCallback to implement nodes just using a simple callback method.
  • OpcData.GetNodeId now supports array types as well.
  • Added encoding information in the address space of the server (internal).
  • Generic implementation of IOpcMethodCommand for delegates: OpcMethodDelegateCommand.
  • Support of System.Object and System.Object[] for encoding / decoding data types.
  • Support of serialization / deserialization attributes defined in System.Runtime.Serialization on data types.
  • OpcDataTypeMembersAttribute to filter members which shall be encoded / decoded on data types.
  • OpcDictionary<TKey, TValue> as a bare and not by default available data type to transport dictionaries using OPC UA.
  • It is no longer necessary to link the name or identifier of custom defined root nodes returned by OpcNodeManager.CreateNodes(...) manually to the default namespace of the custom NodeManager.
  • Respecting the order of fields as they are declared within their inheritance hierarchy to always define the fields of the base data type first.
  • Added new GetDataType(...) methods to OpcClient.
  • Added new GetDataType(...) methods to OpcNodeSet.
  • IOpcNodeInfo now defines the methods Child(...) and Children() to query the child nodes of a node instance.
  • Implemented new OpcNamespaceCollection.
  • OpcNodeSet.Namespaces property to provide the namespaces referred to in a NodeSet.
  • IOpcMethodCommand to define/use custom command instances instead of being forced to define an explicit delegate.
  • OpcMethodCommands class to provide predefined commands such as NotImplemented.
  • Enhanced OpcMethodNode to support IOpcMethodCommand instances as well as invocation target instead of using a delegate.
  • Enhanced generic OpcDataTypeNode<T> class to no longer support only enumeration types. The class now supports the use of class and struct types as well and maps them to OPC UA structures.
  • Introduced new abstract and non-generic OpcDataTypeNode class.
  • Static OpcContext.Empty property to define an empty context instance where required and supported.
  • Implemented IOpcNamespaceResolver in OpcContext to resolve namespaces of OpcNodeId instances.
  • OpcTypeSystem class which acts as the new base class of the existing OpcDataTypeSystem and the new OpcNodeTypeSystem classes.
  • OpcDataTypeDictionary.Documentation property.
  • OpcNodeSetManager class which enables simple hosting of OpcNodeSets using OpcNodeSetManager.Create(...).
  • Protected virtual methods OpcNodeManager.ImportNodes() and OpcNodeManager.ImplementNode(IOpcNode).
  • Unified and simplified DataType resolution especially using non-built-in data types for variable and property nodes. This affects the nodes: OpcDataItemNode, OpcDataItemNode<T>, OpcAnalogItemNode, OpcAnalogItemNode<T>, OpcDataVariableNode, OpcDataVariableNode<T>, OpcConditionVariableNode, OpcConditionVariableNode<T>, OpcPropertyNode, OpcPropertyNode<T> and OpcVariableNode.

Changed

  • License codes used prior to version 2.9 no longer work. Customers will receive new license keys working in all frameworks supported.
  • OpcAttributeWriteAccess is now based on UInt32.
  • The default value of OpcAutomatism.AlwaysParseStringIdentifiers is now false. As a result, the value is no longer parsed automatically when the constructor OpcNodeId(string) is called. For more details, see OpcAutomatism.AlwaysParseStringIdentifiers.
  • [Client SDK] Moved the OpcBrowseNode class from namespace Opc.UaFx.Client to namespace Opc.UaFx.
  • [Client SDK] Moved the OpcBrowseNodeDegree enumeration from namespace Opc.UaFx.Client to namespace Opc.UaFx.
  • [Client SDK] IOpcBrowseService and OpcBrowseRequest now use the classes OpcViewDescription and OpcBrowseNode instead of the Foundation classes ViewDescription and BrowseDescription.
  • Moved OpcReadOnlyNamespaceCollection from namespace Opc.UaFx.Server to namespace Opc.UaFx.
  • Changed the default value of the DataType attribute of OpcDataTypeDictionaryNode from Byte to ByteString to match the definition of the specification.
  • Renamed Description property of IOpcDataTypeInfo, OpcDataTypeInfo and OpcDataFieldInfo to Documentation to match the definition of the OPC UA specification.
  • OpcEncoding.All(...) now constructs the OpcEncoding.Id using the default BrowseNames for the different encoding types.
  • OpcNamespace.ToString() now always returns a string which just represents the OpcNamespace.Value and OpcNamespace.Index (if not zero).
  • OpcNodeSet.GetDataTypeSystem() now provides an OpcDataTypeSystem instance which uses the typical BrowseName for the type of encoding used by the type system.
  • Removed method IOpcTypeProvider.GetType(OpcEncoding), because encoding information only applies to data types.
  • OpcTypeCategory.EventType and OpcTypeCategory.ReferenceType have been removed.

Fixed

  • Issues with validating outdated certificates or certificates which violate some policy regarding generally valid certificates. Such certificates can now be handled by the CertificateValidationFailed event.
  • Issue with the automatic application configuration if the AssemblyTitleAttribute of the entry assembly is not present or defines string.Empty as assembly title.
  • Issue with variable node values changing their value using different complex data types (expressed using ExtensionObject as the data type of the node).
  • Wrong EncodingMask if there is more than one optional field declared in a data type.
  • Wrong interpretation in OpcArgument.IsArray and OpcArgumentInfo.IsArray.
  • An OpcVariableNode.Timestamp initially defined is no longer reset during address space creation.
  • Issues with wrongly determined default value ranks and default data type identifiers using OpcDataTypes.GetValueRank(..) and OpcDataTypes.GetNodeId(...).
  • Issue with DataTypeDictionary nodes which do not define any DataTypeDescription nodes while constructing the DataTypeSystem using OpcClient.GetDataTypeSystem().
  • Issues when decoding structured data using the new Opc.UaFx.Bit.
  • Issue using OpcNodeId.UriIdentifier(...) if the OpcNodeId.Value is not of the type System.String.
  • OpcNamespace now preserves the original string used to define the OpcNamespace without any subsequent changes (by the System.Uri class) as the value of the OpcNamespace.Value property, so that it always returns the same System.String value that was used to define the instance.
  • Some conditions under which a newly created OpcNode without a name could not be renamed later.

2.8 ​

API changes: 207 added, 25 removed, 47 changed, 2 obsoleted

2.8.3.1 (released on January 24, 2020)

Fixed

  • Issue with no longer working subscription handlers after a long running reconnection attempt succeeded.
  • Issue with disposed socket in disposed TcpMessageSocket used in a request header representing the last request sent to the server to which the connection got lost.
2.8.3.0 (released on January 16, 2020)

New

  • Support of OpcExceptions in delegates used to define method nodes. This enables the definition of bad results without the need to manually change the result of the method call using the OpcMethodContext parameter.
  • Added support for additional access levels (StatusWrite and TimestampWrite).
  • Added missing documentation to OpcAccessLevel, OpcVariableNode.AccessLevel and OpcVariableNode.UserAccessLevel.
  • Added support to disconnect and abort a pending reconnect attempt on OpcClient.
  • Changes to improve the experience with UWP applications regarding the use of the native tool chain.

Changed

  • Reviewed OpcClient.State changes to detect a lost connection to the server.
  • OpcClient.State now changes automatically only to Disconnected (during a running request) if ReconnectTimeout is greater than zero (reconnection is manually handled).

Fixed

  • Issue with not applied status (code) information passed to one of the constructors defined by OpcValue.
  • Issue with TypeDictionaries which do not offer NamespaceUri information.
2.8.2.1 (released on December 13, 2019)

Fixed

  • Issue with parallel subscription publishing while calling a method node in OpcClient.
  • Issue with not updated OpcVariableNode.Value if there is no custom WriteVariableValueCallback associated with a variable node.
  • Issue with conditions upon which the OpcClientKeepAlive.Interval is not applied to the current session.
2.8.2.0 (released on November 6, 2019)

New

  • Introduced new Opc.UaFx.Bit as a .NET-based representation of the foundation-defined "Bit" value type for which no concrete implementation exists so far.

Changed

  • Explicitly encoded information known as the EncodingMask of a structured data type is now handled using the new Opc.UaFx.Bit type instead of System.Boolean.

Fixed

  • Issue with mixed-structured data types using leading Boolean values followed by additional non-Boolean values which sometimes resulted in wrongly encoded data streams.
  • Issue connecting to OPC Classic servers using OPC Watch without a custom application certificate.
  • Issue in OpcServerInfo.FromProcess(...) if the ProductVersion of the FileVersionInfo of the ProcessModule of Process.MainModule provides a version string which not only consists of numbers and dots like 1.2.3.4-preview.
2.8.1.3 (released on October 24, 2019)

Fixed

  • Issue with exchanging structured data types without using the upcoming metadata support.
2.8.1.2 (released on October 23, 2019)

Changed

  • Adjusted iconUrl and licenseUrl information in NuGet packages upon their deprecation.

Fixed

  • OPC Classic support no longer worked ("An internal error occurred as a result of a programming or configuration error") because the OPC Classic client could no longer find its embedded resources.
  • Issue with wrong interpretation of Int32 as return type of method nodes.
2.8.1.1 (released on October 11, 2019)

New

  • Implemented support for method parameters using System.Object which are transported as OPC UA variant values.

Fixed

  • Issues with disregarded method parameters of the type System.Object.
  • Issue with reading large file nodes (representing files whose content exceeds the MaxByteStringLength).
2.8.1.0 (released on September 25, 2019)

New

  • Implemented RegisterNodes and UnregisterNodes methods on the OpcClient that allow registering nodes on the OPC UA server for the current session for possibly faster access.
  • Enabled the OPC Classic API in the .NET Standard target to support the use of the API in .NET Core applications running on Windows.
  • Implemented OpcDataObject.HasField(name) and OpcDataObject.TryGetField(name, out field).
  • Improved performance by excluding foundation defined data type dictionaries while querying the data type system of the server.
  • Introduced new OpcClient.UseDynamic property and changed default value of OpcAutomatism.UseDynamic to the value false to improve the performance while connecting without the need of the knowledge of data types.
  • Implemented support for servers which do not support range-based reads to query the data type dictionary.

Fixed

  • Crash caused by an exception in Socket.Shutdown() that was not caught.

Changed

  • OpcAutomatism.UseDynamic property default value is now false. Change its value or the OpcClient.UseDynamic to true to enable use of OpcDataObject.
2.8.0.0 (released on September 18, 2019)

New

  • Introduced a whole set of new classes to support the definition, consumption and reflection of custom data types in client applications.
  • Introduced new OpcNodeSet class to provide a file, string or stream based source to offer data type system information from a UANodeSet.
  • Implemented new OpcClient.NodeSet property to assign an instance of the OpcNodeSet class which is to be used to query data type system information instead of querying the server's data type system.
  • Implemented new OpcClient.GetDataTypeSystem() method which determines the data type system which is used by the client to resolve data type information.
  • Introduced new OpcAutomatism.UseDynamicTypeRegistration property to control the automatic type reflection used by client and server applications to determine the different data and event types declared.
  • Introduced new OpcAutomatism.UseDynamic property to control the dynamic type resolution while consuming custom typed but not explicitly declared data types in client applications.
  • Introduced new OpcNodeValue<T> class, OpcAttributeValue<T> and IOpcNodeAttribute with IOpcNodeDescriptor in conjunction with OpcNodeValuePair to declare "node-bound" values.
  • Enhanced OpcClient class with new ReadNodeValue and WriteNodeValue methods to read and write "node-bound" values.
  • Improved exception handling to preserve StackTrace information from user code down to foundation and communication layer.
  • Implemented new OpcClient.KeepAlive property and the corresponding OpcClientKeepAlive class to control and monitor the keep alive tasks executed against the server connected to.
  • Implemented dynamic type conversion in OpcValue.As<T>().
  • Added new AsValue<T>() method to OpcValue to provide a generic definition of the value using the new OpcValue<T> class.
  • OpcNamespace now provides the namespace string / URI using the new OpcNamespace.Value property.
  • Default transport limits increased: DefaultMaxByteStringLength from 64 KB to 5 MB and DefaultMaxMessageSize from 1 MB to 10 MB.
  • Solved inline handled exceptions in XmlSerializer during startup.
  • Improved exception handling and tracing during data encoding and decoding (see OpcTypes.EncodingFailed and OpcTypes.DecodingFailed).
  • Support for tracing all encoding operations using the new OpcEncodingStackFrame and OpcEncodingStackTrace classes.
  • Introduced decoding and encoding related tracing support using the new OpcEncodingStackFrame and OpcEncodingStackTrace classes.
  • Added int ResolveIndex(string namespaceValue) and string ResolveValue(int namespaceIndex) to IOpcNamespaceResolver.
  • OpcClient now provides service methods to simplify calls to CallMethod using the new generic methods CallAction and CallFunc.
  • Added additional overloads to OpcBrowseNode to support OpcNodeIds to refer to specific types of references.
  • OpcNodeInfo now provides additional overloads of Children(...) and Parents(...) accepting an OpcReferenceType value.
  • OpcResult now provides the root result with GetBaseResult().
  • OpcEventNode.EventTypeId is now writable using an added setter.
  • Introduced OpcEventTypeAttribute to define client-side declared custom event types used to handle event notification data in client applications.
  • Corrected wrongly used status code while decoding in the foundation stack (before: BadEncodingError, now: BadDecodingError).
  • Added missing SourceType property to Opc.Ua.Schema.Binary.FieldType.
  • Added missing BaseType property to Opc.Ua.Schema.Binary.BaseType.

Fixed

  • Wrongly used variable when configuring Opc.UaFx.Client.OpcSubscription.LifetimeCount.
  • Issues during serialization of OpcException objects.

Changed

  • OpcDataTypeAttribute is now applicable on classes and structures.
  • Unified OpcNodeManager.NamespaceIndexes and OpcNodeManager.NamespaceUris into new OpcNodeManager.Namespaces.
  • Renamed IOpcReadOnlyDataStore to IOpcReadOnlyNodeDataStore.
  • IOpcNamespaceResolver methods Uri Resolve(int namespaceIndex) and int Resolve(Uri namespaceUri) are now obsolete.

2.7 ​

API changes: 301 added, 150 removed, 103 changed

2.7.5.1 (released on August 15, 2019)

New

  • Added use of OpcNominalNodeIdFactory (via OpcNodeId.Factory) to resolve OPC Classic tag names using the OPC Classic server specific tag separator.

Fixed

  • Issue with multiple times serialized exception information which caused SerializationExceptions instead of the exception itself.
2.7.5.0 (released on August 13, 2019)

New

  • Improved API documentation: IOpcNode, IOpcNodeInfo and OpcNode.
  • Stack change to assure that a node manager lock is held as long as MonitoredItems are created, modified or deleted.
  • Updated System.ServiceModel.Primitives to version 4.5.3. Version 4.5.x of System.Private.ServiceModel fixed a bug that caused the System.Private.ServiceModel.dll not to be copied for .NET Core applications when publishing for Windows (win-xxx).

Fixed

  • Issues with compiling using the .NET Native tool chain.
  • Issues with multiplied subscription notifications and events after reconnecting to the server.
  • Issues with inline parsed OpcNodeIds when creating an OpcNodeId using a string identifier.
  • Issue with wrongly used base address and security policies in OpcDiscoveryServer.
  • Issue with re-created OpcMonitoredItem instances which additionally resulted in the issue that comparing OpcMonitoredItem instances no longer worked.

Changed

  • OpcMonitoredItem.AutoFlushCache has been replaced with the new OpcMonitoredItem.QueueMode property to better express the mechanism used when the notification data item queue of a MonitoredItem overflows.
2.7.4.0 (released on June 7, 2019)

New

  • Domain name resolution used while validating client / server certificates now uses fallback mechanisms if there is no DNS server configured in the operating system.
  • Re-implemented explicit use of OperationTimeout when using HTTPS (which is no longer part of the foundation stack).
  • Implemented MonitoredItemsCreated, MonitoredItemsModified and MonitoredItemsDeleted events in OpcNodeManager.

Fixed

  • SocketExceptions on macOS while validating certificate domains using domain name resolution although there is no (available) DNS server configured in the operating system.

Changed

  • Changed some int-based properties in OpcMonitoredItem, OpcServiceCounter, OpcSessionDiagnostics and OpcServerDiagnostics to long as their property type to assure CLS compliance while accessing the unsigned API of the foundation stack.
2.7.3.1 (released on May 23, 2019)

New

  • [Client SDK] Added support for target framework .NET Framework 4.6.

Fixed

  • Issues with connecting to a server using HTTPS on macOS and Linux, which results in the OpcException "An unrecognized response was received from the server."
2.7.3.0 (released on May 17, 2019)

New

  • Replaced local X509Certificate2 instance activation by using OpcCertificateManager.QueryInstance to load certificate information. This enables custom X509Certificate2 creation using an EventHandler.
  • Introduced new OpcCertificateStores.PathProbings property to enable custom probing mechanism to determine the certificate store paths to use by default.
  • Improved user experience regarding different (smaller) issues using subscriptions and MonitoredItems (especially in automatically reconnecting clients).
  • Introduced additional AddMonitoredItem(...) overloads on OpcSubscription.

Fixed

  • Issue with connecting to servers using HTTPS, which results in the OpcException "An unrecognized response was received from the server."

Changed

  • Reviewed implementation of OpcMonitoredItem and OpcSubscription: Changed some int-based properties to use long as the property type to support underlying uint properties used by the foundation stack in a CLSCompliant way.
2.7.2.0 (released on May 10, 2019)

New

  • Support of TypeDefinition information when browsing instance nodes through new OpcInstanceNodeInfo class.
  • Added Socket property to the OpcSession class to identify the socket identity information for the used local and remote endpoints.
  • Changed product icon of NuGet package.
  • [Client SDK] Enabled support for IL2CPP in Unity projects. This addresses some overflow exceptions reported while IL2CPP has been executed.

Fixed

  • Issues when browsing more than one reference type at once which resulted in an ArgumentOutOfRangeException.
  • Issues with sometimes outdated subscription and MonitoredItem information when the client automatically reconnects to the server after the connection got lost.
  • Issue with sometimes missing client and subscription based notification events, for example the NotificationReceived event has been missed on OpcClient.
2.7.1.1 (released on April 29, 2019)

New

  • Updated the package information (ProjectUrl and LicenseUrl).
2.7.1.0 (released on March 25, 2019)

New

  • Implemented rejection of requested node identifiers using unknown namespace index values (in AddNodes service, BadNodeIdInvalid).
  • Implemented use of node (identifier) specific node manager to assure that a node being added is not added to the nodes of the node manager of the parent node if the new node refers to the namespace maintained by a different node manager.
  • Node access and write flags are now applied recursively when adding nodes by a client.

Fixed

  • Issue with bad node rejected in case of a client defined node identifier using AddNodes.
  • Issues with custom node attributes used to set up the write and access attributes of nodes added by clients.
  • Corrected not nicely formed namespace URI of default node manager (removed unnecessary /).
  • Issue with wrongly wrapped .NET array types using OpcValue instances.
  • Issue with wrongly wrapped UA FX array types using OpcValue instances.
  • Issue with missing DataType information if an OpcVariableNode (non-generic) is initialized with an initial value using its constructor followed by a change of its DataType property to the appropriate type. Result: The DataType property value was not accepted.
2.7.0.2 (released on March 15, 2019)

Fixed

  • Wrongly used addressing of unmanaged memory (using OPC Classic) which especially can fail in processes using large address awareness (see LARGEADDRESSAWARE).
2.7.0.1 (released on March 15, 2019)

Fixed

  • Issue with locales which are supported by the OPC Classic servers but not by the operating system.
  • Issue with addressing OPC Classic servers running on a 64-bit system.
2.7.0.0 (released on March 14, 2019)

New

  • Completely reworked AddNode support in OpcClient including a whole new set of OpcAddNode command types like OpcAddFolderNode, OpcAddObjectNode, OpcAddDataVariableNode, OpcAddAnalogItemNode and some more.
  • First time full support of AddNode service calls in OpcServer accepting every supported type definition to add a new node into the address space.
  • Completely reworked DeleteNode, AddReference and DeleteReference support in OpcClient including a whole new definition of the OpcDeleteNode, OpcAddReference and OpcDeleteReference command.
  • Reworked support of DeleteNode, AddReference and DeleteReference service calls in OpcServer using additional request validations.
  • Introduced new OpcAddNodeResult class which provides a specialization of the OpcResult class to provide the used NodeId and the command instance from which the result of an AddNode service call originates.
  • OpcNodeManager now provides virtual methods called when adding or deleting a node to / from the address space of the manager (through the AddNode and DeleteNode services).
  • Improved exception details when using the services AddNodes, DeleteNodes, AddReferences and DeleteReferences.
  • OpcServerIdentity constructor overloads accept a string value as password.
  • OpcServer events: RequestProcessing, RequestValidating, RequestValidated and RequestProcessed to pre- and post-process client requests and the sent responses.
  • OpcException always provides Source, StackTrace, Data and HelpLink information where available and no longer skips them in case of a different source exception.
  • IOpcNode.Child(...) method to retrieve an IOpcNode child instance using the name (that is, the BrowseName) of the child node.
  • Additional OpcServerIdentity.ChangePassword(string) method overloads.
  • Additional OpcUserNameAcl.AddEntry(...) method overloads to define a custom OpcServerIdentity.
  • Enabled subclassing of OpcResult using custom types.

Changed

  • Removed OpcServerIdentity.Password property, because there is no need to publish the internally stored password information and it is not a good practice to provide references to an array through properties.
  • Removed OpcTransformUserPasswordDelegate delegate.
  • Replaced OpcUserNameAcl.PasswordTransform with virtual Matches and TransformPassword methods in OpcServerIdentity.

Fixed

  • Issue when writing built-in structured values like OpcEngineeringUnitInfo or OpcValueRange using OpcClient.WriteNode.
  • Issue when disconnecting / stopping the client / server which led to a crash if there was still at least one connect attempt pending.
  • Issue with StackOverflowExceptions when changing the OpcServer.Configuration instance.

2.6 ​

API changes: 61 added, 33 removed, 16 changed

2.6.0.0 (released on February 20, 2019)

New

  • Implemented OPC Classic support in OpcClient just using an address like opc.com://<host>(:<port>)/<progId>/<classId> (only in .NET Framework).
  • Implemented new OpcClassicInterface, OpcClassicInterfaces and OpcClassicInterfaceCollection classes and OpcClassicInterfaceCategory enumeration (only in .NET Framework).
  • Implemented new OpcClassicApplicationDescription, OpcClassicApplicationDescriptionCollection, OpcClassicEndpointDescription and OpcClassicEndpointDescriptionCollection classes (only in .NET Framework).
  • Implemented OPC Classic discovery using the new OpcClassicDiscoveryClient class, which uses OpcEnum.exe (a COM application provided by the OPC Classic runtime environment) (only in .NET Framework).
  • Enhanced existing OpcDataChangeFilter to support the configuration of the trigger, DeadbandType and DeadbandValue. Using the Trigger property it is possible to monitor items using the SourceTimestamp as well.
  • Implemented additional OpcClient.SubscribeDataChange overloads and additional OpcDataSubscribeDataChange constructor overloads accepting a value of the OpcDataChangeTrigger enumeration.
  • A predefined ApplicationName is now used as the SubjectName of the certificate when (automatically) creating a new certificate used by client or server applications.
  • Implemented generic OpcApplicationInstance class implementing IOpcApplicationInstance.
  • OpcClient and OpcServerBase use the new OpcApplicationInstance class as their common base class.
  • Implemented generic OpcSecurity base class for the security settings of client and server applications.
  • OpcClient derives from the OpcApplicationInstance class.
  • OpcServer derives from the OpcApplicationInstance class through its base class OpcServerBase.
  • Centralized application configuration (within the SDK) of client and server application instances using OpcApplicationInstance.
  • Implemented generic OpcTransport configuration class and its use in IOpcApplicationInstance.
  • Implemented generic OpcSecurity configuration class and its use in IOpcApplicationInstance.
  • Added Security and Transport properties to IOpcApplicationInstance.
  • Added CertificateValidationFailed event to IOpcApplicationInstance.
  • OpcSecurityPolicyCollection now implements a public constructor.

Changed

  • Removed OpcClientTransport class (replaced by new OpcTransport class).
  • Removed OpcServerTransport class (replaced by new OpcTransport class).
  • The default server information provided by OpcServerBase now prefers a predefined ApplicationName.
  • OpcSecurityPolicyCollection no longer provides a constructor with an OpcServerBase instance. The corresponding Owner property has been removed as well.

2.5 ​

2.5.7.0 (released on February 6, 2019)

New

  • OpcClient.WriteNode now directly accepts null as the value without the need of a new OpcValue instance.
  • The OpcServer class provides new constructor overloads which use the default address opc.tcp + localhost + 4840 (the default port).
  • The whole node tree can now be created inline using new constructors of OpcObjectNode and OpcFolderNode to specify their children directly when they are created.
  • Ensured that read/write operations on attributes are canceled if a custom read/write callback returns a "bad" result. In case of a "good" result the processing of the read/write operation continues.
  • API whose signature only accepts nodeId : string to identify a node now parses the specified string value inline to ensure a more fluent usage of the SDK API.

Changed

  • The application certificate is no longer stored in .\CertificateStores\Trusted, now it is stored (by default) in .\CertificateStores\App to improve startup performance when searching for the application certificate.
  • Changed use of LinkTime to LastWriteTime of the assembly when determining OpcServerInfo from an assembly.

Fixed

  • Issue with not applied initial value when using the OpcDataVariableNode(parent, name, value) constructor.
  • Included missed value checks (like BadTypeMismatch) in cases where the Value attribute is written.
2.5.6.0 (released on October 19, 2018 [Client SDK], February 6, 2019 [Client+Server SDK])

New

  • Added enhanced Android linking support when linking SDK+User for additional APIs.
  • Enhanced default certificate store directory to first try to use the local directory (if it is writable), then CommonApplicationData and then ApplicationData.
  • Additional support of .NET Framework 4.7.1 as the target framework to no longer refer to 12 additional system assemblies caused by .NET Standard references in .NET Framework 4.7.1. See the Microsoft article Targeting .NET Framework 4.7.1 copies extra files to your bin directory.

Fixed

  • Issue when checking if a certificate store already contains a certificate. The store always returned true.
  • Solved issues when browsing in an Android SDK+User linked environment.
2.5.5.0 (released on October 11, 2018 [Client SDK], February 6, 2019 [Client+Server SDK])

New

  • Extracted API for exclusive client development from OPC UA Advanced.
  • CertificateRequested event on OpcClient and OpcServerBase to query an alternative certificate if an existing application instance certificate could not be found or can't be used. This event can also be used to determine the reason why a new certificate is required. The client can also use it to notify or ask its user.
  • If .\CertificateStores\ (the default directory for certificates) is not writable, the path $(AppData)\OPC Foundation\CertificateStores\ is instead used as the default directory to maintain certificates.
  • Increased default lifetime of a certificate from 12 months (1 year) to 600 months (50 years).
  • Reduced default key size from 2048 to 1024 to support older certificates.
  • Less assembly size and fewer dependencies through reorganization of the internal licensing mechanism for .NET Standard.
  • In case of failed socket binding, an exception is no longer caught nor thrown as a generic exception. Instead, it is forwarded to the caller.
  • Binding property on OpcServer, which provides an instance of the new OpcServerBinding class.
  • OpcServerBinding (OpcServerBase.Binding property) defines the address scope the server binds to. By default it will bind (as before) to any IPv4 and to any IPv6 address using the specified port number.
  • The low-level read/write operations of node managers now provide OpcNodeAccessTokens with operation result information.
  • Added documentation for OpcSubscription, OpcMonitoredItem, OpcMonitoredItemEventArgs, OpcMonitoredItemEventHandler and more regarding subscriptions.

Changed

  • Changed default MinimumCertificateKeySize from 2048 to 1024 to support lower key sizes used by older certificates.
  • When changing the application certificate of a client or server instance using the Certificate property, the store path type of the application certificate store changes to System. To use the store path type Directory, you have to change the store path type manually and have to ensure that the certificate can be found in the application certificate store after changing the Certificate property.

Fixed

  • OpcServer.Security.AutoAcceptUntrustedCertificates when using secured endpoint policies did not auto-accept untrusted certificates.
  • Problem when dynamically determining the start time of the node history to read count-based.
  • Issue with so far not comparable MonitoredItem and session instances.
  • Issue when writing a node value using OpcValue encapsulated raw values.
  • Wrong use of AutoAcceptUntrustedCertificates in server application instances.
  • Issue with rejected path of the application certificate store when manually changing the application certificate.
  • Incorrectly used start time when reading historical values without explicitly specifying a start time.
2.5.4.0 (released on August 27, 2018)

New

  • Implemented support for automatic history creation in OpcNodeHistorian through client-written values (AutoUpdateHistory property).
  • OpcNodeHistorian now differentiates node changes and now logs only changes of the Value attribute.
  • Improved code documentation on server-side subscription and MonitoredItem API.
  • Server.OpcSubscription and Server.OpcMonitoredItem instances are now comparable through caching existing instances.

Fixed

  • OpcVariableNode.IsHistorizing is no longer reset after OpcNodeManager.CreateNodes has been called.
  • Issue with writing to variable nodes with undefined DataType attribute (did not work and an exception was thrown).

Changed

  • OpcNode.BeforeApplyChanges and OpcNode.AfterApplyChanges are now only raised if changes are pending (see OpcNode.HasPendingChanges).
2.5.3.0 (released on August 21, 2018)

New

  • Implemented automatic value arrangement after reading a node value (server-side) using the encoding and value range requested by the client.
  • New OpcClientTransport class accessible via OpcClient.Transport to set up transport options like timeouts and limits.
  • New OpcServerTransport class accessible via OpcServer.Transport to set up transport options like timeouts and limits.

Fixed

  • Issue with incorrectly used certificate data source when validating an X509 identity token.
2.5.2.5 (released on August 7, 2018)

New

  • Removed NuGet dependencies enforced (in .NET Standard) to reference in user projects.
  • Simplified content of *.deps.json (in .NET Standard).
2.5.2.4 (released on July 31, 2018)

Fixed

  • Issue with reporting global events using OpcServer and OpcNodeManager instances.

New

  • Implemented support of null OpcName instances when using OpcNominalNodeIdFactory.
  • OpcContext now always provides an appropriate OpcNodeIdFactory instance, at least the global instance defined by OpcNodeId.Factory.
2.5.2.3 (released on July 25, 2018)

New

  • NuGet updated.
2.5.2.2 (released on July 23, 2018)

Fixed

  • InvalidCastException when the assembly was loaded with Assembly.LoadFrom().
2.5.2.1 (released on July 13, 2018)

Fixed

  • DllNotFoundException when trying to use specific types before creating an OpcClient or OpcServer.
2.5.2.0 (released on July 6, 2018)

New

  • Activated licensing support for .NET Standard, which also covers .NET Core applications through the netstandard2.0 assembly.
2.5.1.1 (released on July 3, 2018)

New

  • Renewed the evaluation license to provide a new license period.
2.5.1.0 (released on June 15, 2018)

New

  • MIME type support in OpcFileNode and OpcFileInfo.
  • Improved performance when accessing OpcContext references in OpcNodes (internally).
  • Improved performance / memory usage when accessing the children of an OpcNode (internally).
  • Removed inline and by default always prepared history configuration nodes for all variable nodes. Instead, they are now created on demand.
  • Removed internal cross-references and use of heavy OnXy callbacks defined by the Foundation. Instead, we now use a provider pattern.
  • Introduced IOpcNodeInfo to no longer create temporary OpcNode instances. This improves performance and memory usage.
  • IOpcNodeInfo is used in scenarios where a reference to the origin node is not required. This also reduces the amount of memory required to process internal node operations / evaluations.
  • Introduced cache for custom data types to no longer repeatedly reflect their attributes to improve performance.
  • Exceptions which are thrown during the execution of CreateNodes(...) are now passed to the source where OpcServer.Start has been called.

Changed

  • Changed IsNodeAccessible(..., IOpcNode node) to IsNodeAccessible(..., IOpcNodeInfo node).
2.5.0.3 (released on May 24, 2018)

Fixed

  • Issue with not working external references when using multiple node managers which share the same custom node as the root of the nodes provided.
2.5.0.2 (released on May 23, 2018)

Fixed

  • Issue with missing nodes when using multiple node managers referencing the same system node.
2.5.0.1 (released on May 16, 2018)

Fixed

  • NullReferenceException in OpcMethodNode when using a predefined node as the parent of the method node.
  • OpcDataVariableNode no longer displayed in the server's address space when using the constructor (parent : IOpcNode, name : OpcName).

Changed

  • Downgraded sample projects to C# language version 6.0 to ensure that the samples will compile in older versions of Visual Studio.
2.5.0.0 (released on May 10, 2018)

New

  • Added support for creating nodes using a custom node identifier.
  • Streamlined constructor overloads in all node classes.
  • Added a lot of so far missing code documentation on node classes.
  • Implemented for each property of a node a corresponding XyNode property which provides the reference to the property node that represents the value of the so far available Xy properties.
  • Implemented support for lazy initialization of nodes which allows defining the Xy property values to be set up while they are applied to their property nodes on server startup.
  • Completely reviewed implementation of OpcNodeId and OpcNamespace. Partially re-implemented both classes to ensure a maximum of compatibility to Foundation-defined node identifier standards including the features provided by this SDK.
  • The OpcNodeId now supports identifiers using byte arrays, GUIDs and unsigned integers.
  • The OpcNodeId now expresses the type of identifier value in its string representations generated using OpcNodeId.ToString.
  • The OpcNodeId now supports UTF-8 encoded special characters in a URL-formatted node identifier.
  • The OpcNodeId now supports parsing Foundation-formatted node identifiers.
  • The OpcNodeId now provides additional properties like OriginalString and OriginalFormat.
  • Reworked OpcName implementation to no longer combine the BrowseName, DisplayName and SymbolicName into one instance / class.
  • IOpcNode, OpcNode and OpcNodeInfo now provide direct properties for the DisplayName (and SymbolicName) of a node.
  • OpcNodeInfo now supports the children and parent browsing using a combination of the OpcNodeCategory enum members.
  • OpcClient.SubscribeEventRaise methods and OpcSubscribeEventRaise now support an OpcEventFilter instance for event filtering.
  • Reviewed existing API regarding UA Alarm + Events and adjusted it for a more fluent / intuitive interface including some changes to use lazy initialization to improve performance.
  • Reworked OpcEventRaiseEventArgs to define the Event property for EventNode snapshot information using event raw data.
  • Added MonitoredItem property to OpcDataChangeEventArgs and OpcEventRaiseEventArgs.
  • Added events DataChangedReceived and EventRaiseReceived to OpcSubscription.
  • Implemented OpcEventType enumeration and OpcEventTypes to simplify access to the different event types supported.
  • Implemented different state machine and state / transition variable nodes.
  • Implemented DialogRequested event in OpcClient to provide a simple way to process OpcDialogConditionNode instances.
  • Implemented support for Foundation-specified event types. These are: OpcConditionNode, OpcAcknowledgeableConditionNode, OpcDialogConditionNode, OpcAlarmConditionNode, OpcDiscreteAlarmNode, OpcLimitAlarmNode, OpcOffNormalAlarmNode, OpcSystemOffNormalAlarmNode, OpcTripAlarmNode, OpcExclusiveLimitAlarmNode, OpcNonExclusiveLimitAlarmNode, OpcExclusiveDeviationAlarmNode, OpcExclusiveLevelAlarmNode, OpcExclusiveRateOfChangeAlarmNode, OpcNonExclusiveDeviationAlarmNode, OpcNonExclusiveLevelAlarmNode and OpcNonExclusiveRateOfChangeAlarmNode.

Fixed

  • Corrected the wrong name of method GetOutpuArguments to GetOutputArguments in the OpcMethodNodeInfo class.
  • Issue with DBNull values used if there is no default value for an argument specified in method nodes.

Changed

  • Corrected misspelled members.
  • Streamlined API through additional descriptive parts in class and delegate names. In general, changed the naming of Data to DataSet, DataItem to DataSetItem and EventRaise to Event.
  • OpcNodeId.ToString now formats by default using the OpcNodeIdFormat.Foundation format.
  • Order of subscription events from MonitoredItem → Client → Subscription to MonitoredItem → Subscription → Client, to ensure a more logical event order using bubbling.
  • Renamed OpcMonitoredItem.ReceivedDataChange to OpcMonitoredItem.DataChangeReceived.
  • Renamed OpcMonitoredItem.ReceivedEventRaise to OpcMonitoredItem.EventRaiseReceived.

Breaking changes due to renamings

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

2.3 ​

2.3.2.0 (released on March 13, 2018)

Fixed

  • Issue with wrong use of DebuggerDisplayAttribute in OpcVariableNode and OpcNodeInfo.
  • Issue with reading / writing custom DataType attribute values on OpcVariableNodes.

Changed

  • OpcVariableNode defined as an abstract base class.
  • Removed multiple local Foundation node references to reduce memory usage.

New

  • Enhanced implementation of OpcVariableNode especially for enumeration types.
  • Implemented new nodes OpcTypeNode and OpcDataTypeNode. The OpcDataTypeNode does support the definition of custom enumeration types.
  • Implemented enhanced support to simplify browsing of enumerated data types. The new OpcTypeNodeInfo.GetEnumMembers() method provides all the information available on an enumerated type (also see the new OpcTypeNodeInfo.IsEnum property).
2.3.1.1 (released on February 26, 2018)

Fixed

  • Issue with loading the OpcApplicationConfiguration from a file, because of a required DataContract attribute on the OpcApplicationConfiguration class which was not required in older SDK versions.

New

  • Implemented additional constructor overloads in OpcEngineeringUnitInfo to simplify initialization of a specific unit.
  • Implemented ToString overloads in OpcEngineeringUnitInfo and OpcValueRange.
  • CommonCode property in OpcEngineeringUnitInfo and static GetCommonCode(int unitId) method.
  • DefaultNamespaceUri in OpcEngineeringUnitInfo is used when using a constructor without an explicit namespace parameter. This is not the case when using the default constructor.
2.3.1.0 (released on February 22, 2018)

Attention

  • Starting with this version, a reference to the NuGet package Portable.BouncyCastle (at least version 1.8.1.3) or the BouncyCastle.Crypto assembly (at least version 1.8.1.146) is required.
  • Using a server address with the scheme https requires references to the NuGet packages Microsoft.AspNetCore.Server.Kestrel (1.1.3) and Microsoft.AspNetCore.Server.Kestrel.Https (1.1.3).

New

  • Implemented the Range data type as OpcValueRange.
  • Implemented the EUInformation data type as OpcEngineeringUnitInfo.
  • Implemented new node type AnalogItemType as OpcAnalogItemNode.
  • Support of DataValues using the data types Range and EUInformation.
  • Advanced support for browsing nodes using the AnalogItemType definition through the new OpcAnalogItemNodeInfo.
  • Updated to target framework .NET Framework 4.6.
2.3.0.0 (released on February 13, 2018)

New

  • Updated to Foundation stack 1.03.351.0.
  • Implemented new security option for client / server to define additional certificate validation rules (see OpcClient/OpcServer.Security.CertificateValidationRules).

Changed

  • The SDK no longer supports Windows-based authentication using the WinLogon API for OPC UA server authentication.
  • Application certificates are now created using SHA256 (the default defined by the Foundation). This does not influence any running code. This change will only have an effect when a new certificate is generated.

2.2 ​

2.2.2.0 (released on December 11, 2017)

New

  • Enhanced filter construction using operator overloads to get a more natural API.
  • Introduced OpcText to represent localized human-readable string values.

Fixed

  • Issue with missing use of configured OperationTimeout using OpcClient.Connect() while discovering the server endpoints.

Changed

  • Simplified OpcValue.ToString implementation to just provide null for null references or the Value.ToString().
2.2.1.0 (released on September 6, 2017)

New

  • Added support for incomplete certificate chains when the peer provides a certificate which is signed by an unknown issuer. This is, for example, the case when trying to connect to a Siemens SIMOTION.
  • Enhanced support for failed certificate validations using the CertificateValidationFailed events in the OpcClient and OpcServer classes.
2.2.0.0 (released on September 1, 2017)
  • New: Added the GetReferenceType method to resolve the corresponding OpcReferenceType for a given OpcNodeId of the type of reference.
  • Changed: Removed special handling of the attribute DataType in OpcNodeInfo.Attribute(). This means that there is no longer an OpcDataType value provided. Instead, the data type dependent OpcNodeId is provided.
  • New: Implemented basic support for object nodes and extended support for variable nodes, also implemented generic support for type nodes (including ObjectTypes, VariableTypes and DataTypes) while browsing nodes.
  • New: Using the OpcVariableNodeInfo, OpcObjectNodeInfo and OpcTypeNodeInfo, it is now possible to browse the address space using additional information about the nodes provided. This also includes, for example, the type information of a variable node including all its type-specific metadata including super- and subtypes.
  • New: Prepared the SDK for use under .NET Standard and .NET Core 2.0.
  • New: Introduced the LicenseInfo property on all Licenser classes to provide some information about the license conditions used.

2.1 ​

2.1.0.0 (released on August 1, 2017)

New

  • Updated to OPC UA Foundation stack 1.3.342.0.

2.0 ​

2.0.1.1 (released on June 7, 2017)

New

  • RegisterAddress / UnregisterAddress methods and new Addresses method to maintain the different base addresses of an OpcServerBase instance.

Fixed

  • Corrected the wrong naming of IsNodeAccessable in OpcNodeManager to IsNodeAccessible.
  • Issue with malformed node namespaces using a namespace URI just built from a scheme if OpcNamespace.ToString() is called (FormatException).
  • Issue with wrong implicit interpretation of status codes as result information.
2.0.1.0 (released on May 24, 2017)

New

  • Added many more details to the message of an OpcException and to the description of an OpcStatus / OpcResult instance to better indicate the source / reason / outcome of an operation.
2.0.0.0 (released on May 21, 2017)
  • New: Changed the assembly version to 2.0.0.0.
  • New: Implemented OpcCertificateSettings to configure an application instance certificate which can be created through the OpcCertificateManager.
  • Fixed: Issue with wrongly configured application certificates using a store path in cases when the certificate cannot be located under such a path.
  • Fixed: Issue with wrongly stored user name and password pair in the UserName ACL (access control list) that led to unsuccessful user authentication.
  • Fixed: Issue when creating an OpcNodeId using the string + int32 pair, where the int32 was not used for the namespace index of the new NodeId.
  • Fixed: Issue with OpcServerBase.Certificate and OpcClient.Certificate if the certificate is not stored in the ApplicationStore of the certificate stores.
  • New: Introduced OpcClientCertificateStores (available through OpcClient.CertificateStores) and OpcServerCertificateStores (available through OpcServerBase.CertificateStores) to provide a fluent API for client and server to manage and maintain their certificate stores.
  • New: Introduced OpcClientServices (available through OpcClient.Services) to provide a service-based API to set up the different services used by the client.
  • Removed: OpcValue.SourceLabel and OpcValue.ServerLabel. This also includes that the OpcValueLabel class no longer exists. The provided properties are now provided directly via the OpcValue class. Just make use of the OpcValue.ServerXy and OpcValue.SourceXy properties.
  • New: IOpcWriteNodesService now supports an automatic discovery of which value the server expects for the SourceTimestamp of an OpcValue. The automatic determination can be disabled by setting an explicit OpcTimestampSource using the IOpcWriteNodesService.TimestampSource property. Note: The IOpcWriteNodesService instance can be accessed using the OpcClient.Services.WriteNodes property.
  • New: Removed usage of the obsolete ResolveNodeId method and implemented the new Resolve method on the OpcNodeId instead to determine the fully qualified node identifier using the server's namespaces array on demand. This now supports the node access using the fully qualified node identifier without the need to know the index of the dedicated node namespace.
  • New: Implemented an additional overload of the UpdateCertificate method to manually define whether a certificate is to be created if a certificate is missing or not valid. So far this was only possible by using the static AutoCreateCertificate property.
  • New: Implemented the new properties OpcClient.Certificate (to directly define a custom client certificate) and OpcClient.Security (to set up client security options within one class).
  • Changed: Renamed property OpcSecurity.Policies to OpcSecurity.EndpointPolicies to match the OpcClientSecurity.EndpointPolicy model.
  • Changed: Defined the default value of OpcCertificateManager.AutoCreateCertificate as true.
  • New: Implemented the new properties in Opc.UaFx.Server.OpcSecurity: AutoAcceptUntrustedCertificates and AutoCreateCertificate.
  • New: Implemented the new OpcServer.Certificate property to match the same API model as the OpcClient implements.
  • Changed: Behavior used to select an endpoint to connect to, so that it is no longer negotiable if there is an explicit endpoint policy defined.
  • Changed: Default of AutoAcceptUntrustedCertificates in SecurityConfiguration to true.
  • New: Implemented support for a DefaultNodeManager. This is either the first manager in the list of managers defined or the internally defined default node manager which defines the namespace as <serveraddress>/nodes/. You can now also define just a callback method that provides the nodes for the default node manager's address space.
  • Moved: OpcClient.PreferredPolicy property to OpcClient.Security.EndpointPolicy.
  • Moved: OpcClient.UseDomainChecks property to OpcClient.Security.VerifyServersCertificateDomains and changed its default value to false.
  • Moved: OpcClient.UserIdentity property to OpcClient.Security.UserIdentity and changed its type from the Foundation type IUserIdentity to OpcUserIdentity.
  • Moved: OpcClient.UseOnlySecureEndpoints property to OpcClient.Security.UseOnlySecureEndpoints and changed its default value to false.
  • Removed: Obsolete OpcClient.UseAutoNodeIdResolution property.
  • New: Reworked / reviewed OpcIdentity derivatives and defined the OpcCertificateIdentity, OpcWindowsIdentity, OpcServerIdentity and OpcClientIdentity as new derivatives of OpcUserIdentity (so far they just used the OpcIdentity as their base class). Also changed their construction behavior to simplify the process of identity creation on client and server side.
  • Fixed: OpcRequestType.Call has been defined as OpcRequestType.Cancel so far. This led to a nonfunctional use of the OpcRequestType.Call, because it has then been used like the OpcRequestType.Cancel.
  • Removed: OpcCertificateManager.AutoCreateCertificate property, because it is now used per instance using OpcClient.Security.AutoCreateCertificate or OpcServer.Security.AutoCreateCertificate. Also these properties are by default set to the value true.
  • Removed: OpcServer.Security.Owner property to reduce redundant reference information and simplify the API.
  • Renamed: Server.OpcSecurity to Server.OpcServerSecurity.
  • Renamed: OpcServerSecurity.Anonymous to OpcServerSecurity.AnonymousAcl.
  • Renamed: OpcServerSecurity.Certificate to OpcServerSecurity.CertificateAcl.
  • Renamed: OpcServerSecurity.IssuedToken to OpcServerSecurity.IssuedTokenAcl.
  • Renamed: OpcServerSecurity.UserName to OpcServerSecurity.UserNameAcl.
  • Renamed: OpcClient.PreferredLocales to OpcClient.Locales.
  • Renamed: OpcClient.ReceivedNotification to OpcClient.NotificationReceived.
  • Renamed: OpcClient.OnReceivedNotification to OpcClient.OnNotificationReceived.
  • Renamed: OpcSubscription.ReceivedNotification to OpcSubscription.NotificationReceived.
  • Renamed: OpcSubscription.OnReceivedNotification to OpcSubscription.OnNotificationReceived.
  • Moved: OpcNodeCommand from Opc.UaFx.Client to Opc.UaFx.Services.
  • Moved: OpcNodeAttributeCommand from Opc.UaFx.Client to Opc.UaFx.Services.
  • Renamed: OpcNodeCommand to OpcNodeServiceCommand.
  • Renamed: OpcNodeAttributeCommand to OpcNodeAttributeServiceCommand.
  • Renamed: OpcStatusCode members with Bad, Good and Uncertain prefixes, as the OPC Foundation uses them to divide status codes into these three categories.
  • New: Implemented additional ReadNode overloads to define a numeric node identifier together with a namespace index and attribute to read.
  • New: Implemented new ReadNodes methods to read multiple nodes using a specific attribute.

1.0–1.6 (2015–2017) ​

1.6 ​

1.6.5.2 (released on February 7, 2017)

Changed

  • Removed implicit interpretation of a numeric node identifier encoded as a string.
1.6.5.1 (released on December 8, 2016)

New

  • Implemented enhanced timeout handling for read history requests produced by the OpcClient. This is necessary to give the server additional time to collect the historical data if it takes more time than usual and the server provides successive continuation points until the data collection has been completed.
1.6.5.0 (released on December 7, 2016)

New

  • Enhanced node history navigation in case of a fixed time window (where StartTime and EndTime are not equal to MinDate). Therefore node history values are collected on each page request as long as the server provides a continuation point, either until the server no longer provides a continuation point or until the page has reached its page size.
1.6.4.0 (released on October 12, 2016)

New

  • Updated the IOpcNode interface definition with respect to the current public OpcNode API.
  • Implemented new method Children() : IEnumerable<IOpcNode> in IOpcNode to determine physical children in the node tree.
1.6.3.0 (released on October 6, 2016)
  • New: Implemented the new method OpcFileMethods.IsFileNode to determine if a node is accessible in the manner of a FileType.
  • Fixed: Out-of-memory issue when using OpcFile.ReadAllText and OpcFile.ReadAllLines.
  • New: Improved performance of OpcFile.ReadAllText to no longer construct the text using the lines of the file; instead it now uses the binary stream of the file.
  • New: Generally optimized the speed of reading and writing file contents by using the client-configured MaxByteStringLength.
  • Fixed: Issue when browsing nodes containing remote nodes which led to the exception: "Cannot cast an absolute ExpandedNodeId to a NodeId. Use ExpandedNodeId.ToNodeId instead."
1.6.2.0 (released on October 4, 2016)
  • New: Implemented the new method CreateTempCertificate which is also used in cases where AutoCreateCertificate is set to true and where the certificate generator utility is not installed. Therefore there is no longer a need to have the certificate generator utility deployed for testing and development besides OPC applications.
  • Fixed: Issue with opening files for writing: the access mask has been verified in the wrong way.
  • New: Implemented a new Session Resource Manager to dispose of any session-related resources whenever a session times out or closes. Such a resource is the internal file handle when accessing file nodes via OPC. If the client discards the connection to the server for any reason, the Session Manager now releases all resources acquired by the session.
1.6.1.0 (released on September 14, 2016)

New

  • Implemented the OpcNodeManager.Browse method to support custom browsing in subclassing scenarios.
1.6.0.0 (released on August 25, 2016)
  • New: Excluded non-value attributes from automatically updating the source label of the value when writing node values. Workarounds to use an explicit OpcValue are now obsolete.
  • New: Introduced the new derivative OpcBrowseNodeContext especially for node browsing and reduced the previous OpcNodeContext to a more generic implementation for further subclassing. The new OpcBrowseNodeContext now also includes the NodeId of the node from which the browsing operation has been originally initiated.
  • New: Introduced the OpcValue.As<T> method to retrieve the represented value as a specific type by converting the value to the type specified by T.
  • New: Implemented the new OpcResult class to represent ServiceResult instances.
  • New: Implemented the subclass OpcMethodContext of OpcContext to determine method call sensitive system information including the method node being called and its target. This also includes storing the outcome of the callback routine invocation.
  • New: Implemented file system accessibility support for OpcFileNode objects from the client point of view. This includes a simple 1:1 API layer implemented by the OpcFileMethods class, a SafeOpcFileHandle to ensure allocated file handles are freed, the OpcFile class to implement an OPC-based System.IO.File class-like set of service methods, the OpcFileInfo class to implement an OPC-based System.IO.FileInfo class-like object and the OpcFileStream class to implement an OPC-based System.IO.FileStream-like object which is derived from the System.IO.Stream class and can therefore be used by all StreamReader and StreamWriter classes provided by the .NET Framework.
  • New: Implemented the new OpcPropertyNode and OpcPropertyNode<T>.
  • Changed: The type OpcVariableValue now requires a generic type parameter for the type of value represented. The OpcVariableNode class has been adapted regarding this type parameter.
  • New: Implemented the new OpcFileNode including its child nodes like the method nodes Open, Close, GetPosition, SetPosition, Read and Write.

1.5 ​

1.5.11.7 (released on July 28, 2016)

Fixed

  • Issue with remote node identifiers in OpcNodeId.
  • Issue with comparing node identifiers of different types in OpcNodeId.
1.5.11.6 (released on June 17, 2016)

New

  • Implemented the Child method on OpcNodeInfo to retrieve the successors of a node using its OpcName. This includes the BrowseName, DisplayName and SymbolicName of a node.
  • Implemented the Parent method on OpcNodeInfo to retrieve the ancestors of a node using its OpcName. This includes the BrowseName, DisplayName and SymbolicName of a node.
  • Implemented the Children method on OpcNodeInfo to retrieve successors of a node of a specific OpcNodeCategory.
  • Implemented the Parents method on OpcNodeInfo to retrieve ancestors of a node of a specific OpcNodeCategory.
1.5.11.5 (released on June 13, 2016)

New

  • Implemented implicit cast operator for ExpandedNodeIds.
  • Implemented additional Get method overload on OpcNamespace to retrieve node namespaces using a URI or index.

Fixed

  • Issue with ExpandedNodeIds in OpcValues and simplified the handling of them.
1.5.11.4 (released on May 30, 2016)

New

  • Minimized lock conditions when reading / writing nodes.
1.5.11.3 (released on May 2, 2016)

New

  • Renewed the evaluation license to provide a new license period.
1.5.11.2 (released on April 18, 2016)

Fixed

  • Issue with MonitoredItems when reading the initial value of a node (the server ran into a NullReferenceException in case of unfiltered MonitoredItems).
1.5.11.1 (released on March 31, 2016)

New

  • Implemented the Changed event on OpcStatus.

Fixed

  • Issue with the not synchronized OPC status from SDK to the Foundation stack (on OpcValue and OpcVariableNode).
1.5.11.0 (released on March 23, 2016)
  • New: OpcNamespace which represents the whole namespace information of a node identifier (namespace index and namespace URI).
  • New: IOpcNamespaceResolver which is implemented by OpcNodeManager, OpcClient and OpcServer. This interface provides late-bound namespace resolution after the OpcServer is started or the OpcClient is connected. Each OpcNodeId whose namespace has been resolved provides the fully qualified URL of the namespace together with the node identifier.
  • New: OpcNodeId.Namespace property to provide the associated OpcNamespace.
  • Changed: Renamed OpcAttribute.Historizing to OpcAttribute.IsHistorizing.
  • New: OpcNode: Implemented node change tracking through the properties HasPendingChanges and PendingChanges including the method IsChangePending.
  • New: Implemented history support for OpcVariableNode and its subclasses.
  • New: Enhanced constructor overloads of OpcStatusCollection for a much simpler setup of a new instance using OpcStatusCodes.
  • New: HDA methods on the client to read and update node history.
  • New: HDA interface on the server to provide the required logic to handle historical data access.
  • New: HDA services: IOpcReadNodesHistoryService and IOpcUpdateNodesHistoryService.
  • New: HDA commands: OpcCreateNodeHistory, OpcDeleteNodeHistory, OpcDeleteNodeHistoryAtTime, OpcDeleteNodeHistoryModified, OpcReadNodeHistory, OpcReplaceNodeHistory and OpcUpdateNodeHistory. All of them are subclasses of the OpcNodeHistoryCommand.
1.5.10.0 (released on February 3, 2016)

New

  • Added the OPC Watch application to the assembly archive.
1.5.9.1 (released on January 25, 2016)

Fixed

  • Issue with a wrongly closed and released session although it can be reused in case of a reconnect.
1.5.9.0 (released on January 21, 2016)
  • Fixed: Possible multithreading issues in the session keep-alive in OpcClient.
  • Changed: The BreakDetected event is now raised only if the reconnect timeout equals zero.
  • Fixed: In case of closing and releasing an OPC client session which has already been disposed of, in some cases it could lead to an undesired reconnect to the server upon an ObjectDisposedException thrown by the already disposed client session.
1.5.8.0 (released on January 18, 2016)

New

  • Updated the licensing logic.
1.5.7.1 (released on January 14, 2016)

Fixed

  • Issue with the minimum possible PublishingInterval in the OpcSubscription class.
1.5.7.0 (released on January 9, 2016)
  • Fixed: Issue with the NullReferenceException in OpcCertificateManager.CreateCertificate when passing an applicationUri as a null reference (Nothing in Visual Basic).
  • Fixed: Issue with not uniquely generated OpcNodeIds for InputArguments and OutputArguments of OpcMethodNode instances. This led to the behavior that only the arguments of the most recently provided OpcMethodNode were published when browsing / reading the method argument properties.
  • Changed: The OpcNodeId for InputArgument and OutputArgument nodes of OpcMethodNode instances; for more information, see the entry before.
  • Changed: The OpcReadOnlyNodeCollection class now provides IOpcNode instances instead of the internal Foundation NodeState instances.
  • New: An OpcNodeId can now be constructed from OpcName instances whose SymbolicName is a null reference (Nothing in Visual Basic). In this case the BrowseName is used instead of the SymbolicName.
  • New: The OpcReadNodesRequest now returns both timestamps (source and server) by default.
  • New: Implemented new OpcNodeManager methods: AddNode, RemoveNode and IsNodeAccessable.
  • Fixed: Issue with duplicate ACEs (access control entries) some of the time when requesting an ACE which has already been added to an ACL.
1.5.6.8 (released on December 17, 2015)

Fixed

  • Issue with missed TimeStamp update on writing node values.
  • Issue with missed TimeStamp data on reading node values.
1.5.6.7 (released on December 17, 2015)

New

  • Implemented the ChangePassword method on OpcServerIdentity to change the user password after an identity has been created.
  • Implemented the protected SystemContext property on OpcNodeManager to provide an alternative context within which system-internal changes can be performed.
  • The OpcWriteNode class now automatically sets the source label timestamp when writing a node.

Changed

  • The OpcValueLabel is now no longer defined as a struct; instead it is now a class.
1.5.6.6 (released on December 16, 2015)

New

  • Implemented AddNode and RemoveNode in OpcNodeManager to support dynamically providing nodes after CreateNodes has been called.
1.5.6.5 (released on December 10, 2015)

New

  • Added additional session information to OpcOperationContext when calling IsNodeAccessable on OpcNodeManager.
1.5.6.4 (released on December 9, 2015)

New

  • Implemented the IsNodeAccessable method on OpcNodeManager to specify in custom code whether a node is accessible within the view.
1.5.6.3 (released on December 8, 2015)

Fixed

  • Issue with duplicate ACEs when manually adding additional entries on demand.
1.5.6.2 (released on October 12, 2015)

Fixed

  • Issue with reading and writing OpcValue instances and arrays as node values on the client and server sides.
  • Issue with anonymous user login on the server side when creating an OpcSession object.

New

  • Implemented redirection if the string value passed to the constructor (string, int) of the OpcNodeId class indicates a numeric identifier. Now an OpcNodeId will be initialized with the numeric identifier instead of using the string value.
1.5.6.1 (released on September 8, 2015)

Fixed

  • Issue with Anonymous and UserName ACLs enabled at the same time.

New

  • Implemented additional CreateCertificate overloads in OpcCertificateManager.
1.5.6.0 (released on September 7, 2015)
  • Changed: Renamed the BuiltInType property to DataType on OpcAttributeInfo.
  • New: Browsing the DataType attribute now results in a member of the OpcDataType enumeration.
  • New: Implemented OpcValue as a surrogate of the DataValue class.
  • New: Implemented the static CreateCertificate method on OpcCertificateManager to create certificates out of the box.
  • New: The OpcStatus class now provides the new OpcStatusCode enumeration as code.
  • New: Implemented support for OpcDataTypes: ExtensionObject, Value and Variant.
  • Changed: Renamed DataValue to Value in OpcDataTypes.
  • New: Implemented support to directly start browsing using a method node.
  • Changed: Moved OpcDiscoveryClient to the Opc.UaFx.Client namespace.
  • Fixed: Issue with NullReferenceException when noncached nodes are browsed.
  • New: Implemented support for using a null reference for an application URI to create certificates.
  • New: Implemented a new abstraction layer for different OPC server types (OpcServerBase).
  • New: Implemented a new OPC server specialization: OPC Discovery Server.
  • Fixed: Issue in the OPC client with accessing the internal session instance although it has been disposed of.
1.5.5.3 (released on August 25, 2015)

New

  • Simplified the use of OpcVariableClass in read / write callbacks by determining the status and timestamp (if no other has been specified) from the node instance.
1.5.5.2 (released on August 24, 2015)

Fixed

  • Issue with Anonymous and UserName ACLs enabled at the same time.

New

  • Removed the OpcAccessControlMode member Default and replaced its use with Blacklist.
1.5.5.1 (released on August 24, 2015)

Fixed

  • Issue with null DataType in VariableNodes.
1.5.5.0 (released on August 24, 2015)

New

  • Implemented different callback properties to read / write OpcNode attributes.
  • Implemented protected virtual methods to read / write OpcNode attributes.
  • Implemented specific callback properties to read / write OpcVariableNode attributes.
  • Implemented protected virtual methods to read / write OpcVariableNode value attributes.
  • The OpcSession class now provides the properties UsedIdentity and SuppliedIdentity.
  • Implemented the Update method on OpcStatus.
  • The OpcContext now provides an Identity property.
  • Implemented the new OpcMonitoredItem class in the server namespace.
  • OnMonitoredItemCreated/Deleted/Modified now provides non-Foundation classes.

Changed

  • Moved the Identity and ImpersonationContext classes from the Opc.UaFx.Server to the Opc.UaFx namespace.
1.5.2.0 (released on June 18, 2015)

New

  • Excluded the auto update of the endpoint before the connect in cases where a preferred endpoint is defined in OpcClient.
  • Implemented new endpoint identity security on OpcSecurity to enable / disable different endpoints for one or more ACEs. Additionally renamed some existing methods.
  • Implemented the StateChanged event in OpcClient.
1.5.1.1 (released on June 16, 2015)

New

  • Implemented the InvokeService method in OpcClient to invoke service routines using a try-catch-finally block to ensure that the client's state property also handles its connection state in case of an exception which indicates that the connection has timed out or been lost.

Fixed

  • Issue with null references as DisplayName and BrowseName in OpcReferenceDescription.
1.5.1.0 (released on June 15, 2015)

New

  • Implemented the SaveCertificate method on OpcCertificateManager.
  • Reworked the complete argument binding to also support out and ref parameters in OpcMethodNode.
  • Implemented ByRef type support in OpcMethodNode.
  • Implemented the local server CertificateValidationFailed event to support custom actions on failed certificate validation.
  • Implemented the new OpcMethodNodeInfo class derived from OpcNodeInfo to browse the arguments of method nodes.
  • Implemented the new OpcCertificateValidationFailedEventArgs and OpcCertificateValidationFailedEventHandler.
  • Implemented the DataType property on OpcDataVariableNode.
  • Implemented the InputArguments and OutputArguments properties on the OpcMethodNode class. Additionally extended the support of OpcArgument instances with the OpcArgumentAttribute on custom delegates.
  • Implemented support for null references in all implicit cast operators which are working with reference types.
1.5.0.0 (released on June 10, 2015)
  • New: Implemented logic to generate a server-fulfilled configuration on start.
  • New: Completely reworked the endpoint selection using the OpcDiscoveryClient and the custom preferred OpcSecurityPolicy.
  • New: Improved the auto complete of the configuration depending on its application type.
  • New: Introduced transport profile information.
  • New: Moved the configuration of UserTokenPolicies to OpcServer on startup and improved the transparency of the IsEnabled property.
  • Fixed: Issue with empty certificate store paths.
  • New: Completely reworked the node referencing mechanism to provide more information while building the node references and to also remove OPC internals from the user API.
  • New: Completely reworked existing node implementations and moved their base class reference to an internal reference to improve the experience with the SDK and become more CLSCompliant by also providing more useful APIs.
  • New: Implemented support for discovery server base address configuration.
  • New: Improved configuration defaults, also when loading configuration through one of the Load methods. Additionally implemented default support for DiscoveryServerConfigurations.
  • New: Simplified the API further.
  • New: Introduced OpcStatus as replacement for StatusCode.
  • New: Reworked OpcDiscoveryClient from factory methods to constructor use to provide a fluent interface between all server and client classes.

1.4 ​

1.4.0.0 (released on June 9, 2015)

New

  • Merged Opc.ClientFx.Advanced and Opc.ServerFx.Advanced together into Opc.UaFx.Advanced.

1.0 ​

1.0.0.0 (released on January 11, 2015)

New

  • Created Opc.ClientFx.Advanced and Opc.ServerFx.Advanced.