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.
- Forum
- Discussions
- QuickOPC-Classic in COM
- Reading, Writing, Subscriptions, Property Access
- Upgrading from v2017 and dealing with breaking changes
Upgrading from v2017 and dealing with breaking changes
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.
- BAUMGARTNER
- Topic Author
- Offline
- Premium Member
- Posts: 14
- Thank you received: 1
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);
var
Arguments: OleVariant;
Client: TEasyDAClient;
// ClientEventHandlers: TSubscribeMultipleItems_ClientEventHandlers;
HandleArray: OleVariant;
ItemSubscriptionArguments1: _EasyDAItemSubscriptionArguments;
ItemSubscriptionArguments2: _EasyDAItemSubscriptionArguments;
ItemSubscriptionArguments3: _EasyDAItemSubscriptionArguments;
ItemSubscriptionArguments4: _EasyDAItemSubscriptionArguments;
begin
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(
Client.SubscribeMultipleItems(Arguments));
// WriteLn('Processing item changed events for 1 minute...');
// PumpSleep(60*1000);
// WriteLn('Unsubscribing...');
Client.UnsubscribeAllItems;
// WriteLn('Waiting for 5 seconds...');
// PumpSleep(5*1000);
// WriteLn('Finished.');
FreeAndNil(Client);
// FreeAndNil(ClientEventHandlers);
end;
That is the code I copied from here : opclabs.doc-that.com/files/onlinedocs/QuickOpc/Latest/User%2...tml#i-tab-content-ObjectPascal
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.
Before that happens, a workaround might be to disable it, which is described here: kb.opclabs.com/How_to_disable_prerequisites_boxing .
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"?>
<configuration>
<appSettings>
<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"/>
</appSettings>
</configuration>
Best regards
Please Log in or Create an account to join the conversation.
- BAUMGARTNER
- Topic Author
- Offline
- Premium Member
- Posts: 14
- Thank you received: 1
Please Log in or Create an account to join the conversation.
Thank you
Please Log in or Create an account to join the conversation.
- BAUMGARTNER
- Topic Author
- Offline
- Premium Member
- Posts: 14
- Thank you received: 1
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;
begin
BrowseDialog := TOpcBrowseDialog.Create(nil);
BrowseDialog.ShowDialog(nil);
end;
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.
Here is an example using it: opclabs.doc-that.com/files/onlinedocs/QuickOpc/Latest/User%2...ind%20all%20registrations.html
and here is the relevant part of it:
// Define which GDS we will work with.
GdsEndpointDescriptor := CoUAEndpointDescriptor.Create;
GdsEndpointDescriptor.UrlString := 'opc.tcp://opcua.demo-this.com:58810/GlobalDiscoveryServer';
GdsEndpointDescriptor.UserIdentity.UserNameTokenInfo.UserName := 'appadmin';
GdsEndpointDescriptor.UserIdentity.UserNameTokenInfo.Password := 'demo';
Please Log in or Create an account to join the conversation.
- BAUMGARTNER
- Topic Author
- Offline
- Premium Member
- Posts: 14
- Thank you received: 1
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.
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 kb.opclabs.com/What%27s_new_in_QuickOPC_2020.1#Component_Refactorings . 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.
- BAUMGARTNER
- Topic Author
- Offline
- Premium Member
- Posts: 14
- Thank you received: 1
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 :
- TEasyDAClient no longer has a implementation of SubscribeMultipleItems taking a PSafeArray as input, it now takes an OleVariant. We were using that implementation.
- _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. - 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.
Regards,
Mathieu
Please Log in or Create an account to join the conversation.
- Forum
- Discussions
- QuickOPC-Classic in COM
- Reading, Writing, Subscriptions, Property Access
- Upgrading from v2017 and dealing with breaking changes