Reference
Version history
All releases of the OPC UA .NET SDK with new features, changes, and fixes, grouped by version series and minor version.
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.ServerCapabilitiesTypeandOpcObjectTypes.ServerDiagnosticsType, which identify the object types ServerCapabilitiesType and ServerDiagnosticsType and provide the identifiers of the nodes related to them. Before, the properties of the classesOpcObjectTypes.OpcServerCapabilitiesTypeandOpcObjectTypes.OpcServerDiagnosticsTypewere 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) withBouncyCastle.Cryptography(version 2.7.0), whose assembly is namedBouncyCastle.Cryptography.dllinstead ofBouncyCastle.Crypto.dll.CertificateFactoryRandomGeneratoradditionally providesAddSeedMaterial(ReadOnlySpan<byte>)andNextBytes(Span<byte>), which theIRandomGeneratorofBouncyCastle.Cryptographydeclares for .NET 6 and later. Applications that deploy the assemblies themselves must deployBouncyCastle.Cryptography.dllinstead ofBouncyCastle.Crypto.dll. Applications that referencePortable.BouncyCastlethemselves and use its types must change toBouncyCastle.Cryptography, since both packages provide the same types. - Removed the dependency on
System.Management. - Breaking: The operators
<,<=,>,>=, and==ofOpcFilterOperandthrow anArgumentNullExceptionfor a left operand that isnull, and the constructors ofOpcContentFilterElementthrow anArgumentNullExceptionfor operands that arenull. Before, aNullReferenceExceptionwas thrown. Code that catches theNullReferenceExceptionmust catch theArgumentNullExceptioninstead. - 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.SetEndpointPolicythrows anArgumentNullExceptionfor an endpoint policy that isnull, and the indexer ofOpcSecurityPolicyCollectionthrows anArgumentNullExceptionwhennullis set. Before,SetEndpointPolicythrew aNullReferenceExceptionand the indexer stored an entry without a policy. Code that catches theNullReferenceExceptionmust catch theArgumentNullExceptioninstead, and code that setsnullusing the indexer now fails. - Breaking: The
CertificateRequestedevent ofOpcServerandOpcClientalso occurs when the application certificate exists but is not valid, with the reasonInvalid,UseNotAllowed,Revoked,TimeInvalid,IssuerUseNotAllowed,IssuerRevoked, orIssuerTimeInvalid(for exampleTimeInvalidfor an expired certificate). The certificate is never replaced automatically (AutoCreateCertificateof the event data isfalse); 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 referencesOpcEventContextno longer compiles. - Breaking:
ExtensionObjectExtensions.To<T>throws anArgumentNullExceptioninstead of aNullReferenceExceptionfor an extension object that isnull, and theChildrenofOpcAddObjectTypeNodeandOpcAddVariableTypeNodethrow anArgumentNullExceptioninstead of aNullReferenceExceptionwhen a command that isnullis added or set. Code that catches theNullReferenceExceptionmust catch theArgumentNullExceptioninstead. - A custom
IOpcNodeHistoryProvidershould 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 inBadNoData. - Breaking:
OpcNodeHistory<T>uses -1 (unlimited) as its default capacity instead of 0, with which each call toAddfailed. A capacity of 0 or less than -1 is now rejected with anArgumentOutOfRangeException, also by the constructors ofOpcNodeHistorian. Code that passes a capacity of 0 (for examplenew OpcNodeHistory<T>(0, values)) now fails with anArgumentOutOfRangeException. - Breaking:
OpcNodeHistorian.ModifiedHistoryis anOpcModifiedNodeHistoryinstead of anOpcNodeHistory<OpcModifiedHistoryValue>. Code that uses the property as anOpcNodeHistory<OpcModifiedHistoryValue>must be changed:GetValues(DateTime)replaces the indexer by timestamp, whileRemoveAt(DateTime),Replace, and theReplacedevent are no longer available. Code compiled against a previous version must be recompiled. - Breaking: Reading (for example with
OpcClient.ReadNodeHistoryModified) and deleting (for example withOpcClient.DeleteNodeHistoryModified) the modified history of anOpcNodeHistorianrefer 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)andOpcClient.BrowseNodesthrow anArgumentNullExceptionfor a command that isnull. Before, aNullReferenceExceptionwas thrown. Code that catches theNullReferenceExceptionmust catch theArgumentNullExceptioninstead. - Breaking:
OpcClient.CallFuncthrows anInvalidCastExceptionif the first output argument isnulland the result type is a non-nullable value type. Before, aNullReferenceExceptionwas thrown. Code that catches theNullReferenceExceptionmust catch theInvalidCastExceptioninstead. - Breaking:
OpcClient.CallMethodsthrows anArgumentNullExceptionfor a command that isnull. 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 allnullfailed with anOpcExceptionstatingBadNothingToDo. Code that passes a command that isnullnow fails instead of receiving shifted results. - Breaking: The single-command overloads
OpcClient.CallMethod(OpcCallMethod),ReadNodeHistory(..., OpcReadNodeHistory),CreateNodeHistory,ReplaceNodeHistory,UpdateNodeHistory,DeleteNodeHistory,DeleteNodeHistoryAtTime, andDeleteNodeHistoryModifiedthrow anArgumentNullExceptionwith theParamNamecommandfor a command that isnull. Before, theParamNamestatedcommands.Item, andCallMethod(OpcCallMethod)failed with anOpcExceptionstatingBadNothingToDo. Code that catches theOpcExceptionofCallMethod(OpcCallMethod)for a command that isnullmust catch theArgumentNullExceptioninstead. - Breaking: The
OpcServerconstructors that take a sequence of nodes throw anArgumentNullExceptionfor a node that isnull. Before,OpcServer.Start()failed with anOpcException. The exception now occurs when the server is constructed and is anArgumentNullExceptioninstead of anOpcException. - Breaking:
OpcNode.ReadAttributeValueCoreandOpcNode.WriteAttributeValueCorethrow anArgumentNullExceptionfor a value that isnull. Before, aNullReferenceExceptionwas thrown. A derived class that catches theNullReferenceExceptionmust catch theArgumentNullExceptioninstead. - Breaking: The service requests built from commands (for example
OpcCallMethodsRequest,OpcReadNodesRequest, orOpcWriteNodesRequest) throw anArgumentNullExceptionfor a command that isnull. 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 isnullnow fails instead of receiving shifted results. - Breaking:
OpcClient.CreateSubscriptionthrows anOpcExceptionstatingBadServerNotConnectedwhen the client has not been connected or has been disconnected. Before, aNullReferenceExceptionwas thrown. Code that catches theNullReferenceExceptionmust catch theOpcExceptioninstead. - Breaking:
OpcEventFilterFactory.Selectthrows anArgumentNullExceptionfor operands that arenull. Before, aNullReferenceExceptionwas thrown while the client was connected. Code that catches theNullReferenceExceptionmust catch theArgumentNullExceptioninstead. - Breaking:
OpcEventFilterConstrainedFactory.Wherecombines the specified constraint with the constraint of the factory using a logical AND, like a singleWherewith 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 chainedWherecalls now restricts the events by all constraints, so that a MonitoredItem may receive fewer events than before. - Breaking:
OpcClientApplication.Exitdisconnects the client also in the statesConnecting,Reconnecting, andReconnected(the state the client takes after a reconnect with the same session); while the client connects,Exitwaits until connecting has completed. In a non-interactive environment,Exitalso endsRunif the client has already been disconnected, for example because reconnecting failed. Before,Exitdid nothing in these states, so that the client stayed connected or kept reconnecting andRundid not return in a non-interactive environment (for example a service did not stop). The eventsExitingandExitedare now raised in the statesConnecting,Reconnecting, andReconnectedas well. - Breaking: The constructors of
OpcClientApplication,OpcServerApplication, andOpcServerServiceApplicationcheck their arguments before the application is registered for the current thread. Before, a constructor that threw anArgumentNullExceptionleft the failed instance registered, so thatOpcApplication.Currentreturned it and the next constructor on the same thread threw anInvalidOperationExceptionuntil the instance was garbage collected. After a failed construction,OpcApplication.Currentnow returnsnullinstead of the failed instance. - An application that has been garbage collected without a call of
Exitno longer prevents the creation of the next application on the same thread. Before, the next constructor threw anArgumentException. - Applications can be created and exited on several threads at the same time. Before, this could corrupt the registration, so that
OpcApplication.Currentreturned the application of another thread or an exception was thrown. - Breaking:
OpcServerApplication.Exitstops the server also in the stateSuspended. Before,Exitdid nothing in this state, so that the server stayed suspended andRundid not return in a non-interactive environment. The eventsExitingandExitedare now raised in this state as well. OpcNodeManager.SyncRoot,GetNode(string), andIsNodeReadyToPublishthrow anInvalidOperationExceptionwhen 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, aNullReferenceExceptionwas thrown.OpcClient.BrowseNodeandBrowseNodesuseOpcBrowseNode.IncludeSubtypesonce 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
OpcServerlet 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|ofOpcContentFilterElementcombining an element with anOpcContentFiltercreated using its constructor (for examplenew OpcContentFilter(element1) & element2), which failed with aNullReferenceException. 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 betweenaand 5 instead of whetherais between 1 and 5. The operands are now passed in the order defined by OPC UA. Code that compensated for the issue by callingBetweenon the lower bound (for examplelower.Between(a, upper)) now determines whether the lower bound is betweenaand the upper bound and must be changed toa.Between(lower, upper). - Issue with the message of the
NotSupportedExceptionthrown by the operator!=ofOpcFilterOperand, 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.CreateModifiedthat takes a value, which also set the value in the data of the history value it was called on, while itsValueproperty 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 itsValueproperty still returned the previous value. The history value now uses a copy of the data. Code that changes anOpcValueafter passing it toCreate, or a history value created byCreate, no longer changes the data of the other value. - Issue with the constructor of
OpcCertificateStoreInfo, which failed with aNullReferenceExceptionfor the store typeOpcCertificateStoreType.Applicationand a path of a certificate store of the operating system (for exampleCurrentUser\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 anArgumentOutOfRangeExceptionfor an empty array. The method now copies all policies to the array starting at the specified index, likeList<T>.CopyTo, and throws anArgumentExceptionif 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 anArgumentException. - Breaking: Issue with the
CertificateRequestedevent ofOpcServerandOpcClient, where a certificate provided usingAlternativeCertificateof 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 setAlternativeCertificateto 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 aNullReferenceException. AnInvalidOperationExceptionthat names the data type, the field, and the structure is now thrown. Code that catches theNullReferenceExceptionin this case does not catch theInvalidOperationException. - 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 specifiedOpcEnumFieldinstances were changed. Like in C#, a field defined without a value now follows the value of the field before it (A, B, C = 5, Dresults 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; theValueof anOpcEnumFieldspecified without a value remains 0, andGetFieldsreturns copies. - Issue with
EnumStringsofOpcMultiStateDiscreteNode, where reading the property of a node whose EnumStrings variable has no value threw anArgumentNullException. The property now providesnullin this case. The issue existed since version 2.53.0.0. - Issue with
AvailableStatesandAvailableTransitionsofOpcFiniteStateMachineNode, where reading the property of a state machine without the optional AvailableStates or AvailableTransitions variable, or without its value, threw anArgumentNullException. The property now providesnullin 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 exampleuint) ended in aStackOverflowExceptionwhen the sub-state machine of a state was created. The state number is now converted toTand passed toCreateSubStatesMachineNode(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.GetMembersof a subtype), where readingParentof an inherited variable or object member ended in aStackOverflowExceptionthat terminated the application.Parentnow 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 aNullReferenceException. 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-emptyoutputArgumentslist 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 DeleteReferencesBadUnexpectedError). 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, orBadMethodInvalid). 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 thatRequestValidatingis raised with a good result, the request is processed, and it is not counted inRejectedRequestsCountof 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 classUnspecifiedwas not rejected as an invalid node class. The server now reportsBadNodeClassInvalidfor 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 statusGoodand without a node identifier. The server now reportsBadNotSupportedfor such a node. The issue existed since version 2.7.0.0. - Issue with
OpcNodeHistory<T>.Enumerate(DateTime?)andEnumerate(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?)andRemoveRange(DateTime?, DateTime?), which removed no value if a bound wasnull,DateTime.MinValue, orDateTime.MaxValue, so thatRemoveRange(DateTime?)never removed a value. Such a bound now does not limit the time range. As a result, anOpcNodeHistorianno 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 withOpcClient.ReadNodeHistoryProcessed) from anOpcServer, where a time between two values resulted inBadNoDatainstead of an interpolated value.OpcNodeHistorian.ReadHistorynow 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 withReturnBoundsnow returns the bounding values instead ofBadBoundNotFound. - Issue with the history services of
OpcNodeHistorianfor a node with the ValueRankAny,ScalarOrOneDimension, orOneOrMoreDimensions, which rejected each value withBadTypeMismatch. A value is now accepted if its value rank is valid for the value rank of the node. - Issue with
OpcNodeHistorian, which setPercentDataBadandPercentDataGoodof 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 ofOpcReadNodeHistoryRawDetails), whose setter set the valuetrueregardless of the value passed, so that the bounding values could not be turned off again once requested. - Issue with the constructor of
OpcNodeHistorian, which addedHistoryReadOrWriteto theAccessLevelandUserAccessLevelof the node and set itsIsHistorizingbefore rejecting an invalid capacity with anArgumentOutOfRangeException. The arguments are now checked before the node is changed, and for an invalidmodifiedCapacitythe exception names the parametermodifiedCapacityinstead ofcapacity. - Issue with deleting the raw or modified history of a node within a time range (for example with
OpcClient.DeleteNodeHistoryorOpcClient.DeleteNodeHistoryModifiedwith a start or end time) from anOpcServer, 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.CreateNodeHistoryorOpcClient.ReplaceNodeHistory) in anOpcServer, which processed each insert or replace as an update. Inserting a value at the timestamp of an existing value replaced it instead of resulting inBadEntryExists, and replacing a value at a timestamp without a value inserted it instead of resulting inBadNoEntryExists. The issue existed since version 2.7.0.0. - Issue with
OpcUpdateNodeHistoryDataDetailsandOpcUpdateNodeHistoryStructureDataDetailsof a request received by anOpcServer(for example in theRequestValidatingevent), whoseValueswerenull. - Issue with the history services of
OpcNodeHistorian(CreateHistory,UpdateHistory,ReplaceHistory, andDeleteHistory), which failed with anArgumentExceptionfrom the second value of a call on, because the modified history kept one value per modification time. A client receivedBadUnexpectedErrorfor 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 aFormatException. NullReferenceExceptioninOpcClientIdentity.Matchesfor an identity that has been created with a password that isnull. Such an identity now matches no password.- Issue with
OpcAccessControlEntry.EndpointAccessMode, which returned theOperationAccessModeof 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 anArgumentOutOfRangeExceptionwhen the diagnostics were disabled while the server was running and held the diagnostics of at least one subscription. - Issue with
OpcDataTypeSystem.DefaultandOpcNodeTypeSystem.Default(for exampleGetTypes), which failed with aFileNotFoundException, because the predefined nodes of OPC UA (resourceOpc.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.Clientonly) - Issue with
EnumValuesofOpcMultiStateValueDiscreteNodeandValueofOpcEnumValuesPropertyNode, which threw anArgumentNullExceptionwhen the EnumValues variable had no value, so that a server with such a node failed to start. Both returnnullin this case now. - Issue with
OpcFiniteStateMachineNode, which failed with aNullReferenceExceptionwhen its type declared a sub-state machine for a state without the class creating a node for it (seeCreateSubStatesMachineNode), 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 anOpcServer, it is taken fromOpcServerInfo.CompanyName. Without a known organization, the subject remains as before. - Introduced
OpcRequestProcessedEventArgs.RequestTypeandIsUnsupportedService, and the membersRegisterServer,RegisterServer2, andFindServersOnNetworkofOpcRequestType, so that a server can tell which service a request called, including services it does not support. - Introduced the
SessionActivationFailedevent ofOpcServer, which occurs for each rejected session activation and states the identity the client used (OpcUserNameIdentityTokenInfo,OpcCertificateIdentityTokenInfo) without its password or token data. - Introduced
OpcServerDiagnostics.IsEnabledto turn on the diagnostics of sessions and subscriptions (defaultfalse). - Introduced
OpcServer.DiscoverywithOpcServerDiscovery.RegistrationInterval, the interval of the registration at the local discovery server (default 30000 ms; 0 disables the registration). - Introduced overloads of
OpcDiscoveryClient.DiscoverEndpointsandDiscoverServersthat filter by transport profile and server URI. OpcBrowseNode.IncludeSubtypesis now public (defaultfalse), andOpcViewDescriptionprovides public constructors to browse a view. In this version,IncludeSubtypesonly takes effect throughclient.Services.Browse;BrowseNodeandBrowseNodesdo not evaluate the property yet.- Introduced
OpcClient.ChangeUserIdentityto change the user identity of a connected session. - Introduced
OpcClient.ReconnectInterval, the time between two reconnect attempts (formerlyReconnectTimeout, which remains as a hidden alias), andOpcClient.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, andOpcData.Encodeto encode a structure as anOpcRawObject. Code that expected an array of bytes or anXmlElementfor a value of an unknown structure now receives anOpcRawObject; itsRawDataholds what was returned before. - Breaking: Introduced the attributes
RolePermissions,UserRolePermissions,AccessRestrictions, andAccessLevelExinOpcAttributeandOpcAttributes, the memberDataTypeDefinitionofOpcAttributes, and the typesOpcRolePermissionandOpcPermissions. Reading the DataTypeDefinition attribute now yields anOpcDataTypeInfoinstead of aStructureDefinitionorEnumDefinitionof the stack, and reading RolePermissions or UserRolePermissions yields an array ofOpcRolePermissioninstead ofRolePermissionType. - Introduced
OpcServerSecurity.IsAuditingEnabled(defaultfalse) 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 inTraceEventArgs.Exception.
Changed
- Breaking: Removed the
CertificateFactoryof the stack from the public API of the package, since the SDK does not provide CA signing or CRL generation. Code that usesCertificateFactoryno longer compiles. - Breaking:
OpcSecurityAlgorithm.Autoand the default endpoints of the discovery server and of the OPC Classic wrapper server useBasic256Sha256instead of the deprecatedBasic256(Sign) andBasic128Rsa15(SignAndEncrypt). A client usingAutono longer connects to a server that offers only the deprecated policies. - The certificate the SDK creates for an
OpcServeralso names the fully qualified name of the machine, so that clients that connect by that name accept it. An existing certificate remains unchanged. - Breaking:
OpcServerreports audit events only whileOpcServerSecurity.IsAuditingEnabledistrue, and only to clients connected overSignAndEncryptor HTTPS with a user in the SecurityAdmin role, as defined by OPC UA. A server reports session audit events only afterIsAuditingEnabledhas been set totrue. - Breaking:
State,StateChanged, andBreakDetectedofOpcClientfollow a lost connection detected by a failing service call (for exampleBadConnectionClosedorBadSessionIdInvalid) 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, orImage), each data type states its supertype asBaseType, and fields of data types derived from a built-in type (for exampleDuration,UtcTime, orLocaleId) are decoded. Built-in types and the structures of OPC UA now state their supertype asBaseTypeinstead of none, and a field of a type derived fromByteStringyields aByteStringinstead of an array of bytes. OpcServerno longer traces a connection reset by a client as an error, neither during a read nor when it closes the socket.- Breaking:
OpcClient.ReconnectTimeoutandDefaultReconnectTimeoutare obsolete; useReconnectIntervalandDefaultReconnectIntervalinstead. Code that uses them receives a compiler warning, and a compiler error withTreatWarningsAsErrors. - Breaking: The single-node history services
OpcClient.ReadNodeHistoryProcessed,ReadNodeHistoryAtTime, andReadNodeHistoryModifiedthrow anOpcExceptionwith the status code of the server (for exampleBadAggregateNotSupported) for a node the server rejected, and return an empty result for a node the server accepted without values. Before, aKeyNotFoundExceptionwas thrown in both cases. Code that catches theKeyNotFoundExceptionmust catch theOpcExceptioninstead. - Breaking:
OpcDiscoveryClient(DiscoverEndpoints,DiscoverServers, and its constructors) throws anOpcExceptionstating the reason (for exampleBadSecureChannelClosed) when the server cannot be reached, closes the channel during the handshake, or the discovery URL uses an unsupported scheme. The history navigators ofOpcClient.ReadNodeHistoryandReadEventHistorythrow anOpcExceptionstatingBadCommunicationErrorwhen a page was not finished within the maximum number of requests. Before, theServiceResultExceptionof the stack was thrown. Code that catches theServiceResultExceptionmust catch theOpcExceptioninstead. - Breaking:
OpcViewDescription.Defaultis now astatic readonlyfield, so that the default view cannot be replaced. Code that assignsOpcViewDescription.Defaultno longer compiles. Code compiled against an older version that readsOpcViewDescription.Defaultmust be recompiled, because the property has become a field.
Fixed
- Issue with methods in
OpcServerthat are implemented by a command (for example a method of an imported NodeSet implemented usingOpcNodeSetManager.ImplementNodeCallback) and declare an argument with the ValueRankAny,ScalarOrOneDimension, orOneOrMoreDimensions. Each call of such a method failed with anIndexOutOfRangeException. 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 asByteString[], 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 ValueRankOneDimension), 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 theServerConfigurationof the application, so that a restart offered anonymous access although only theOpcUserNameAclwas enabled. The server now works with a copy of the configuration. Code that readsConfiguration.ServerConfigurationafter the start sees the values it set itself instead of the policies in use. - Issue with
OpcClient.Connect, which failed with anIndexOutOfRangeExceptionon 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 raisedMonitoredItemsDeletedinstead ofMonitoredItemsModifiedwhen 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 exampleRSA_DH_AesGcm) before a supported one. - Issue with
OpcServer, which terminated with aStackOverflowExceptionwhen 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 withBadTimestampsToReturnInvalid. 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 asOpcReadNodeHistoryRawDetailsinstead ofOpcReadNodeHistoryModifiedDetails. 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 theReconnectingstate 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
NameandXmlNameof 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 withOpcClient.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 usingSignorSignAndEncryptfailed. 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. KeyNotFoundExceptionin the single-node history update servicesOpcClient.CreateNodeHistory,ReplaceNodeHistory,UpdateNodeHistory,DeleteNodeHistory,DeleteNodeHistoryAtTime, andDeleteNodeHistoryModifiedfor a NodeId stating a namespace index only (for examplens=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
OpcExceptionnow 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
NotificationFailedevent inOpcSubscriptionandOpcClient, and the corresponding handlerOpcSubscriptionSetup.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 theOpcSubscriptionthe message belongs to and, if not handled, by theOpcClient. A message whose subscription is not known (yet) is reported by theOpcClientonly. - Introduced
OpcAttribute.DataTypeDefinitionto 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 exceededMaxStringLengthor the status codeBadEncodingLimitsExceeded. - 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, orString). Decoding such a structure failed with anArgumentNullExceptionand the whole read with the status codeBadUnknownResponse. 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 asOpcConditioninstead ofOpcDialogConditionor an alarm condition asOpcAcknowledgeableConditioninstead ofOpcAlarmCondition. - Issue that caused
OpcClient.Connect()to fail whenUseDynamicis enabled and the server sends the same HasSubtype or HasEncoding reference of a data type more than once. NullReferenceExceptioninOpcClientwith 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.Autowhose first optional member is not set. Values decoded after such a member could be wrong, or decoding failed with anEndOfStreamExceptionor aServiceResultExceptionreporting an exceededMaxStringLength. - Issue with members of a structured data type declared as one of the wrapper types
OpcText,OpcName,OpcNodeId,OpcValueorOpcEngineeringUnitInfo. 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?orDateTime?). The value of such a member is now preserved. NullReferenceExceptionwhile decoding a structured data type with an array member which is not optional and holds a null reference.InvalidCastExceptionwhile decoding an array ofGuidvalues.- Issue with empty arrays of the wrapper types
OpcText,OpcName,OpcValueandOpcEngineeringUnitInfo. 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
OpcNodeIdvalues 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
RetainStateis not automatically updated by any sub-state different than theEnableStateif theRetainPolicyisManual. - Incorrectly handled
nodeChangesinOpcNode.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
OpcClientif an event type is registered using only an expanded node identifier (for example usingOpcNamespace.GetId, where theOpcNamespaceinstance does not have a namespace index assigned). This results in always receivingOpcEventinstances instead of the specific sub-type ofOpcEventor 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.IsRetainedPolicyproperty inOpcConditionNodeto override the default logic used to control the value of theOpcConditionNode.IsRetainedproperty according to the different states defined by condition nodes (for exampleEnableState,ActiveState,AckedState,ConfirmState). The default value used for this property depends on the subtype of theOpcConditionNodeused. This way you can gain full control of theIsRetainedproperty using the valueOpcConditionRetainPolicy.Manualfor theIsRetainedPolicyproperty.
Changed
- The initial value of the
OpcConditionNode.IsRetainedproperty and its subtypes (OpcAcknowledgeableConditionNodeandOpcAlarmConditionNode) 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 newOpcConditionRetainPolicyenumeration 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 valueOpcConditionRetainPolicy.Manualfor theOpcConditionNode.IsRetainedPolicyproperty to gain full control of theIsRetainedproperty.
Fixed
StackOverflowExceptionwhen 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
StackOverflowExceptionin the newOpcFiniteStateMachineNode<T>class when usingChangeStateTo.
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
InheritReferenceTypeIdforOpcInstanceNodesto control whether theDefaultReferenceTypeIdis to be inherited by its direct children. - Introduced new
OpcNodeSet.GetNodesmethod to retrieve the whole address space defined by a NodeSet.
Fixed
- Issue with incorrectly generated DataTypeDefinition attribute in the
OpcServerwhen using structured data types with optional fields usingOpcEncodingMaskKind.Explicit. - Issue with incorrect encoding of optional fields in the
OpcClientwhen enablingUseDynamicand the server doesn't provide aTypeDictionary. - 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.GetNodeafter loading a NodeSet without a custom context with matching namespace URIs.
2.54.0.0 (released on June 25, 2026)
New
- Added new
SupportedTokenTypesproperty toOpcEndpointDescriptionto provide an enumerable sequence of supportedOpcAccessControlTokenTypevalues to identify the supported access control list using the endpoint provided by the server. This can be discovered usingOpcDiscoveryClient.DiscoverEndpoints(...). - Added new properties
AvailableStatesandAvailableTransitionstoOpcFiniteStateMachineNode. - Added new property
SupportCurrentStateto 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 methodChangeStateTo. In addition the CurrentState node deliversBadas status code andBADas value, while its child node "Id" provides a null reference as value. - Added support for providing event history in the
OpcServerusing theIOpcEventHistoryProviderinterface, and for reading event history in theOpcClientusing theReadEventHistorymethod. - Added property
OpcServerBinding.UseExclusiveAddressthat 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.UseExclusiveAddressproperty.
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.
ArgumentNullExceptionoccurred in theOpcServerwhen 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 theQueryEventsCallback.- Issue with missing structured data types in
OpcNodeSetafter importing aNodeSet2.xmlfile which defines several data types using onlyDataTypeDefinitionsand partially using (additional)DataTypeDescriptionswhich are not referenced byDataTypeEncodingswhich themselves do not use inverse references back to their encoded DataType node. Please note that in such cases the API ignores anyDataTypeDescriptionand will provide the DataType related information using the DataTypeDefinition of the DataType node. NullReferenceExceptionoccurred while callingOpcServer.GetDataTypes()when a NodeSet has been loaded that contains an empty structure definition.NullReferenceExceptionoccurred 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 parameterTwas a wrapper type likeOpcText, and when using a constructor that takes a parent node.OpcText.Equals()and.CompareTo()methods could throw aNullReferenceExceptionand could return a wrong comparison result.- The
OpcServercould 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, orOpcClientwhile dynamic type registration is enabled. - Issue where user-defined nodes added with
OpcNodeManager.AddNode()after starting theOpcServersometimes missed the hierarchical reference from the parent node.
2.53.0.0 (released on April 16, 2026)
New
- Introduced property
OpcServer.UseDynamictogether with typesOpcStruct,OpcStructField,OpcEnum,OpcEnumField, which allow you to dynamically define data types for theOpcServer. - Introduced new
OpcEnumValuetype to represent enumeration values using the OPC UA data typeEnumValueType. - Introduced in
OpcEnumtwo 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 attributesOpcEnumAttribute,OpcEnumMemberAttributeandEnumMemberAttribute. - Introduced new
OpcEnumValuesPropertyNodeto support publishing customOpcEnumValuesas part of the server's address space. - Introduced new
OpcMultiStateDiscreteNodeandOpcMultiStateValueDiscreteNodeincluding 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
OpcAccessControlRoleto represent default roles and define custom roles whichOpcPrincipalscan be a member of. - Introduced new
OpcServerSecurityRolesto provide all default roles which are usually known by theOpcServer. - Introduced new
OpcServerSecuritypropertiesRolesandAccessControlRoles: the first provides a set of all default OPC UA roles and the latter provides the roles currently used by theOpcServer(within this implementation all instances provided by the set of default roles are in theAccessControlRolesproperty). - Introduced new
OpcAccessControlEntrymethodsAssignandRevoketo control the role memberships of the principal in the entry. - Introduced in
OpcPrincipalthe new methodIsInRoleto 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
AuthenticatedUserrole (custom access control lists must ensure that authenticated principals are assigned to this role as well). - Introduced new
OpcServereventCertificateChangedwhich is raised whenever a session with an identity which is a member of theSecurityAdminrole changes the certificate of the server. - Introduced support for GDS Push Management using
ServerConfigurationType,UpdateCertificate,TrustListand role-based authentication using theSecurityAdminrole. To enable GDS Push Management the custom implementation of theOpcServermust provide at least one ACL entry which is assigned to theSecurityAdminrole.
Fixed
- Issue with duplicated child references for nodes which use inline default foundation defined
NodeStateinstances representing a whole tree of nodes, where children are defined by theNodeStateand 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
OpcDiscreteItemNodeandOpcDiscreteItemNode<T>of the base classOpcDataItemNode. - Introduced new subtype
OpcTwoStateDiscreteNodeof the base classOpcDiscreteItemNode. - Introduced support for new security policy algorithms
Aes128_Sha256_RsaOaepandAes256_Sha256_RsaPss.
Fixed
- CTT issue with wrong status code
BadSessionClosedinstead ofBadNoSubscriptionif a session requests a publish without any subscription. - Issue with automatic node identifier assignment not working for
ShelvingStateinOpcAlarmConditionNode. - Issue with not initialized ValueRank attribute after creating a non-generic
OpcVariableNodeinstance 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.EstimatedReturnTimeproperty to support CTT compliance. This new property will directly update the value of the corresponding node atObjects/Server/EstimatedReturnTimeto 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
OpcNodeModelwith additional overloads toCreateByDefault,OmitByDefaultandOmitOptionalswith an additional boolean parameterrecursiveto 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
OpcOperationLimiterto provide more practical default limits, ifAutoDetermineLimitsis enabled.
2.51.3.0 (released on February 12, 2026)
New
- Introduced client-side support of
ResendDatausingOpcSubscription.ResendDatato query current values of MonitoredItems in reporting mode.
Fixed
- Issue in the OPC UA server to correctly handle pending
ResendDatarequests, especially if the current value did not change in the meantime. - Issue which caused type
OpcNodeIdin structured data type definitions to be mapped toExpandedNodeIdinstead of NodeId since version 2.50.0. - Issue that could cause values set using
OpcVariableNode.Valuenot to be added to theOpcNodeHistorian'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 whenUseDynamicis enabled and the server provides one or more type dictionary nodes that returned aBadNotReadablestatus 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
ActivateSessionwhen an invalid session identifier or an empty client signature was specified (CTT compliance). PolicyIdofUserTokenPolicyentries was not unique within the server in the endpoint descriptions provided byGetEndpoints(CTT compliance).- When a client sends a
UserNameIdentityTokenwith an empty user name, status codeBadIdentityTokenInvalidis 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 parametertimeFlowsBackwardistrue.
Fixed
- Issue that caused reading the
ServerDiagnosticsNodeto return aBadOutOfServicestatus even when diagnostics were enabled in theOpcServer. - Issue that caused incoming connections to the
OpcServerto fail withBadUserTokenRejectedwhen using anhttps:URL. - When a client sends a HistoryRead request with a
maxCountvalue, 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
OpcAutomatismpropertiesUseNodeNameAsDefaultDescriptionandUseNodeNameAsDefaultSymbolicNameto support conditional initialization of the Description attribute andSymbolicNameproperty ofOpcNodeinstances.
Changed
- Improved CTT compliance regarding
OpcNodedefault initialization and conditionally removed defaults for the Description attribute and for theSymbolicNameproperty. To enable the previous behavior, enable the corresponding properties inOpcAutomatism.
Fixed
- Issue with overwritten variable node attributes provided through an
OpcNodeModel.
2.50.6.2 (released on October 6, 2025)
Fixed
- Issue with
InvalidOperationException/NullReferenceExceptionwhen creating anOpcConditionNodeor anOpcHistoryConfigurationNode.
2.50.6.1 (released on September 25, 2025)
Fixed
- Issue with
NullReferenceExceptionin case of NodeSet variables with undefined array dimensions.
2.50.6.0 (released on September 21, 2025)
New
- Enhanced
IOpcNodeInfowithWriteAccessandUserWriteAccessproperties to provide the values of these attributes as well. - Introduced new
IOpcVariableNodeInfoas a sub-type ofIOpcNodeInfoto 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
OpcAnalogUnitRangeNodeandOpcAnalogUnitNode.
Changed
- Moved
Modelproperty and all otherOpcNodeModelrelated API fromOpcInstanceNodetoOpcNodeto 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.AuthenticationLimitsto control new brute force protection limits applied while authenticating. - Updated node types to version 1.05.03.
- Introduced
BadUserAccessDeniedin 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
OpcNodeModelparameter forOpcConditionNode(including its subclasses),OpcOrderedObjectNodeandOpcFileNode.
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
NullReferenceExceptioninOpcContextif created from anOpcOperationContext. - Issue with
NullReferenceExceptioninOpcNodeIdwhenValueAsStringis queried on anOpcNodeId.Nullinstance. - Issue with
NullReferenceException(since version 2.50.4) when creating anOpcDataItemNode(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.ProductUrifor setting theProductUriin the BuildInfo variable of theServerStatusvariable. - Introduced new generic implementation of
OpcMethodNode: TheOpcMethodNode<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.OperationLimitsproperty 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
DefaultReferenceTypeIdOrganizes ofOpcFolderNodeand adopted use of HasComponent instead. This change addresses CTT compliance. ServerDiagnosticsno longer provides children and any explicit read/write operations on the child nodes using their NodeId result inBadOutOfService. This behavior applies for disabledServerDiagnosticsand addresses CTT compliance.
Fixed
- Issue with
SemanticsChangedstatus code (0x4000) not reported for MonitoredItems when writing values to semantic properties, for example of anOpcAnalogItemNode. - 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
InverseNameattribute ofReferenceTypesto assure that aBadAttributeIdInvalidis provided instead of a null reference (Nothing in Visual Basic). - Wrong status code from
BadSessionIdInvalidtoBadSubscriptionIdInvalidused in server subscriptions when accessing the subscription of a different session. - Wrong status code from
BadIdentityTokenInvalidtoBadIdentityTokenRejectedin 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
NullReferenceExceptionwhen creating anOpcAlarmConditionNodeinstance (or one of its subclasses) in theOpcServer.
2.50.2.0 (released on July 7, 2025)
New
- The
OpcServernow provides the server's local time zone information in theLocalTimeproperty of the Server object. - Introduced support for model change tracking and reporting.
- Added
OpcAutomatism.RaiseModelChangeEventsproperty to globally enable or disable model change tracking and reporting. - Added
OpcNode.SuspendModelChangeEvents(...)andOpcNode.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 returnOpcFiniteStateMachineNodeinstances.- Issue receiving
ModelChangeEventand GeneralModelChangeEvent data inOpcClient. - Issue with
NullReferenceExceptioninOpcGeneralModelChangewhen theChangesproperty 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
NodeTypereflection.
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
NodeTypeSysteminformation in theOpcServerandOpcContext. - 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
OpcFiniteStateMachineNodeto 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 newOpcContext.Currentproperty) to support scenarios where anOpcContextis required but not given by any parameter. This currently applies to server code only. - Added properties
OpcNodeManager.NodeSetImportOptionsandOpcNodeSetManager.ImportOptionsto 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.DefaultAutoto simplify generic encoding definitions. - Introduced thread local
OpcContext(using newOpcContext.Currentproperty) to support scenarios where anOpcContextis required but not given by any parameter, for example in the constructor of some node. - Introduced
OpcContext.OfNodemethod to switch into the context of a dedicated node. In addition, enhancedAddChildandRemoveChildmethods inOpcInstanceNodeto 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 toAddChildandRemoveChild. - Added
OpcServer.RegisterNamespaceandOpcServer.RegisterNamespacesmethods 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
OpcSessionto itsOpcSubscriptionsand from them to theirOpcMonitoredItems. - Introduced new
OpcNode.ChangesUnhandledevent 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.UseOnlySecureEndpointsis set totrue, theOpcClientnow only selects endpoints with aSignAndEncryptmode, and no longer selects ones with aSignmode, because the latter does not provide confidentiality. To use the previous behavior of selecting endpoints with aSignorSignAndEncryptpolicy, setclient.Security.EndpointPolicyto one with that mode, and setOpcClient.Security.AutoUpgradeEndpointPolicytotrue. Alternatively, to select the "best" endpoint offered by the server, setOpcClient.Security.UseHighLevelEndpointtotrue(but note that this does not provide security). - When creating an event filter with
OpcEventFilterFactory.Select(), the type identifier of theBaseEventTypeis 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, specifyOpcEventFieldSelectOptions.UseExplicitEventTypeIdsinOpcEventFilterFactory.Select().
Fixed
NullReferenceExceptionwhen importing a NodeSet containing aFiniteStateMachinewithout a LastTransition child node.NullReferenceExceptionswhile comparing two Number struct values if the underlying value is a null reference (Nothing in Visual Basic).- Issue which caused clients to receive a
BadNotSupportederror when trying to establish a new connection to the server after one client subscribed to audit events. - Issue which could cause
OpcEngineeringUnitInfo.CommonCodeto return a string containing a NUL character. - Issue which could cause an
OpcExceptionwhen reading a structured data type with an array of nested structured data types whenOpcClient.UseDynamicwas enabled. - Issue which could cause the
OpcServerto accept client connections using untrusted certificates even whenOpcSecurity.AutoAcceptUntrustedCertificateswas set tofalse. - Issue which could cause the
OpcClientto connect to endpoints with aNonepolicy mode when that was the only policy offered by the server, even ifOpcClientSecurity.UseOnlySecureEndpointswas set totrue. - Issue with decoding structured data types when a null value occurred for an array field.
- Issue with
InvalidCastExceptionwhen reading a structured data type containing an array of structured data types. IndexOutOfRangeExceptionwhen importing a NodeSet where aVariableNodespecifies 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
NullReferenceExceptionthat 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
UserIdentityTokentoOpcIdentityToken.
Changed
- Updated
Portable.BouncyCastledependency 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.Stateto be stuck inConnectingwhen callingOpcClient.Disconnect(), while at the same time another thread calls methods likeOpcClient.CallMethod().
2.42.2.0 (released on August 22, 2024)
New
- Classes
OpcAccessControlListandOpcUserIdentityare now subclassable, and customOpcAccessControlListinstances can be added to theOpcServerviaOpcServerSecurity.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
InvalidOperationExceptioninOpcFiniteStateMachine.ChangeStateTo()due to an incorrectOpcNodeIdcomparison.
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.UseNullInsteadOfEmptyArraysto control several array / list / collection properties regarding their supported / encoded values. When setting this property to the valuetrue, 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, theOpcAutomatism.UseNullInsteadOfEmptyArraysproperty has to be set to the valuefalse. This results in empty array / list / collection values which are encoded using an array size equal to zero.
Changed
OpcArgument.ArrayDimensionsandOpcArgumentInfo.ArrayDimensionsnow support null references (Nothing in Visual Basic) when enabled viaOpcAutomatism.UseNullInsteadOfEmptyArrays. This means whenever a server provides a value ofnullfor theArrayDimensionsthis property will now return a null reference (Nothing in Visual Basic) as well.
Fixed
- The
OpcClientno 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.Idto 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
DataTypeIdof 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 sameOpcNodeManagerinstance).- Invalid generated length field for arrays in the DataTypeDefinition attribute.
- Memory leak in
OpcServerthat 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.Coredependency to version 2.1.25, to fix a vulnerability.
Fixed
- Issue that caused a memory leak in the
OpcClientwhen repeatedly callingOpcClient.BrowseNodes()or accessing file nodes with classOpcFileMethods,OpcFileStreamorOpcFileInfo. - Issue that could cause the
OpcClientto 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
OpcServeris now done only once duringActivateSession, instead of doing it for each request separately.
Fixed
- Issue with
OpcVariableNodeInfo.IsArrayandOpcVariableNode.IsArrayincorrectly returningfalse(the former since version 2.33.0) for an array with 3 or more dimensions. - Issue with a deadlock occurring when calling
OpcClient.Disconnect()orOpcClient.Dispose()while at the same time event subscriptions were active. - Issue that caused the
OpcClient.Statenot changing toReconnectingwhen a connection break was detected while an operation likeReadNodes()was still executing. - Issue that prevented creating an event filter from an
OpcNodeIdif it was using a resolved namespace. - Issue that caused a memory leak when repeatedly creating (and throwing away)
OpcMethodNodeinstances 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
OpcDataTypeInfoto supportExtensionObjectsas system type as well (IsSystemTypeproperty). - 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
ExtensionObjectsin 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
DataTypeDescriptionsandDataTypeDefinitionswhile the definitions use different field types. The descriptions are now prioritized. - Issue with event subscriptions not working since version 2.29.0 when no
OpcEventFilterwas 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
OpcNodeContextwith newNodeManagerproperty which references theOpcNodeManagerin 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(...)andWrite(...)to invoke the implemented methods of anOpcFileNodeusing 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
OpcDataObjectclass.
Changed
OpcContext.Empty.SessionIdno longer provides a null reference (Nothing in Visual Basic). Instead it providesOpcNodeId.Null.- Changed access modifiers of
OpcNodeManager.AddNode(...)andOpcNodeManager.RemoveNode(...)methods fromprotectedtopublicfor improved usability. - Evaluation of
OpcVariableNodeInfo.IsArraynow 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,AuthorizationServiceandProxyCapabilitiesfrom user code. - Introduced new
Nameproperty inOpcDataTypeAttributeto define a different name per DataType as used by the implementing .NET type. - Introduced support of lazy initialization of custom
OpcDatastore implementations with support of a default constructor. - Introduced new
IsUnionproperty inIOpcDataTypeInfoto indicate whether a data type is a union data type. - Introduced new interface
IOpcUnionto 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
OpcSubscriptionSetupclass to create a new subscription with all properties preset at once. - Introduced new
OpcClient.CreateSubscription(...)method which uses anOpcSubscriptionSetupto create a newOpcSubscription.
Fixed
- Added a reference to
System.Text.Encodings.Web4.5.1 (for the NuGet package), to fix a vulnerability warning caused by the transitive reference throughMicrosoft.AspNetCore.Server.Kestrel2.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
ApplyChangesusingOpcEventNode.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
UseDynamicand subscriptions consuming structured data types represented using theOpcDataObjectclass.
2.31
API changes: none
2.31.0.0 (released on May 17, 2023)
Changed
- Updated
Newtonsoft.Jsondependency 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 theclassIDandprogID, but instead a free dynamic port number is determined. This facilitates using multipleOpcClientswith the sameopc.com:URL at the same time.
Fixed
- Issue when updating the
OpcServer'sApplicationUrifrom 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 theOpcClientto 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.InheritParentNamespaceproperty 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.InheritParentNamespaceistrue; the default value).
Changed
- The behavior of starting and stopping an OPC Classic UA Wrapper Server is now more deterministic, as each
OpcClientuses a dedicated wrapper server, which is now also stopped when theOpcClientdisconnects. - The method
OpcCertificateIdentity.Matches()is now virtual to enable custom identity comparison. - The
OpcEvent.EventIdproperty now provides the underlying ByteString instead of a byte-array (before the ByteString was introduced).
Fixed
- Issue with
ArgumentOutOfRangeExceptionbeing thrown when creating anOpcFiniteStateMachineNodewithout defining states via attributes. - Issue with
NullReferenceExceptionwhen anOpcFiniteStateMachineNodeis created after theOpcServerhas already been started. OpcEvent.GetValue<T>(string)correctly returns a ByteString value when type parameterTisOpc.UaFx.ByteString.- Issue with
ArgumentExceptioninOpcClient.Connect()when the currentAppDomain'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.UseBreakMonitoringto 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 numericalOpcNodeIdfrom theOpcNamespace. - Introduced a set of new attributes to specify
OpcStateMachineNodespecific states and their transitions. - Introduced new
OpcStateNodeclass to represent the OPC UAStateType. - Introduced new
OpcTransitionNodeclass to represent the OPC UATransitionType. - Introduced support to configure custom
OpcFiniteStateMachineNodesusing 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 theStateMachineto 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.AddNotifieris no longer supported on other types thanOpcObjectNodesand their subclasses.
Fixed
- Issues with missing data type information for the abstract data type "Structure" (
i=22). - Issues accessing the
OpcTransitionVariableNode.VariableId/Nodeproperties. - Issues accessing the
OpcFiniteTransitionVariableNode.VariableId/Nodeproperties. - Issues accessing the
OpcStateVariableNode.VariableId/Nodeproperties. - Issues accessing the
OpcFiniteStateVariableNode.VariableId/Nodeproperties.
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()withOPC_BROWSE_TOeven thoughOpcClient.Interfaces.DataAccess.SupportsBrowseTowas set tofalse. - 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
DataTypeDictionaryNodesto 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.TypeResolveandOpcClient.TypeResolveusing the corresponding encoding identifier andOpcNodeId.Nullfor the data type identifier.
Changed
- Disabling
OpcAutomatism.UseDynamicTypeRegistrationresulted in a deferred dynamic type registration at the time a custom data type is manually registered.
Fixed
- Issue with
ArgumentExceptionwhenever theValueproperty of anOpcStateVariableNodeorOpcFiniteStateVariableNodehas been changed. - Issue with
OpcData.TypeResolvewhere 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.TypeResolvenot 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.UseDynamicTypeRegistrationhas been disabled. - Issues with enumerations described in a different
DataTypeDictionarythan 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
DataTypeDictionariesonly declaring enumerations. - Issues when selecting an endpoint by constraints, to ignore endpoints that have
Mode == NonebutAlgorithm != Noneand 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
NumberInListproperty toOpcOrderedObjectNodeto determine the current position of a node within the server. - Added new
OpcClient.TypeResolveevent 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.DefineModelmethods to define node type dependent modeling rules for its whole node model. - Introduced
IOpcDataTypeMapperand its default implementationOpcDataTypeMapper. - Introduced new
OpcDatamethod to register, determine and unregister custom data type mappers. - Introduced new
OpcDataTypeMapper.ConvertibleandOpcDataType.Delegatemethods 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
BadNodeIdUnknownon 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.Childoverloads 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
Declarationsproperty toOpcDataTypeInfoto 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.Resolutionproperty to configure the ways node identifiers are resolved if no custom node identifiers are used. - Introduced new
OpcNodeeventsBeforeAddandAfterAddto handle conditions/states at the time a node is being or has been added to the address space of the server. - Introduced new
OpcNode.Implementmethod to finalize the node creation before it can be used for the first time. - Enabled support of implementing standard OPC UA interfaces.
- Introduced
OpcOrderedObjectListNodeas default implementation of theOrderedListType. - Introduced abstract
OpcOrderedObjectNodeas default implementation of theIOrderedObjectType/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
BadAttributeIdInvalidand 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
OpcClientSecurityrelated properties to configure theAuthenticationLevelandImpersonationLevelthe 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
IOpcAsyncMethodCommandinterface to implement asynchronous commands. - Introduced new default
OpcMethodCommands.Executeto provide a custom generic command method to be executed using a command object. - Introduced new default
OpcMethodCommands.ExecuteAsyncto provide an async custom generic command method to be executed asynchronously using a command object. - Introduced support of
IOpcAsyncMethodCommandand delegates pointing to a method which returns aTaskorTask<T>. Either are executed asynchronously on method call. - Introduced new
OpcAutomatism.UseAsyncMethodCallsproperty to globally control the execution of method calls for every server and all its node managers. - Introduced new
OpcNodeManager.UseAsyncMethodCallsproperty to locally control the execution of method calls of methods defined by the node manager. - Introduced support for OPC UA
NumericRangeinformation using the newOpcRangestructure. - Enhanced
OpcReadNodewith newRangeproperty to support reading a range of elements in an attribute. - Enhanced
OpcWriteNodewith newRangeproperty to support writing a range of elements in an attribute. - Introduced additional
OpcClient.ReadNodemethod overloads to provide anOpcRangeto read a range of elements in an attribute. - Introduced additional
OpcClient.WriteNodemethod overloads to provide anOpcRangeto write a range of elements in an attribute.
Changed
- The
OpcNodeAccessToken.IndexRangeis now obsolete, use newOpcNodeAccessToken.Rangeproperty instead. - The property type of
OpcReadVariableValueContext(<T>).Rangehas been changed fromUa.NumericRangetoOpcRange. - The property type of
OpcWriteVariableValueContext(<T>).Rangehas been changed fromUa.NumericRangetoOpcRange. - The property type of
OpcReadPropertyValueContext(<T>).Rangehas been changed fromUa.NumericRangetoOpcRange. - The property type of
OpcWritePropertyValueContext(<T>).Rangehas been changed fromUa.NumericRangetoOpcRange.
Fixed
- Issues with strict
XmlReflectionImporterused 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
Tagproperty inOpcServiceCommandto assign custom metadata bound to a specific command. - Introduced
Load,ParseandTryParsemethods onOpcDataTypeDictionaryto provide different ways to consume an XML serialized dictionary in any possible way. - Overall review of
OpcReadHistoryDetails,OpcReadNodeHistoryDetails,OpcReadNodeHistoryRawDetailsandOpcReadNodeHistoryModifiedDetails. - Added missing documentation to
OpcReadHistoryDetails,OpcReadNodeHistoryDetails,OpcReadNodeHistoryRawDetailsandOpcReadNodeHistoryModifiedDetails. - Introduced new
ReturnBoundsproperty inOpcReadNodeHistoryDetails. - Introduced new
ReadNode[s]History[Modified] methods toOpcClientto support customOpcReadHistoryDetails.
Fixed
- OPC Classic connections now specify
RPC_C_AUTHN_LEVEL_PKT_INTEGRITYfor 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,ConfirmandAddCommentonOpcConditionandOpcAcknowledgeableConditioninstances.
2.22.0.0 (released on February 11, 2022)
New
- Introduced new
CreateArraymethod inOpcArrayDimensions. - Introduced new
GetDataTypemethods inOpcContextto determine context sensitive data type information. - Introduced support of
OpcModelChangeEvent[Node] andOpcGeneralModelChangeEvent[Node] including itsOpcModelChangeItemandOpcModelChangeActions. - Custom model change event propagation/handling using the new
OpcModelChangeEventNodeandOpcGeneralModelChangeEventNode. - Introduced inline event compression of model change events whenever an event snapshot of an
OpcGeneralModelChangeEventNodeis to be reported.
Fixed
- Issue with wrong definition of
ValueRankusingOpcArgumentsconstructor 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
DataTypeDictionariesandDataTypeDescriptionsincluding theDataTypeEncodingsare 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
DataTypeDictionariesandDataTypeDescriptionsincluding theDataTypeEncodingsare 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
BadNodeIdUnknownwhen a node subscribed is deleted later.
2.20.3.0 (released on January 4, 2022)
Fixed
- Issue with
OpcNamespace.Resolve()that causedOpcNamespaceCollection.ResolveValue()not to work correctly. IndexOutOfRangeExceptionwhen using a non-genericOpcAnalogItemNodein the server.- Issue with
StackOverflowExceptionwhen (implicitly) converting aByte[]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
OpcMethodNodeusing wrong callback target.
2.20.1.0 (released on October 8, 2021)
New
- Introduced new
OpcEnumAttributeto control the definition of the enum members using EnumStrings or EnumValues. Additionally theOpcEnumAttributeprovides 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
OpcClientnow provides node type information for event, object and variable types.OpcNodeprovides newRegisterTypeandUnregisterTypemethods to define/undefine custom node types.OpcNodeprovides newGetTypeandGetTypeInfomethods to determineSystem.TypeandOpcNodeTypeInfoinstances used to define/describe a node type.OpcInstanceNodeprovides newGetNodeValueandSetNodeValuemethods to change the Value attribute of a dedicatedOpcVariableNodewhich is a child of the instance node.- Subclassing an
OpcObjectNodeusing 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
OpcTypeNodewere introduced to define custom node types (OpcNodeTypeandOpcNodeType<T>). - Introduced new attributes to describe custom node types (
OpcNodeTypeAttribute,OpcNodeTypeIgnoreMemberAttribute,OpcNodeTypeMemberAttribute,OpcNodeTypeOptionalMemberAttribute). - Enhanced
OpcNodeTypeSystemclass to provide Default and Current node type system related node type information. - Members in
OpcNodeTypeInfoto provide additional information about the type and its children/members. - Extended data type resolution of
OpcArgumentto support lazy initialized custom data types as well.
Changed
OpcInstanceNodenow determines itsDefaultTypeDefinitionIdusing the node type used to create the instance node.OpcMemberOriginsnow defines an additional enum memberMethodfor method origins.
Fixed
- Issue with lazy defined custom data types used for arguments in
OpcMethodNodes. - Issue with
BadNodeIdUnknownwhile accessing/browsing the InputArguments/OutputArguments ofOpcMethodNodescreated before its dedicatedOpcNamespacehas been initialized and defined in the server (for example, beforeOpcNodeManager.CreateNodeshas 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>inOpcNamePath. - Introduced new
OpcClient.GetType(s) methods to determine any type information associated with a node identifier. - Introduced new
OpcClient.IsSubtypeOfmethod 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 ofBrowseNamesto follow and look up the corresponding child. - Introduced new
ServiceNameproperty inOpcServiceRequestandOpcServiceResponse. - Introduced new methods
GetResultsandGetResultExceptionsinOpcServiceResponseto determine request and command related exception information. - Introduced new
OpcServer.RequestJudgementevent to handle request issues and decide whether an impeachment is to be dismissed. For example, an outdated request (BadInvalidTimestamp) can still be allowed through theDismissproperty.
Changed
- Removed unnecessary new lines in the string representation of
OpcExceptioninstances.
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,
BaseTypeofBaseEventTypewasBaseEventType). - Possible
NullReferenceExceptionsusing theOpcClient.GetDataTypeandOpcClient.GetNodeTypemethods with a null reference (Nothing in Visual Basic) instead of a valid instance of theOpcNodeIdclass. - Issue with too few
HistoryValuesbeing 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
GetValuemethod inOpcEventfor 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 theDataStore.Getmethods. This assures that custom event types no longer need to know the namespace index in any case.
Changed
- Possibly breaking:
IOpcReadOnlyNodeDataStorenow requires the implementation ofIOpcNamespaceResolveras well.
Fixed
- Issue with resolving the corresponding custom
OpcEventtype/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.FileReadCallbackandOpcFileReadMethodNode.FileReadExCallbacknow return a ByteString instead of an array of bytes. - Breaking:
OpcFileWriteMethodNode.FileWriteCallbackandOpcFileWriteMethodNode.FileWriteExCallbacknow accept a ByteString for the data parameter instead of an array of bytes. - Parameter of
OpcFilterOperand.OfTypefromvalue : objecttotypeId : OpcNodeIdto assure that anOfTypeoperand is evaluated as expected (that is, using anOpcNodeId).
Fixed
- Breaking: Regression issue using
OpcFileNodeaccess using Read and Write operations after enforcing the Foundation's stack to use ByteString for ByteString andByte[]forByte[]instead of using ByteString forByte[]. - Issue with no history values being returned when the server reports status code
GoodNoDatawith 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.GetDataTypewith, 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
OpcExceptionandBadServerNotConnectedwith enabledOpcClient.UseDynamicoption 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 inOpcMethodNodes. - Introduced indexer using an
Int32to address a dedicatedOpcDataFieldin anOpcDataObject. - The
OpcClient.SubscriptionsChangedevent is now raised wheneverOpcClient.Subscriptionsare 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.Connectedevent has been raised. - Issue with enhanced
byte[]support which led to no longer workingsbyte[]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 asByte[]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
OpcNodeIdComparisonoptions:IgnoreNamespaceIndexandIgnoreNamespaceIndexIgnoreCase.
Changed
OpcClassicDiscoveryClientnow usesOpcExceptionto represent all stack related exceptions.
Fixed
- Issues with
OpcServerInfoif 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
ByteStringinstead of using it as it is.
2.18.2.0 (released on June 17, 2021)
New
- Introduced new
Translatemethods inOpcServerGlobalizationto provide mechanisms to localize custom resources. - Introduced support of enum arrays, which is missing in OPC Stack 1.03.
- Introduced
OpcNodeIdComparisonand newOpcNodeId.Equalsmethods to compare node identifiers using different comparison methods.
Changed
OpcNodeIdnow matches the OPC UA specification and compares node identifiers and namespaces case-sensitively.
Fixed
- Issue with missing preferred locales in
OpcSessionafter activating a session. The locales were only internally updated and used. - Issues with ServerHalted exceptions when accessing properties of an instance of the
OpcServerclass before starting the instance.
2.18.1.0 (released on June 2, 2021)
New
- Added additional setter to the
OpcBrowseNode.Degreeproperty. - Introduced new
OpcClient.Interfacesproperty to configure the communication using OPC Classic interfaces. - The
OpcClassicDataAccessOptionsclass 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
OpcVariableNodesusing an array of ByteString values.
2.18.0.0 (released on May 26, 2021)
New
- Improved scenarios where
Byte[], ByteString andByteString[]or some of them are used as the data type of a method argument or a variable node. - Introduced support for
OpcDataTypeInfo.Documentationused for theOpcDataTypeNode.Descriptionattribute. - Introduced new
OpcReferenceTypes.GetReferenceTypeName(OpcNodeId)andGetReferenceType(OpcName)methods. - Completely reviewed and enhanced the types
OpcRelativePathandOpcRelativePathElement. - Introduced support for browse path translation using the
TranslateBrowsePathservice. OpcClientnow supports browse path translation using the newTranslatePathandTranslatePathsmethods.
Changed
- Format of ByteString from Base64 encoding to hex (
X2) encoded / formatted strings, which matches the Foundation's binary encoded representation of aByteString.
Fixed
- Incorrectly initialized ArrayDimensions and ValueRank attributes of method arguments and variable nodes using
Byte[], ByteString orByteString[]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
NullReferenceExceptionwhile initializing encodable data types is no longer thrown. - Issues with incorrectly determined
OpcArgumentmetadata used to define array-based method arguments. - Issues with reflecting
System.Typeinformation which is defined by-reference, for example, using anoutparameter 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
TypeLoadExceptionswhenever 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
OpcFileInfoclass. - Enhanced
OpcMethodContextwith Owner information to gain access to the underlyingOpcServerinstance. - 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.Descriptionwhen 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
TypeInitializationExceptionwhile testing for Unity in some dynamic assembly load scenarios. - Issue with
InvalidOperationExceptionin the Foundation'sBufferManagerwhenever 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
NullReferenceExceptionswhen 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
OpcFolderNodesdefault 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
OpcServerinstances 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
OpcNominalNodeIdFactoryto apply custom logic to theOpcNameused to define theOpcNodeIdcreated.
Fixed
- Issue with still existing
OpcSubscriptioninstances inOpcClient.Subscriptionsalthough the client has been disconnected.
2.16.0.0 (released on April 20, 2021)
New
- Introduced support for custom
OpcFileNodesources using the newIOpcFileInfointerface.
Fixed
- Issue with declaring/accessing variable nodes using
ExpandedNodeIdas DataType. - Issue with
FileNotFoundExceptionsusing 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.Clientproperty to get access to the client which is the owner of a subscription. - Introduced new
OpcServer.Binding.Addressesproperty to define explicit IP addresses of the network interfaces to bind to and listen on. - Introduced
OpcNodeCollection.TryGetmethod to try to look up a node using its node identifier. - Introduced
OpcNodeManager.GetNodemethods 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.IsNullOrEmptymethod which ignores the namespace information associated with theOpcName. - Introduced new static
OpcNodeId.IsNullOrEmptymethod which ignores the namespace information associated with theOpcNodeId. - 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.RegisterTypemethods to no longer enforce the use of the generic type parameter. - Introduced new
OpcDataTypeNode.Create(...)methods to provide a non-generic way to initialize newOpcDataTypeNodeinstances.
Changed
- Removed duplicate references to
DataTypeNodeswhen using theOpcAddressSpaceclass to describe the nodes of the server.
Fixed
- Issue with "malformed" or "TooMany" subscriptions preventing the
OpcClientfrom automatically reconnecting after connection loss. - Issue with inline initialized
OpcDataTypeNodesusing 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
OpcDataTypeIgnoreMemberAttributeto explicitly exclude a member from being encoded or decoded. - Introduced new
OpcDataTypeAttribute.NamespaceUriandOpcDataTypeAttribute.UseDataTypeDescriptionproperties 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
OpcNodeExportOptionsto set up the information exported while exporting nodes to a NodeSet. OpcNodeManager.ExportNodes(OpcNodeExportOptions)method overload to specify custom node export options.- Introduced new
OpcNodeGlobalizationclass to maintain the resources used to localize the attributes of a dedicated node. OpcNode.DisplayNamesandOpcNode.Descriptionsproperties 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
ProductVersionand theFileVersion. - Issue with overridden
OpcNode.SymbolicNameif the node has been imported with a differentSymbolicNamethan the DisplayName. - Issue with no longer multi-line Base64 encoded
DataTypeDictionary(using default export options). - Issue with removed
ParentNodeIdattributes 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
Namespacesproperty inIOpcApplicationInstanceandOpcApplicationInstanceto provide the namespaces used. - Introduced new
Namespacesproperty inOpcClientto reflect the namespaces defined by the server connected to. - Introduced new
Namespacesproperty inOpcServerto provide the namespaces used by the node managers of the server to organize the address space. - Introduced new
Namespacesproperty inOpcContextto provide the namespaces currently valid within a given context. - Implemented
IOpcNamespaceResolverinOpcNamespaceCollectionandOpcReadOnlyNamespaceCollection. Resolvemethod inIOpcNamespaceResolverto resolve another ("online") namespace using the metadata from an (offline / local) defined namespace.OpcNamespacenow provides a URI wheneverOpcNamespace.Valueis 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. OpcClientandOpcClassicDiscoveryClientnow support the use of a host identity for DCOM authentication. Note: For theOpcClient, theOpcClient.Security.UserIdentityis used for DCOM authentication as well.- Introduced new
Scopeproperty inOpcNamespaceto describe the context in which the namespace has been created and to which its metadata applies. - Improved performance initializing
OpcNodesduring the startup of theOpcServer. - Using
OpcNodeManager.ctor(OpcNamespace, ...)with a namespace which references an explicit namespace index results in anArgumentException, because the server will define the namespace indexes associated with the different namespaces used. - The
OpcNamespaceinstances in theOpcNodeManagerare now synchronized with theOpcNamespaceinstances in the newOpcServer.Namespacesproperty. Note that until the server is about to start, the instances inOpcNodeManager.Namespacesmight be exchanged with the instances in theOpcServer.Namespacesproperty. In fact, in methods likeOpcNodeManager.CreateNodes(...), allOpcNodeManager.Namespacesare already in sync with theOpcServer.Namespaces.
Changed
- The
OpcNamespace.Defaultnamespace now provides the default value and URI used to identify the Foundation's default namespace. - Removed obsolete methods from
IOpcNamespaceResolverand all its implementations inOpcClient,OpcServer,OpcContextandOpcNodeManager. OpcClient.Stateno longer transitions (using the reconnect mechanism activated by default) when calling, for example,ReadNodewhile theOpcClientis about to re-establish a broken connection.- In case of a broken connection, the
OpcClienttries (by default) to re-establish the connection and re-use the previously used session. If this works, theOpcClientwill raise theReconnectedevent as before. If the client has been forced to create a new session (for example, upon timeout of the previous session), theOpcClientwill now raise theConnectedevent instead of theReconnectedevent to provide a way to distinguish these conditions in user code. - Comparison in
OpcNodeIdandOpcNamespaceto 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
OpcNamespaceinformation 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
OpcNamespaceinstance. 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
ReferenceTypeIdof the child node.
Fixed
- Issue with
NullReferenceExceptionsinOpcServerwhen 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
ParentNodeIdis now omitted in such a case ifchild.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 theParentNodeIdattribute and the references defined).
2.11.4.0 (released on December 15, 2020)
New
- Introduced new
OpcContext.Ownerproperty which refers to anIOpcApplicationInstancelikeOpcClientorOpcServerthe context belongs to (if available). - Introduced new
OpcException.Contextproperty which offers an instance of theOpcContextclass 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.ClientIDproperty. - Added missing code documentation of
OpcSecurityPolicy,OpcSecurityModeandOpcSecurityAlgorithm. - Introduced new
PreferredLocalesproperty toOpcContext,OpcOperationContextandOpcSession. - Introduced new
OpcNode.Read/WriteDisplayNameCallbackproperty. - Introduced new
OpcServer.GetSession(sessionId)method to query a specific session using its session identifier. - Introduced new
OpcServer.Globalizationproperty to provide a more advanced way to localize data and information.
Changed
- Used data type in
OpcNode.Read/WriteDescriptionCallbackproperty fromStringtoOpcText. OpcDataChangeDataSetItem.ClientIDfromInt32toInt64to match the used type inOpcMonitoredItem.ClientID.
Fixed
- Issue with missing
OpcNotification.DatausingOpcNotification.GetDataChanges()without accessingOpcNotification.Databefore. - Issue with type initialization in
OpcClientusing Unity with IL2CPP, which results in a different type initialization order.
2.11.2.0 (released on November 10, 2020)
New
- Experimental
OpcNodeManager.ExportNodesmethod to generateOpcNodeSetinstances 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.DisposeandOpcServer.Dispose. - Issue validating license information using IL2CPP and .NET Standard 2.0 as scripting backend in Unity.
- Issue which prevented use of an existing
SynchronizationContextto 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
OpcServeris now able to get stopped while it is in the suspended state. - Property to configure the
TimestampsToReturnfor all requests usingOpcClient.Services.ReadNodesHistory.TimestampsToReturn. - Property to query the
ApplicationUricontained in the subject alternate name extension of certificates using theOpcCertificateInfo.ApplicationUriproperty. - Property
OpcClientSecurity.AutoUpgradeEndpointPolicyto 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
OpcCertificateJudgementEventArgsno 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 policyNone(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 toSuspended. - Introduced method
OpcServer.Resume()to change the server's state back toStarted. - Enumeration members
SuspendingandSuspendedinOpcServerState. - Enhanced
OpcSession.Closeto 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.Closecloses the session and invalidates the session-related identifier.OpcClientmethods validate the connection state using anOpcException(withBadServerNotConnected) instead of using anInvalidOperationException.- Default
QueueSizeofOpcMonitoredItemcreated usingOpcClient.SubscribeEvent(s) fromint.MaxValuetouint.MaxValueto enforce that the server uses the maximum queue size supported for event notifications (which was initially intended with the wrongint.MaxValue). - Renamed
OpcMonitoredItemStatus.DataItemQueueSizetoQueueSizeto match the naming used inOpcMonitoredItem(which defines the requested size while the status gives the revised size). - Returned type of
OpcMonitoredItemStatus.IdfromInt32toInt64to cover the underlying non-CLS compliantUInt32of the Foundation's stack. - Adopted recently reviewed API of
OpcMonitoredItemtoOpcMonitoredItemStatusand reworkedOpcMonitoredItemStatus.AutoFlushCachetoQueueMode(as inOpcMonitoredItem).
Fixed
- Wrong status code used for communication errors (
BadNotConnected->BadCommunicationError). - The
OpcClientconnected to a fallback/unsecure endpoint if a presetSecurityPolicyis not supported by a server. - Issue with not applied
OpcSubscription.TimestampsToReturnwithout 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
OpcNodeIdsusing 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
AddNodesservice. This results in the same behavior as used when adding a node within a custom node manager. - Enhanced
OpcCertificateManager.SaveCertificatemethod to determine format of certificate using the file extension of the specifiedfilePathparameter. - Introduced
OpcValueRange.Ofmethods to dynamically determine the correspondingOpcValueRangefor a specific type of data. - Non-generic
OpcAnalogItemNodescan now define the correspondingOpcValueRangesfor theInstrumentRangeandEngineeringUnitRangeon their own as well (using the DataType attribute). - Added support to encode/decode
System.Decimal(not supported by OPC UA 1.03) usingSystem.Double. This applies to fields in data structures. ProductUriproperty inOpcClientandOpcServerto simplify the configuration of it.- Added automatic initialization of ProductUri information in client and server applications.
- Introduced use/support of an existing
SynchronizationContextto 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.UpdateChangesmethods to notify about changes on behalf of a node (and its children). - Added missing documentation to different types.
Changed
OpcNode.OnAfterApplyChangesandOpcNode.OnBeforeApplyChangesuseOpcNodeChangesEventArgsinstead ofEventArgs.OpcNode.AfterApplyChangesandOpcNode.BeforeApplyChangespassOpcNodeChangesEventArgsinstead ofEventArgsto event handlers.
Fixed
- Issue writing an analog item node which is offered by a custom node manager without providing an
InstrumentalRangeto validate values written to the node. - Issue with only once updated
SourceTimestampinOpcValues(if there was noSourceTimestampexplicitly defined) written to the variable node. - Issue in
OpcNodeHistorianif a NodeSet imported node with enabled historizing is attached to a newOpcNodeHistorianwhile the node is missingHistoryConfigurationand/orAggregateConfigurationnodes. - Issue linking assembly in C++ CLR projects using C++/CLI, which results in C2686.
- Issue with
NullReferenceExceptionsusing .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.UseDynamicistrue.
2.9.2.0 (released on May 6, 2020)
New
- Added additional constructor overloads to
OpcArgumentto support the use of anOpcDataTypeenumeration 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
ArrayDimensionsproperty onOpcVariableNodeas well). - Added support of null references as field values for fields using a reference type as the type of value.
- Added support of the
ObjectTypeNodeClass in calls to the add nodes service. - Added support of the
VariableTypeNodeClass in calls to the add nodes service.
Fixed
- Issue with automatic definition of the
ValueRankof variable nodes in case of n-dimensional custom structured types. - Issues in the stack to support n-dimensional custom structured types.
- Issue loading
UANodeSetswith extended values for AccessLevel and UserAccessLevel in UAVariable entries (belongs to stack 1.04). - Issue with
NullReferenceExceptionsinOpcDataTypeInfo.BaseTypein case of data types defined in a NodeSet usingUATypeDefinitionswithout any field. - Issue with
NullReferenceExceptionsif 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 anOpcNamespace.Valuewhich did not express theUri.OriginalStringas defined by thenamespaceUriparameter. - 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
AddNodesin case of typeNodeClasses. This issue belongs to the server API only. - Issues with type
NodeClassesregarding wrongAddNodecommand 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
FailIfandThrowIfmethods to verify the used license on demand by user code. UseFailIfmethods in your DEBUG configurations and useThrowIfmethods in your RELEASE configurations to protect yourself from the unlicensed use of the SDK. - Added new
GetNodeType(...)methods toOpcClient(only for event node types). - Added new
GetNodeTypeSystem(...)methods toOpcClient(only for event node types). - Added new
GetNodeType(...)methods toOpcNodeSet. - Added new
GetNodeTypeSystem(...)method toOpcNodeSet. OpcMethodNodenow supports custom defined input and output arguments when usingIOpcMethodCommand.- Added new
GetNodeType(...)methods andGetNodeTypeSystem()method toOpcNodeSet. OpcNodenow inherits theOpcNode.Namespaceto its child nodes (if they use the default namespace determined by theirOpcNode.Id).- Introduced new specializations of
OpcTypeNodeInfo:OpcObjectTypeNodeInfoandOpcVariableTypeNodeInfo(subclassingOpcTypeNodeInfo). - Improved experience while debugging and inspecting the properties of
OpcNodeInfoinstances (and its subclasses). - Browsing now supports reading additional attributes besides the attributes supported by the browse services.
OpcNodeInfonow implementsIOpcNodeInfoto provide a more fluent use of node instances independent from their source.- Additional configurable services in
OpcClientServices: Browse andReadNodes. - Significantly improved performance when constructing event filters.
IOpcNodeInfonow defines the additional methods:AttributeValue(...),Child(...)andChildren().- Unlimited browse, read and write operations upon automatic request partitioning (
OpcClient). OpcClient.CertificateJudgementevent to handle certificate issues after a connection has been established and certificate information has been successfully validated first.OpcModelrepresenting the model information in NodeSets.OpcMemberSwitch.Conditionsproperty 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
ReplaceNodemethod inOpcNodeManagerto replace an existing node recursively in nodes, notifiers and MonitoredItems. - Added additional metadata properties (
LastModifiedandName) toOpcNodeSet. - A general implementation of the
IOpcMethodCommandinterface using callbacks:OpcMethodDelegateCommand. - Added missing documentation to collection and some other types.
OpcNodeSetManager.ImplementNodeCallbackto implement nodes just using a simple callback method.OpcData.GetNodeIdnow supports array types as well.- Added encoding information in the address space of the server (internal).
- Generic implementation of
IOpcMethodCommandfor delegates:OpcMethodDelegateCommand. - Support of
System.ObjectandSystem.Object[] for encoding / decoding data types. - Support of serialization / deserialization attributes defined in
System.Runtime.Serializationon data types. OpcDataTypeMembersAttributeto 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 customNodeManager. - 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 toOpcClient. - Added new
GetDataType(...)methods toOpcNodeSet. IOpcNodeInfonow defines the methodsChild(...)andChildren()to query the child nodes of a node instance.- Implemented new
OpcNamespaceCollection. OpcNodeSet.Namespacesproperty to provide the namespaces referred to in a NodeSet.IOpcMethodCommandto define/use custom command instances instead of being forced to define an explicit delegate.OpcMethodCommandsclass to provide predefined commands such as NotImplemented.- Enhanced
OpcMethodNodeto supportIOpcMethodCommandinstances 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
OpcDataTypeNodeclass. - Static
OpcContext.Emptyproperty to define an empty context instance where required and supported. - Implemented
IOpcNamespaceResolverinOpcContextto resolve namespaces ofOpcNodeIdinstances. OpcTypeSystemclass which acts as the new base class of the existingOpcDataTypeSystemand the newOpcNodeTypeSystemclasses.OpcDataTypeDictionary.Documentationproperty.OpcNodeSetManagerclass which enables simple hosting ofOpcNodeSetsusingOpcNodeSetManager.Create(...).- Protected virtual methods
OpcNodeManager.ImportNodes()andOpcNodeManager.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>andOpcVariableNode.
Changed
- License codes used prior to version 2.9 no longer work. Customers will receive new license keys working in all frameworks supported.
OpcAttributeWriteAccessis now based onUInt32.- The default value of
OpcAutomatism.AlwaysParseStringIdentifiersis nowfalse. As a result, the value is no longer parsed automatically when the constructorOpcNodeId(string)is called. For more details, seeOpcAutomatism.AlwaysParseStringIdentifiers. - [Client SDK] Moved the
OpcBrowseNodeclass from namespaceOpc.UaFx.Clientto namespaceOpc.UaFx. - [Client SDK] Moved the
OpcBrowseNodeDegreeenumeration from namespaceOpc.UaFx.Clientto namespaceOpc.UaFx. - [Client SDK]
IOpcBrowseServiceandOpcBrowseRequestnow use the classesOpcViewDescriptionandOpcBrowseNodeinstead of the Foundation classesViewDescriptionandBrowseDescription. - Moved
OpcReadOnlyNamespaceCollectionfrom namespaceOpc.UaFx.Serverto namespaceOpc.UaFx. - Changed the default value of the DataType attribute of
OpcDataTypeDictionaryNodefrom Byte to ByteString to match the definition of the specification. - Renamed
Descriptionproperty ofIOpcDataTypeInfo,OpcDataTypeInfoandOpcDataFieldInfotoDocumentationto match the definition of the OPC UA specification. OpcEncoding.All(...)now constructs theOpcEncoding.Idusing the default BrowseNames for the different encoding types.OpcNamespace.ToString()now always returns a string which just represents theOpcNamespace.ValueandOpcNamespace.Index(if not zero).OpcNodeSet.GetDataTypeSystem()now provides anOpcDataTypeSysteminstance 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.EventTypeandOpcTypeCategory.ReferenceTypehave 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
CertificateValidationFailedevent. - Issue with the automatic application configuration if the
AssemblyTitleAttributeof the entry assembly is not present or definesstring.Emptyas assembly title. - Issue with variable node values changing their value using different complex data types (expressed using
ExtensionObjectas the data type of the node). - Wrong
EncodingMaskif there is more than one optional field declared in a data type. - Wrong interpretation in
OpcArgument.IsArrayandOpcArgumentInfo.IsArray. - An
OpcVariableNode.Timestampinitially defined is no longer reset during address space creation. - Issues with wrongly determined default value ranks and default data type identifiers using
OpcDataTypes.GetValueRank(..)andOpcDataTypes.GetNodeId(...). - Issue with DataTypeDictionary nodes which do not define any DataTypeDescription nodes while constructing the
DataTypeSystemusingOpcClient.GetDataTypeSystem(). - Issues when decoding structured data using the new
Opc.UaFx.Bit. - Issue using
OpcNodeId.UriIdentifier(...)if theOpcNodeId.Valueis not of the typeSystem.String. OpcNamespacenow preserves the original string used to define theOpcNamespacewithout any subsequent changes (by theSystem.Uriclass) as the value of theOpcNamespace.Valueproperty, so that it always returns the sameSystem.Stringvalue that was used to define the instance.- Some conditions under which a newly created
OpcNodewithout 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
TcpMessageSocketused 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
OpcExceptionsin 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 theOpcMethodContextparameter. - Added support for additional access levels (
StatusWriteandTimestampWrite). - Added missing documentation to
OpcAccessLevel,OpcVariableNode.AccessLevelandOpcVariableNode.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.Statechanges to detect a lost connection to the server. OpcClient.Statenow changes automatically only toDisconnected(during a running request) ifReconnectTimeoutis 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
TypeDictionarieswhich 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.Valueif there is no customWriteVariableValueCallbackassociated with a variable node. - Issue with conditions upon which the
OpcClientKeepAlive.Intervalis not applied to the current session.
2.8.2.0 (released on November 6, 2019)
New
- Introduced new
Opc.UaFx.Bitas 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
EncodingMaskof a structured data type is now handled using the newOpc.UaFx.Bittype instead ofSystem.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 theProductVersionof theFileVersionInfoof theProcessModuleofProcess.MainModuleprovides a version string which not only consists of numbers and dots like1.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
iconUrlandlicenseUrlinformation 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
Int32as return type of method nodes.
2.8.1.1 (released on October 11, 2019)
New
- Implemented support for method parameters using
System.Objectwhich 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
RegisterNodesandUnregisterNodesmethods on theOpcClientthat 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)andOpcDataObject.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.UseDynamicproperty and changed default value ofOpcAutomatism.UseDynamicto the valuefalseto 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.UseDynamicproperty default value is nowfalse. Change its value or theOpcClient.UseDynamictotrueto enable use ofOpcDataObject.
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
OpcNodeSetclass to provide a file, string or stream based source to offer data type system information from aUANodeSet. - Implemented new
OpcClient.NodeSetproperty to assign an instance of theOpcNodeSetclass 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.UseDynamicTypeRegistrationproperty to control the automatic type reflection used by client and server applications to determine the different data and event types declared. - Introduced new
OpcAutomatism.UseDynamicproperty 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>andIOpcNodeAttributewithIOpcNodeDescriptorin conjunction withOpcNodeValuePairto declare "node-bound" values. - Enhanced
OpcClientclass with newReadNodeValueandWriteNodeValuemethods 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.KeepAliveproperty and the correspondingOpcClientKeepAliveclass 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 toOpcValueto provide a generic definition of the value using the newOpcValue<T>class. OpcNamespacenow provides the namespace string / URI using the newOpcNamespace.Valueproperty.- Default transport limits increased:
DefaultMaxByteStringLengthfrom 64 KB to 5 MB andDefaultMaxMessageSizefrom 1 MB to 10 MB. - Solved inline handled exceptions in
XmlSerializerduring startup. - Improved exception handling and tracing during data encoding and decoding (see
OpcTypes.EncodingFailedandOpcTypes.DecodingFailed). - Support for tracing all encoding operations using the new
OpcEncodingStackFrameandOpcEncodingStackTraceclasses. - Introduced decoding and encoding related tracing support using the new
OpcEncodingStackFrameandOpcEncodingStackTraceclasses. - Added
int ResolveIndex(string namespaceValue)andstring ResolveValue(int namespaceIndex)toIOpcNamespaceResolver. OpcClientnow provides service methods to simplify calls toCallMethodusing the new generic methodsCallActionandCallFunc.- Added additional overloads to
OpcBrowseNodeto supportOpcNodeIdsto refer to specific types of references. OpcNodeInfonow provides additional overloads ofChildren(...)andParents(...)accepting anOpcReferenceTypevalue.OpcResultnow provides the root result withGetBaseResult().OpcEventNode.EventTypeIdis now writable using an added setter.- Introduced
OpcEventTypeAttributeto 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
SourceTypeproperty toOpc.Ua.Schema.Binary.FieldType. - Added missing
BaseTypeproperty toOpc.Ua.Schema.Binary.BaseType.
Fixed
- Wrongly used variable when configuring
Opc.UaFx.Client.OpcSubscription.LifetimeCount. - Issues during serialization of
OpcExceptionobjects.
Changed
OpcDataTypeAttributeis now applicable on classes and structures.- Unified
OpcNodeManager.NamespaceIndexesandOpcNodeManager.NamespaceUrisinto newOpcNodeManager.Namespaces. - Renamed
IOpcReadOnlyDataStoretoIOpcReadOnlyNodeDataStore. IOpcNamespaceResolvermethodsUri Resolve(int namespaceIndex)andint 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(viaOpcNodeId.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
SerializationExceptionsinstead of the exception itself.
2.7.5.0 (released on August 13, 2019)
New
- Improved API documentation:
IOpcNode,IOpcNodeInfoandOpcNode. - Stack change to assure that a node manager lock is held as long as MonitoredItems are created, modified or deleted.
- Updated
System.ServiceModel.Primitivesto version 4.5.3. Version 4.5.x ofSystem.Private.ServiceModelfixed a bug that caused theSystem.Private.ServiceModel.dllnot 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
OpcNodeIdswhen creating anOpcNodeIdusing a string identifier. - Issue with wrongly used base address and security policies in
OpcDiscoveryServer. - Issue with re-created
OpcMonitoredIteminstances which additionally resulted in the issue that comparingOpcMonitoredIteminstances no longer worked.
Changed
OpcMonitoredItem.AutoFlushCachehas been replaced with the newOpcMonitoredItem.QueueModeproperty 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
OperationTimeoutwhen using HTTPS (which is no longer part of the foundation stack). - Implemented
MonitoredItemsCreated,MonitoredItemsModifiedandMonitoredItemsDeletedevents inOpcNodeManager.
Fixed
SocketExceptionson 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 inOpcMonitoredItem,OpcServiceCounter,OpcSessionDiagnosticsandOpcServerDiagnosticstolongas 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
X509Certificate2instance activation by usingOpcCertificateManager.QueryInstanceto load certificate information. This enables customX509Certificate2creation using anEventHandler. - Introduced new
OpcCertificateStores.PathProbingsproperty 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 onOpcSubscription.
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
OpcMonitoredItemandOpcSubscription: Changed someint-based properties to uselongas the property type to support underlyinguintproperties used by the foundation stack in aCLSCompliantway.
2.7.2.0 (released on May 10, 2019)
New
- Support of
TypeDefinitioninformation when browsing instance nodes through newOpcInstanceNodeInfoclass. - Added
Socketproperty to theOpcSessionclass 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
NotificationReceivedevent has been missed onOpcClient.
2.7.1.1 (released on April 29, 2019)
New
- Updated the package information (
ProjectUrlandLicenseUrl).
2.7.1.0 (released on March 25, 2019)
New
- Implemented rejection of requested node identifiers using unknown namespace index values (in
AddNodesservice,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
OpcValueinstances. - Issue with wrongly wrapped UA FX array types using
OpcValueinstances. - Issue with missing DataType information if an
OpcVariableNode(non-generic) is initialized with an initial value using its constructor followed by a change of itsDataTypeproperty to the appropriate type. Result: TheDataTypeproperty 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
AddNodesupport inOpcClientincluding a whole new set ofOpcAddNodecommand types likeOpcAddFolderNode,OpcAddObjectNode,OpcAddDataVariableNode,OpcAddAnalogItemNodeand some more. - First time full support of
AddNodeservice calls inOpcServeraccepting every supported type definition to add a new node into the address space. - Completely reworked
DeleteNode,AddReferenceandDeleteReferencesupport inOpcClientincluding a whole new definition of theOpcDeleteNode,OpcAddReferenceandOpcDeleteReferencecommand. - Reworked support of
DeleteNode,AddReferenceandDeleteReferenceservice calls inOpcServerusing additional request validations. - Introduced new
OpcAddNodeResultclass which provides a specialization of theOpcResultclass to provide the used NodeId and the command instance from which the result of anAddNodeservice call originates. OpcNodeManagernow provides virtual methods called when adding or deleting a node to / from the address space of the manager (through theAddNodeandDeleteNodeservices).- Improved exception details when using the services
AddNodes,DeleteNodes,AddReferencesandDeleteReferences. OpcServerIdentityconstructor overloads accept a string value as password.OpcServerevents:RequestProcessing,RequestValidating,RequestValidatedandRequestProcessedto pre- and post-process client requests and the sent responses.OpcExceptionalways providesSource,StackTrace,DataandHelpLinkinformation where available and no longer skips them in case of a different source exception.IOpcNode.Child(...)method to retrieve anIOpcNodechild 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 customOpcServerIdentity. - Enabled subclassing of
OpcResultusing custom types.
Changed
- Removed
OpcServerIdentity.Passwordproperty, 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
OpcTransformUserPasswordDelegatedelegate. - Replaced
OpcUserNameAcl.PasswordTransformwith virtualMatchesandTransformPasswordmethods inOpcServerIdentity.
Fixed
- Issue when writing built-in structured values like
OpcEngineeringUnitInfoorOpcValueRangeusingOpcClient.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
StackOverflowExceptionswhen changing theOpcServer.Configurationinstance.
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
OpcClientjust using an address likeopc.com://<host>(:<port>)/<progId>/<classId>(only in .NET Framework). - Implemented new
OpcClassicInterface,OpcClassicInterfacesandOpcClassicInterfaceCollectionclasses andOpcClassicInterfaceCategoryenumeration (only in .NET Framework). - Implemented new
OpcClassicApplicationDescription,OpcClassicApplicationDescriptionCollection,OpcClassicEndpointDescriptionandOpcClassicEndpointDescriptionCollectionclasses (only in .NET Framework). - Implemented OPC Classic discovery using the new
OpcClassicDiscoveryClientclass, which usesOpcEnum.exe(a COM application provided by the OPC Classic runtime environment) (only in .NET Framework). - Enhanced existing
OpcDataChangeFilterto support the configuration of the trigger,DeadbandTypeandDeadbandValue. Using theTriggerproperty it is possible to monitor items using theSourceTimestampas well. - Implemented additional
OpcClient.SubscribeDataChangeoverloads and additionalOpcDataSubscribeDataChangeconstructor overloads accepting a value of theOpcDataChangeTriggerenumeration. - A predefined
ApplicationNameis now used as theSubjectNameof the certificate when (automatically) creating a new certificate used by client or server applications. - Implemented generic
OpcApplicationInstanceclass implementingIOpcApplicationInstance. OpcClientandOpcServerBaseuse the newOpcApplicationInstanceclass as their common base class.- Implemented generic
OpcSecuritybase class for the security settings of client and server applications. OpcClientderives from theOpcApplicationInstanceclass.OpcServerderives from theOpcApplicationInstanceclass through its base classOpcServerBase.- Centralized application configuration (within the SDK) of client and server application instances using
OpcApplicationInstance. - Implemented generic
OpcTransportconfiguration class and its use inIOpcApplicationInstance. - Implemented generic
OpcSecurityconfiguration class and its use inIOpcApplicationInstance. - Added
SecurityandTransportproperties toIOpcApplicationInstance. - Added
CertificateValidationFailedevent toIOpcApplicationInstance. OpcSecurityPolicyCollectionnow implements a public constructor.
Changed
- Removed
OpcClientTransportclass (replaced by newOpcTransportclass). - Removed
OpcServerTransportclass (replaced by newOpcTransportclass). - The default server information provided by
OpcServerBasenow prefers a predefinedApplicationName. OpcSecurityPolicyCollectionno longer provides a constructor with anOpcServerBaseinstance. The correspondingOwnerproperty has been removed as well.
2.5
2.5.7.0 (released on February 6, 2019)
New
OpcClient.WriteNodenow directly acceptsnullas the value without the need of a newOpcValueinstance.- The
OpcServerclass provides new constructor overloads which use the default addressopc.tcp+localhost+4840(the default port). - The whole node tree can now be created inline using new constructors of
OpcObjectNodeandOpcFolderNodeto 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 : stringto 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\Appto improve startup performance when searching for the application certificate. - Changed use of
LinkTimetoLastWriteTimeof the assembly when determiningOpcServerInfofrom 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
CommonApplicationDataand thenApplicationData. - 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.
CertificateRequestedevent onOpcClientandOpcServerBaseto 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.
Bindingproperty onOpcServer, which provides an instance of the newOpcServerBindingclass.OpcServerBinding(OpcServerBase.Bindingproperty) defines the address scope the server binds to. By default it will bind (as before) to anyIPv4and to anyIPv6address using the specified port number.- The low-level read/write operations of node managers now provide
OpcNodeAccessTokenswith operation result information. - Added documentation for
OpcSubscription,OpcMonitoredItem,OpcMonitoredItemEventArgs,OpcMonitoredItemEventHandlerand more regarding subscriptions.
Changed
- Changed default
MinimumCertificateKeySizefrom 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
Certificateproperty, the store path type of the application certificate store changes toSystem. To use the store path typeDirectory, 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 theCertificateproperty.
Fixed
OpcServer.Security.AutoAcceptUntrustedCertificateswhen 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
OpcValueencapsulated raw values. - Wrong use of
AutoAcceptUntrustedCertificatesin 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
OpcNodeHistorianthrough client-written values (AutoUpdateHistoryproperty). OpcNodeHistoriannow differentiates node changes and now logs only changes of the Value attribute.- Improved code documentation on server-side subscription and MonitoredItem API.
Server.OpcSubscriptionandServer.OpcMonitoredIteminstances are now comparable through caching existing instances.
Fixed
OpcVariableNode.IsHistorizingis no longer reset afterOpcNodeManager.CreateNodeshas been called.- Issue with writing to variable nodes with undefined DataType attribute (did not work and an exception was thrown).
Changed
OpcNode.BeforeApplyChangesandOpcNode.AfterApplyChangesare now only raised if changes are pending (seeOpcNode.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
OpcClientTransportclass accessible viaOpcClient.Transportto set up transport options like timeouts and limits. - New
OpcServerTransportclass accessible viaOpcServer.Transportto 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
OpcServerandOpcNodeManagerinstances.
New
- Implemented support of null
OpcNameinstances when usingOpcNominalNodeIdFactory. OpcContextnow always provides an appropriateOpcNodeIdFactoryinstance, at least the global instance defined byOpcNodeId.Factory.
2.5.2.3 (released on July 25, 2018)
New
- NuGet updated.
2.5.2.2 (released on July 23, 2018)
Fixed
InvalidCastExceptionwhen the assembly was loaded withAssembly.LoadFrom().
2.5.2.1 (released on July 13, 2018)
Fixed
DllNotFoundExceptionwhen trying to use specific types before creating anOpcClientorOpcServer.
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
OpcFileNodeandOpcFileInfo. - Improved performance when accessing
OpcContextreferences inOpcNodes(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
IOpcNodeInfoto no longer create temporaryOpcNodeinstances. This improves performance and memory usage. IOpcNodeInfois 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 whereOpcServer.Starthas been called.
Changed
- Changed
IsNodeAccessible(..., IOpcNode node)toIsNodeAccessible(..., 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
NullReferenceExceptioninOpcMethodNodewhen using a predefined node as the parent of the method node.OpcDataVariableNodeno 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
XyNodeproperty which provides the reference to the property node that represents the value of the so far availableXyproperties. - Implemented support for lazy initialization of nodes which allows defining the
Xyproperty values to be set up while they are applied to their property nodes on server startup. - Completely reviewed implementation of
OpcNodeIdandOpcNamespace. 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
OpcNodeIdnow supports identifiers using byte arrays, GUIDs and unsigned integers. - The
OpcNodeIdnow expresses the type of identifier value in its string representations generated usingOpcNodeId.ToString. - The
OpcNodeIdnow supports UTF-8 encoded special characters in a URL-formatted node identifier. - The
OpcNodeIdnow supports parsing Foundation-formatted node identifiers. - The
OpcNodeIdnow provides additional properties likeOriginalStringandOriginalFormat. - Reworked
OpcNameimplementation to no longer combine the BrowseName, DisplayName andSymbolicNameinto one instance / class. IOpcNode,OpcNodeandOpcNodeInfonow provide direct properties for the DisplayName (andSymbolicName) of a node.OpcNodeInfonow supports the children and parent browsing using a combination of theOpcNodeCategoryenum members.OpcClient.SubscribeEventRaisemethods andOpcSubscribeEventRaisenow support anOpcEventFilterinstance 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
OpcEventRaiseEventArgsto define theEventproperty forEventNodesnapshot information using event raw data. - Added
MonitoredItemproperty toOpcDataChangeEventArgsandOpcEventRaiseEventArgs. - Added events
DataChangedReceivedandEventRaiseReceivedtoOpcSubscription. - Implemented
OpcEventTypeenumeration andOpcEventTypesto simplify access to the different event types supported. - Implemented different state machine and state / transition variable nodes.
- Implemented
DialogRequestedevent inOpcClientto provide a simple way to processOpcDialogConditionNodeinstances. - Implemented support for Foundation-specified event types. These are:
OpcConditionNode,OpcAcknowledgeableConditionNode,OpcDialogConditionNode,OpcAlarmConditionNode,OpcDiscreteAlarmNode,OpcLimitAlarmNode,OpcOffNormalAlarmNode,OpcSystemOffNormalAlarmNode,OpcTripAlarmNode,OpcExclusiveLimitAlarmNode,OpcNonExclusiveLimitAlarmNode,OpcExclusiveDeviationAlarmNode,OpcExclusiveLevelAlarmNode,OpcExclusiveRateOfChangeAlarmNode,OpcNonExclusiveDeviationAlarmNode,OpcNonExclusiveLevelAlarmNodeandOpcNonExclusiveRateOfChangeAlarmNode.
Fixed
- Corrected the wrong name of method
GetOutpuArgumentstoGetOutputArgumentsin theOpcMethodNodeInfoclass. - Issue with
DBNullvalues 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
DatatoDataSet,DataItemtoDataSetItemandEventRaisetoEvent. OpcNodeId.ToStringnow formats by default using theOpcNodeIdFormat.Foundationformat.- Order of subscription events from MonitoredItem → Client → Subscription to MonitoredItem → Subscription → Client, to ensure a more logical event order using bubbling.
- Renamed
OpcMonitoredItem.ReceivedDataChangetoOpcMonitoredItem.DataChangeReceived. - Renamed
OpcMonitoredItem.ReceivedEventRaisetoOpcMonitoredItem.EventRaiseReceived.
Breaking changes due to renamings
OpcSubscribeEventRaise->OpcSubscribeEventOpcDataChangeEventArgs->OpcDataChangeReceivedEventArgsOpcDataChangeEventHandler->OpcDataChangeReceivedEventHandlerOpcEventRaiseEventArgs->OpcEventReceivedEventArgsOpcEventRaiseEventHandler->OpcEventReceivedEventHandlerOpcNotificationEventArgs->OpcNotificationReceivedEventArgsOpcNotificationEventHandler->OpcNotificationReceivedEventHandlerOpcDataChangeCallback->OpcDataChangeReceivedCallbackOpcEventRaiseCallback->OpcEventReceivedCallbackIOpcNotificationData->IOpcNotificationDataSetOpcNotificationData->OpcNotificationDataSetOpcNotificationDataCollection->OpcNotificationDataSetCollectionOpcNotificationDataReadOnlyCollection->OpcNotificationDataSetReadOnlyCollectionOpcNotificationDataItem->OpcNotificationDataSetItemOpcNotificationDataItemCollection->OpcNotificationDataSetItemCollectionOpcNotificationDataItemReadOnlyCollection->OpcNotificationDataSetItemReadOnlyCollectionOpcDataChange->OpcDataChangeSetOpcDataChangeItem->OpcDataChangeSetItemOpcEventRaise->OpcEventDataSetOpcEventRaiseItem->OpcEventDataSetItemOpcMonitoredItem.EventRaiseReceived->EventReceived.LastEventRaise->LastEvent.OnEventRaiseReceived->OnEventReceived
OpcSubscription.EventRaiseReceived->EventReceived.ReceivedEventRaiseCallback->ReceivedEventCallback.OnEventRaiseReceived->OnEventReceived
OpcClient.EventRaiseReceived->EventReceived.OnEventRaiseReceived->OnEventReceived.SubscribeEventRaise->SubscribeEvent
2.3
2.3.2.0 (released on March 13, 2018)
Fixed
- Issue with wrong use of
DebuggerDisplayAttributeinOpcVariableNodeandOpcNodeInfo. - Issue with reading / writing custom DataType attribute values on
OpcVariableNodes.
Changed
OpcVariableNodedefined as an abstract base class.- Removed multiple local Foundation node references to reduce memory usage.
New
- Enhanced implementation of
OpcVariableNodeespecially for enumeration types. - Implemented new nodes
OpcTypeNodeandOpcDataTypeNode. TheOpcDataTypeNodedoes 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 newOpcTypeNodeInfo.IsEnumproperty).
2.3.1.1 (released on February 26, 2018)
Fixed
- Issue with loading the
OpcApplicationConfigurationfrom a file, because of a required DataContract attribute on theOpcApplicationConfigurationclass which was not required in older SDK versions.
New
- Implemented additional constructor overloads in
OpcEngineeringUnitInfoto simplify initialization of a specific unit. - Implemented
ToStringoverloads inOpcEngineeringUnitInfoandOpcValueRange. CommonCodeproperty inOpcEngineeringUnitInfoand staticGetCommonCode(int unitId)method.DefaultNamespaceUriinOpcEngineeringUnitInfois 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 theBouncyCastle.Cryptoassembly (at least version 1.8.1.146) is required. - Using a server address with the scheme
httpsrequires references to the NuGet packagesMicrosoft.AspNetCore.Server.Kestrel(1.1.3) andMicrosoft.AspNetCore.Server.Kestrel.Https(1.1.3).
New
- Implemented the Range data type as
OpcValueRange. - Implemented the
EUInformationdata type asOpcEngineeringUnitInfo. - Implemented new node type
AnalogItemTypeasOpcAnalogItemNode. - Support of
DataValuesusing the data types Range andEUInformation. - 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
OpcTextto represent localized human-readable string values.
Fixed
- Issue with missing use of configured
OperationTimeoutusingOpcClient.Connect()while discovering the server endpoints.
Changed
- Simplified
OpcValue.ToStringimplementation to just providenullfor null references or theValue.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
CertificateValidationFailedevents in theOpcClientandOpcServerclasses.
2.2.0.0 (released on September 1, 2017)
- New: Added the
GetReferenceTypemethod to resolve the correspondingOpcReferenceTypefor a givenOpcNodeIdof the type of reference. - Changed: Removed special handling of the attribute DataType in
OpcNodeInfo.Attribute(). This means that there is no longer anOpcDataTypevalue provided. Instead, the data type dependentOpcNodeIdis provided. - New: Implemented basic support for object nodes and extended support for variable nodes, also implemented generic support for type nodes (including
ObjectTypes,VariableTypesandDataTypes) while browsing nodes. - New: Using the
OpcVariableNodeInfo,OpcObjectNodeInfoandOpcTypeNodeInfo, 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
LicenseInfoproperty 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/UnregisterAddressmethods and newAddressesmethod to maintain the different base addresses of anOpcServerBaseinstance.
Fixed
- Corrected the wrong naming of
IsNodeAccessableinOpcNodeManagertoIsNodeAccessible. - 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
OpcExceptionand to the description of anOpcStatus/OpcResultinstance 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
OpcCertificateSettingsto configure an application instance certificate which can be created through theOpcCertificateManager. - 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
UserNameACL (access control list) that led to unsuccessful user authentication. - Fixed: Issue when creating an
OpcNodeIdusing thestring+int32pair, where theint32was not used for the namespace index of the new NodeId. - Fixed: Issue with
OpcServerBase.CertificateandOpcClient.Certificateif the certificate is not stored in theApplicationStoreof the certificate stores. - New: Introduced
OpcClientCertificateStores(available throughOpcClient.CertificateStores) andOpcServerCertificateStores(available throughOpcServerBase.CertificateStores) to provide a fluent API for client and server to manage and maintain their certificate stores. - New: Introduced
OpcClientServices(available throughOpcClient.Services) to provide a service-based API to set up the different services used by the client. - Removed:
OpcValue.SourceLabelandOpcValue.ServerLabel. This also includes that theOpcValueLabelclass no longer exists. The provided properties are now provided directly via theOpcValueclass. Just make use of theOpcValue.ServerXyandOpcValue.SourceXyproperties. - New:
IOpcWriteNodesServicenow supports an automatic discovery of which value the server expects for theSourceTimestampof anOpcValue. The automatic determination can be disabled by setting an explicitOpcTimestampSourceusing theIOpcWriteNodesService.TimestampSourceproperty. Note: TheIOpcWriteNodesServiceinstance can be accessed using theOpcClient.Services.WriteNodesproperty. - New: Removed usage of the obsolete
ResolveNodeIdmethod and implemented the newResolvemethod on theOpcNodeIdinstead 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
UpdateCertificatemethod 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 staticAutoCreateCertificateproperty. - New: Implemented the new properties
OpcClient.Certificate(to directly define a custom client certificate) andOpcClient.Security(to set up client security options within one class). - Changed: Renamed property
OpcSecurity.PoliciestoOpcSecurity.EndpointPoliciesto match theOpcClientSecurity.EndpointPolicymodel. - Changed: Defined the default value of
OpcCertificateManager.AutoCreateCertificateastrue. - New: Implemented the new properties in
Opc.UaFx.Server.OpcSecurity:AutoAcceptUntrustedCertificatesandAutoCreateCertificate. - New: Implemented the new
OpcServer.Certificateproperty to match the same API model as theOpcClientimplements. - 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
AutoAcceptUntrustedCertificatesinSecurityConfigurationtotrue. - 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.PreferredPolicyproperty toOpcClient.Security.EndpointPolicy. - Moved:
OpcClient.UseDomainChecksproperty toOpcClient.Security.VerifyServersCertificateDomainsand changed its default value tofalse. - Moved:
OpcClient.UserIdentityproperty toOpcClient.Security.UserIdentityand changed its type from the Foundation typeIUserIdentitytoOpcUserIdentity. - Moved:
OpcClient.UseOnlySecureEndpointsproperty toOpcClient.Security.UseOnlySecureEndpointsand changed its default value tofalse. - Removed: Obsolete
OpcClient.UseAutoNodeIdResolutionproperty. - New: Reworked / reviewed
OpcIdentityderivatives and defined theOpcCertificateIdentity,OpcWindowsIdentity,OpcServerIdentityandOpcClientIdentityas new derivatives ofOpcUserIdentity(so far they just used theOpcIdentityas their base class). Also changed their construction behavior to simplify the process of identity creation on client and server side. - Fixed:
OpcRequestType.Callhas been defined asOpcRequestType.Cancelso far. This led to a nonfunctional use of theOpcRequestType.Call, because it has then been used like theOpcRequestType.Cancel. - Removed:
OpcCertificateManager.AutoCreateCertificateproperty, because it is now used per instance usingOpcClient.Security.AutoCreateCertificateorOpcServer.Security.AutoCreateCertificate. Also these properties are by default set to the valuetrue. - Removed:
OpcServer.Security.Ownerproperty to reduce redundant reference information and simplify the API. - Renamed:
Server.OpcSecuritytoServer.OpcServerSecurity. - Renamed:
OpcServerSecurity.AnonymoustoOpcServerSecurity.AnonymousAcl. - Renamed:
OpcServerSecurity.CertificatetoOpcServerSecurity.CertificateAcl. - Renamed:
OpcServerSecurity.IssuedTokentoOpcServerSecurity.IssuedTokenAcl. - Renamed:
OpcServerSecurity.UserNametoOpcServerSecurity.UserNameAcl. - Renamed:
OpcClient.PreferredLocalestoOpcClient.Locales. - Renamed:
OpcClient.ReceivedNotificationtoOpcClient.NotificationReceived. - Renamed:
OpcClient.OnReceivedNotificationtoOpcClient.OnNotificationReceived. - Renamed:
OpcSubscription.ReceivedNotificationtoOpcSubscription.NotificationReceived. - Renamed:
OpcSubscription.OnReceivedNotificationtoOpcSubscription.OnNotificationReceived. - Moved:
OpcNodeCommandfromOpc.UaFx.ClienttoOpc.UaFx.Services. - Moved:
OpcNodeAttributeCommandfromOpc.UaFx.ClienttoOpc.UaFx.Services. - Renamed:
OpcNodeCommandtoOpcNodeServiceCommand. - Renamed:
OpcNodeAttributeCommandtoOpcNodeAttributeServiceCommand. - Renamed:
OpcStatusCodemembers withBad,GoodandUncertainprefixes, as the OPC Foundation uses them to divide status codes into these three categories. - New: Implemented additional
ReadNodeoverloads to define a numeric node identifier together with a namespace index and attribute to read. - New: Implemented new
ReadNodesmethods 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
StartTimeandEndTimeare not equal toMinDate). 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
IOpcNodeinterface definition with respect to the current publicOpcNodeAPI. - Implemented new method
Children():IEnumerable<IOpcNode>inIOpcNodeto determine physical children in the node tree.
1.6.3.0 (released on October 6, 2016)
- New: Implemented the new method
OpcFileMethods.IsFileNodeto determine if a node is accessible in the manner of a FileType. - Fixed: Out-of-memory issue when using
OpcFile.ReadAllTextandOpcFile.ReadAllLines. - New: Improved performance of
OpcFile.ReadAllTextto 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
ExpandedNodeIdto a NodeId. UseExpandedNodeId.ToNodeIdinstead."
1.6.2.0 (released on October 4, 2016)
- New: Implemented the new method
CreateTempCertificatewhich is also used in cases whereAutoCreateCertificateis set totrueand 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.Browsemethod 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
OpcValueare now obsolete. - New: Introduced the new derivative
OpcBrowseNodeContextespecially for node browsing and reduced the previousOpcNodeContextto a more generic implementation for further subclassing. The newOpcBrowseNodeContextnow 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 byT. - New: Implemented the new
OpcResultclass to representServiceResultinstances. - New: Implemented the subclass
OpcMethodContextofOpcContextto 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
OpcFileNodeobjects from the client point of view. This includes a simple 1:1 API layer implemented by theOpcFileMethodsclass, aSafeOpcFileHandleto ensure allocated file handles are freed, theOpcFileclass to implement an OPC-basedSystem.IO.Fileclass-like set of service methods, theOpcFileInfoclass to implement an OPC-basedSystem.IO.FileInfoclass-like object and theOpcFileStreamclass to implement an OPC-basedSystem.IO.FileStream-like object which is derived from theSystem.IO.Streamclass and can therefore be used by allStreamReaderandStreamWriterclasses provided by the .NET Framework. - New: Implemented the new
OpcPropertyNodeandOpcPropertyNode<T>. - Changed: The type
OpcVariableValuenow requires a generic type parameter for the type of value represented. TheOpcVariableNodeclass has been adapted regarding this type parameter. - New: Implemented the new
OpcFileNodeincluding its child nodes like the method nodesOpen,Close,GetPosition,SetPosition,ReadandWrite.
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
Childmethod onOpcNodeInfoto retrieve the successors of a node using itsOpcName. This includes the BrowseName, DisplayName andSymbolicNameof a node. - Implemented the
Parentmethod onOpcNodeInfoto retrieve the ancestors of a node using itsOpcName. This includes the BrowseName, DisplayName andSymbolicNameof a node. - Implemented the
Childrenmethod onOpcNodeInfoto retrieve successors of a node of a specificOpcNodeCategory. - Implemented the
Parentsmethod onOpcNodeInfoto retrieve ancestors of a node of a specificOpcNodeCategory.
1.5.11.5 (released on June 13, 2016)
New
- Implemented implicit cast operator for
ExpandedNodeIds. - Implemented additional
Getmethod overload onOpcNamespaceto retrieve node namespaces using a URI or index.
Fixed
- Issue with
ExpandedNodeIdsinOpcValuesand 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
NullReferenceExceptionin case of unfiltered MonitoredItems).
1.5.11.1 (released on March 31, 2016)
New
- Implemented the
Changedevent onOpcStatus.
Fixed
- Issue with the not synchronized OPC status from SDK to the Foundation stack (on
OpcValueandOpcVariableNode).
1.5.11.0 (released on March 23, 2016)
- New:
OpcNamespacewhich represents the whole namespace information of a node identifier (namespace index and namespace URI). - New:
IOpcNamespaceResolverwhich is implemented byOpcNodeManager,OpcClientandOpcServer. This interface provides late-bound namespace resolution after theOpcServeris started or theOpcClientis connected. EachOpcNodeIdwhose namespace has been resolved provides the fully qualified URL of the namespace together with the node identifier. - New:
OpcNodeId.Namespaceproperty to provide the associatedOpcNamespace. - Changed: Renamed
OpcAttribute.HistorizingtoOpcAttribute.IsHistorizing. - New:
OpcNode: Implemented node change tracking through the propertiesHasPendingChangesandPendingChangesincluding the methodIsChangePending. - New: Implemented history support for
OpcVariableNodeand its subclasses. - New: Enhanced constructor overloads of
OpcStatusCollectionfor a much simpler setup of a new instance usingOpcStatusCodes. - 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:
IOpcReadNodesHistoryServiceandIOpcUpdateNodesHistoryService. - New: HDA commands:
OpcCreateNodeHistory,OpcDeleteNodeHistory,OpcDeleteNodeHistoryAtTime,OpcDeleteNodeHistoryModified,OpcReadNodeHistory,OpcReplaceNodeHistoryandOpcUpdateNodeHistory. All of them are subclasses of theOpcNodeHistoryCommand.
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
BreakDetectedevent 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
ObjectDisposedExceptionthrown 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
PublishingIntervalin theOpcSubscriptionclass.
1.5.7.0 (released on January 9, 2016)
- Fixed: Issue with the
NullReferenceExceptioninOpcCertificateManager.CreateCertificatewhen passing anapplicationUrias a null reference (Nothing in Visual Basic). - Fixed: Issue with not uniquely generated
OpcNodeIdsforInputArgumentsandOutputArgumentsofOpcMethodNodeinstances. This led to the behavior that only the arguments of the most recently providedOpcMethodNodewere published when browsing / reading the method argument properties. - Changed: The
OpcNodeIdforInputArgumentandOutputArgumentnodes ofOpcMethodNodeinstances; for more information, see the entry before. - Changed: The
OpcReadOnlyNodeCollectionclass now providesIOpcNodeinstances instead of the internal FoundationNodeStateinstances. - New: An
OpcNodeIdcan now be constructed fromOpcNameinstances whoseSymbolicNameis a null reference (Nothing in Visual Basic). In this case the BrowseName is used instead of theSymbolicName. - New: The
OpcReadNodesRequestnow returns both timestamps (source and server) by default. - New: Implemented new
OpcNodeManagermethods:AddNode,RemoveNodeandIsNodeAccessable. - 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
TimeStampupdate on writing node values. - Issue with missed
TimeStampdata on reading node values.
1.5.6.7 (released on December 17, 2015)
New
- Implemented the
ChangePasswordmethod onOpcServerIdentityto change the user password after an identity has been created. - Implemented the protected
SystemContextproperty onOpcNodeManagerto provide an alternative context within which system-internal changes can be performed. - The
OpcWriteNodeclass now automatically sets the source label timestamp when writing a node.
Changed
- The
OpcValueLabelis now no longer defined as a struct; instead it is now a class.
1.5.6.6 (released on December 16, 2015)
New
- Implemented
AddNodeandRemoveNodeinOpcNodeManagerto support dynamically providing nodes afterCreateNodeshas been called.
1.5.6.5 (released on December 10, 2015)
New
- Added additional session information to
OpcOperationContextwhen callingIsNodeAccessableonOpcNodeManager.
1.5.6.4 (released on December 9, 2015)
New
- Implemented the
IsNodeAccessablemethod onOpcNodeManagerto 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
OpcValueinstances and arrays as node values on the client and server sides. - Issue with anonymous user login on the server side when creating an
OpcSessionobject.
New
- Implemented redirection if the string value passed to the constructor (string, int) of the
OpcNodeIdclass indicates a numeric identifier. Now anOpcNodeIdwill 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
UserNameACLs enabled at the same time.
New
- Implemented additional
CreateCertificateoverloads inOpcCertificateManager.
1.5.6.0 (released on September 7, 2015)
- Changed: Renamed the
BuiltInTypeproperty toDataTypeonOpcAttributeInfo. - New: Browsing the DataType attribute now results in a member of the
OpcDataTypeenumeration. - New: Implemented
OpcValueas a surrogate of theDataValueclass. - New: Implemented the static
CreateCertificatemethod onOpcCertificateManagerto create certificates out of the box. - New: The
OpcStatusclass now provides the newOpcStatusCodeenumeration as code. - New: Implemented support for
OpcDataTypes:ExtensionObject,ValueandVariant. - Changed: Renamed
DataValuetoValueinOpcDataTypes. - New: Implemented support to directly start browsing using a method node.
- Changed: Moved
OpcDiscoveryClientto theOpc.UaFx.Clientnamespace. - Fixed: Issue with
NullReferenceExceptionwhen 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
OpcVariableClassin 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
UserNameACLs enabled at the same time.
New
- Removed the
OpcAccessControlModememberDefaultand replaced its use withBlacklist.
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
OpcNodeattributes. - Implemented protected virtual methods to read / write
OpcNodeattributes. - Implemented specific callback properties to read / write
OpcVariableNodeattributes. - Implemented protected virtual methods to read / write
OpcVariableNodevalue attributes. - The
OpcSessionclass now provides the propertiesUsedIdentityandSuppliedIdentity. - Implemented the
Updatemethod onOpcStatus. - The
OpcContextnow provides anIdentityproperty. - Implemented the new
OpcMonitoredItemclass in the server namespace. OnMonitoredItemCreated/Deleted/Modifiednow provides non-Foundation classes.
Changed
- Moved the
IdentityandImpersonationContextclasses from theOpc.UaFx.Serverto theOpc.UaFxnamespace.
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
OpcSecurityto enable / disable different endpoints for one or more ACEs. Additionally renamed some existing methods. - Implemented the
StateChangedevent inOpcClient.
1.5.1.1 (released on June 16, 2015)
New
- Implemented the
InvokeServicemethod inOpcClientto 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
SaveCertificatemethod onOpcCertificateManager. - Reworked the complete argument binding to also support
outandrefparameters inOpcMethodNode. - Implemented
ByReftype support inOpcMethodNode. - Implemented the local server
CertificateValidationFailedevent to support custom actions on failed certificate validation. - Implemented the new
OpcMethodNodeInfoclass derived fromOpcNodeInfoto browse the arguments of method nodes. - Implemented the new
OpcCertificateValidationFailedEventArgsandOpcCertificateValidationFailedEventHandler. - Implemented the
DataTypeproperty onOpcDataVariableNode. - Implemented the
InputArgumentsandOutputArgumentsproperties on theOpcMethodNodeclass. Additionally extended the support ofOpcArgumentinstances with theOpcArgumentAttributeon 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
OpcDiscoveryClientand the custom preferredOpcSecurityPolicy. - New: Improved the auto complete of the configuration depending on its application type.
- New: Introduced transport profile information.
- New: Moved the configuration of
UserTokenPoliciestoOpcServeron startup and improved the transparency of theIsEnabledproperty. - 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
CLSCompliantby 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
Loadmethods. Additionally implemented default support forDiscoveryServerConfigurations. - New: Simplified the API further.
- New: Introduced
OpcStatusas replacement forStatusCode. - New: Reworked
OpcDiscoveryClientfrom 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.AdvancedandOpc.ServerFx.Advancedtogether intoOpc.UaFx.Advanced.
1.0
1.0.0.0 (released on January 11, 2015)
New
- Created
Opc.ClientFx.AdvancedandOpc.ServerFx.Advanced.

