What's New - OPC Data Client 2020.3 (5.59)
Key changes: - Usability improvements - OPC DA under .NET Core on Windows
Download the latest version here
Targeting
- Operating systems: Windows 10 versions supported are now 1803 - 20H2.
- Visual Studio 2017 is no longer among primary development tools. We expect it to work well for most tasks, but we do not test for that.
- It is now possible to use OPC DA under .NET Core on Windows (previously, OPC DA was only available under .NET Framework or from COM).
Technology
- For .NET Standard, now using OPC Foundation UA-.NETStandard 1.4.363.107.
- Updated to BoxedApp SDK 2020.5.
Licensing
- Improved the licensing error messages. Besides more precise wording, the typical messages now contain the list of (serial numbers of) licenses that were considered but dropped, together with their "release date covered" field, which is frequently the cause for the license not being recognized.
- Added text to License Manager dialog, explaining that licenses with Active status are not necessarily valid, depending on the particular combination of the component and environment status, and that the capabilities of the component itself should be used to check the license validity.
Packaging
- Added a new assembly OpcLabs.DotProlog to the product. It is needed whenever you use OpcLabs.BaseLibForms or OpcLabs.EasyOpcForms assemblies, but it does not need to be referenced in your project.
- Modified the NuGet manifest so that under .NET Framework, the packages for .NET Standard are not unnecessarily considered as dependencies.
- Fixed the version in dependency on Microsoft Visual C++ Redistributables. The proper dependency is "Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019", from https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
- Binaries are no longer code-signed with SHA-1 (only SHA-256).
Installation and Uninstallation
- The setup log file now includes product version and build number information.
Component Improvements
- Input arguments that are materialized sequences (such as arrays, collections and lists) are now consistently checked for nullness of their elements before a method body is executed. That is, if the developer mistakenly passes in a sequence with a null element into an argument where it is not allowed, an
ArgumentNullExceptionexception will always be thrown upon method entry, and with an improved error text indicating the position (index) of the offending element.
OPC Classic
- Added method
IEasyDAClient.GetItemSubscriptionArguments. This method allows the developer to obtain the arguments used to make an item subscription. - Added method
IEasyAEClient.GetEventsSubscriptionArguments. This method allows the developer to obtain the arguments used to make events subscription. - Added an overload of
IEasyDAClient.ChangeItemSubscriptionextension method, with an argument of typeDAHandleGroupArguments. - Added explicit conversion operator from
DAVtqResulttoValueResultand their generic (typed) variants. Same functionality has the staticDAVtqResult.ToValueResultmethod (for programming languages that do not support explicit conversion operators). - Large OPC-DA requests are now "chunked", i.e. divided into smaller requests and performed sequentially. This is beneficial especially with Subscribe and Unsubscribe requests, because with many OPC servers, it allows the results be served to the client sooner. The behavior (chunk sizes, and whether the chunking will be applied to specific operation types at all) is configurable, and is managed by the new OPC-DA Optimizer plugin.
- Calls to OPC Read, Write and GetProperty operations that contain identical (except for the
Stateproperty) arguments are now merged to perform just a single Read, Write or GetProperty (request merging). This behavior can be turned off in the OPC-DA Optimizer plugin parameters. - Added (extension) method
IEasyDAClient.WaitForMultipleItems. Subscribes to the specified OPC-DA items, and monitors their data until the predicates specified for each item become true, an error occurs, or the allotted time elapses. - Added (extension) method
IEasyDAClient.WaitForMultipleItemValues. Subscribes to the specified OPC-DA items, and monitors their data until they have at least the quality specified for each item, an error occurs, or the allotted time elapses. - Added (extension) method
IEasyDAClient.WaitForItemValue. Subscribes to the specified OPC-DA item, and monitors its data until it has "good" quality, an error occurs, or the allotted time elapses. - Added (extension) methods
IEasyDAClient.SupportsTechnologyandIEasyAEClient.SupportsTechnology. Determines whether the client object supports a given OPC technology or technologies (such as OPC COM or OPC XML). - The
DANodeElementCollectionandDAPropertyElementCollectionclasses now implement theICloneableinterface. - The
AEAttributeElementCollection,AECategoryElementCollection,AEConditionElementCollectionandAENodeElementCollectionclasses now implement theICloneableinterface.
OPC UA
- Added
HasServerTimestampandHasSourceTimestampproperties to theUADataValueclass (and therefore, also to the derivedUAAttributeDataandUADataSetFieldDataclasses). These properties determine whether there is a (non-default) server or source timestamp in the data value. - Added method
IEasyUAClient.IsKnownMonitoredItemSubscriptionHandle. Determines whether the given monitored item subscription handle is known to the given client.
OPC UA Client-Server
- Added
TestEndpointextension method onIEasyUAClient. The method tests whether an operational connection can be established to the specified endpoint of an OPC UA server. - Added explicit conversion operator from
UAAttributeDataResulttoValueResultand their generic (typed) variants. Same functionality has the staticUAAttributeData.ToValueResultmethod (for programming languages that do not support explicit conversion operators). - For consistency, renamed the
Uriproperty in theResourceDescriptorclass toUrl(in line with itsUrlStringproperty). All derived classes are of course also affected - includingServerDescriptorandUAEndpointDescriptor.
OPC UA PubSub
- Added method
IEasyUASubscriber.IsKnownDataSetSubscriptionHandle. Determines whether the given data set subscription handle is known to the given subscriber. - Added
TestConnectionandTestConnectionAsyncmethods onIEasyUASubscriber. The methods test whether an OPC UA PubSub connection can be successfully established. - Added
TestSubscriptionandTestSubscriptionAsyncmethods onIEasyUASubscriber. The methods test whether an OPC UA PubSub subscription can be successfully established. - Factored out base
UADataSetHeaderclass from theUADataSetDataclass. TheUADataSetHeadercan be used e.g. to distinguish dataset data that represent different datasets. - Added
Logicalizemethod to several PubSub objects (descriptors). The method removes the physical information from the object. - Added
AllowsResolutionproperty to several PubSub objects (descriptors). The property determines whether the object has the necessary information to allow logical resolution.. - Added
HasConfigurationVersionandHasTimestampproperties to theUADataSetHeaderclass. - Added
MajorVersionDateTimeLocalandMinorVersionDateTimeLocalproperties to theUAConfigurationVersionclass. - Accompanied each string-typed
XXXXUriStringorXXXXUrlStringproperty by a corresponding Uri-typedXXXXUriorXXXXUrlproperty (only in .NET, because theUriclass is not COM-visible). - Based on UA Specification Errata 1.04, the
UAPublisherIdclass no longer allows zero numeric identifiers, or empty string identifiers.
COM Components
- Added
AddRangemethod toElasticVector. Among other uses, it can be used in Xojo to convert a keyed collection to an elastic vector, and index its elements by integers, as a workaround for Xojo inability to enumerate the collections using COM interface methodGetEnumerator. - In COM-visible objects, consistently added
SetXXXXmethods to accompany each property setter whose argument isSystem.Object. This allows such properties be set from Visual Basic 6.0 with early binding. - For COM tools (such as PHP) that do not allow to navigate between COM interfaces of an object, or provide an "amalgamated" set of members from multiple interfaces, when a specific interface is returned by a property or method, added
InteropHelperobject with theAsObjectmethod. By passing the object through this method, the consuming COM tool is forced to use late binding, allowing the intended members be accessed. - Added
AsXXXXDataTypemethods to the_DataTypeCOM interface, allowing the data type downcasting for tools like PHP. - In order to allow passing 'null' to nullable array arguments from VBScript, consistently changed corresponding argument types in COM interfaces from "Type[]" to "object".
- Added alternative date/time properties to allow milliseconds resolution in VBA in Excel, which removes the sub-seconds parts of VT_DATE values. These new properties use VT_R8 variant type instead, and provide a milliseconds resolution. The properties have the word "Double" added as postfix to their names. Most importantly, in the
UADataValueclass and its derived classesUAAttributeDataandUADataSetFieldData, you can now use theServerTimestampDouble,ServerTimestampLocalDouble,SourceTimestampDoubleandSourceTimestampLocalDoubleproperties for this purpose. In theDAVtqclass, you can now useTimestampDoubleandTimestampLocalDoubleproperties for this purpose. Other affected and enhanced classes with date/time properties are:AEConditionState,AEEventData,UABaseEventObjectandUADataSetData. - All COM methods that were returning
_Listnow return_ElasticVector(which contains all_Listmembers but does not inherit from it; the returned class,ElasticVector, implements both_Listand_ElasticVector). This change has been done to allow languages like Xojo access the_ElasticVectormembers.
Component Refactorings
OPC Classic
- The
IEasyDAClient.ReadMultipleItemValuesandReadItemValue(extension) methods no longer wait until a "non-bad" value becomes available. Instead, they simply perform a read, and an error is returned if the data do not contain valid value. The new behavior is consistent with corresponding methods in OPC UA, with method names better describing the internal working. This is potentially a breaking change (with some OPC servers). If you want the behavior similar to the past, use the newWaitForMultipleItemValuesandWaitForItemValue(extension) methods, described at other place in this article. - Moved
EnableNativeClient,EnableNetApiClient(andEnableServiceClient, not yet functional) properties fromEasyDAClientandEasyDAClientConfigurationclasses toEasyDAInstanceParametersclass. Besides other advantages, this made them available for configuration in Connectivity Explorer and OpcCmd tools. - Harmonized the base exceptions returned, between OPC DA and OPC XML-DA specifications, and also between the native and NET API client implementations. User code can now rely on the fact that the base exception for direct OPC Classic operations will be
ExtendedCOMExceptionor its derivation, and that bothErrorCode(HResult) andQualifiedNameproperties will be filled in, whenever possible. For well-known errors in COM-based OPC DA, the component automatically derives theQualifiedNamefrom theErrorCode. For well-known errors in OPC XML-DA, the component automatically derives theErrorCodefrom theQualifiedName. OPC XML-DA errors are mapped to their corresponding COM-based OPC DA counterparts, if they exist. The same harmonization is now being done also inEasyAEClient, for OPC A&E. Timeout errors that do not come from lower layers will beTimeoutExceptionor its derivation. - Parameter bucketing has been reimplemented, and is now available as part of the OPC-DA Optimizer. The
PercentDeadbandBucketsPerDecadeandUpdateRateBucketsPerDecadeproperties have been moved to theDAParameterBucketingParametersclass. TheEasyDATopicParameters.ExactManualGroupMatchproperty has been removed; useDAOptimizerPluginParameters.EnableParameterBucketingproperty instead (note the negated semantics though). - Item caching has been reimplemented, and is now available as part of the OPC-DA Optimizer. Item caching can be turned off using the
DAOptimizerPluginParameters.EnableItemCachingproperty. - Parameter restricting has been reimplemented, and is now available as part of the OPC-DA Optimizer. The related properties have been moved to the
DAParameterRestrictingParametersclass, and renamed to:FastestUpdateRate,SlowestUpdateRate,LowestPercentDadband,HighestPercentDeadband. - Auto-subscribing has been reimplemented and improved, and is now available as part of the OPC-DA Optimizer. The related properties are now available in the
DAAutoSubscribingParametersclass. The auto-subscribing is now turned off by default; set theDAOptimizerPluginParameters.EnableAutoSubscribingproperty to true to turn it on. Alternatively (for shorter code), use the newTryEnableAutoSubscribingOptimizationextension method. - Removed properties:
EasyDAEngineParameters.ClientLruSize,EasyDAEngineParameters.TopicLruSize,EasyAEEngineParameters.ClientLruSize. - The
EasyDAClientUpdateRatesclass, and theEasyDAInstanceParameters.UpdateRatesproperty have been removed. There is no need for them any more in the improved auto-subscribing optimization. - Subscription blending has been reimplemented, and is now available as part of the OPC-DA Optimizer. Subscription blending can be turned off using the
DAOptimizerPluginParameters.EnableSubscriptionBlendingproperty. - Various optimizations (performed by OPC-DA Optimizer) are now done on a specific
EasyDAClientinstance, and are not shared (global). In applications that currently use separateEasyDAClientinstances and can benefit from sharing some optimizations (such as Subscription Blending or Item Caching), consider using a commonEasyDAClientinstance. - Changed the default scheme in
ServerDescriptorfrom "opcda" to "dcom" (but both schemes still work for OPC-DA).
OPC UA
- Extended some OPC UA error messages with concrete information helpful for troubleshooting.
COM Components
- All COM methods on the main components (
EasyDAClient,EasyAEClient,EasyUAClient,EasyUASubscriber) now pump any available Windows messages upon entry to the method, when the current thread is in a single-threaded apartment (STA). It is a responsibility of the user's code to pump the messages (in an STA), but since developers are not commonly aware of it, this behavior helps to prevent memory leaks in tight loops involving the affected components.
User Interface
- Added "Server Connection Test" command to context menu on OPC UA endpoint nodes in browsing controls and dialogs. The commands attempts to make a connection to the OPC UA server using the selected endpoint, and displays the outcome. This affects user interface displayed by tools (such as in Live Mapping, or in Connection Explorer), and also the interface to the end user, such as through
UAHostAndEndpointDialog, orUABrowseControlcomponents.
Windows Forms Dialogs
- In dialogs presented by
AEAreaOrSouceDialog,DAItemDialog,OpcBrowseDialog,UABrowseDialogandUADataDialog, double-clicking on a list node that is both branch and leaf now closes the dialog, as if "OK" was pressed with focus on that node. Previously, doing so would open the node in the tree view. This behavior change also applies to the point browsing dialog in Connectivity Model (such as when selecting points for Live Binding), which is not available for programmatic usage.
Windows Forms Controls
- Added general
AutomaticValueControl, which provides "control pages" for various objects, based on specified object type, and criteria such as whether the control should be nullable, polymorphic, or read-write. - Control pages (usable by
AutomaticValueControl) made available for following OPC UA PubSub configuration objects:UASubscribeDataSetArguments,UASubscribeDataSetFilter,UADataSetSubscriptionDescriptor,UAPubSubConnectionDescriptor,UASubscriberCommunicationParameters. - Added specialized controls for several OPC UA PubSub objects:
UAVersionTimeControl,UAFieldDataDictionaryControl,UADataSetHeaderControlandUADataSetDataControl.
Instrumentation
OPC Classic
- The
EasyDAClientandEasyAEClientnow have staticLogEntryevent, and the (non-static)LogEntryevent onEasyDAClientConfigurationandEasyAEClientConfigurationis now functional. The semantics is analogous to theLogEntryevent onEasyUAClientorEasyUAClientConfiguration. Currently, events related to licensing, callback errors and queue overflows are reported. When extended tracing is enabled, log entries appear in the generated trace.
Tools and Online Services
Demo Servers and Publishers
- The simulation server for OPC DA now provides initial values also for Simulation.Register_ArrayOfXXXX items (previously, these items returned an error initially, and required an external "write" for them to return a valid value). The initial value is always an empty array.
Connectivity Explorer
- Log entries from
EasyDAClientnow appear in "Event Records" view. - Added Advanced tab to OPC-UA Attribute Point Subscribe Parameters editor. Allows the user to view and modify advanced monitoring parameters ("Queue size" and "Discard oldest") and subscription parameters ("Publishing interval" and "Priority").
- Added Edit tab to OPC-UA Attribute Point Read Parameters editor. Allows the user to view and modify the "Maximum age" and "Value only" parameters.
- Added Edit tab to OPC-UA Attribute Point Write Parameters editor. Allows the user to view and modify the "Value type code" and "Value only" parameters.
- Added Edit tab to OPC-DA Item Point Read Parameters editor. Allows the user to view and modify the "Data source", "Value age" and "Value only" parameters.
- Added Edit tab to OPC-DA Item Point Write Parameters editor. Allows the user to view and modify the "Value only" parameter.
Other
- The OPC Kit Server (OPC DA and OPC A&E simulation server) is now also available separately as a zipped file under Tool Downloads.
- ComCreateTest, a tool for quick (local) instantiation test of OPC "Classic" servers under 32-bit or 64-bit environments has been made available under Tool Downloads.
Examples
- Visual Studio example projects are now being maintained with Visual Studio 2019.
- For better optimization, changed Web-based examples (C#, VB.NET) to use a shared client instance.
Platform: COM
- Added VBA example in Excel: UACallMethodNoArguments.xlsm. Shows how to call OPC UA methods that have no arguments. Shows how to disable or enable OPC UA condition.
- Added Xojo example for OPC Data Access: Read multiple items.
- Retested the Xojo examples with Xojo 2019r3.1 and Xojo 2020r1.2.
OPC Classic
- Added larger number of C# examples, showing e.g. how to browse access paths, browse branches, browse leaves, browse properties, browse servers, read item value with specifying server's CLSID, read multiple items "from device", do many reads repeatedly, perform synchronous OPC read, read multiple item values, unsubscribe all or multiple items, write an item (including timestamp and quality), list OPC categories that the server implements, and more.
- Added C# FormsDocExamples project, with examples for user interface (showing various browsing dialogs for OPC Classic), and added these C# examples to conceptual&reference documentation.
- Added call to
TryEnableAutoSubscribingOptimizationto (C#, VB.NET) Web-based examples, to show how to enable the auto-subscribing optimization.
OPC UA Client-Server
- Added a WPF port of OPC UA Demo Application: WpfEasyOpcUADemo. This new project is available both as a pre-built application that you can run after product install, and in source form in the C# examples solution.
- Added pair of examples UAWcfService1 and UAWcfClient1 (C#): A simple Web service using WCF technology. Provides a GetData method to read a value of an OPC UA variable. Accompanied by a console-based client code.
- Added example UAWindowsService1 (C#): A Windows Service that subscribes to variables from the OPC UA sample server, and logs their changes into a file.
- Added C# example that shows how to read value of server's NamespaceArray, and display the namespace URIs in it.
- Added C# example that shows how to write an ever-incrementing value to an OPC UA variable.
- Added C# UAFormsDocExamples project, with examples for user interface (showing various browsing dialogs for OPC UA), and added these C# examples to conceptual&reference documentation.
- Added C# example that shows how to read a state of an alarm in OPC UA Alarms & Conditions.
- Added C# example that shows how to use multi-select with
UADataDialog.
OPC UA PubSub
- Added Windows Forms demo application for OPC UA PubSub (EasyOpcUAPubSubDemo) in C#. Project source code is available in the Examples solution, and compiled version of the application is installed by the Setup program. The application offers a selection of ready-made settings for various OPC UA PubSub subscription choices, and also offers a rich user interface to specify custom settings. It then allows to subscribe to datasets and display the received data dynamically.
Documentation and Help
- Documentation is no longer provided in the booklet (PDF) form.
- Made clear at multiple places that Product Option licenses (such as Excel Option or StreamInsight Option) require base product license first.
- Added a chapter documenting the existence of multiple implementations (native and NET API client for OPC Data Access), their capabilities, and how to enable and disable them.
- Improvements in the Best Practices section.
COM Components
- Documentation for all COM objects now consistently contains "Object Creation" section, with syntax for object creation in following languages or tools: C++, Free Pascal, JScript, Object Pascal (Delphi), Perl, PHP, PowerScript, Python, REALbasic (Xojo), Visual Basic (VB 6.), Visual FoxPro, VBA, VBScript, Xbase++.
- Added explanation of Xojo programming specifics, explaining how to use the
ElasticVectorfor enumeration of keyed collections.