You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
OPC-UA Part 9 defines AlarmConditionType events that vendor PLCs (Siemens S7-1500 FW V2.9+, Beckhoff TF6100, CodeSys 3.5+, Rockwell via FactoryTalk Linx) emit natively. The plugin currently reports faults only from threshold checks on scalar values - native alarms with their state machine, severity, and ack flow are ignored. Subscribe to AlarmConditionType events and bridge them to fault_manager as SOVD faults.
Scope
Native event subscription via raw UA_Client_MonitoredItems_createEvents (open62541pp lacks subscribeEvent)
ConditionRefresh on subscribe and on every reconnect, with RefreshStartEvent / RefreshEndEvent bracketing per spec
Per-condition EventId tracking (required for spec-compliant Acknowledge calls)
State machine on EnabledState x ShelvingState x ActiveState x AckedState x ConfirmedState x BranchId -> SOVD CONFIRMED / HEALED / CLEARED / suppressed (full table in design/index.rst)
node_map.yaml extension: new alarm_source field, mutually exclusive with threshold
acknowledge_fault and confirm_fault SOVD operations: POST -> OPC-UA Call (Object=ConditionId instance, Method=i=9111 Ack / i=9113 Confirm), comment as LocalizedText
Motivation
OPC-UA Part 9 defines
AlarmConditionTypeevents that vendor PLCs (Siemens S7-1500 FW V2.9+, Beckhoff TF6100, CodeSys 3.5+, Rockwell via FactoryTalk Linx) emit natively. The plugin currently reports faults only from threshold checks on scalar values - native alarms with their state machine, severity, and ack flow are ignored. Subscribe toAlarmConditionTypeevents and bridge them to fault_manager as SOVD faults.Scope
UA_Client_MonitoredItems_createEvents(open62541pp lackssubscribeEvent)EventType,EventId,SourceNode,Time,Severity,Message,ConditionId,BranchId,ConditionClassId,EnabledState,ActiveState,AckedState,ConfirmedState,ShelvingState,RetainConditionRefreshon subscribe and on every reconnect, withRefreshStartEvent/RefreshEndEventbracketing per specEventIdtracking (required for spec-compliantAcknowledgecalls)EnabledState x ShelvingState x ActiveState x AckedState x ConfirmedState x BranchId-> SOVDCONFIRMED / HEALED / CLEARED / suppressed(full table indesign/index.rst)node_map.yamlextension: newalarm_sourcefield, mutually exclusive withthresholdacknowledge_faultandconfirm_faultSOVD operations: POST -> OPC-UACall(Object=ConditionId instance, Method=i=9111Ack /i=9113Confirm), comment asLocalizedTextOut of scope
BranchId != nullevents log to history only. Re-fires tracked via fault_manageroccurrence_count+/faults/streamSSE.TimedShelve/OneShotShelve) - operator UI concern.Acceptance criteria
AlarmConditionTypeevent -> SOVD fault appears CONFIRMED within one publishing intervalacknowledge_faultoperation triggers OPC-UAAcknowledgewith tracked EventId; AckedState transitions on serverconfirm_faultoperation triggers OPC-UAConfirm; ConfirmedState transitions on serverEnabledState=falseorShelvingState=Shelved-> alarm not surfaced as CONFIRMED; transition back -> alarm reappearsBranchId != nullevents do not change SOVD live status; visible in fault_manager event logRefreshStartEvent/RefreshEndEventbracketing handled; no missed alarmsReferences
src/ros2_medkit_plugins/ros2_medkit_opcua/src/opcua_client.cpp:373src/ros2_medkit_plugins/ros2_medkit_opcua/src/opcua_plugin.cpp:468