OPC-UA - open62541 - 帮助理解 UA_Client_MonitoredItems_createDataChange

问题描述

我对 OPC-UA 比较陌生,并尝试使用 open62541 制作客户端,服务器上有一个节点正在监控,当服务器告诉客户端值发生变化时,它应该运行一个函数,给出为 *语境。 我遇到的问题是当我给它不同的功能时,它会尝试在所有监视器项目上运行最后一个给定的功能。在我的示例中,它还会尝试将 double 值打印为 int。

我的代码是这样的:

main.cpp:

void getGeneric(int data){
std::cout << data << std::endl;

}

void getGeneric1(double data){
std::cout << data << std::endl;

}

int main() {

OpcuaClient opcclient("127.0.0.1");

opcclient.onValueChanged<double>("NodeId1",getGeneric1);
opcclient.onValueChanged<int>("NodeId2",getGeneric);

while(true) {
UA_Client_run_iterate(mClient,200);
}
}

OpcuaClient.h:

template<typename T>
void onValueChanged(const std::string& startingNodeIdentifier,std::function<void(T)> handler) {


  UA_MonitoredItemCreateRequest monRequest =
     UA_MonitoredItemCreateRequest_default(getNode(startingNodeIdentifier));

  UA_MonitoredItemCreateResult monResponse =
     UA_Client_MonitoredItems_createDataChange(mClient,mSubscriptionId,UA_TIMESTAMPSTORETURN_BOTH,monRequest,handler,[](UA_Client *client,UA_UInt32 subId,void *subContext,UA_UInt32 monId,void 
     *monContext,UA_DataValue *data){

       UA_Variant dataVariant = data->value;

       T value;
       value = *(T *)dataVariant.data;

       std::function<void(T)> monitorHandler = 
          (*static_cast<std::function<void(T)>*>(monContext));
       monitorHandler(*(T *) dataVariant.data);
},NULL);
}

如果有人能看到我做错了什么或告诉我我是否做错了。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)