Professional OPC
Development Tools


Online Forums

Technical support is provided through Support Forums below. Anybody can view them; you need to Register/Login to our site (see links in upper right corner) in order to Post questions. You do not have to be a licensed user of our product.

Please read Rules for forum posts before reporting your issue or asking a question. OPC Labs team is actively monitoring the forums, and replies as soon as possible. Various technical information can also be found in our Knowledge Base. For your convenience, we have also assembled a Frequently Asked Questions page.

Do not use the Contact page for technical issues.

Upgrading from v2017 and dealing with breaking changes

31 Oct 2020 09:26 #9049 by support

are you absolutely sure that you have done the [AppName].exe.config thing right, for your background service? If there are more related programs, the file name should correspond to the executable that actually loads the QuickOPC components into its process. And, what about the file permissions - does the service have access rights to read this config file? The reason I am asking these questions is that we have had multiple reports about problems that occurred only under WIndows 10 version 2004, and this workaround have always worked, as far as I can tell.

Best regards

Please Log in or Create an account to join the conversation.

30 Oct 2020 13:57 #9046 by BAUMGARTNER
This helped "solve" this specific issue thank you. I do however still get a access violation error when closing the TOpcBrowseDialog but i can live with that.

So this pretty much solves the issues I had with our gui application.

I do however have yet another problem.with our backgroud agent that's actually in charge of subscribing and getting the OPC data.

I've been able to recreate it by creating a simple VCL app again and having the following code execute on a button press :
procedure TForm10.Button1Click(Sender: TObject);
  Arguments: OleVariant;
  Client: TEasyDAClient;
//  ClientEventHandlers: TSubscribeMultipleItems_ClientEventHandlers;
  HandleArray: OleVariant;
  ItemSubscriptionArguments1: _EasyDAItemSubscriptionArguments;
  ItemSubscriptionArguments2: _EasyDAItemSubscriptionArguments;
  ItemSubscriptionArguments3: _EasyDAItemSubscriptionArguments;
  ItemSubscriptionArguments4: _EasyDAItemSubscriptionArguments;
  ItemSubscriptionArguments1 := CoEasyDAItemSubscriptionArguments.Create;
  ItemSubscriptionArguments1.ServerDescriptor.ServerClass := 'OPCLabs.KitServer.2';
  ItemSubscriptionArguments1.ItemDescriptor.ItemID := 'Simulation.Random';
  ItemSubscriptionArguments1.GroupParameters.RequestedUpdateRate := 1000;
  ItemSubscriptionArguments2 := CoEasyDAItemSubscriptionArguments.Create;
  ItemSubscriptionArguments2.ServerDescriptor.ServerClass := 'OPCLabs.KitServer.2';
  ItemSubscriptionArguments2.ItemDescriptor.ItemID := 'Trends.Ramp (1 min)';
  ItemSubscriptionArguments2.GroupParameters.RequestedUpdateRate := 1000;
  ItemSubscriptionArguments3 := CoEasyDAItemSubscriptionArguments.Create;
  ItemSubscriptionArguments3.ServerDescriptor.ServerClass := 'OPCLabs.KitServer.2';
  ItemSubscriptionArguments3.ItemDescriptor.ItemID := 'Trends.Sine (1 min)';
  ItemSubscriptionArguments3.GroupParameters.RequestedUpdateRate := 1000;
  ItemSubscriptionArguments4 := CoEasyDAItemSubscriptionArguments.Create;
  ItemSubscriptionArguments4.ServerDescriptor.ServerClass := 'OPCLabs.KitServer.2';
  ItemSubscriptionArguments4.ItemDescriptor.ItemID := 'Simulation.Register_I4';
  ItemSubscriptionArguments4.GroupParameters.RequestedUpdateRate := 1000;
  Arguments := VarArrayCreate([0, 3], varVariant);
  Arguments[0] := ItemSubscriptionArguments1;
  Arguments[1] := ItemSubscriptionArguments2;
  Arguments[2] := ItemSubscriptionArguments3;
  Arguments[3] := ItemSubscriptionArguments4;
  // Instantiate the client object and hook events
  Client := TEasyDAClient.Create(nil);
//  ClientEventHandlers := TSubscribeMultipleItems_ClientEventHandlers.Create;
//  Client.OnItemChanged := ClientEventHandlers.OnItemChanged;
  TVarData(HandleArray).VType := varArray or varVariant;
  TVarData(HandleArray).VArray := PVarArray(
//  WriteLn('Processing item changed events for 1 minute...');
//  PumpSleep(60*1000);
//  WriteLn('Unsubscribing...');
//  WriteLn('Waiting for 5 seconds...');
//  PumpSleep(5*1000);
//  WriteLn('Finished.');
//  FreeAndNil(ClientEventHandlers);

That is the code I copied from here :

This code works fine on my Win 10 1909 env but fails on my Win 10 2004 env. The app just shuts down without any errror (same symptom as previous issue).

I've tried adding a [AppName].exe.config file next to it as well (with the same content as previously provided) but it didn't solve the issue.

Thanks for your help

Please Log in or Create an account to join the conversation.

29 Oct 2020 16:29 #9039 by support
This looks similar to some other issues, which were caused by the 3rd party library we use (BoxedApp SDK). We will be updating to a newest version of it (again) in the upcoming version of QuickOPC, which should hopefully resolve it.

Before that happens, a workaround might be to disable it, which is described here: .
Basically, if (for example) your application is MyApp.exe, you would create a text file named MyApp.exe.config with the contents listed below, and make sure the file is placed alongside your application.
<?xml version="1.0" encoding="utf-8"?>
    <add key="OpcLabs.EasyOpc.Implementation.Native.Assemblies.EnableVC142RedistBoxer" value="false"/>
    <add key="OpcLabs.EasyOpc.Internal.OpcPSBoxing.EnableOpcCorePSBoxer" value="false"/>
    <add key="OpcLabs.EasyOpc.UA.Toolkit.ClientServer.UAClientEngineBase.EnableUACertificateGeneratorBoxer" value="false"/>

Best regards

Please Log in or Create an account to join the conversation.

28 Oct 2020 17:08 #9035 by BAUMGARTNER
The version is

Please Log in or Create an account to join the conversation.

28 Oct 2020 16:58 #9034 by support
For this problem, I need to know the precise QuickOPC version you are using, including build number (either from the Setup screens, or right-click on any of the installed assemblies, do Properties and take it from the Details tab).

Thank you

Please Log in or Create an account to join the conversation.

28 Oct 2020 14:46 #9033 by BAUMGARTNER
I'm facing another issue now (sorry for piling them up).

My application seems to be working fine in my dev environement under Windows 10 v1909 with .NET Framework 4.8 sdk installed but fails to work on a Windows 10 v2004 environement that supposedly has .net framework 4.8 runtime built in.

I've made a basic VCL (delphi equivalent of WinForms) application, and instanciated a TOpcBrowseDialog in it and called a showdialog on it. See the code here :
procedure TForm9.Button1Click(Sender: TObject);
var BrowseDialog: TOpcBrowseDialog;
  BrowseDialog := TOpcBrowseDialog.Create(nil);

This application runs well on my 1909 env. but fails on my 2004 env. The app starts, the browsedialogs starts showing up when the button is clicked but the entire app shuts down a couple seconds after.

Please Log in or Create an account to join the conversation.

27 Oct 2020 17:05 #9031 by support
No, TUserIdentity has not been removed either. What makes you think it was removed?

Here is an example using it:

and here is the relevant part of it:
// Define which GDS we will work with.
  GdsEndpointDescriptor := CoUAEndpointDescriptor.Create;
  GdsEndpointDescriptor.UrlString := 'opc.tcp://';
  GdsEndpointDescriptor.UserIdentity.UserNameTokenInfo.UserName := 'appadmin';
  GdsEndpointDescriptor.UserIdentity.UserNameTokenInfo.Password := 'demo';
Best regards

Please Log in or Create an account to join the conversation.

27 Oct 2020 14:35 #9029 by BAUMGARTNER
Hello and thank your for your help, this is all very helpful.

However, it seems like the TUserIdentity has also been removed from this new version of UA, is that correct?
We were using this to affect the UserNameTokenInfo.Username and UserNameTokenInfo.Password properties.

Is my assumption correct? If so, what's the recommended way to do this now?

Please Log in or Create an account to join the conversation.

19 Oct 2020 14:56 #9011 by support
regarding the individual questions:

1. Yes you are right. This has been done because some COM tools were unable to pass in the proper arguments. You should wrap the PSafeArray inside an Olevariant, the change is not that difficult. The examples have been updated accordingly.

2. Yes you are right. This change is listed on . It is a string and not a number, but otherwise it has the same purpose. It was introduced because it was not generally possible to guarantee "global" uniqueness of the error codes (numbers) for different errors - but we can do that with strings.

3. _EasyUAClient (TEasyUAClient when imported as a component to Delphi) has been neither removed nor renamed. Have you imported the right type library? If you continue having problems, please describe in more details what you are doing and observing.

Best regards

Please Log in or Create an account to join the conversation.

19 Oct 2020 14:17 #9010 by BAUMGARTNER

I recently started investigating on upgrading our version of OPCLabs to the latest one in order to solve a bug related to Win10 now preventing us from installing .NET v4.5.2 (dependency of OpcLabs v2017).

Anyway, i'm facing what seems to be breaking changes introduced between then and now. Here are the one I encountered thus far :
  1. TEasyDAClient no longer has a implementation of SubscribeMultipleItems taking a PSafeArray as input, it now takes an OleVariant. We were using that implementation.
  2. _EasyDAItemChangedEventArgs no longer has an Integer « ErrorCode » Member.

    I can see it now has an sting « ErrorId » member but i’m not sure I should be treating it the same way.
  3. The entire TEasyUAClient class seems to be missing, or most likely has been renamed?, in the new version.

Thank you in advance for any guidance you can provide on solving these issues.



Please Log in or Create an account to join the conversation.

Moderators: support
Time to create page: 0.063 seconds