0

I'm quite new in the opcua's world and I'm trying to monitor a server variable with a client in C++.

I'm on the 1.2.2 version of opcua

I have a boolean variable in the server at the node (1,6070) and when I run the following code I receive the LOG :

[2021-08-03 15:27:47.442 (UTC+0200)] info/session Connection 5 | SecureChannel 2 | Session ns=1;g=913a21de-f467-5bc9-ed9e-29b27b470490 | Subscription 2 | Created the Subscription with a publishing interval of 500.00 ms

But I've never reach the function 'handler_events_datachange' in which I only put an output for now. (I'm sure that the value in the node 6070 changed btw)

Thanks for helping!

int main(void) {
   signal(SIGINT, stopHandler); /* catches ctrl-c */

   UA_Client *client = UA_Client_new();
   UA_ClientConfig *cc = UA_Client_getConfig(client);
   UA_ClientConfig_setDefault(cc);

   UA_Client_connect(client, "opc.tcp://localhost");

   UA_MonitoredItemCreateResult result;
   UA_CreateSubscriptionResponse response; // warning memory leak
   UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();

   UA_Client_Subscriptions_create(client, request, NULL, NULL,  NULL);
   UA_Int32 subId = response.subscriptionId;

   if(response.responseHeader.serviceResult == UA_STATUSCODE_GOOD)
   {
      UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND ,  "subscription succed");
   } else {
      UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND ,  "subscription UNsucced");
   }

   UA_MonitoredItemCreateRequest monRequest = UA_MonitoredItemCreateRequest_default(UA_NODEID_NUMERIC(1, 6070));

   result = UA_Client_MonitoredItems_createDataChange(client, subId, UA_TIMESTAMPSTORETURN_BOTH, monRequest, NULL, handler_events_datachange, NULL);

   while(running) {
    
   }
}
greg
  • 46
  • 4

1 Answers1

0

I finally found the error !

The problem comme from the fact no means of handling asynchronous events automatically is provided. However, some synchronous function calls will trigger handling, but to ensure this happens a client should periodically call UA_Client_run_iterate explicitly.

So the solution is to add UA_Client_run_iterate(client,100) in the while().

I didn't fully understand what the timeout was about but I'll complete this answer if I can

greg
  • 46
  • 4