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
相关产品推荐
相关产品推荐

