如何将自定义信息模型XML文件添加至open62541服务器并运行?
open62541 加载自定义对象XML到服务器实现方法
前置要求
- 编译open62541库时必须开启
UA_ENABLE_NODESETLOADER编译选项,这个选项默认关闭,是加载XML节点集的核心依赖,没开的话找不到对应加载接口。 - 你编写的对象XML必须符合OPC UA节点集规范,所有依赖的第三方节点集文件要和你的自定义XML放在程序可访问的路径下。
实现步骤
- 按常规流程初始化open62541服务器实例,拿到
UA_Server*类型的服务器对象指针,注意不要在初始化完成前就加载节点集。 - 在调用服务器启动接口之前,调用节点集加载接口导入你的XML文件,参考代码如下:
#include <open62541.h> #include <open62541/plugin/nodesetloader.h> int main(void) { UA_Server *server = UA_Server_new(); UA_ServerConfig *config = UA_Server_getConfig(server); UA_ServerConfig_setDefault(config); // 加载自定义对象XML,替换成你自己的XML文件路径 UA_StatusCode loadRet = UA_Server_loadNodeset(server, "./your_custom_objects.xml", NULL); if(loadRet != UA_STATUSCODE_GOOD) { printf("XML节点集加载失败,错误码:%#x\n", loadRet); UA_Server_delete(server); return EXIT_FAILURE; } // 正常启动服务器,端口默认4840 UA_StatusCode runRet = UA_Server_runUntilInterrupt(server); UA_Server_delete(server); return runRet == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE; }
- 注意加载顺序:如果你的自定义XML依赖其他非官方基础节点集,要先加载被依赖的节点集文件,最后加载你自己的对象XML。open62541初始化时已经内置了NS0基础节点集,不需要重复加载。
- 编译上述代码的时候,链接阶段要带上open62541的库依赖,编译完成后运行程序,用任意OPC UA客户端连接服务器的4840端口,就能在地址空间浏览到XML里定义的所有对象、变量、方法节点。
常见问题排查
- 编译时提示找不到
UA_Server_loadNodeset函数:回到open62541的编译配置,确认UA_ENABLE_NODESETLOADER设为ON,重新编译安装库文件。- 加载接口返回命名空间相关错误:检查XML文件内的
NamespaceUris节点是否列全了所有用到的外部命名空间,同时确认依赖的节点集文件路径正确、加载顺序没错。- 客户端连接后看不到自定义节点:不要忽略
UA_Server_loadNodeset的返回值,必须确认返回状态为UA_STATUSCODE_GOOD才代表加载成功,加载失败的话节点不会写入地址空间。
内容的提问来源于stack exchange,提问作者Aravinth Kalai
相关产品推荐
相关产品推荐

