问题描述
我对 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 (将#修改为@)