What's New - OPC Data Client 2022.1 (5.63)
Key changes: - Initial support for .NET 6.0 - COM management updates
Download the latest version of OPC Data Client here
Users are strongly encouraged to review our Upgrading Best Practices before upgrading as well as our log of changes that require more review and action such as breaking code changes.
If you are using a version older than OPC Data Client 5.63.246.1 (Released July 22, 2022), please review the the details of Security Vulnerability ZDI-CAN-16596, which affects the Connectivity Explorer in all previous versions.
Internal version number: 5.63
Targeting
- .NET 6.0 is now a supported .NET runtime. Note: When you develop for .NET 6, use .NET Standard 2.1 as target framework. Windows-specific technologies (Windows Forms, WPF) and features that depend on them (Live Binding, Browse Dialogs and Browse Controls, ...) are not yet supported.
- Maximum supported Windows 10 version is now 21H2.
Licensing
- The default format of the distributed license key file is now .TXT (Base64 encoded), instead of .BIN. This is intended to prevent issues with mail/antivirus filters which sometimes reject to let through binary files. License Manager accepts the .TXT format since version 2018.2.
- COM development now requires Enterprise Edition or higher (previously, it required Professional Edition or higher). This is valid for license keys issued from the release date of software version 2022.1. Behavior of license keys issued earlier is not affected, even with software version 2022.1 or later. Note: "COM development" means using the toolkit from COM-based development tools (such as VB6, Delphi, PHP etc.); it does *not* refer to the usage of COM/DCOM-based OPC specification (OPC Classic), this aspect remains unchanged.
- Licenses from the registry (Registry License Store, i.e. those handled by the License Manager utility) are now recognized when running under .NET Core/.NET 5+ on Windows (previously, they were only recognized when you were targeting .NET Framework).
- Added
LicensingManagement.RegisterManagedResourceWithExistenceCheckmethod. In comparison with the preexistingLicensingManagement.RegisterManagedResourcemethod, this new method checks upfront whether the specified license resource exists, and throws an exception if it does not exist or is not accessible. This allows easier troubleshooting of the process of embedding the license key into your project.
Component Improvements
OPC Classic
- Added
ComSecurityParameters.EnsureDataIntegrityproperty (defaults to false). You can set this property inComManagement.Instance.Configuration.SecurityParameters. When true (andComSecurityParameters.UseCustomSecurityis also true, which is the default), it sets the security so that COM verifies that none of the data transferred between client and server has been modified, by specifying RPC_C_AUTHN_LEVEL_PKT_INTEGRITY for the authentication level. Using this authentication level might be necessary on systems with hardening changes for CVE-2021-26414 vulnerability. For related guidance, see COM management. - It is possible to enforce early initialization of COM security by calling
ComManagement.Instance.AssureSecurityInitialization(). TheComManagement.Instance.AssureSecurityInitializationAndRunOnStaThreadmethod makes it easier to rewrite programs that were originally written to start on an STA thread, but had to be switched to an MTA thread in order to avoid premature COM security initialization. - Added
ComSecurityParameters.AllowImpersonateClientproperty (defaults to false). Controls whether the the server is allowed to impersonate the client. - COM security initialization success or failure is now logged through the
EasyDAClient.LogEntryorEasyAEClient.LogEntryevents. - COM security initialization success or failure events are now written to the system log. This can be turned on/off by the
ComManagement.Instance.LogToSystemproperty. - COM configuration can now be set externally to the program, using Intrinsic Component Configuration.
- The
DANodeDescriptorandAENodeDescriptorclasses have been extended by aBrowsePathStartingNodeDescriptorproperty. This allows to specify a node other than the root node as a starting node for the browse path. - Added
HasBrowsePathandHasNodeIdproperties to theDANodeDescriptorandAENodeDescriptorclasses. - Added
HasClsidandHasProgIdproperties to theObjectDescriptorandServerDescriptorclasses. - The native OPC DA and A&E clients no longer attempt to connect to remote registry and/or OPCEnum, if the server descriptor specifies a CLSID. This can reduce the time needed to connect to the OPC server.
- Added "ProgID Database" optimization to the OPC DA Optimizer. It recognizes ProgIDs of some common OPC servers, and resolves them directly to CLSIDs, bypassing the need to search through registry or use OPCEnum. This results in faster connection times, especially in remote scenarios with slow network connections. It can also allow connection to an OPC server that would otherwise be unreachable, due to ProgID resolution issues.
- Added OPC A&E Optimizer plugin, with the ProgID database optimization (same functionality as described for OPC DA).
- Enhanced error messages.
OPC UA Client-Server
- Added
StartingNodeDescriptorproperty to theUABrowsePath. This is a generalization of the existingStartingNodeIdproperty, allowing the starting node be specified not just by its node ID, but by any node descriptor (which can then contain a browse path, etc., recursively).
OPC UA PubSub
- Added ability to load and resolve PubSub configurations from Web resources, using FTP, HTTP or HTTPS.
- Added
UADataSetData.FieldDataDictionaryByIdproperty. When metadata is available, this property contains field data for each field in the dataset, keyed by the dataset field Id (a GUID). - Added
Originproperty to theUADataSetHeader(and therefore also to the derivedUADataSetData) class. The property contains origin of the dataset. The type and semantics of the origin depends on the transport used. For example, it is a string containing topic name in MQTT transport. It is anIPEndpointobject in the UDP transport, and aPhysicalAddressobject in the Ethernet transport. - Replaced the
EasyUASubscribeDataSetFieldArguments.FieldNameproperty by aDataSetFieldDescriptorproperty, which can contain either a field name, or a dataset field Id (a GUID). Also, the various overloads of theIEasyUASubscriberExtension.SubscribeDataSetFieldmethod now take theUADataSetFieldDescriptorobject as an input, instead of just the field name. Implicit conversions exist from a string (representing the field name) or a GUID (representing the dataset field Id) to theUADataSetFieldDescriptor. - Added recognition of cases when a JSON message is being parsed as UADP, or vice versa, and generate specific errors with messages properly identifying the cause of the problem.
- In JSON message mapping, added support for DataSetWriterName and ReversibleFieldEncoding flags, introduced in OPC UA specification 1.05.01.
COM Components
- Updated QuickOpc.h include file (Microsoft C++) for use with ISO C++ 20 Standard.
Services
- Added the
IEasyUAClientConnectionControlservice on theEasyUAClientcomponent (Professional Edition and higher). It provides methods to control the OPC UA client connections to the server, and contains methods likeLockConnectionandUnlockConnection. When the connection is locked, the component will attempt to open it and keep open, and will not automatically disconnect from the server after the connection is unused for certain time. The service is also available via COM, as_EasyUAClientConnectionControlinterface. In .NET, it is also possible to use theDisposableLockConnectionextension method, which works nicely with "using" statements in C# and VB.NET. - Added the
IEasyUAClientNodeRegistrationservice on theEasyUAClientcomponent (Professional Edition and higher). It provides methods to register and unregister nodes, using the corresponding OPC UA services. Node registration (with OPC UA servers that support it) can improve performance with repeatedly accessed nodes. The service is also available via COM, as_EasyUAClientNodeRegistrationinterface.
Component Refactorings
OPC Classic
- The
ServerClassproperty (inObjectDescriptor,ServerDescriptor, andOpcServerDialogclasses) now contains the {CLSID} of the OPC server, if available; otherwise, it contains its ProgID (or is empty, if no ProgID present either). Previously, theServerClassproperty "preferred" the ProgID before the CLSID. This is potentially a breaking change. If you need the previous behavior, use the newServerProgramproperty instead. - Properties
ExecutionContextandTurnOffActivationSecurityhave fromEasyMachineParameters(for OPCEnum operations) andEasyClientParameters(for target OPC server operation) have been moved into a new class,ComInstantiationParameters, and a correspondingComInstantiationParametersproperty has been added to theEasyMachineParametersandEasyClientParametersclasses. - The effective COM instantiation parameters are now determined by taking the value from
ComManagement.Instance.Configuration.InstantiationParameters, and possibly overriding them by values fromEasyXXClient.SharedParameters.ClientParameters.ComInstantiationParameters, orEasyXXClient.SharedParameters.MachineParameters.ComInstantiationParameters. - Properties
UseCustomSecurityandTurnOffCallSecurityhave been moved fromEasyMachineParameters(for OPCEnum operations) andEasyClientParameters(for target OPC server operation) and merged into a single set of properties in a new class,ComSecurityParameters, available in theComManagement.SecurityParametersproperty. - The default timeout values for OPC DA, OPC XML-DA and OPC A&E operation have been increased from 60 seconds to 90 seconds.
OPC UA
- The
ServerConditionChangedevent, previously available on theIEasyUAClientinterface, has been moved to a new service,IEasyUAClientConnectionMonitoring, available from theEasyUAClientcomponent. The service is also available via COM, as_EasyUAClientConnectionMonitoringinterface. - Types renamed:
UAComplexDataPluginParameterstoUAComplexDataClientPluginParameters,_UAComplexDataPluginParametersto_UAComplexDataClientPluginParameters. When retrieving the OPC UA Complex Data plugin (for OPC UA client-server model) setup fromEasyUAClient.InstanceParameters.PluginSetupsusing theFindNamemethod, use "UAComplexDataClient" instead of "UAComplexData".
OPC UA PubSub
- The
ResolverDescriptorproperty has been moved from theUASubscribedataSetArgumentsclass to theUADataSetSubscriptionDescriptorclass.
User Interface
- In OPC UA browse controls and dialogs, when an endpoint configuration has been changed from its initial state (e.g. when the user has modified the user identity, or the endpoint selection policy), the OPC UA endpoint icon now indicates that by showing an additional overlay in the upper left corner.
- Object editor dialogs now contain a ">>> More" checkbox in the tab header area. When checked, an additional Serialization tab is shown. The Serialization tab shows how to create currently the edited object, including all its configured content, in C# and VB.NET.
- Added Origin field to the OPC UA PubSub dataset header and dataset data controls.
Tools and Online Services
Connectivity Explorer
- The Connectivity Explorer now has a node for OPC UA PubSub, and it allows the user to browse the relevant parts of the Publish/Subscribe model in the servers, selected dataset fields form published datasets, and display their values in the Live Point Data view.
- In various property grids, the property name in the description area is now clickable (underlined), and shows a contextual online help associated with that property. Also, a Help command has been added to the context menu on the property grids.
- Added Lock Connection action on OPC UA endpoints. It allows the user to lock or unlock the connection to the specified endpoint, assuring that the component will attempt to keep the connection open until unlocked. Endpoints nodes with locked connections are marked with a little "lock" overlay icon.
- Added a little overlay icon to OPC UA endpoint nodes that are "dirty", i.e. modified from their original state (e.g. their endpoint selection policy, or user identity, has been changed by the user).
Demo Servers and Publishers
- The public instance of OPC UA Demo Publisher now has its OPC UA PubSub configuration file available for access or download from http://opcua.demo-this.com/UADemoPublisher/UADemoPublisher-PublicDemo.uabinary.
OpcCmd Utility
- Using the new
--!inputFile|--!if <fileName>command option, it is now possible to switch the tool input to the specified file. - The .opccmd file extension is now associated with executing the file using the OpcCmd utility.
- Added
uaClient getService uaClientConnectivityControlcommand, withlockConnectionandunlockConnectionsubcommands. - Added
uaClient getService uaClientNodeRegistrationcommand, withregisterNodeandunregisterNodesubcommands. - Added
interopServices comManagementcommand, allowing the user to view and change the COM configuration, andassureSecurityInitializationsubcommand. - Added
--OutputFieldsById|-ofbioption to theuaSubscriber subscribeDataSetcommand. When used, the fields in the dataset messages are outputted with their dataset field Ids, instead of field names. - Added
--DataSetFieldId|-dsfi <guid>option to theuaSubscriber subscribeDataSetFieldcommand. The option allows to specify the dataset field Id (a GUID) of the field to be subscribed to (as an alternative to specifying the field name), when metadata is available. - Added
plugins setupcommand, allowing to access (view and modify) the setup of a specified plugin. - More dense output of trace entries, by shortening the trace event type column to a 3-letter symbol.
Examples
OPC UA Client-Server
- Added a C# example showing how to lock and unlock connections to an OPC UA server, using the new
IEasyUAClientConnectionControlservice. - Added a C# example showing how to register an unregister nodes in an OPC UA server, using the new
IEasyUAClientNodeRegistrationservice. - Added a VBScript example showing how to connections to and disconnections from the OPC UA server, using the
IEasyUAClientConnectionMonitoringservice and the event pull mechanism. - Added a VB.NET example showing how to store current state of the subscribed items in a dictionary.
- Added a C# example showing how to obtain "data nodes" under the "Objects" node, recursively.