Open62541库用DI Nodeset替代Standard Nodeset配置节点命名空间问题
操作步骤
- 第一步:获取DI命名空间索引
加载完DI Nodeset的初始化代码后,调用UA_Server_getNamespaceIndexByName()接口查询DI对应的命名空间索引,不要硬编码数值,避免后续新增命名空间后索引偏移:
UA_StatusCode res; UA_UInt16 diNsIdx; res = UA_Server_getNamespaceIndexByName(server, UA_STRING("http://opcfoundation.org/UA/DI/"), &diNsIdx); // 需自行添加返回值校验逻辑,确认命名空间存在再进行后续操作
- 第二步:调整节点创建参数
调用UA_Server_addObjectNode()、UA_Server_addVariableNode()等接口时,所有涉及命名空间的参数都替换为上面获取的diNsIdx:requestedNewNodeId参数的namespaceIndex字段填diNsIdxbrowseName参数的namespaceIndex字段填diNsIdx- 如果用到DI Nodeset中定义的类型作为节点的类型定义,直接调用生成头文件中对应的类型ID宏即可
示例代码:
// 创建DI命名空间下的自定义变量节点 UA_NodeId customVarId = UA_NODEID_NUMERIC(diNsIdx, 20001); // 节点ID自定义,保证DI命名空间下唯一即可 UA_VariableAttributes varAttr = UA_VariableAttributes_default; // 此处自行补全变量属性赋值逻辑 res = UA_Server_addVariableNode(server, customVarId, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), // 父节点可根据需求调整 UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), // 引用类型可根据需求调整 UA_QUALIFIEDNAME(diNsIdx, "CustomVariable"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), // 如需用DI定义的类型替换即可 varAttr, NULL, NULL);
- 第三步:修复DI Nodeset加载为空的问题
你当前加载后为空节点,基本是初始化顺序错误导致,按以下顺序执行即可:
- 完成UA_Server实例的初始化操作
- 调用NodesetCompiler生成的DI对应代码中的加载函数,一般命名格式为
UA_Server_load<Nodeset名称>(server) - 执行上述获取命名空间索引、创建自定义节点的逻辑
- 最后启动UA_Server
内容的提问来源于stack exchange,提问作者hfiazi
相关产品推荐
相关产品推荐

