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

open62541中OPC UA服务器自定义事件添加数据不显示问题求助

Open62541自定义事件Temperature属性无法在EventView显示的问题排查

问题说明

使用open62541开发OPC UA服务器时,已基于BaseEventType创建CustomEvent自定义事件类型,能正常向OpcUaExpert发送Severity和Time字段值。但为CustomEvent添加TemperatureEvent属性后,该属性在地址空间Root-Types-EventTypes中可见,却无法在EventView中看到温度数值。

现有代码

自定义事件类型及属性创建代码

UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default;
attr.displayName = UA_LOCALIZEDTEXT("en-US", "CustomEvent");
attr.description = UA_LOCALIZEDTEXT("en-US", "Event for ...");
UA_Server_addObjectTypeNode(server, UA_NODEID_NULL, UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE),
                            UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
                            UA_QUALIFIEDNAME(NamespaceIndex, "CustomEvent"), attr, NULL, &eventType);

// Add Temperature field to the event type
UA_VariableAttributes temperatureAttr = UA_VariableAttributes_default;
temperatureAttr.displayName = UA_LOCALIZEDTEXT("en-US", "TemperatureEvent");
temperatureAttr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
UA_NodeId temperatureAttrId;
UA_Server_addVariableNode(server, UA_NODEID_NULL, eventType, UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY),
                          UA_QUALIFIEDNAME(NamespaceIndex, "TemperatureEvent"),
                          UA_NODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE), temperatureAttr, NULL, NULL);

std::thread threadObjTriggerEvent(threadTriggerEvent, server);

事件触发线程代码

UA_NodeId eventNodeId;
UA_StatusCode retval = UA_Server_createEvent(server, eventType, &eventNodeId);

// informations for ua expert
UA_DateTime eventTime = UA_DateTime_now();
UA_Server_writeObjectProperty_scalar(server, eventNodeId, UA_QUALIFIEDNAME(0, "Time"), &eventTime,
                                     &UA_TYPES[UA_TYPES_DATETIME]);

UA_UInt16 eventSeverity = 100;
UA_Server_writeObjectProperty_scalar(server, eventNodeId, UA_QUALIFIEDNAME(0, "Severity"), &eventSeverity,
                                     &UA_TYPES[UA_TYPES_UINT16]);

UA_LocalizedText eventMessage = UA_LOCALIZEDTEXT("en-US", "An event has been generated.");
UA_Server_writeObjectProperty_scalar(server, eventNodeId, UA_QUALIFIEDNAME(0, "Message"), &eventMessage,
                                     &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);

// Event data: Temperature
UA_Double temperature = 23.5;// Example temperature value
UA_Server_writeObjectProperty_scalar(server, eventNodeId, UA_QUALIFIEDNAME(2, "TemperatureEvent"), &temperature,
                                     &UA_TYPES[UA_TYPES_DOUBLE]);

// trigger this event
retval = UA_Server_triggerEvent(server, eventNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER), NULL, UA_TRUE);      

问题原因及修复方案

1. 事件字段关联类型错误

OPC UA规范中,事件的可通知字段必须通过HasComponent关联,而不是HasProperty。HasProperty关联的属性不会被自动包含在事件通知的字段列表中,因此EventView无法识别。

修复代码(修改添加Temperature属性的关联节点ID):

// 将UA_NS0ID_HASPROPERTY改为UA_NS0ID_HASCOMPONENT
UA_Server_addVariableNode(server, UA_NODEID_NULL, eventType, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
                          UA_QUALIFIEDNAME(NamespaceIndex, "TemperatureEvent"),
                          UA_NODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE), temperatureAttr, NULL, &temperatureAttrId);

2. 命名空间索引不一致

触发事件写入Temperature值时,硬编码了命名空间索引2,但创建属性时使用的是变量NamespaceIndex,两者必须一致才能正确找到节点。

修复代码(修改写入时的命名空间索引):

// 将UA_QUALIFIEDNAME(2, ...)改为UA_QUALIFIEDNAME(NamespaceIndex, ...)
UA_Server_writeObjectProperty_scalar(server, eventNodeId, UA_QUALIFIEDNAME(NamespaceIndex, "TemperatureEvent"), &temperature,
                                     &UA_TYPES[UA_TYPES_DOUBLE]);

额外注意事项

  • 确保NamespaceIndex变量的值正确对应你自定义的命名空间,避免索引不匹配。
  • 若需要该字段支持事件过滤,还需确保变量属性的valueRank等设置符合OPC UA规范(默认配置已满足基础需求)。

内容的提问来源于stack exchange,提问作者danrudn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:34:53