What's new in QuickOPC 2022.2: Difference between revisions
From OPC Labs Knowledge Base
m (→Packaging) |
|||
(56 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
''Key changes: '' | ''Key changes: '' | ||
* Changes in packaging | * Changes in packaging | ||
* Tool improvements | |||
<br/> | <br/> | ||
Line 11: | Line 12: | ||
* Minimum supported .NET Framework version is now 4.7.2 (was 4.7). | * Minimum supported .NET Framework version is now 4.7.2 (was 4.7). | ||
* .NET 5.0 is no longer supported (.NET Core 3.1 and .NET 6 remain). | * .NET 5.0 is no longer supported (.NET Core 3.1 and .NET 6 remain). | ||
* Operating systems: Added Windows 10 version 22H2 and Windows 11 version 22H2. | |||
* The primary development tool is now Visual Studio 2022. Designer integration (such as toolbox controls, and Live Binding design mode) is only available for Visual Studio 2022. | * The primary development tool is now Visual Studio 2022. Designer integration (such as toolbox controls, and Live Binding design mode) is only available for Visual Studio 2022. | ||
= Technology = | = Technology = | ||
* In '''both''' the .NET Framework and .NET Standard targetings, the OPC UA code is now based on OPC Foundation .NET Stack and SDK version 1.4.368.53. The "legacy" OPC Foundation .NET stack is no longer used (previously, the .NET Framework targeting has used the "legacy" stack, while the .NET Standard targeting has used the new stack). | * <span style="background-color: powderblue;">In '''both''' the .NET Framework and .NET Standard targetings, the OPC UA code is now based on OPC Foundation .NET Stack and SDK version 1.4.368.53. The "legacy" OPC Foundation .NET stack is no longer used (previously, the .NET Framework targeting has used the "legacy" stack, while the .NET Standard targeting has used the new stack).</span> | ||
* Consequently, .NET Framework targeting gains more modern and secure codebase. There are, however, several less-frequently used features that are no longer available: | * Consequently, .NET Framework targeting gains more modern and secure codebase for OPC UA. There are, however, several less-frequently used features that are no longer available: | ||
** "User Token - Issued Token Windows Server Facet" Security Policy is not supported (basically, Windows authentication for users). | ** "User Token - Issued Token Windows Server Facet" Security Policy is not supported (basically, Windows authentication for users). | ||
** Plain HTTP protocol for OPC UA is no longer supported (HTTPS '''is''' supported, though). | ** Plain HTTP protocol for OPC UA is no longer supported (HTTPS '''is''' supported, though). | ||
Line 26: | Line 28: | ||
= Packaging = | = Packaging = | ||
* In .NET, you can no longer reference individual QuickOPC assemblies, which has been a possibility when targeting .NET Framework. Same as when targeting .NET Standard, QuickOPC is now only referenced in form of NuGet packages | * <span style="background-color: powderblue;">In .NET, you can no longer reference individual QuickOPC assemblies, which has been a possibility when targeting .NET Framework. Same as when targeting .NET Standard, QuickOPC is now only referenced in form of NuGet packages. If you are upgrading from earlier QuickOPC versions, remove the individual assembly references, and add NuGet package references instead (see User's Guide). As an exception, individual assemblies can be referenced from PowerShell or C++/CLI.</span> | ||
* A new NuGet package, '''OpcLabs.QuickOpc.Wpf''', is now available, for development of WPF applications with QuickOPC. | |||
* The installation program now also installs (and uninstalls) a QuickOPC Visual Studio extension. The extension implements the functionality of Visual Studio Toolbox items for QuickOPC components and controls. The extension is not necessary if you write the code manually, nor is it needed to build or run the code. It is only used for design-time features of QuickOPC, such as Live Binding, or the ability to instantiate components and place controls onto designer surface by dragging them from the Toolbox. The version and build of the Visual Studio extension must match precisely the version and build of QuickOPC components used; the installation program normally takes care of this. The Visual Studio extension only supports Visual Studio 2022, version 17.2 or later (32- or 64-bit). | * The installation program now also installs (and uninstalls) a QuickOPC Visual Studio extension. The extension implements the functionality of Visual Studio Toolbox items for QuickOPC components and controls. The extension is not necessary if you write the code manually, nor is it needed to build or run the code. It is only used for design-time features of QuickOPC, such as Live Binding, or the ability to instantiate components and place controls onto designer surface by dragging them from the Toolbox. The version and build of the Visual Studio extension must match precisely the version and build of QuickOPC components used; the installation program normally takes care of this. The Visual Studio extension only supports Visual Studio 2022, version 17.2 or later (32- or 64-bit). | ||
* There is one new assembly: '''OpcLabs.EasyOpcClassicCore.dll''', containing parts of what has originally been in '''OpcLabs.EasyOpcClassic.dll'''. Because your projects will now reference the NuGet package(s) and not the individual assemblies (see above), in most cases you do not need to be concerned about this change in particular, because referencing the NuGet package will automatically take care of referencing the necessary assemblies, including this one. | * There is one new assembly: '''OpcLabs.EasyOpcClassicCore.dll''', containing parts of what has originally been in '''OpcLabs.EasyOpcClassic.dll'''. Because your projects will now reference the NuGet package(s) and not the individual assemblies (see above), in most cases you do not need to be concerned about this change in particular, because referencing the NuGet package will automatically take care of referencing the necessary assemblies, including this one. | ||
Line 32: | Line 35: | ||
* Assembly binding redirection for COM components, in Excel Option, and for PowerShell development, is achieved through [[Assemblies.config files]]. | * Assembly binding redirection for COM components, in Excel Option, and for PowerShell development, is achieved through [[Assemblies.config files]]. | ||
* The '''OpcLabs.UAPubSubJson''' package is no longer necessary and no longer exists. The JSON message mapping for OPC UA PubSub is now always included automatically. | * The '''OpcLabs.UAPubSubJson''' package is no longer necessary and no longer exists. The JSON message mapping for OPC UA PubSub is now always included automatically. | ||
* ZIP packages | * ZIP packages (MQTT comunication libraries, and Pcap) are now only used for COM development. | ||
= Delivery = | = Delivery = | ||
Line 42: | Line 45: | ||
== OPC Classic == | == OPC Classic == | ||
* The {{Style=Identifier|EasyDAClient}} and {{Style=Identifier|EasyAEClient}} now support a limited form of cache persistency. The information cached for browse path and item Id resolution, which is normally kept in memory and is thus lost when the program is restarted, can now be persisted to disk and retrieved again, improving performance. This functionality is turned off by default, but can be enabled using the {{Style=Identifier|InstanceParameters}}.{{Style=Identifier|EnableCachePersistence}} property. The information is persisted per-user, and the storage place can further be distinguished by setting the {{Style=Identifier|InstanceParameters}}.{{Style=Identifier|PersistenceKey}} property. | * The {{Style=Identifier|EasyDAClient}} and {{Style=Identifier|EasyAEClient}} now support a limited form of cache persistency. The information cached for browse path and item Id resolution, which is normally kept in memory and is thus lost when the program is restarted, can now be persisted to disk and retrieved again, improving performance. This functionality is turned off by default, but can be enabled using the {{Style=Identifier|InstanceParameters}}.{{Style=Identifier|EnableCachePersistence}} property. The information is persisted per-user, and the storage place can further be distinguished by setting the {{Style=Identifier|InstanceParameters}}.{{Style=Identifier|PersistenceKey}} property. | ||
* OPC-DA 1.0 is now also supported in the NET API Client (previously, only OPC-DA 2.0 and 3.0 were supported in the NET API Client; the Native Client has supported all of them already before). | |||
* Added {{Style=Identifier|StatusInfo}} property to the {{Style=Identifier|DAVtq}} class. | |||
<!-- | <!-- | ||
== OPC Data Access and OPC XML-DA == | == OPC Data Access and OPC XML-DA == | ||
== OPC XML-DA == | == OPC XML-DA == | ||
== OPC Alarms&Events == | == OPC Alarms&Events == | ||
--> | |||
== OPC UA == | == OPC UA == | ||
* Added {{Style=Identifier|StatusInfo}} property to the {{Style=Identifier|UADataValue}} class. | |||
== OPC UA Client-Server == | == OPC UA Client-Server == | ||
* When the user is asked accept the server instance certificate, and there is a chain of errors leading to the problem with the certificate, the user is now presented with just one dialog, where all the errors are listed, instead of having to work through multiple dialogs, one for each error in the chain. | |||
* Added {{Style=Identifier|EasyUAInstanceParameters.EnableModelCaching}} property (defaults to 'true'). It determines whether the client will cache the model information obtained.<ref>The model information is used e.g. in the specialized client objects for File Transfer, or Publish-Subscribe.</ref> | |||
* The component now keeps data related to a session in memory for some time after the session has been closed ("dormant session"). This allows faster reconnection later. The period for which the session data is kept in memory after the session is closed is configurable by the {{Style=Identifier|UASmartSessionParameters.DormancyPeriod}} property. The maximum count of sessions that can be kept in the dormant state is configurable in the {{Style=Identifier|UASmartEngineParameters.MaximumDormantSessions}} property. | * The component now keeps data related to a session in memory for some time after the session has been closed ("dormant session"). This allows faster reconnection later. The period for which the session data is kept in memory after the session is closed is configurable by the {{Style=Identifier|UASmartSessionParameters.DormancyPeriod}} property. The maximum count of sessions that can be kept in the dormant state is configurable in the {{Style=Identifier|UASmartEngineParameters.MaximumDormantSessions}} property. | ||
* The preselected endpoint data are kept for some period in memory and reused, resulting in faster reconnections, because the OPC UA GetEndpoint service call is not repeated. The period defaults to 1 minute and is configurable in the {{Style=Identifier|UAClientSessionParameters.PreselectedEndpointValidityPeriod}} property. | * The preselected endpoint data are kept for some period in memory and reused, resulting in faster reconnections, because the OPC UA GetEndpoint service call is not repeated. The period defaults to 1 minute and is configurable in the {{Style=Identifier|UAClientSessionParameters.PreselectedEndpointValidityPeriod}} property. | ||
Line 62: | Line 69: | ||
== OPC UA PubSub == | == OPC UA PubSub == | ||
* The PubSub configuration can now be loaded from the file node standardized in OPC UA 1.05 (this is in addition to the vendor-specific node used by servers based on Unified Automation SDK, which has already been supported). | |||
* Added {{Style=Identifier|Address}} property to the {{Style=Identifier|UADatagramWriterGroupTransportParameters}} class. This property participates in support of UDP unicast. | |||
* Added {{Style=Identifier|SecurityKeyServices}} property to the {{Style=Identifier|UAPubSubConfigurationElement}} class. This property corresponds to '''DefaultSecurityKeyServices''' on the PubSub configuration in the OPC UA specification, and is interpreted accordingly. | |||
* Support for UDP unicast is now implement according to changes in OPC UA specification version 1.05 (making use of the information contained in TransportSettings.Address of the writer group). | |||
* With MQTT transport protocol mapping, it is no longer necessary to specify whether UADP or JSON will be used as message mapping. QuickOPC will automatically recognize the message mapping, and is able to receive both UADP and JSON messages on the same connection. For more information, see [[OPC UA PubSub Automatic Message Mapping Recognition]] and [[OPC UA PubSub Transport Profiles]]. | * With MQTT transport protocol mapping, it is no longer necessary to specify whether UADP or JSON will be used as message mapping. QuickOPC will automatically recognize the message mapping, and is able to receive both UADP and JSON messages on the same connection. For more information, see [[OPC UA PubSub Automatic Message Mapping Recognition]] and [[OPC UA PubSub Transport Profiles]]. | ||
* The MQTT transport now automatically recognizes GZipped messages (in both JSON and UADP message mappings), and uncompresses them. This feature is not in the currently released OPC UA specifications, but some publishers are using it nevertheless. | * The MQTT transport now automatically recognizes GZipped messages (in both JSON and UADP message mappings), and uncompresses them. This feature is not in the currently released OPC UA specifications, but some publishers are using it nevertheless. | ||
Line 74: | Line 85: | ||
* Added {{Style=Identifier|HasDataSetMetaData}} property to the {{Style=Identifier|UADataSetData}} class, and extended its string format so that it contains an indication whether the metadata is present or not. | * Added {{Style=Identifier|HasDataSetMetaData}} property to the {{Style=Identifier|UADataSetData}} class, and extended its string format so that it contains an indication whether the metadata is present or not. | ||
* The {{Style=Identifier|UAPublisherId}} and {{Style=Identifier|UADataSetHeader}} classes now implement the {{Style=Identifier|IComparable<>}} interface. | * The {{Style=Identifier|UAPublisherId}} and {{Style=Identifier|UADataSetHeader}} classes now implement the {{Style=Identifier|IComparable<>}} interface. | ||
* The boolean {{Style=Identifier|allowLoadFromFileNode}} argument to the {{Style=Identifier|IEasyUAPublishSubscribeClientExtension}}.{{Style=Identifier|AccessOrLoadReadOnlyConfiguration}} method has been changed to a {{Style=Identifier|pubSubConfigurationAccessMethod}} argument which allows an enumeration ({{Style=Identifier|UAPubSubConfigurationAccessMethod}}) with finer control about which methods to access the configuration are allowed or preferred. | |||
* It is now possible to subscribe to an MQTT broker, while storing a copy of the received message into a file system at the same time, e.g. for troubleshooting. For more information, see [[File-based MQTT emulation#Implicit_Usage_in_MQTT_Transport|File-based MQTT emulation - Implicit Usage in MQTT Transport]] and [[File-based MQTT emulation#Examples|File-based MQTT emulation - Examples]]. | * It is now possible to subscribe to an MQTT broker, while storing a copy of the received message into a file system at the same time, e.g. for troubleshooting. For more information, see [[File-based MQTT emulation#Implicit_Usage_in_MQTT_Transport|File-based MQTT emulation - Implicit Usage in MQTT Transport]] and [[File-based MQTT emulation#Examples|File-based MQTT emulation - Examples]]. | ||
* When specifying custom properties on PubSub objects, it is possible to shorten the commonly used namespace http://opclabs.com/OpcUA/PubSub to {OpcLabs}, using a pre-defined replacement variable. | * When specifying custom properties on PubSub objects, it is possible to shorten the commonly used namespace http://opclabs.com/OpcUA/PubSub to {OpcLabs}, using a pre-defined replacement variable. | ||
Line 108: | Line 120: | ||
= Development Productivity = | = Development Productivity = | ||
<!-- | |||
== Code Analysis == | == Code Analysis == | ||
* | --> | ||
== <span style="color:#ff0000">Visual Studio Integration</span> == | |||
* <span style="color:#ff0000">WPF design-time features are not available in this version. This affects the ability to use Visual Studio to configure Live Binding in WPF applications, and to configure properties of WPF controls. You can still use XAML editing to configure properties of WPF controls. QuickOPC still fully supports WPF in run-time, i.e. the functionality of WPF controls in run-time is not affected, and also existing applications that use WPF Live Binding run correctly. We are evaluating the feasibility of supporting the WPF design-time features in a future version.</span> | |||
* The Toolbox items that previously appeared in a single "QuickOPC" toolbox category are now divided into two categories: "QuickOPC Components" (non-visual, but including Live Binding support), and "QuickOPC Windows Forms" (controls for Windows Forms, and dialogs usable from Windows Forms and WPF). | * The Toolbox items that previously appeared in a single "QuickOPC" toolbox category are now divided into two categories: "QuickOPC Components" (non-visual, but including Live Binding support), and "QuickOPC Windows Forms" (controls for Windows Forms, and dialogs usable from Windows Forms and WPF). | ||
Line 133: | Line 147: | ||
== OpcCmd Utility == | == OpcCmd Utility == | ||
=== OPC UA Client-Server === | |||
* Added '''collectSoftwareInformation|csi''' subcommand to the '''uaClient''' command. It allows surveying the OPC UA server running on the specified endpoint for various features and capabilities. | |||
* Added '''--ValueTypeCode|-vtc''' command option to the '''uaClient write''' command. It allows specifying the type code that should be used when writing the Value attribute. | |||
* Added '''--BrowseDirections|-bd''' command option to the '''uaClient browse''' command. It allows to specify the directions of the references to return. | * Added '''--BrowseDirections|-bd''' command option to the '''uaClient browse''' command. It allows to specify the directions of the references to return. | ||
* Added '''--IncludeSubtypes|-is''' command option to the '''uaClient browse''' command. Determines whether subtypes of the specified reference type should be returned by the browsing. | |||
* Added '''--NodeClasses|-nc''' command option to the '''uaClient browse''' command. It allows to specify which node classes will be returned by the browsing. | * Added '''--NodeClasses|-nc''' command option to the '''uaClient browse''' command. It allows to specify which node classes will be returned by the browsing. | ||
* Added '''--ReferenceTypeId|-rti''' command option (multiple values) to the '''uaClient browse''' command. It allows to specify which reference types will be returned by the browsing. | |||
* The new '''--Aggregates''' ('''-a''') command option, available with '''uaClient subscribe''' command, allows to select which of the predefined aggregates will be calculated, and displayed at the end of command execution. Available aggregate is currently '''StateStatistics'''. | |||
* Added '''--EndpointSecurityPolicyDisplayName''' ('''-espdn''') option to all OPC UA commands that have an endpoint as an argument. It allows to specify the security policy using a shorter form (display name), rather than its full (and often lengthy) URL. For example, you can use '''-espdn None''' instead of '''-espu http://opcfoundation.org/UA/SecurityPolicy#None'''. | |||
* Added '''--EndpointServerCertificateByteArray''' ('''-escba''') option to all OPC UA commands that have an endpoint as an argument. It allows to specify the "raw data" (as hexadecimal string) of the server certificate, when using a synthesized endpoint. | |||
=== OPC UA PubSub === | |||
* The new '''uaSubscriber getService uaPubSubSniffer subscribeCapture''' command allows the user to "sniff" on OPC UA PubSub traffic on a PubSub connection (on a higher level than e.g. WireShark), and obtain captures indicating types of PubSub message flowing on the network, and their crucial characteristics such as publisher, writer group and dataset writer Ids. More information: [[Using OpcCmd Utility as OPC UA PubSub Sniffer]]. | * The new '''uaSubscriber getService uaPubSubSniffer subscribeCapture''' command allows the user to "sniff" on OPC UA PubSub traffic on a PubSub connection (on a higher level than e.g. WireShark), and obtain captures indicating types of PubSub message flowing on the network, and their crucial characteristics such as publisher, writer group and dataset writer Ids. More information: [[Using OpcCmd Utility as OPC UA PubSub Sniffer]]. | ||
* The '''--ShowCaptureData''' option of the '''uaPubSubSniffer subscribeCapture''' command allows to display the actual binary (UADP) or textual (JSON) data received by the transport mechanism. | * The '''--ShowCaptureData''' option of the '''uaPubSubSniffer subscribeCapture''' command allows to display the actual binary (UADP) or textual (JSON) data received by the transport mechanism. | ||
* The table of dataset header statistics, displayed at the end of '''uaSubscriber subscribeDataSet''' command execution, now also shows the rate (in messages per second) of the incoming messages. | * The table of dataset header statistics, displayed at the end of '''uaSubscriber subscribeDataSet''' command execution, now also shows the rate (in messages per second) of the incoming messages. | ||
* The table of dataset header statistics, displayed at the end of '''uaSubscriber subscribeDataSet''' command execution, is now ordered by publisher Id, writer group dataset writer Id&name, dataset class Id, and origin. | * The table of dataset header statistics, displayed at the end of '''uaSubscriber subscribeDataSet''' command execution, is now ordered by publisher Id, writer group dataset writer Id&name, dataset class Id, and origin. | ||
* The new '''-Aggregates''' ('''-a''') command option, available with '''uaSubscriber subscribeDataSet''' and '''uaPubSubSniffer subscribeCapture''' commands, allows to select which of the predefined aggregates will be calculated, and displayed at the end of command execution. Available aggregates are currently '''CaptureHeaderStatistics''', '''DataSetHeaderStatistics''', '''DataSetWriterStatistics''', '''GroupByOrigin''', '''HierarchizeByOriginPath''', '''OriginStatistics''', and '''PublisherStatistics'''. It is also possible to specify '''All''' to select all defined aggregates at once. | * The new '''--Aggregates''' ('''-a''') command option, available with '''uaSubscriber subscribeDataSet''' and '''uaPubSubSniffer subscribeCapture''' commands, allows to select which of the predefined aggregates will be calculated, and displayed at the end of command execution. Available aggregates are currently '''CaptureHeaderStatistics''', '''DataSetHeaderStatistics''', '''DataSetWriterStatistics''', '''GroupByOrigin''', '''HierarchizeByObjectIds''', '''HierarchizeByOriginPath''', '''OriginStatistics''', and '''PublisherStatistics'''. It is also possible to specify '''All''' to select all defined aggregates at once. | ||
* Added '''--DistinctHeadersOnly''' ('''-dho''') option to the '''uaSubscriber subscribeDataSet''' command. The options changes the command output so that only dataset header information is displayed, and only when a dataset with a new, distinct header is received. With this option, you can easily collect information about "who is publishing" over a period of time. | * Added '''--DistinctHeadersOnly''' ('''-dho''') option to the '''uaSubscriber subscribeDataSet''' command. The options changes the command output so that only dataset header information is displayed, and only when a dataset with a new, distinct header is received. With this option, you can easily collect information about "who is publishing" over a period of time. | ||
* Added '''--OriginPattern''' ('''-op''') option to the '''uaSubscriber subscribeDataSet''' command. It allows to specify a filtering pattern for the origin of the dataset message. The origin is e.g. a MAC address in the Ethernet transport, the IP address in the UDP transport, or the topic name in the MQTT transport. | * Added '''--OriginPattern''' ('''-op''') option to the '''uaSubscriber subscribeDataSet''' command. It allows to specify a filtering pattern for the origin of the dataset message. The origin is e.g. a MAC address in the Ethernet transport, the IP address in the UDP transport, or the topic name in the MQTT transport. | ||
* It is now possible to subscribe to an MQTT broker, while storing a copy of the received | * It is now possible to subscribe to an MQTT broker, while storing a copy of the received messages into a file system at the same time, e.g. for troubleshooting. For more information, see [[File-based MQTT emulation#Implicit_Usage_in_MQTT_Transport|File-based MQTT emulation - Implicit Usage in MQTT Transport]] and [[File-based MQTT emulation#Examples|File-based MQTT emulation - Examples]]. | ||
* | |||
=== Common === | |||
* Using a "[]" after the type code, and with element list in '{' and '}', it is now possible specify array values (e.g. for writing). | |||
* The OpcCmd Utility is now able to collect anonymous usage data that we use to improve the product. On the first run, the user is asked for consent with data collection. The consent can also be withdrawn at any time. | * The OpcCmd Utility is now able to collect anonymous usage data that we use to improve the product. On the first run, the user is asked for consent with data collection. The consent can also be withdrawn at any time. | ||
* Cache persistency (see above in this article) is turned on in the OpcCmd Utility. | * Cache persistency (see above in this article) is turned on in the OpcCmd Utility. | ||
== All Command-Line Tools == | |||
* A backslash ('\') at the end of the interactive loop input line indicates a continuation; the program will prompt for a next line to form the concatenated command line, and so on. | |||
* Added the ability to define, list, obtain and remove user command variables (using the '''!variable''' command, and its subcommands like '''get''', '''let''', '''remove''' and '''set'''). The command variables can be expanded as macros using the '''%('''''name''''')''' notation in the commands. | |||
* Added the ability to use several system command variables, such as '''%''name''''' for environment variables, '''.''' for the current directory, '''?''' for the exit code of the last command, '''^''' for the last command error (exception), and '''~''' for the last command result object. | |||
* Where previously a "typed value" was expected, it is now also possible to use '''%''variable''''', which evaluates to the value of the given user or system variable. | |||
* Added '''!execute|!x''' command, which executes a command script from a file. The default file extension for the script files is '''.opccmd'''. Arguments can be passed to the script, and they can be referred inside the script using system command variables '''1''', '''2''', '''3''', etc. The system variable '''0''' holds the filename of the current script. '''*''' expands to all script arguments (separated by spaces). '''#''' represents the number of script arguments. '''@''' expands to all script arguments represented as an array. | |||
* For table output (sequences etc.), it is now possible to specify maximum key column width and maximum value column widths, using the 'K' and 'V' format specifiers. | |||
* The tools now output a symbolic error Id with all operation errors, before the error's message text. | |||
* There is an indication in the output when the executing command has been terminated by the user. | * There is an indication in the output when the executing command has been terminated by the user. | ||
* The tools now record the command history (the command lines entered in an interactive loop), and persist it in a per-user file between the tool runs. The history can be displayed using the '''!history''' command. The entries in the history can cleared using the '''!history clear''' command, or deduplicated using the '''!history deduplicate''' command. A command line from the history can be retrieved and executing using the "^''n''" syntax, where ''n'' is the history command line number. "^-''n''" refers to the command line ''n'' lines back. "^^" refers to the previous command line (a synonym for "^-1"). "^''string''" refers to the most recent command line preceding the current position in the history list starting with ''string''. "^?''string''" refers to the most recent command line preceding the current position in the history list containing ''string''. | |||
* It is now possible to redirect the command output to a specified file using the '''--!outputFile''' command option. The output can be appended to an existing file contents by also specifying the '''--!appendOutput''' command option. The output can be written to the output file in addition to the original output destination (usually the console) using the '''-teeOutput''' command option. | |||
* Improvements to table output: better color schemes, use of styles (italics), colorization of rows based on their status, header rows with units, header title alignment. | |||
* Shortened the event output by introducing a concept of "default events". | |||
* Added '''!diagnostic collectionApplicationInfo''' command, which collects and displays information about the currently executing application. | |||
== OPC UA PubSub Formatter == | == OPC UA PubSub Formatter == | ||
Line 169: | Line 205: | ||
== OPC Classic == | == OPC Classic == | ||
* Added C# example showing how to read OPC DA items while being subscribed. | * Added C# example showing how to read OPC DA items while being subscribed. | ||
* Added C# example showing how to use event pull with multiple items. | |||
* Added C# and VB.NET examples showing how to read an OPC item that is of array type. | |||
* Added C# example showing how to store current state of the subscribed items in a dictionary. | |||
* Added C# example showing how to read OPC DA item synchronously. | |||
== OPC UA Client-Server == | == OPC UA Client-Server == | ||
* Added C# and VB.NET examples showing how to write a value that is an array. | * Added C# and VB.NET examples showing how to write a value that is an array. | ||
* Added C# example showing how to read repeatedly. | |||
* Added C# and VB.NET examples showing how to read a value from a single node that is an array of UInt16. | |||
* Added VBScript example showing how to lock and unlock a connection to an OPC UA server. | * Added VBScript example showing how to lock and unlock a connection to an OPC UA server. | ||
* Added C# example showing how to store current state of the subscribed monitored items in a dictionary. | |||
<!-- | <!-- | ||
== OPC UA PubSub == | == OPC UA PubSub == |
Latest revision as of 15:21, 28 November 2022
See also: Versions; Previous version: What's new in QuickOPC 2022.1
Internal version number: 5.70
Key changes:
- Changes in packaging
- Tool improvements
Targeting
- .NET runtimes: Added support for .NET Framework 4.8.1.
- Minimum supported .NET Framework version is now 4.7.2 (was 4.7).
- .NET 5.0 is no longer supported (.NET Core 3.1 and .NET 6 remain).
- Operating systems: Added Windows 10 version 22H2 and Windows 11 version 22H2.
- The primary development tool is now Visual Studio 2022. Designer integration (such as toolbox controls, and Live Binding design mode) is only available for Visual Studio 2022.
Technology
- In both the .NET Framework and .NET Standard targetings, the OPC UA code is now based on OPC Foundation .NET Stack and SDK version 1.4.368.53. The "legacy" OPC Foundation .NET stack is no longer used (previously, the .NET Framework targeting has used the "legacy" stack, while the .NET Standard targeting has used the new stack).
- Consequently, .NET Framework targeting gains more modern and secure codebase for OPC UA. There are, however, several less-frequently used features that are no longer available:
- "User Token - Issued Token Windows Server Facet" Security Policy is not supported (basically, Windows authentication for users).
- Plain HTTP protocol for OPC UA is no longer supported (HTTPS is supported, though).
- The OPC UA Certificate Generator, a standalone executable that has been invoked in .NET Framework behind the scenes (and automatically "boxed" with the library so that the users do not have to install it separately), is no longer used.
- Security policies Aes128-Sha256-RsaOaep and Aes256-Sha256-RsaPss are now also available when targeting .NET Framework, and for COM and Excel development.
Licensing
- Since the new OPC Foundation UA stack is now always used (also in .NET Framework and for COM development), be prepared for the fact that there is a higher number of dependent packages, and you need to review and accept their licenses.
- When validity check fails (LicenseException), the component now writes a warning entry into the Windows event log, with details about the failure. This helps troubleshoot licensing problems in case the application itself does not provide good enough means to observe the error message.
Packaging
- In .NET, you can no longer reference individual QuickOPC assemblies, which has been a possibility when targeting .NET Framework. Same as when targeting .NET Standard, QuickOPC is now only referenced in form of NuGet packages. If you are upgrading from earlier QuickOPC versions, remove the individual assembly references, and add NuGet package references instead (see User's Guide). As an exception, individual assemblies can be referenced from PowerShell or C++/CLI.
- A new NuGet package, OpcLabs.QuickOpc.Wpf, is now available, for development of WPF applications with QuickOPC.
- The installation program now also installs (and uninstalls) a QuickOPC Visual Studio extension. The extension implements the functionality of Visual Studio Toolbox items for QuickOPC components and controls. The extension is not necessary if you write the code manually, nor is it needed to build or run the code. It is only used for design-time features of QuickOPC, such as Live Binding, or the ability to instantiate components and place controls onto designer surface by dragging them from the Toolbox. The version and build of the Visual Studio extension must match precisely the version and build of QuickOPC components used; the installation program normally takes care of this. The Visual Studio extension only supports Visual Studio 2022, version 17.2 or later (32- or 64-bit).
- There is one new assembly: OpcLabs.EasyOpcClassicCore.dll, containing parts of what has originally been in OpcLabs.EasyOpcClassic.dll. Because your projects will now reference the NuGet package(s) and not the individual assemblies (see above), in most cases you do not need to be concerned about this change in particular, because referencing the NuGet package will automatically take care of referencing the necessary assemblies, including this one.
- For COM developers, there is one new type library, OpcLabs.EasyOpcClassicCore.tlb, which needs to be used in addition to OpcLabs.EasyOpcClassic.tlb.
- Assembly binding redirection for COM components, in Excel Option, and for PowerShell development, is achieved through Assemblies.config files.
- The OpcLabs.UAPubSubJson package is no longer necessary and no longer exists. The JSON message mapping for OPC UA PubSub is now always included automatically.
- ZIP packages (MQTT comunication libraries, and Pcap) are now only used for COM development.
Delivery
- The NuGet packages, besides being available on https://www.nuget.org as before, are now also installed by the Setup program, and can be used to set up a local NuGet feed.
Installation and Uninstallation
- The option to install the assemblies into GAC (Global Assembly Cache) is no longer available.
Component Improvements
OPC Classic
- The EasyDAClient and EasyAEClient now support a limited form of cache persistency. The information cached for browse path and item Id resolution, which is normally kept in memory and is thus lost when the program is restarted, can now be persisted to disk and retrieved again, improving performance. This functionality is turned off by default, but can be enabled using the InstanceParameters.EnableCachePersistence property. The information is persisted per-user, and the storage place can further be distinguished by setting the InstanceParameters.PersistenceKey property.
- OPC-DA 1.0 is now also supported in the NET API Client (previously, only OPC-DA 2.0 and 3.0 were supported in the NET API Client; the Native Client has supported all of them already before).
- Added StatusInfo property to the DAVtq class.
OPC UA
- Added StatusInfo property to the UADataValue class.
OPC UA Client-Server
- When the user is asked accept the server instance certificate, and there is a chain of errors leading to the problem with the certificate, the user is now presented with just one dialog, where all the errors are listed, instead of having to work through multiple dialogs, one for each error in the chain.
- Added EasyUAInstanceParameters.EnableModelCaching property (defaults to 'true'). It determines whether the client will cache the model information obtained.[1]
- The component now keeps data related to a session in memory for some time after the session has been closed ("dormant session"). This allows faster reconnection later. The period for which the session data is kept in memory after the session is closed is configurable by the UASmartSessionParameters.DormancyPeriod property. The maximum count of sessions that can be kept in the dormant state is configurable in the UASmartEngineParameters.MaximumDormantSessions property.
- The preselected endpoint data are kept for some period in memory and reused, resulting in faster reconnections, because the OPC UA GetEndpoint service call is not repeated. The period defaults to 1 minute and is configurable in the UAClientSessionParameters.PreselectedEndpointValidityPeriod property.
- Made the connection process quicker by delaying the creation of status subscription (used for monitoring the server status).
- Optimized the number of Read service calls needed upon a connection to an OPC UA server.
- Added AllHierarchicalReferences static property to the UABrowseParameters class. It contains the parameters used for browsing all hierarchical references in the address space.
- Added ConfiguredTokenInfoCount to the UserIdentity class (returns the number of configured token infos in the given user identity).
OPC UA PubSub
- The PubSub configuration can now be loaded from the file node standardized in OPC UA 1.05 (this is in addition to the vendor-specific node used by servers based on Unified Automation SDK, which has already been supported).
- Added Address property to the UADatagramWriterGroupTransportParameters class. This property participates in support of UDP unicast.
- Added SecurityKeyServices property to the UAPubSubConfigurationElement class. This property corresponds to DefaultSecurityKeyServices on the PubSub configuration in the OPC UA specification, and is interpreted accordingly.
- Support for UDP unicast is now implement according to changes in OPC UA specification version 1.05 (making use of the information contained in TransportSettings.Address of the writer group).
- With MQTT transport protocol mapping, it is no longer necessary to specify whether UADP or JSON will be used as message mapping. QuickOPC will automatically recognize the message mapping, and is able to receive both UADP and JSON messages on the same connection. For more information, see OPC UA PubSub Automatic Message Mapping Recognition and OPC UA PubSub Transport Profiles.
- The MQTT transport now automatically recognizes GZipped messages (in both JSON and UADP message mappings), and uncompresses them. This feature is not in the currently released OPC UA specifications, but some publishers are using it nevertheless.
- The JSON message mapping now also accepts transport messages that are (incorrectly) formatted as an array of network messages, in order to better cope with non-standard publishers like Azure Industrial IoT Platform.
- Added a boolean Retain property to the UADataSetHeader class. Determines whether the dataset message is retained by the server (MQTT).
- Retained messages (MQTT) are now automatically "replayed" on all new subscriptions (and not just the first one), even if the MQTT subscription to a particular topic is shared among multiple readers.
- The key/delta frame assembly algorithm has been improved. If dataset metadata is available, the algorithm can now release a dataset message even when no key frame has been received, but it recognizes that the data from received delta frames make up a full frame.
- Added OriginPattern property to the UASubscribeDataSetFilter class. It allows to specify a filtering pattern for the origin of the dataset message. The origin is e.g. a MAC address in the Ethernet transport, the IP address in the UDP transport, or the topic name in the MQTT transport.
- Added MessageMappingName property to the UADataSetHeader class. Contains the name of the message mapping ("Json" or "Uadp"), if known.
- Added Signed and Encrypted properties to the UADataSetHeader class. The properties determine whether the received data was signed and/or encrypted.
- Added Compressed property to the UADataSetHeader class. The property determines whether the received data was compressed (GZip in MQTT transport).
- Added HasDataSetMetaData property to the UADataSetData class, and extended its string format so that it contains an indication whether the metadata is present or not.
- The UAPublisherId and UADataSetHeader classes now implement the IComparable<> interface.
- The boolean allowLoadFromFileNode argument to the IEasyUAPublishSubscribeClientExtension.AccessOrLoadReadOnlyConfiguration method has been changed to a pubSubConfigurationAccessMethod argument which allows an enumeration (UAPubSubConfigurationAccessMethod) with finer control about which methods to access the configuration are allowed or preferred.
- It is now possible to subscribe to an MQTT broker, while storing a copy of the received message into a file system at the same time, e.g. for troubleshooting. For more information, see File-based MQTT emulation - Implicit Usage in MQTT Transport and File-based MQTT emulation - Examples.
- When specifying custom properties on PubSub objects, it is possible to shorten the commonly used namespace http://opclabs.com/OpcUA/PubSub to {OpcLabs}, using a pre-defined replacement variable.
- Using the 'keyPartsDirectory' named value in the 'static' security key source URI, it is now possible to specify the directory where files defining the static key (signingKey.key, encryptKey.key, keyNonce.key) reside (key storage format used by Systerel S2OPC).
Performance
- The EasyDAClient and EasyUAClient components perform a hidden internal "warm-up" operation upon their first instantiation, improving performance of a subsequent user-initiated operation in some cases.
Development Productivity
Visual Studio Integration
- WPF design-time features are not available in this version. This affects the ability to use Visual Studio to configure Live Binding in WPF applications, and to configure properties of WPF controls. You can still use XAML editing to configure properties of WPF controls. QuickOPC still fully supports WPF in run-time, i.e. the functionality of WPF controls in run-time is not affected, and also existing applications that use WPF Live Binding run correctly. We are evaluating the feasibility of supporting the WPF design-time features in a future version.
- The Toolbox items that previously appeared in a single "QuickOPC" toolbox category are now divided into two categories: "QuickOPC Components" (non-visual, but including Live Binding support), and "QuickOPC Windows Forms" (controls for Windows Forms, and dialogs usable from Windows Forms and WPF).
Application Deployment
- The Production Installer is no longer intended to be used for .NET applications (.NET Framework, .NET Core, .NET 6+); it is meant to be used for COM applications or Excel Option deployment. This is because the assembly referencing model has been abandoned in favor of NuGet package references (see Packaging), and the set of assemblies required is no longer static, including their versions, and the binding redirects needed to support them. The only usable part from the Production installer for .NET applications is the LMConsole utility, and that can be invoked separately, which means that the use of Production Installer would be an overkill.
- Installing QuickOPC assemblies into the GAC is no longer supported and we recommend against it.
- When deploying the COM component files (for COM applications or Excel Option), an additional assemblies.config file (provided together with the assembly .dll-s) has to be deployed alongside the assembly .dll-s.
Tools and Online Services
Connectivity Explorer
- OPC UA discovery endpoints with unsupported scheme (http) are displayed with strike-through font. The reason for the strike-out is explained in the node tooltip.
- OPC UA session endpoints with obsolete security policies (such as Basic128Rsa15 or Basic256) are displayed with strike-through font. The reason for the strike-out is explained in the node tooltip.
- The Connectivity Explorer is now able to collect anonymous usage data that we use to improve the product. On the first run, the user is asked for consent with data collection. The consent can also be withdrawn at any time.
- Cache persistency (see above in this article) is turned on in Connectivity Explorer.
Demo Servers and Publishers
- In UADemoPublisher, specifying a "file:" scheme with MQTT transport automatically selects the File-based MQTT emulation, i.e. the generated messages will be stored in form of files in directories of the physical file system.
- In UADemoPublisher, it is possible to publish to a "real" MQTT broker, while storing a copy of the generated message into a file system at the same time. For more information, see File-based MQTT emulation - Implicit Usage in MQTT Transport and File-based MQTT emulation - Examples.
OpcCmd Utility
OPC UA Client-Server
- Added collectSoftwareInformation|csi subcommand to the uaClient command. It allows surveying the OPC UA server running on the specified endpoint for various features and capabilities.
- Added --ValueTypeCode|-vtc command option to the uaClient write command. It allows specifying the type code that should be used when writing the Value attribute.
- Added --BrowseDirections|-bd command option to the uaClient browse command. It allows to specify the directions of the references to return.
- Added --IncludeSubtypes|-is command option to the uaClient browse command. Determines whether subtypes of the specified reference type should be returned by the browsing.
- Added --NodeClasses|-nc command option to the uaClient browse command. It allows to specify which node classes will be returned by the browsing.
- Added --ReferenceTypeId|-rti command option (multiple values) to the uaClient browse command. It allows to specify which reference types will be returned by the browsing.
- The new --Aggregates (-a) command option, available with uaClient subscribe command, allows to select which of the predefined aggregates will be calculated, and displayed at the end of command execution. Available aggregate is currently StateStatistics.
- Added --EndpointSecurityPolicyDisplayName (-espdn) option to all OPC UA commands that have an endpoint as an argument. It allows to specify the security policy using a shorter form (display name), rather than its full (and often lengthy) URL. For example, you can use -espdn None instead of -espu http://opcfoundation.org/UA/SecurityPolicy#None.
- Added --EndpointServerCertificateByteArray (-escba) option to all OPC UA commands that have an endpoint as an argument. It allows to specify the "raw data" (as hexadecimal string) of the server certificate, when using a synthesized endpoint.
OPC UA PubSub
- The new uaSubscriber getService uaPubSubSniffer subscribeCapture command allows the user to "sniff" on OPC UA PubSub traffic on a PubSub connection (on a higher level than e.g. WireShark), and obtain captures indicating types of PubSub message flowing on the network, and their crucial characteristics such as publisher, writer group and dataset writer Ids. More information: Using OpcCmd Utility as OPC UA PubSub Sniffer.
- The --ShowCaptureData option of the uaPubSubSniffer subscribeCapture command allows to display the actual binary (UADP) or textual (JSON) data received by the transport mechanism.
- The table of dataset header statistics, displayed at the end of uaSubscriber subscribeDataSet command execution, now also shows the rate (in messages per second) of the incoming messages.
- The table of dataset header statistics, displayed at the end of uaSubscriber subscribeDataSet command execution, is now ordered by publisher Id, writer group dataset writer Id&name, dataset class Id, and origin.
- The new --Aggregates (-a) command option, available with uaSubscriber subscribeDataSet and uaPubSubSniffer subscribeCapture commands, allows to select which of the predefined aggregates will be calculated, and displayed at the end of command execution. Available aggregates are currently CaptureHeaderStatistics, DataSetHeaderStatistics, DataSetWriterStatistics, GroupByOrigin, HierarchizeByObjectIds, HierarchizeByOriginPath, OriginStatistics, and PublisherStatistics. It is also possible to specify All to select all defined aggregates at once.
- Added --DistinctHeadersOnly (-dho) option to the uaSubscriber subscribeDataSet command. The options changes the command output so that only dataset header information is displayed, and only when a dataset with a new, distinct header is received. With this option, you can easily collect information about "who is publishing" over a period of time.
- Added --OriginPattern (-op) option to the uaSubscriber subscribeDataSet command. It allows to specify a filtering pattern for the origin of the dataset message. The origin is e.g. a MAC address in the Ethernet transport, the IP address in the UDP transport, or the topic name in the MQTT transport.
- It is now possible to subscribe to an MQTT broker, while storing a copy of the received messages into a file system at the same time, e.g. for troubleshooting. For more information, see File-based MQTT emulation - Implicit Usage in MQTT Transport and File-based MQTT emulation - Examples.
Common
- Using a "[]" after the type code, and with element list in '{' and '}', it is now possible specify array values (e.g. for writing).
- The OpcCmd Utility is now able to collect anonymous usage data that we use to improve the product. On the first run, the user is asked for consent with data collection. The consent can also be withdrawn at any time.
- Cache persistency (see above in this article) is turned on in the OpcCmd Utility.
All Command-Line Tools
- A backslash ('\') at the end of the interactive loop input line indicates a continuation; the program will prompt for a next line to form the concatenated command line, and so on.
- Added the ability to define, list, obtain and remove user command variables (using the !variable command, and its subcommands like get, let, remove and set). The command variables can be expanded as macros using the %(name) notation in the commands.
- Added the ability to use several system command variables, such as %name for environment variables, . for the current directory, ? for the exit code of the last command, ^ for the last command error (exception), and ~ for the last command result object.
- Where previously a "typed value" was expected, it is now also possible to use %variable, which evaluates to the value of the given user or system variable.
- Added !execute|!x command, which executes a command script from a file. The default file extension for the script files is .opccmd. Arguments can be passed to the script, and they can be referred inside the script using system command variables 1, 2, 3, etc. The system variable 0 holds the filename of the current script. * expands to all script arguments (separated by spaces). # represents the number of script arguments. @ expands to all script arguments represented as an array.
- For table output (sequences etc.), it is now possible to specify maximum key column width and maximum value column widths, using the 'K' and 'V' format specifiers.
- The tools now output a symbolic error Id with all operation errors, before the error's message text.
- There is an indication in the output when the executing command has been terminated by the user.
- The tools now record the command history (the command lines entered in an interactive loop), and persist it in a per-user file between the tool runs. The history can be displayed using the !history command. The entries in the history can cleared using the !history clear command, or deduplicated using the !history deduplicate command. A command line from the history can be retrieved and executing using the "^n" syntax, where n is the history command line number. "^-n" refers to the command line n lines back. "^^" refers to the previous command line (a synonym for "^-1"). "^string" refers to the most recent command line preceding the current position in the history list starting with string. "^?string" refers to the most recent command line preceding the current position in the history list containing string.
- It is now possible to redirect the command output to a specified file using the --!outputFile command option. The output can be appended to an existing file contents by also specifying the --!appendOutput command option. The output can be written to the output file in addition to the original output destination (usually the console) using the -teeOutput command option.
- Improvements to table output: better color schemes, use of styles (italics), colorization of rows based on their status, header rows with units, header title alignment.
- Shortened the event output by introducing a concept of "default events".
- Added !diagnostic collectionApplicationInfo command, which collects and displays information about the currently executing application.
OPC UA PubSub Formatter
- Allowed public access to updates resulting from OPC UA specification 1.05.01 (new DataSetWriterName and ReversibleFieldEncoding flags).
- Split the output pane to Data and Metadata tabs. The new Metadata tab shows the formatted JSON metadata (discovery) messages that would be generated for the selected datasets.
Product Options
StreamInsight Option
- The StreamInsight Option is no longer available as a separate product option. The functionality is, however, preserved in the product, and the supporting classes have been moved to product core assemblies. StreamInsight development no longer requires a dedicated license for the product option, but can now be done with any license that supports Reactive Programming Model. The documentation topics related to the former StreamInsight Option have been moved into a "StreamInsight Extensions" chapter under the "Layered Extensions for .NET" part of the User's Guide.
Examples
- Examples in Visual Studio 2019 have been converted to Visual Studio 2022 (Visual Studio 2019 may still work, but we do not test for that).
Platform: .NET
- Separate example solutions for .NET Framework and .NET Core/.NET 6+ have been merged. Inside the merged solutions, some projects target .NET Framework, some projects target .NET Core/.NET 6+, and some target both.
OPC Classic
- Added C# example showing how to read OPC DA items while being subscribed.
- Added C# example showing how to use event pull with multiple items.
- Added C# and VB.NET examples showing how to read an OPC item that is of array type.
- Added C# example showing how to store current state of the subscribed items in a dictionary.
- Added C# example showing how to read OPC DA item synchronously.
OPC UA Client-Server
- Added C# and VB.NET examples showing how to write a value that is an array.
- Added C# example showing how to read repeatedly.
- Added C# and VB.NET examples showing how to read a value from a single node that is an array of UInt16.
- Added VBScript example showing how to lock and unlock a connection to an OPC UA server.
- Added C# example showing how to store current state of the subscribed monitored items in a dictionary.
Excel Option
- The demo worksheet for the Excel Option now contains "error cells". In case of an error, they show the associated error message - one for each OPC specification supported.
- ↑ The model information is used e.g. in the specialized client objects for File Transfer, or Publish-Subscribe.