我在opcua的世界里很新,我试图用C++中的客户端监控服务器变量。
我在1.2.2版的蛋白卡上
在节点(1,6070)的服务器中有一个布尔变量,当我运行以下代码时,会收到日志:
2021-08-03 15:27:47.442 (UTC+0200) info/session Connection 5 SecureChannel 2 SecureChannel Session ns=1;g=913a21de-f 467-5bc9-ed9e-29b27b470490订阅2 x创建了发布间隔500.00 ms的订阅。
但是,我从来没有达到'handler_events_datachange‘函数,在这个函数中,我现在只输入一个输出。(我确信节点6070中的值已被更改)
谢谢你的帮助!
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) {
}
}
发布于 2021-08-06 01:26:42
我终于发现了错误!
问题来自于没有提供自动处理异步事件的方法。但是,一些同步函数调用将触发处理,但是为了确保发生这种情况,客户机应该定期显式地调用UA_Client_run_iterate。
因此,解决方案是在while()中添加UA_Client_run_iterate(client,100)。
我不完全明白超时是怎么回事,但如果可以的话,我会完成这个答案的
https://stackoverflow.com/questions/68637076
复制相似问题