Update data nodes near real time | C++

Objective: To read the parameters from the drives and publish them near real time into the data layer further to be consumed by REST/OPC UA clients

Overall, my code tries to read parameter from the drive connected to ctrlX core. It overwrite/update the data nodes created in data layer by deregistering and registering nodes with new data inside an infinite while loop. 

Sample from my code:

 

 

 

float count = 0.5f;
tmp_count.setValue(count);
std::cout << "INFO Register node 'ocx/HMI/tmp_count'  " << std::endl;
result = provider->registerNode("ocx/HMI/tmp_count", new MyProviderNode(tmp_count));

  
std::cout << "INFO Running endless loop - end with Ctrl+C" << std::endl;
while (endProcess == false)
{
  if (provider->isConnected() == false)
  {
    std::cout << "ERROR Datalayer connection broken!" << std::endl;
    break;
  }
  count += 0.1;
  std::cout << "Setting value of tmp_count" << count << std::endl;
  comm::datalayer::DlResult res;
  res = tmp_count.setValue(count);
  std::cout << "Result after SetValue " << res.toString() << std::endl;
  res = provider->registerNode("ocx/HMI/tmp_count", new MyProviderNode(tmp_count));
  std::cout << "Result after Registering node " << res.toString() << std::endl;
  std::this_thread::sleep_for(std::chrono::milliseconds(1000));
  provider->unregisterNode("ocx/HMI/tmp_count");
}

 

 

 

Is it the correct way to overwrite the nodes ? Do we need a constantly running while loop to update nodes?Is there any better way to achieve this? 

Best reply by nickH

Hi Dave

some hints regarding your questions:

  • I would create a method for MyProviderNode called setValue() to change the value of my provided node. That's way better as deleting and creating a new node. See my screenshot:
    setValue of MyProviderNode
  • If you want to monitor nodes in the Data Layer, there is a better way then cyclic reading the variables: the Data Layer Subscription. In this case the client is only notified in case of changes, e.g. change in values. This mechanism largely reduces the amount of transferred data.
    There is also a sample for a Data Layer Subscription in C++ included in the ctrlX SDK (samples-cpp/datalayer.client.sub). 

Best regards, 

Nick

 

 

View original
1 reply