OPC-UA open62541 sdk 运行 服务器后动态添加变量节点
OPC-UA open62541 sdk Add Variable nodes dynamically after run the server
阅读OPC-UA基金会和OPC-UA open62541 sdk的文档和示例,变量节点总是添加在启动运行服务器的语句之前。 是否可以在服务器启动后添加它们?如果我更改不起作用的语句的顺序。
和我一起思考以下情况:我需要在我们异步启动 运行ing application/software(不是服务器)后立即执行一些 http 请求。然后服务器启动,我的http请求完成后,我根据网络返回的信息添加了变量节点。
我在代码上添加了一些注释以阐明我正在尝试做什么。
int main() {
signal(SIGINT, stopHandler);
signal(SIGTERM, stopHandler);
UA_ServerConfig *config = UA_ServerConfig_new_default();
UA_Server *server = UA_Server_new(config);
// If I put this statement after the other statement:
// UA_StatusCode retval = UA_Server_run(server, &running);
// The variables are not added.
addVariable(server);
// I would like to add some variables nodes after this statement,
// for example, like I said I request some information online
// and I will add the nodes after return from this request asynchronous.
UA_StatusCode retval = UA_Server_run(server, &running);
UA_Server_delete(server);
UA_ServerConfig_delete(config);
return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
}
可能有解决方案,但必须由 OPC UA 客户端触发。
OPC UA 规范定义了一些服务以允许客户端 adding/deleting 个节点或引用(AddNodes
、AddRefererences
、DeleteNodes
、DeleteReferences
)
您的 OPC UA 客户端和服务器都需要支持这些服务。
是的,可以使用 UA_Server_addVariableNode
,因为您已经(可能)在 addVariable()
中使用它。我猜你的代码是基于 https://github.com/open62541/open62541/blob/master/examples/tutorial_server_variable.c
因为
,简单地重新排序代码是行不通的
UA_StatusCode retval = UA_Server_run(server, &running);
正在阻塞。
您需要更改此设置以使用迭代方法:
UA_StatusCode retval = UA_Server_run_startup(server);
if(retval != UA_STATUSCODE_GOOD)
return 1;
while(running) {
UA_UInt16 timeout = UA_Server_run_iterate(server, waitInternal);
// HERE you can add any node to the server you like.
// e.g. call addVariable2().
// Make sure that you only call it once in the loop.
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = timeout * 1000;
select(0, NULL, NULL, NULL, &tv);
}
retval = UA_Server_run_shutdown(server);
注意open62541目前不支持多线程。如果要在另一个线程中添加变量,则需要确保互斥对 server
对象的访问。
以上示例基于:
https://github.com/open62541/open62541/blob/master/examples/server_mainloop.c
另一种方法是启动另一个线程来处理您的异步请求,然后在分离的线程中调用 UA_Server_addVariableNode
。仍然确保您使用的是互斥锁。
阅读OPC-UA基金会和OPC-UA open62541 sdk的文档和示例,变量节点总是添加在启动运行服务器的语句之前。 是否可以在服务器启动后添加它们?如果我更改不起作用的语句的顺序。
和我一起思考以下情况:我需要在我们异步启动 运行ing application/software(不是服务器)后立即执行一些 http 请求。然后服务器启动,我的http请求完成后,我根据网络返回的信息添加了变量节点。
我在代码上添加了一些注释以阐明我正在尝试做什么。
int main() {
signal(SIGINT, stopHandler);
signal(SIGTERM, stopHandler);
UA_ServerConfig *config = UA_ServerConfig_new_default();
UA_Server *server = UA_Server_new(config);
// If I put this statement after the other statement:
// UA_StatusCode retval = UA_Server_run(server, &running);
// The variables are not added.
addVariable(server);
// I would like to add some variables nodes after this statement,
// for example, like I said I request some information online
// and I will add the nodes after return from this request asynchronous.
UA_StatusCode retval = UA_Server_run(server, &running);
UA_Server_delete(server);
UA_ServerConfig_delete(config);
return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
}
可能有解决方案,但必须由 OPC UA 客户端触发。
OPC UA 规范定义了一些服务以允许客户端 adding/deleting 个节点或引用(AddNodes
、AddRefererences
、DeleteNodes
、DeleteReferences
)
您的 OPC UA 客户端和服务器都需要支持这些服务。
是的,可以使用 UA_Server_addVariableNode
,因为您已经(可能)在 addVariable()
中使用它。我猜你的代码是基于 https://github.com/open62541/open62541/blob/master/examples/tutorial_server_variable.c
因为
,简单地重新排序代码是行不通的UA_StatusCode retval = UA_Server_run(server, &running);
正在阻塞。
您需要更改此设置以使用迭代方法:
UA_StatusCode retval = UA_Server_run_startup(server);
if(retval != UA_STATUSCODE_GOOD)
return 1;
while(running) {
UA_UInt16 timeout = UA_Server_run_iterate(server, waitInternal);
// HERE you can add any node to the server you like.
// e.g. call addVariable2().
// Make sure that you only call it once in the loop.
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = timeout * 1000;
select(0, NULL, NULL, NULL, &tv);
}
retval = UA_Server_run_shutdown(server);
注意open62541目前不支持多线程。如果要在另一个线程中添加变量,则需要确保互斥对 server
对象的访问。
以上示例基于: https://github.com/open62541/open62541/blob/master/examples/server_mainloop.c
另一种方法是启动另一个线程来处理您的异步请求,然后在分离的线程中调用 UA_Server_addVariableNode
。仍然确保您使用的是互斥锁。