AbCip: ALMA alarm projection; writes to controller-discovered UDT members #611

Closed
opened 2026-10-08 02:31:13 -04:00 by dohertj2 · 2 comments
Owner

Documented feature deferrals: projection is ALMD-only (ALMA "follow-up"); writes to browse-discovered UDT members deferred (only pre-declared Members); whole-UDT writes refused. Native writes still need the bench proof (see the bench-controller issue).
Sources: AbCipAlarmProjection.cs:16,314-324; docs/drivers/AbCip.md:372-375; NativeAbCipTagRuntime.cs:380.

  • ALMA detection + projection
  • Write channel for discovered members
  • Decide whole-UDT writes

Filed 2026-10-08 by the pending/deferred-work sweep after the #562–#591 issue sweep.

Documented feature deferrals: projection is ALMD-only (ALMA "follow-up"); writes to browse-discovered UDT members deferred (only pre-declared `Members`); whole-UDT writes refused. Native writes still need the bench proof (see the bench-controller issue). Sources: AbCipAlarmProjection.cs:16,314-324; docs/drivers/AbCip.md:372-375; NativeAbCipTagRuntime.cs:380. - [ ] ALMA detection + projection - [ ] Write channel for discovered members - [ ] Decide whole-UDT writes _Filed 2026-10-08 by the pending/deferred-work sweep after the #562–#591 issue sweep._
dohertj2 added the driver/abcip label 2026-10-08 02:31:13 -04:00
Author
Owner

From #634: driver-gaps item #236 (AbCip) is tracked here.

From #634: driver-gaps item #236 (AbCip) is tracked here.
Author
Owner

All three items done on master, pushed 2026-10-09 (merges bd209785 ALMA, 6c6800e5 member writes; gate docs 12aa293c).

  • ALMA detection + projection — one condition per ALMA tag (ConditionId = RawPath); active/severity/message from the most severe active limit (HH/H/L/LL/ROC±); Retrigger when a new limit enters, ActiveAcknowledged when it enters already acked, no row when only a non-governing limit drops out; ack writes OperAckAll. Review also found and fixed a pre-existing ALMD defect: it polled InFaulted (input health) instead of InAlarm — an ALMD would have raised on input faults and never on the alarm. E2E test through DriverHostActor (AbCipAlmaNativeAlarmEndToEndTests).
  • Writes to discovered UDT members — writable only when the browse-committed raw tag is authored ReadWrite; written at the member path with its own type. libplctag scalar writes now refuse a width-mismatched authored type (BadTypeMismatch/BadNotSupported, nothing sent, health untouched) instead of writing stale bytes. ab_server patch 0003 serves member paths. Live gate on Z35162 (user-approved, native, restored): _EmptyTemperatureSegment.ID (DINT) 0→4242→0, .Enable (BIT member) false→true→false, .HoldTime (REAL) 0→42.5→0, all Good; a 10-member snapshot after every write/restore showed only the written member changed.
  • Whole-UDT writes — decided: refused BadNotSupported before any I/O (a whole-struct write overwrites every member incl. hidden/padding bytes; member writes cover the use case). Tested + documented as a decision.

Hardware-only residuals moved to #592: ALMA/ALMD on a real controller (Z35162 has none), sibling-bit preservation within one hidden host SINT, the libplctag member-write path on hardware. Full suite green on merged master (13043 passed / 0 failed).

All three items done on master, pushed 2026-10-09 (merges `bd209785` ALMA, `6c6800e5` member writes; gate docs `12aa293c`). - [x] **ALMA detection + projection** — one condition per ALMA tag (ConditionId = RawPath); active/severity/message from the most severe active limit (HH/H/L/LL/ROC±); Retrigger when a new limit enters, ActiveAcknowledged when it enters already acked, no row when only a non-governing limit drops out; ack writes `OperAckAll`. Review also found and fixed a pre-existing ALMD defect: it polled `InFaulted` (input health) instead of `InAlarm` — an ALMD would have raised on input faults and never on the alarm. E2E test through `DriverHostActor` (`AbCipAlmaNativeAlarmEndToEndTests`). - [x] **Writes to discovered UDT members** — writable only when the browse-committed raw tag is authored ReadWrite; written at the member path with its own type. libplctag scalar writes now refuse a width-mismatched authored type (`BadTypeMismatch`/`BadNotSupported`, nothing sent, health untouched) instead of writing stale bytes. ab_server patch 0003 serves member paths. **Live gate on Z35162 (user-approved, native, restored):** `_EmptyTemperatureSegment.ID` (DINT) 0→4242→0, `.Enable` (BIT member) false→true→false, `.HoldTime` (REAL) 0→42.5→0, all Good; a 10-member snapshot after every write/restore showed only the written member changed. - [x] **Whole-UDT writes** — decided: refused `BadNotSupported` before any I/O (a whole-struct write overwrites every member incl. hidden/padding bytes; member writes cover the use case). Tested + documented as a decision. Hardware-only residuals moved to #592: ALMA/ALMD on a real controller (Z35162 has none), sibling-bit preservation within one hidden host SINT, the libplctag member-write path on hardware. Full suite green on merged master (13043 passed / 0 failed).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dohertj2/lmxopcua#611