What's new in QuickOPC 2021.3: Difference between revisions

From OPC Labs Knowledge Base
 
(45 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[Category:What's New]]  
[[Category:Examples]] [[Category:Licensing]] [[Category:PowerShell]] [[Category:User interface]] [[Category:VB 6]] [[Category:What's New]] [[Category:WPF]]  
<div style="text-align: right; direction: ltr; margin-left: 1em;">See also: [[Versions]]; Previous version: [[What's new in QuickOPC 2021.1]]</div>
<div style="text-align: right; direction: ltr; margin-left: 1em;">See also: [[Versions]]; Previous version: [[What's new in QuickOPC 2021.2]]</div>
Internal version number: 5.62
Internal version number: 5.62


''Key changes: ''
''Key changes: ''
* More examples
* More examples<br/>
<br>
* Support for Windows 11
* WPF browse controls
<br/>


= Targeting =  
= Targeting =  
* Operating Systems: Added Windows Server 2022 (x64), to the list of supported systems.
* Operating Systems: Added Windows 11 version 21H2 to the list of supported systems.
* Operating Systems: Added Windows Server 2022 (x64) to the list of supported systems.
* .NET Runtimes: .NET Core 2.1 is no longer supported.
* .NET Runtimes: .NET Core 2.1 is no longer supported.
<!--
<!--
= Technology =
= Technology =
-->
= Licensing =  
= Licensing =  
* Dissociated the licensing from direct use of Visual Studio's mechanism. This change is meant to resolve the issues with .licx files created and maintained in some user projects by Visual Studio. If you have QuickOPC-related entries in the .licx file, you can now remove them. If there are no entries left in the .licx file, you can delete the file altogether.
<!--
= Packaging =
= Packaging =
= Delivery =
= Delivery =
Line 36: Line 43:


== OPC UA Client-Server ==
== OPC UA Client-Server ==
* User authentication with X.509 certificate token is now also supported under .NET Core/.NET 5+.
* Added {{Style=Identifier|IEasyUAClient}}.{{Style=Identifier|ReadValue}} extension method overloads with index range list.
* Added {{Style=Identifier|IEasyUAClient}}.{{Style=Identifier|ReadValue}} extension method overloads with index range list.
* Added {{Style=Identifier|IEasyUAClient}}.{{Style=Identifier|Read}} and {{Style=Identifier|IEasyUAClient}}.{{Style=Identifier|ReadValue}} extension method overloads with read parameters object ({{Style=Identifier|UAReadParameters}}). This allows shorter coding when e.g. maximum value age, or reading from the device needs to be specified.
* Added {{Style=Identifier|IEasyUAClient}}.{{Style=Identifier|Read}} and {{Style=Identifier|IEasyUAClient}}.{{Style=Identifier|ReadValue}} extension method overloads with read parameters object ({{Style=Identifier|UAReadParameters}}). This allows shorter coding when e.g. maximum value age, or reading from the device needs to be specified.
Line 45: Line 53:
* Added {{Style=Identifier|Message}} property to the {{Style=Identifier|UAServiceResult}} class. Returns the message associated with the service result. The component tries to fill it in if no text is provided by the server. Empty if no description is available.
* Added {{Style=Identifier|Message}} property to the {{Style=Identifier|UAServiceResult}} class. Returns the message associated with the service result. The component tries to fill it in if no text is provided by the server. Empty if no description is available.
* Conversions from {{Style=Identifier|UAEUInformation}} and {{Style=Identifier|UARange}} objects to OPC UA structures are now supported, making it possible to write them into the OPC server.
* Conversions from {{Style=Identifier|UAEUInformation}} and {{Style=Identifier|UARange}} objects to OPC UA structures are now supported, making it possible to write them into the OPC server.
* Operation monitoring: The arguments of the {{Style=Identifier|IEasyUAClient}}.{{Style=Identifier|ServerConditionChanged}} event, i.e. the {{Style=Identifier|EasyUAServerConditionChangedEvenArgs}}, now contain a {{Style=Identifier|Statistics}} property. This property contains a {{Style=Identifier|ConnectedConditionStatistics}} object, with large amount of information about the connection to the server. There is a sequential connection attempt count, and an {{Style=Identifier|AutomatonStateStatistics}} object for each of the connection states ({{Style=Identifier|Disconnected}}, {{Style=Identifier|Connecting}}, {{Style=Identifier|Connected}}, and {{Style=Identifier|Disconnecting}}), and for an "Unconnected" state, which represents a state other than {{Style=Identifier|Connected}}. For each of these states, you can obtain information such as how many time it was entered, when it was first entered, when the last cycle started and how long it did last, what is the minimum, maximum, and accumulated duration of the state, and much more. For the current state, you can also obtain information such as when it was entered and how long it is active.  
* Operation monitoring: The arguments of the {{Style=Identifier|IEasyUAClient}}.{{Style=Identifier|ServerConditionChanged}} event, i.e. the {{Style=Identifier|EasyUAServerConditionChangedEvenArgs}}, now contain a {{Style=Identifier|Statistics}} property. This property contains a {{Style=Identifier|ConnectedConditionStatistics}} object, with large amount of information about the connection to the server. There is a sequential connection attempt count, and an {{Style=Identifier|AutomatonStateStatistics}} object for each of the connection states ({{Style=Identifier|Disconnected}}, {{Style=Identifier|Connecting}}, {{Style=Identifier|Connected}}, and {{Style=Identifier|Disconnecting}}), and for an "Unconnected" state, which represents a state other than {{Style=Identifier|Connected}}. For each of these states, you can obtain information such as how many times it was entered, when it was first entered, when the last cycle started and how long it did last, what is the minimum, maximum, and accumulated duration of the state, and much more. For the current state, you can also obtain information such as when it was entered and how long it is active.  
* Added {{Style=Identifier|OperationTimeout}} property to {{Style=Identifier|UAClientSessionParameters}} class. This is the timeout used when sending requests (in milliseconds). Previously, this timeout had to be configured in SDK configuration (by providing a modified XML configuration file).
* Added {{Style=Identifier|OperationTimeout}} property to {{Style=Identifier|UAClientSessionParameters}} class. This is the timeout used when sending requests (in milliseconds). Previously, this timeout had to be configured in SDK configuration (by providing a modified XML configuration file).
* When reading the NodeClass attribute of a node, the returned value is {{Style=Identifier|UANodeClass}} and not an {{Style=Identifier|Int32}}. Note that this is potentionally a breaking change.
* When reading the NodeClass attribute of a node, the returned value is of the {{Style=Identifier|UANodeClass}} type, and not an {{Style=Identifier|Int32}}. Note that this is potentionally a breaking change.
* When reading the AccessLevel or UserAccessLevel attribute of a node, the returned value is now of a new enumeration type, {{Style=Identifier|UAAccessLevels}}, and not a {{Style=Identifier|Byte}}. Note that this is potentionally a breaking change.
<!--
<!--
== OPC UA Complex Data ==
== OPC UA Complex Data ==
Line 59: Line 68:
-->
-->
== User Interface ==
== User Interface ==
* '''Added {{Style=Identifier|WpfOpcBrowseControl}} and {{Style=Identifier|WpfUABrowseControl}} WPF controls. These are wrapper controls around corresponding Windows Forms components, and when placed on a window in an WPF application, they present the user with various OPC "Classic" or OPC UA nodes for selection. The functionality and appearance of the controls can be controlled using the available properties, as in Windows Forms.'''
* Added {{Style=Identifier|ClientSelector}} property to {{Style=Identifier|AEAreaOrSourceDialog}}, {{Style=Identifier|AEAttributeDialog}}, {{Style=Identifier|AECategoryDialog}} and {{Style=Identifier|AEConditionCategoryDialog}}. This allows to specify the parameters of the client object used by the dialog.
* Added {{Style=Identifier|ClientSelector}} property to {{Style=Identifier|AEAreaOrSourceDialog}}, {{Style=Identifier|AEAttributeDialog}}, {{Style=Identifier|AECategoryDialog}} and {{Style=Identifier|AEConditionCategoryDialog}}. This allows to specify the parameters of the client object used by the dialog.
* Added {{Style=Identifier|AEClientSelector}} and {{Style=Identifier|DAClientSelector}} properties to the {{Style=Identifier|OpcBrowseControl}} and {{Style=Identifier|OpcBrowseDialog}} objects. This allows to specify the parameters of the client objects used by the control or the dialog.
* Added {{Style=Identifier|AEClientSelector}} and {{Style=Identifier|DAClientSelector}} properties to the {{Style=Identifier|OpcBrowseControl}}, {{Style=Identifier|OpcBrowseDialog}}, {{Style=Identifier|OpcServerDialog}} and {{Style=Identifier|OpcComputerAndServerDialog}} objects. This allows to specify the parameters of the client objects used by the control or the dialog.
* Added {{Style=Identifier|ClientSelector}} property to {{Style=Identifier|UABrowseControl}}, {{Style=Identifier|UABrowseDialog}}, {{Style=Identifier|UADataDialog}}, {{Style=Identifier|UAEndpointDialog}} and {{Style=Identifier|UAHostAndEndpointDialog}}. This allows to specify the parameters of the client object used by the control or dialog.
* Added {{Style=Identifier|ClientSelector}} property to {{Style=Identifier|UABrowseControl}}, {{Style=Identifier|UABrowseDialog}}, {{Style=Identifier|UADataDialog}}, {{Style=Identifier|UAEndpointDialog}} and {{Style=Identifier|UAHostAndEndpointDialog}}. This allows to specify the parameters of the client object used by the control or dialog.
== Services ==
* When obtaining a new certificate using the {{Style=Identifier|IEasyUAApplication}} service, it is possible to use the PEM private key format (in addition to the PFX format). The private key format can be chosen using the {{Style=Identifier|PrivateKeyFormat}} property in the {{Style=Identifier|UAObtainNewCertificateParameters}}. Note that this is only supported when targeting .NET Standard (not .NET Framework).
<!--
<!--
== Services ==
== Specialized Client Objects ==
== Specialized Client Objects ==
== Other ==
== Other ==
Line 85: Line 97:
* Errors from session connections and reconnections are now enhanced by connection attempt number, last connected time, and unconnected timespan.
* Errors from session connections and reconnections are now enhanced by connection attempt number, last connected time, and unconnected timespan.
* In transitions to the {{Style=Identifier|Connecting}} state, the string form of the {{Style=Identifier|EasyUAServerConditionChangedEventArgs}} now includes the sequential connection attempt number, allowing the user to easily assess whether the connection is "down" for an extended period of time.
* In transitions to the {{Style=Identifier|Connecting}} state, the string form of the {{Style=Identifier|EasyUAServerConditionChangedEventArgs}} now includes the sequential connection attempt number, allowing the user to easily assess whether the connection is "down" for an extended period of time.
* Renamed {{Style=Identifier|UAClientApplicationParameters}}.{{Style=Identifier|AllowClientCertificatePrompt}} property to {{Style=Identifier|AllowOwnCertificatePrompt}}.
* Renamed {{Style=Identifier|UAClientApplicationParameters}} class to {{Style=Identifier|UAClientServerApplicationParameters}}.
<!--
<!--
== OPC UA PubSub ==
== OPC UA PubSub ==
Line 101: Line 115:
* It is possible to configure {{Style=Identifier|ClientSelector}} property of the {{Style=Identifier|UABrowseControl}} and {{Style=Identifier|UABrowseDialog}} using the [[Intrinsic Component Configuration]].
* It is possible to configure {{Style=Identifier|ClientSelector}} property of the {{Style=Identifier|UABrowseControl}} and {{Style=Identifier|UABrowseDialog}} using the [[Intrinsic Component Configuration]].
* Improved generated log entries related to OPC UA .NET SDK configuration, for easier troubleshooting.
* Improved generated log entries related to OPC UA .NET SDK configuration, for easier troubleshooting.
* Added tracing and a trace source for OPC UA certificate management calls.
<!--
<!--
== OPC Classic ==
== OPC Classic ==
Line 115: Line 130:
-->
-->
== OpcCmd Utility ==
== OpcCmd Utility ==
* Added <code>--nodeBrowsePath|-nbp</code> option to '''uaClient''' subcommands. This option allows to specify the node using its browse path (as opposed to direct node Id).
* Added <code>--EndpointCertificateFileName|-ecfn <string></code> option to '''uaClient''' subcommands. This option allows to specify the user identity using an X.509 certificate.
* The '''uaClient''' command now has a new '''--ServerConditionChanged''' ('''-scc''') option, which enables event notifications related to server condition changes (connecting/connected/disconnecting/disconnected).
* The '''uaClient''' command now has a new '''--ServerConditionChanged''' ('''-scc''') option, which enables event notifications related to server condition changes (connecting/connected/disconnecting/disconnected).
* Added the <code>--EndpointAnonymous|-ea <bool></code> option to various '''uaClient''' subcommands, allowing to explicitly enable/disable the use of anonymous user token.
* Added the <code>--EndpointAnonymous|-ea <bool></code> option to various '''uaClient''' subcommands, allowing to explicitly enable/disable the use of anonymous user token.
* Added the '''waitForItemValue''' subcommand under the '''daClient''' command.
* Added the '''waitForItemValue''' subcommand under the '''daClient''' command.
* Added the '''waitForValue''' subcommand under the '''uaClient''' command.
* Added the '''waitForValue''' subcommand under the '''uaClient''' command.
* The '''ua statusCode''' command now also displays the textual description of the OPC UA status code, if found.
* When displaying a value, by default, the OpcCmd utility will now not expand the sub-properties of a property that is at its default value. This creates an output that is still complete, but in many cases shorter. This behavior can be changed using the format string to always expand all properties, or to completely hide the properties that are at their defaults.
* When displaying a value, by default, the OpcCmd utility will now not expand the sub-properties of a property that is at its default value. This creates an output that is still complete, but in many cases shorter. This behavior can be changed using the format string to always expand all properties, or to completely hide the properties that are at their defaults.
* More concise value output in OpcCmd utility for some objects - achieved by hiding properties whose value is evident from the string form of the value, or other properties that are shown.
* More concise value output in OpcCmd utility for some objects - achieved by hiding properties whose value is evident from the string form of the value, or other properties that are shown.
Line 125: Line 143:
== OPC UA PubSub Formatter ==
== OPC UA PubSub Formatter ==
* The OPC UA PubSub Formatter can now show the format of JSON Delta frames, Event messages, and Keep-Alive messages.
* The OPC UA PubSub Formatter can now show the format of JSON Delta frames, Event messages, and Keep-Alive messages.
* You can now select from 4 pre-defined datasets in the OPC UA PubSub Formatter.  
* You can now select a combination of multiple different datasets (from 4 pre-defined datasets) in the OPC UA PubSub Formatter, and their repetition count.  
<!--
<!--
= Product Options =
= Product Options =
Line 132: Line 150:


= Examples =
= Examples =
* '''Introduced a set of examples in PowerShell. Besides several "super-short" scripts demonstrating the easy of use, they include scripts for OPC Data Access (15 examples), OPC XML-DA (2 examples), OPC Alarms&Events (2 examples), user interface for OPC "Classic" (4 examples), OPC Unified Architecture (39 examples), OPC UA Alarms&Conditions (10 examples), OPC UA PubSub (1 example), file providers in OPC UA (1 example), and user interface for OPC UA (5 examples).'''
* Added a C# example that shows how to display all fields of the available license(s).
* Added a C# example that shows how to display all fields of the available license(s).
== Platform: COM ==
== Platform: COM ==
Line 137: Line 156:
* Added a VBA example in Microsoft Access. The example reads an OPC UA value and shows it on a form that opens automatically on database startup.
* Added a VBA example in Microsoft Access. The example reads an OPC UA value and shows it on a form that opens automatically on database startup.
* Added a Python example showing how to subscribe to OPC Classic (OPC A&E) events and obtain the notification events by pulling them.
* Added a Python example showing how to subscribe to OPC Classic (OPC A&E) events and obtain the notification events by pulling them.
* Added a Python example showing how to obtain current state information for the condition instance corresponding to a Source and certain ConditionName in OPC A&E (GetConditionState example).
* Added a Delphi example showing how to use OPC Data Access event pull with multiple subscribed items.
* Added a Delphi example showing how to use OPC Data Access event pull with multiple subscribed items.
* Added a VBScript example showing how to reuse output of one UABrowseDialog invocation as an input for the subsequent invocation.
* Improved Delphi examples to show proper OleVariant clearing, for avoiding memory leaks.
* Improved Delphi examples to show proper OleVariant clearing, for avoiding memory leaks.
* Added set of examples in VB6 for OPC "Classic".
* Added cca 36 examples in VB6 for OPC UA (client-server, and PubSub).
* Added Visual FoxPro example showing how to subscribe to OPC UA data changes, and pull the notification events.


== OPC Classic ==
== OPC Classic ==
Line 168: Line 192:
* Added a C# example showing how the OPC UA status codes are formatted into a string containing the symbolic name of the status code.
* Added a C# example showing how the OPC UA status codes are formatted into a string containing the symbolic name of the status code.
* Added a C# example showing how to configure OPC UA .NET SDK using an external file (UANetSdkConfiguration project), both for .NET Framework and .NET Core/.NET 5+.
* Added a C# example showing how to configure OPC UA .NET SDK using an external file (UANetSdkConfiguration project), both for .NET Framework and .NET Core/.NET 5+.
* Added a C# example showing how to obtain acknowledged state of events, and acknowledge an event that is not acknowledged yet.
* Added C# example that shows how to allow browsing for an OPC UA node by placing a browsing control ({{Style=Identifier|UABrowseControl}}) on the form.
* Added C# example that shows how to allow browsing for an OPC UA node by placing a browsing control ({{Style=Identifier|UABrowseControl}}) on the form.
* Added C# and VBScript example showing how the current node and selected nodes can be persisted between {{Style=Identifier|UABrowseDialog}} dialog invocations.
* Added '''UAAutoRefreshWeb''' example in C#: Web application with a screen that refreshes itself periodically with OPC UA values.
* Added '''UABrowseNodesWeb''' example in C#: Browses nodes in an OPC UA server (ASP.NET Web application).
* Added '''UADataGridWebApplication''' example in C#: Demonstrates how easily can WebControls.GridView be populated with data read from OPC UA server.
* Added '''UADiscoverServersWeb''' examples in C#: Discovers the available OPC UA servers (ASP.NET Web application).
* Added '''UAHmiScreen''' example in C#: Shows how to implement an HMI screen by storing OPC Unified Architecture node IDs in the Tag property of screen controls, and animate the controls by subscribing to all items at once. Also shows a possibility how to write to an OPC item from the screen.
* Added '''UAHmiScreen''' example in C#: Shows how to implement an HMI screen by storing OPC Unified Architecture node IDs in the Tag property of screen controls, and animate the controls by subscribing to all items at once. Also shows a possibility how to write to an OPC item from the screen.
* Added '''UALiveBindingDemo2''' example in C#: Shows advanced live binding features in OPC UA. Among others, it demonstrates binding kinds (binding to local vs. UTC timestamp), conversions (use of LinearConverter, even bi-directionally), animations (moving a control around the form, depending on an OPC tag value), and cumulative binding (Adding incoming values to ListBox or ListView).
* Added '''UALiveBindingDemo2''' example in C#: Shows advanced live binding features in OPC UA. Among others, it demonstrates binding kinds (binding to local vs. UTC timestamp), conversions (use of LinearConverter, even bi-directionally), animations (moving a control around the form, depending on an OPC tag value), and cumulative binding (Adding incoming values to ListBox or ListView).
Line 174: Line 204:
* Added '''UALogAsUnionToSql''' example in C#: Logs OPC Unified Architecture data changes into an SQL database, using a subscription. Values of different data types are stored in separate columns.
* Added '''UALogAsUnionToSql''' example in C#: Logs OPC Unified Architecture data changes into an SQL database, using a subscription. Values of different data types are stored in separate columns.
* Added '''UASubscribeFromXml''' example in C#: Loads a list of OPC Unified Architecture items from an XML file and subscribes to them.
* Added '''UASubscribeFromXml''' example in C#: Loads a list of OPC Unified Architecture items from an XML file and subscribes to them.
* Added '''UASubscribeToMany''' example in C#: Demonstrates and measures performance with large number of subscribed OPC UA data items
* Added '''UAValueToMessageBox''' example in C#: Very simple Windows Forms application that reads and displays an OPC UA node value in a message box after the user clicks on a button.
* Added '''UAWebService1''' example in C#: A simple Web service using ASMX technology. Provides "Hello World" method to read a value of an OPC UA item.
* Added '''UAWindowsFormsApplication1''': The simplest Windows Forms application. Reads and displays an OPC UA node value on a form.
* Added '''UAWpfApplication1''' example in C#: The simplest WPF application for OPC UA. Reads and displays an OPC node value.
* Added '''UAXmlLogger''' example in C#: Logs OPC Unified Architecture data changes into an XML file.
* Added '''UAXmlLogger''' example in C#: Logs OPC Unified Architecture data changes into an XML file.
* Added '''UAXmlEventLogger''' example in C#: Logs OPC UA Alarms&Conditions event notifications into an XML file.
* Added '''UAXmlEventLogger''' example in C#: Logs OPC UA Alarms&Conditions event notifications into an XML file.
Line 188: Line 223:


= Documentation and Help =
= Documentation and Help =
* Added explanations on how to reference assemblies in PowerShell, and use types from their namespaces.
* Added documentation topic about OPC UA user authentication, with an example.
* Added documentation topic about OPC UA user authentication, with an example.
* Enhanced documentation related to OPC DA read parameters (setting value age, choosing to read from the cache or from the device).
* Enhanced documentation related to OPC DA read parameters (setting value age, choosing to read from the cache or from the device).
Line 193: Line 229:
* Enhanced documentation related to OPC UA timeouts (the parameters available, their meaning, and how to set them).
* Enhanced documentation related to OPC UA timeouts (the parameters available, their meaning, and how to set them).
* Examples that were in the DocExamples, UADocExamples and ReactiveDocExamples projects but were not in the User's Guide were added to the documentation.
* Examples that were in the DocExamples, UADocExamples and ReactiveDocExamples projects but were not in the User's Guide were added to the documentation.
* '''Reference documentation: Added exception documentation to large number of methods.'''
* Reference documentation: Improved documentation for overloaded members, by consistently repeating the information common to all overloads.
* Fix: Added missing remarks to enum members.
* Fix: Added missing remarks to enum members.
* Fixed invalid links to enum members.
* Fixed invalid links to enum members.

Latest revision as of 08:30, 22 November 2021

See also: Versions; Previous version: What's new in QuickOPC 2021.2

Internal version number: 5.62

Key changes:

  • More examples
  • Support for Windows 11
  • WPF browse controls


Targeting

  • Operating Systems: Added Windows 11 version 21H2 to the list of supported systems.
  • Operating Systems: Added Windows Server 2022 (x64) to the list of supported systems.
  • .NET Runtimes: .NET Core 2.1 is no longer supported.

Licensing

  • Dissociated the licensing from direct use of Visual Studio's mechanism. This change is meant to resolve the issues with .licx files created and maintained in some user projects by Visual Studio. If you have QuickOPC-related entries in the .licx file, you can now remove them. If there are no entries left in the .licx file, you can delete the file altogether.

Installation and Uninstallation

  • The Launcher now has an information pane at the bottom, showing a description for the currently selected item.

Component Improvements

  • The ILicenseInfoProvider.LicenseInfo property now returns (specially marked) elements for licenses that has been considered but dropped during the license verification and evaluation. With licensing errors that result in a trial license being used, this allows the user to diagnose licensing problems sooner - before the run-time limit associated with the trial license is reached.

OPC Data Access and OPC XML-DA

  • Added more IEasyDAClient.ReadItem, ReadItemValue, ReadMultipleItems and ReadMultipleItemValues extension method overloads with read parameters object (DAReadParameters). This allows shorter coding when e.g. a value age, or reading from the device needs to be specified.

OPC Alarms&Events

  • Added more overloads of the AENotificationObservable.Create method, allowing to pass less arguments.

OPC UA Client-Server

  • User authentication with X.509 certificate token is now also supported under .NET Core/.NET 5+.
  • Added IEasyUAClient.ReadValue extension method overloads with index range list.
  • Added IEasyUAClient.Read and IEasyUAClient.ReadValue extension method overloads with read parameters object (UAReadParameters). This allows shorter coding when e.g. maximum value age, or reading from the device needs to be specified.
  • Added (extension) method IEasyUAClient.WaitForMultiple. Subscribes to the specified nodes&attributes, and monitors their data until the predicates specified for each item become true, an error occurs, or the alloted time elapses.
  • Added (extension) method IEasyUAClient.WaitForMultipleValues. Subscribes to the specified nodes&attributes, and monitors their data until they have at least the status severity specified for each item, an error occurs, or the alloted time elapses.
  • Added (extension) method IEasyUAClient.WaitForValue. Subscribes to the specified node&attribute, and monitors its data until it has "good" status severity, an error occurs, or the alloted time elapses.
  • Added new extension methods to the IEasyUAClient.SubscribeMultipleMonitoredItems method, named SubscribeMultipleDataChanges and SubscribeMultipleEvents, allowing to specify an array of monitored item arguments, and a common data change notification or event notification callback.
  • Added Description property to the UAStatusCode class. Returns textual description of the status code, or an empty string if the description is not available.
  • Added Message property to the UAServiceResult class. Returns the message associated with the service result. The component tries to fill it in if no text is provided by the server. Empty if no description is available.
  • Conversions from UAEUInformation and UARange objects to OPC UA structures are now supported, making it possible to write them into the OPC server.
  • Operation monitoring: The arguments of the IEasyUAClient.ServerConditionChanged event, i.e. the EasyUAServerConditionChangedEvenArgs, now contain a Statistics property. This property contains a ConnectedConditionStatistics object, with large amount of information about the connection to the server. There is a sequential connection attempt count, and an AutomatonStateStatistics object for each of the connection states (Disconnected, Connecting, Connected, and Disconnecting), and for an "Unconnected" state, which represents a state other than Connected. For each of these states, you can obtain information such as how many times it was entered, when it was first entered, when the last cycle started and how long it did last, what is the minimum, maximum, and accumulated duration of the state, and much more. For the current state, you can also obtain information such as when it was entered and how long it is active.
  • Added OperationTimeout property to UAClientSessionParameters class. This is the timeout used when sending requests (in milliseconds). Previously, this timeout had to be configured in SDK configuration (by providing a modified XML configuration file).
  • When reading the NodeClass attribute of a node, the returned value is of the UANodeClass type, and not an Int32. Note that this is potentionally a breaking change.
  • When reading the AccessLevel or UserAccessLevel attribute of a node, the returned value is now of a new enumeration type, UAAccessLevels, and not a Byte. Note that this is potentionally a breaking change.

OPC UA PubSub

  • Delta frames in JSON message mapping are now supported.

User Interface

  • Added WpfOpcBrowseControl and WpfUABrowseControl WPF controls. These are wrapper controls around corresponding Windows Forms components, and when placed on a window in an WPF application, they present the user with various OPC "Classic" or OPC UA nodes for selection. The functionality and appearance of the controls can be controlled using the available properties, as in Windows Forms.
  • Added ClientSelector property to AEAreaOrSourceDialog, AEAttributeDialog, AECategoryDialog and AEConditionCategoryDialog. This allows to specify the parameters of the client object used by the dialog.
  • Added AEClientSelector and DAClientSelector properties to the OpcBrowseControl, OpcBrowseDialog, OpcServerDialog and OpcComputerAndServerDialog objects. This allows to specify the parameters of the client objects used by the control or the dialog.
  • Added ClientSelector property to UABrowseControl, UABrowseDialog, UADataDialog, UAEndpointDialog and UAHostAndEndpointDialog. This allows to specify the parameters of the client object used by the control or dialog.

Services

  • When obtaining a new certificate using the IEasyUAApplication service, it is possible to use the PEM private key format (in addition to the PFX format). The private key format can be chosen using the PrivateKeyFormat property in the UAObtainNewCertificateParameters. Note that this is only supported when targeting .NET Standard (not .NET Framework).

Component Refactorings

  • Elements returned from ILicenseInfoProvider.LicenseInfo that represent date/time or a timespan are now returned as a DateTime or TimeSpan, respectively, instead of just "raw" UInt64 or UInt32. This helps to interpret the commonly needed elements such as ReleaseDateCovered.
  • In standard formats for DAVtq and UAAttributeData, the zero date in timestamps is now displayed as "MinValue" instead, making the output shorter.
  • Renamed EasyXXXXConfiguration components to EasyXXXXManagement, i.e. EasyDAClientConfiguration to EasyDAClientManagement, EasyAEClientConfiguration to EasyAEClientManagement, EasyUAClientConfiguration to EasyUAClientManagement and EasyUASubscriberConfiguration to EasyUASubscriberManagement. This is a breaking change if you use the affected components, but it can be easily resolved by simple text find&replace.

OPC Classic

  • The default (general) output format for DAVtq now displays only the short name of the value type (without namespace).
  • Improved error enhancement (details added to error texts in some common scenarios).

OPC UA

  • The default (general) and brief output formats for UAAttributeData now display only the short name of the value type (without namespace).
  • Improved error enhancement (details added to error texts in some common scenarios).
  • Errors from session connections and reconnections are now enhanced by connection attempt number, last connected time, and unconnected timespan.
  • In transitions to the Connecting state, the string form of the EasyUAServerConditionChangedEventArgs now includes the sequential connection attempt number, allowing the user to easily assess whether the connection is "down" for an extended period of time.
  • Renamed UAClientApplicationParameters.AllowClientCertificatePrompt property to AllowOwnCertificatePrompt.
  • Renamed UAClientApplicationParameters class to UAClientServerApplicationParameters.

Configuration and Instrumentation

  • It is possible to configure ClientSelector property of the AEAreaOrSourceDialog, AEAttributeDialog, AECategoryConditionDialog and AECategoryDialog using the Intrinsic Component Configuration on the AEDialog base component.
  • It is possible to configure AEClientSelector and DAClientSelector property of the OpcBrowseControland OpcBrowseDialog using the Intrinsic Component Configuration.
  • It is possible to configure ClientSelector property of the UADataDialog, UAEndpointDialog and UAHostAndEndpointDialog using the Intrinsic Component Configuration on the UADialog base component.
  • It is possible to configure ClientSelector property of the UABrowseControl and UABrowseDialog using the Intrinsic Component Configuration.
  • Improved generated log entries related to OPC UA .NET SDK configuration, for easier troubleshooting.
  • Added tracing and a trace source for OPC UA certificate management calls.

Tools and Online Services

Demo Servers and Publishers

  • The UADemoPublisher can now produce Delta frames in JSON message mapping (when KeyFrameCount >= 2).

OpcCmd Utility

  • Added --nodeBrowsePath|-nbp option to uaClient subcommands. This option allows to specify the node using its browse path (as opposed to direct node Id).
  • Added --EndpointCertificateFileName|-ecfn <string> option to uaClient subcommands. This option allows to specify the user identity using an X.509 certificate.
  • The uaClient command now has a new --ServerConditionChanged (-scc) option, which enables event notifications related to server condition changes (connecting/connected/disconnecting/disconnected).
  • Added the --EndpointAnonymous|-ea <bool> option to various uaClient subcommands, allowing to explicitly enable/disable the use of anonymous user token.
  • Added the waitForItemValue subcommand under the daClient command.
  • Added the waitForValue subcommand under the uaClient command.
  • The ua statusCode command now also displays the textual description of the OPC UA status code, if found.
  • When displaying a value, by default, the OpcCmd utility will now not expand the sub-properties of a property that is at its default value. This creates an output that is still complete, but in many cases shorter. This behavior can be changed using the format string to always expand all properties, or to completely hide the properties that are at their defaults.
  • More concise value output in OpcCmd utility for some objects - achieved by hiding properties whose value is evident from the string form of the value, or other properties that are shown.
  • When displaying a value, by default, the OpcCmd utility now highlights the property values that are not at their default, using a different color. This behavior can be changed using the format string to never highlight any property values, or to highlight them all.

OPC UA PubSub Formatter

  • The OPC UA PubSub Formatter can now show the format of JSON Delta frames, Event messages, and Keep-Alive messages.
  • You can now select a combination of multiple different datasets (from 4 pre-defined datasets) in the OPC UA PubSub Formatter, and their repetition count.

Examples

  • Introduced a set of examples in PowerShell. Besides several "super-short" scripts demonstrating the easy of use, they include scripts for OPC Data Access (15 examples), OPC XML-DA (2 examples), OPC Alarms&Events (2 examples), user interface for OPC "Classic" (4 examples), OPC Unified Architecture (39 examples), OPC UA Alarms&Conditions (10 examples), OPC UA PubSub (1 example), file providers in OPC UA (1 example), and user interface for OPC UA (5 examples).
  • Added a C# example that shows how to display all fields of the available license(s).

Platform: COM

  • Added an OPC-UA demo application written in C++ (with use of MFC). Both the source code, and the executable are installed.
  • Added a VBA example in Microsoft Access. The example reads an OPC UA value and shows it on a form that opens automatically on database startup.
  • Added a Python example showing how to subscribe to OPC Classic (OPC A&E) events and obtain the notification events by pulling them.
  • Added a Python example showing how to obtain current state information for the condition instance corresponding to a Source and certain ConditionName in OPC A&E (GetConditionState example).
  • Added a Delphi example showing how to use OPC Data Access event pull with multiple subscribed items.
  • Added a VBScript example showing how to reuse output of one UABrowseDialog invocation as an input for the subsequent invocation.
  • Improved Delphi examples to show proper OleVariant clearing, for avoiding memory leaks.
  • Added set of examples in VB6 for OPC "Classic".
  • Added cca 36 examples in VB6 for OPC UA (client-server, and PubSub).
  • Added Visual FoxPro example showing how to subscribe to OPC UA data changes, and pull the notification events.

OPC Classic

  • Added C# examples showing how to read a single item, or just its value, specifying that the read should be performed from the device.
  • Added C# examples showing how to subscribe to single and multiple OPC items with percent deadband.
  • Added a C# example showing how to use isolated client objects for separate connections to the target OPC DA server.
  • Added one more C# example of node browsing.
  • Added one more C# example for the GetMultiplePropertyValues method.
  • Added examples for the SubscribeMultipleItems method showing how to use integers and general objects for identification of the subscriptions.
  • Added a C# example for the ChangeMultipleItemSubscriptions method.
  • Added a C# example for the WriteMultipleItems method.
  • Added C# examples for the usage of OPC A&E area or source dialog, OPC A&E attribute dialog, OPC A&E category dialog, and OPC A&E category condition dialog.
  • Added C# example that shows how to allow browsing for an OPC Data Access node by placing a browsing control (OpcBrowseControl) on the form.
  • Added an example showing how to use reactive development model for OPC Alarms&Events.
  • Enhanced the XmlLogger and XmlEventLogger examples in C# and VB.NET by progress indication.
  • Reactive Programming: Added an example showing how to observe OPC DA data with percent deadband.

OPC UA Client-Server

  • Added C# examples showing how to read a single node or multiple nodes, specifying that the read should be performed from the device (data source).
  • Added C# examples showing how to subscribe to single and multiple OPC monitored items with absolute deadband.
  • Added C# examples showing how to subscribe to single and multiple OPC monitored items with percent deadband.
  • Added a C# example showing how to subscribe to a range of elements from an array.
  • Added a C# example showing how to set various OPC UA timeouts.
  • Added a C# example showing how to use isolated client objects for separate connections to the target OPC UA server.
  • Added a C# example showing how to browse all forward references from a given node.
  • Added a C# example showing how to unsubscribe from just some monitored items.
  • Added a C# example showing that either a single client object, or multiple client objects can be used to read values from two servers.
  • Added example for server condition monitoring (IEasyUAClient.ServerConditionChanged event).
  • Added a C# example showing how the OPC UA status codes are formatted into a string containing the symbolic name of the status code.
  • Added a C# example showing how to configure OPC UA .NET SDK using an external file (UANetSdkConfiguration project), both for .NET Framework and .NET Core/.NET 5+.
  • Added a C# example showing how to obtain acknowledged state of events, and acknowledge an event that is not acknowledged yet.
  • Added C# example that shows how to allow browsing for an OPC UA node by placing a browsing control (UABrowseControl) on the form.
  • Added C# and VBScript example showing how the current node and selected nodes can be persisted between UABrowseDialog dialog invocations.
  • Added UAAutoRefreshWeb example in C#: Web application with a screen that refreshes itself periodically with OPC UA values.
  • Added UABrowseNodesWeb example in C#: Browses nodes in an OPC UA server (ASP.NET Web application).
  • Added UADataGridWebApplication example in C#: Demonstrates how easily can WebControls.GridView be populated with data read from OPC UA server.
  • Added UADiscoverServersWeb examples in C#: Discovers the available OPC UA servers (ASP.NET Web application).
  • Added UAHmiScreen example in C#: Shows how to implement an HMI screen by storing OPC Unified Architecture node IDs in the Tag property of screen controls, and animate the controls by subscribing to all items at once. Also shows a possibility how to write to an OPC item from the screen.
  • Added UALiveBindingDemo2 example in C#: Shows advanced live binding features in OPC UA. Among others, it demonstrates binding kinds (binding to local vs. UTC timestamp), conversions (use of LinearConverter, even bi-directionally), animations (moving a control around the form, depending on an OPC tag value), and cumulative binding (Adding incoming values to ListBox or ListView).
  • Added UALogAsStringToSql example in C#: Logs OPC Unified Architecture data changes into an SQL database, using a subscription. Values of all data types are stored in a single NVARCHAR column.
  • Added UALogAsUnionToSql example in C#: Logs OPC Unified Architecture data changes into an SQL database, using a subscription. Values of different data types are stored in separate columns.
  • Added UASubscribeFromXml example in C#: Loads a list of OPC Unified Architecture items from an XML file and subscribes to them.
  • Added UASubscribeToMany example in C#: Demonstrates and measures performance with large number of subscribed OPC UA data items
  • Added UAValueToMessageBox example in C#: Very simple Windows Forms application that reads and displays an OPC UA node value in a message box after the user clicks on a button.
  • Added UAWebService1 example in C#: A simple Web service using ASMX technology. Provides "Hello World" method to read a value of an OPC UA item.
  • Added UAWindowsFormsApplication1: The simplest Windows Forms application. Reads and displays an OPC UA node value on a form.
  • Added UAWpfApplication1 example in C#: The simplest WPF application for OPC UA. Reads and displays an OPC node value.
  • Added UAXmlLogger example in C#: Logs OPC Unified Architecture data changes into an XML file.
  • Added UAXmlEventLogger example in C#: Logs OPC UA Alarms&Conditions event notifications into an XML file.
  • Reactive Programming: Added an example showing how to observe a range of elements from an array.
  • Reactive Programming: Added an example showing how to observe OPC UA data with data change trigger.
  • Reactive Programming: Added an example showing how to observe OPC UA data with absolute deadband.
  • Reactive Programming: Added an example showing how to observe OPC UA data with percent deadband.
  • Reactive Programming: Added an example that shows an OPC UA data change observable with specified timeouts.
  • All .NET examples now consistently use opc.tcp: endpoints of the sample servers, instead of http:.

Documentation and Help

  • Added explanations on how to reference assemblies in PowerShell, and use types from their namespaces.
  • Added documentation topic about OPC UA user authentication, with an example.
  • Enhanced documentation related to OPC DA read parameters (setting value age, choosing to read from the cache or from the device).
  • Enhanced documentation related to OPC UA read parameters (setting maximum age, choosing to read from the cache or from the data source, or setting the encoding name).
  • Enhanced documentation related to OPC UA timeouts (the parameters available, their meaning, and how to set them).
  • Examples that were in the DocExamples, UADocExamples and ReactiveDocExamples projects but were not in the User's Guide were added to the documentation.
  • Reference documentation: Added exception documentation to large number of methods.
  • Reference documentation: Improved documentation for overloaded members, by consistently repeating the information common to all overloads.
  • Fix: Added missing remarks to enum members.
  • Fixed invalid links to enum members.