CHANGELOG
Changelog for package ros2_medkit_opcua
Forthcoming
Native OPC-UA Part 9
AlarmConditionTypeevent subscription. The plugin now subscribes to vendor-defined alarms (Siemens S7-1500Program_Alarm/ ProDiag, Beckhoff TF6100, CodeSys 3.5+, Rockwell via FactoryTalk Linx) and bridges each event into the SOVD fault lifecycle. Configured via a new top-levelevent_alarms:block in the node map YAML; mutually exclusive per entry with the existing threshold-basedalarmform. (issue #386)New SOVD operations on entities that host alarm sources:
acknowledge_faultinvokes the inheritedAcknowledgemethod on the liveConditionId(i=9111, EventId tracked per Part 9 §5.7.3);confirm_faultinvokesConfirm(i=9113). Both accept an optionalcommentrendered asLocalizedTexton the server.OpcuaClientgainsadd_event_monitored_item/remove_event_monitored_item/call_methodand a generation counter that filters callbacks fired from defunct subscriptions after a reconnect. Heap-ownedEventCallbackContextresolves the open62541pp / raw-C lifetime hazard.Header-only
AlarmStateMachinemappingEnabledState x ShelvingState x ActiveState x AckedState x ConfirmedState x BranchIdto SOVDCONFIRMED / HEALED / CLEARED / Suppressed. Full transition table documented indesign/index.rst.ConditionRefresh(Server method i=3875) is invoked on subscribe and on every reconnect, withRefreshStartEvent/RefreshEndEventbracketing tracked for diagnostics.New
test_alarm_serverfixture (open62541-based, full namespace 0 + alarms enabled) emits AlarmConditionType events on stdin commands; integration testrun_alarm_tests.shruns in CI alongside the existing OpenPLC threshold suite. The fixture builds by default via the workspacecolcon build(gated onMEDKIT_OPCUA_BUILD_ALARM_SERVERwhich defaults to ON;ExternalProject_Addrebuilds open62541 withUA_NAMESPACE_ZERO=FULLand alarms ON, with a serial sub-build to dodge the upstream-jrace onnamespace0_generated.c).New CTest wrapper
test_alarm_server_smokeboots the fixture on an ephemeral port and runs the asyncua smoke test against it; skips with CTest exit 77 (treated as pass) whenasyncuais not importable, so iterating on plugin code without the Python dependency does not fail the suite.
0.4.0 (2026-04-11)
Initial release
OpcuaPluginimplementation ofGatewayPluginandIntrospectionProviderthat bridges OPC-UA capable PLCs into the SOVD entity treeREST endpoints via the new
get_routes()plugin API:x-plc-data,x-plc-operations,x-plc-statusVendor capabilities registered per entity - only PLC-backed apps and the PLC runtime component advertise the
x-plc-*endpointsFull OPC 10000-6 section 5.3.1.10 node identifier support (
i=numeric,s=string,g=GUID,b=opaque ByteString); example node maps for OpenPLC, Siemens S7-1500 TIA Portal, Beckhoff TwinCAT 3, Allen-Bradley via Kepware and KUKA KR C5NodeMapdriven by YAML configuration - same binary serves any OPC-UA compliant server by changing the node map fileDeterministic entity ordering in
IntrospectionResultoutput (entries sorted by id)Threshold-based PLC alarm detection routed to SOVD faults via
ros2_medkit_msgsservicesReportFault/ClearFaultOptional bridging of numeric PLC values to ROS 2
std_msgs/Float32topics fromset_context()Type-aware writes with per-node range validation
Robust connection-loss detection: all three OPC-UA client paths (
read_value,read_values,write_value) mark the connection as dropped on terminal status codes soOpcuaPollerreconnect kicks in without stallingPolling mode (default) and OPC-UA subscription mode, backed by
open62541ppv0.16.0Integration test suite against an OpenPLC IEC 61131-3 tank demo container
Contributors: @mfaferek93