cancel
Showing results for 
Search instead for 
Did you mean: 
SOLVED

Update data nodes near real time | C++

Update data nodes near real time | C++

AkashDve
Member

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? 

1 REPLY 1

nickH
Community Moderator
Community Moderator

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 MyProviderNodesetValue 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

 

 

Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist