open62541库为OPC-UA节点添加工程单位属性报错如何解决?
open62541添加OPC UA工程单位属性解决方案
错误原因
- 第一个错误
UA_STATUSCODE_BADNOMATCH:调用UA_Server_writeObjectProperty_scalar时,目标节点下还不存在EngineeringUnits属性节点,写入操作无法匹配到已有节点,因此报错。 - 第二个错误
UA_STATUSCODE_BADTYPEMISMATCH:代码存在四处核心错误:EngineeringUnits是OPC UA标准定义的属性,BrowseName必须属于0命名空间,你使用了自定义的nsIndexBrowser作为命名空间索引,不符合规范- 属性的dataType赋值错误,不应该直接取
UA_TYPES[UA_TYPES_EUINFORMATION].typeId,需要明确指定为0命名空间下的UA_NS0ID_EUINFORMATION类型ID - 没有给属性节点设置
accessLevel权限,仅设置userWriteMask不符合节点创建的参数要求 - 重复调用了
UA_VariableAttributes_init,UA_VariableAttributes_default已经完成了默认参数初始化,重复初始化会清空部分默认配置,导致参数异常
正确实现代码
// 初始化工程单位信息 UA_EUInformation eu; eu.namespaceUri = UA_STRING_ALLOC("somecompany.com"); // 用ALLOC拷贝字符串,避免临时指针失效 eu.unitId = -1; // 自定义单位可填-1,标准单位使用UN/CEFACT规定的单位编码 const char* euStr = typeSigne_->getEUid().c_str(); eu.displayName = UA_LOCALIZEDTEXT_ALLOC(const_cast<char*>(lt), const_cast<char*>(euStr)); eu.description = UA_LOCALIZEDTEXT_ALLOC(const_cast<char*>(lt), const_cast<char*>(euStr)); // 配置属性节点参数 UA_VariableAttributes enAttr = UA_VariableAttributes_default; enAttr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_EUINFORMATION); // 明确指定标准数据类型 enAttr.accessLevel = UA_ACCESSLEVELMASK_READ; // 必须设置基础访问权限 enAttr.displayName = UA_LOCALIZEDTEXT(const_cast<char*>(lt), const_cast<char*>("EngineeringUnits")); enAttr.description = UA_LOCALIZEDTEXT(const_cast<char*>(lt), const_cast<char*>("工程单位")); UA_Variant_setScalarCopy(&enAttr.value, &eu, &UA_TYPES[UA_TYPES_EUINFORMATION]); // 添加属性节点,注意BrowseName的命名空间是0,引用类型是HasProperty UA_StatusCode status = UA_Server_addVariableNode(server, UA_NODEID_NULL, value_, // 父节点是你之前创建的变量节点 UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), UA_QUALIFIEDNAME(0, "EngineeringUnits"), // 关键:标准属性必须用0命名空间 UA_NODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE), enAttr, nullptr, &enUnitNodeUnits_ ); // 用完释放EUInformation的内存避免泄漏 UA_EUInformation_clear(&eu); if(status != UA_STATUSCODE_GOOD) { return isOk; }
补充注意事项
- 如果添加仍然报错,可检查open62541编译配置是否开启了标准数据类型支持,确保
UA_TYPES_EUINFORMATION的定义可用 - 节点创建完成后如果需要修改单位值,再调用
UA_Server_writeObjectProperty_scalar就不会报BADNOMATCH错误了
内容的提问来源于stack exchange,提问作者vvpnet
相关产品推荐
相关产品推荐

