You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

open62541库为OPC-UA节点添加工程单位属性报错如何解决?

open62541添加OPC UA工程单位属性解决方案

错误原因

  • 第一个错误UA_STATUSCODE_BADNOMATCH:调用UA_Server_writeObjectProperty_scalar时,目标节点下还不存在EngineeringUnits属性节点,写入操作无法匹配到已有节点,因此报错。
  • 第二个错误UA_STATUSCODE_BADTYPEMISMATCH:代码存在四处核心错误:
    1. EngineeringUnits是OPC UA标准定义的属性,BrowseName必须属于0命名空间,你使用了自定义的nsIndexBrowser作为命名空间索引,不符合规范
    2. 属性的dataType赋值错误,不应该直接取UA_TYPES[UA_TYPES_EUINFORMATION].typeId,需要明确指定为0命名空间下的UA_NS0ID_EUINFORMATION类型ID
    3. 没有给属性节点设置accessLevel权限,仅设置userWriteMask不符合节点创建的参数要求
    4. 重复调用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:30:00