[abcip] AbCip — AOI input/output handling #351

Merged
dohertj2 merged 1 commits from auto/abcip/2.6 into auto/driver-gaps 2026-04-25 19:01:05 -04:00
Owner

Summary

AOI (Add-On Instruction) Input / Output / InOut classification preserved through L5K/L5X import and the AbCip discovery tree.

  • AbCipStructureMember.AoiQualifier enum: Local (default) / Input / Output / InOut.
  • L5K parser — recognises ADD_ON_INSTRUCTION_DEFINITION blocks and captures each PARAMETER's Usage attribute.
  • L5X parser — captures Usage on <Parameter> elements inside <AddOnInstructionDefinition>.
  • L5kIngest — maps Usage strings → AoiQualifier. null/unknown → Local.
  • AbCipDriver.DiscoverAsync — groups directional members under Inputs/ / Outputs/ / InOut/ sub-folders only when at least one member is non-Local. Plain UDTs keep the pre-2.6 flat layout (zero regression). Full reference Tag.Member is preserved so reads/writes are unchanged.

Test plan

  • dotnet build src/ZB.MOM.WW.OtOpcUa.Driver.AbCip — clean (0 / 0)
  • dotnet test tests/ZB.MOM.WW.OtOpcUa.Driver.AbCip.Tests319 / 319 passed (5 new: L5K AOI block parsing, L5X Usage capture, ingest mapping for both formats, AOI-typed discovery fan-out, plain-UDT non-regression)
  • Integration tests — skipped (live PLC required)

🤖 Auto-generated by the Mode-B execution loop. Closes #234.

Closes #234

## Summary AOI (Add-On Instruction) Input / Output / InOut classification preserved through L5K/L5X import and the AbCip discovery tree. - **`AbCipStructureMember.AoiQualifier`** enum: `Local` (default) / `Input` / `Output` / `InOut`. - **L5K parser** — recognises `ADD_ON_INSTRUCTION_DEFINITION` blocks and captures each `PARAMETER`'s `Usage` attribute. - **L5X parser** — captures `Usage` on `<Parameter>` elements inside `<AddOnInstructionDefinition>`. - **`L5kIngest`** — maps Usage strings → `AoiQualifier`. null/unknown → `Local`. - **`AbCipDriver.DiscoverAsync`** — groups directional members under `Inputs/` / `Outputs/` / `InOut/` sub-folders **only** when at least one member is non-Local. Plain UDTs keep the pre-2.6 flat layout (zero regression). Full reference `Tag.Member` is preserved so reads/writes are unchanged. ## Test plan - [x] `dotnet build src/ZB.MOM.WW.OtOpcUa.Driver.AbCip` — clean (0 / 0) - [x] `dotnet test tests/ZB.MOM.WW.OtOpcUa.Driver.AbCip.Tests` — **319 / 319 passed** (5 new: L5K AOI block parsing, L5X Usage capture, ingest mapping for both formats, AOI-typed discovery fan-out, plain-UDT non-regression) - [ ] Integration tests — skipped (live PLC required) 🤖 Auto-generated by the Mode-B execution loop. Closes #234. Closes #234
dohertj2 added 1 commit 2026-04-25 19:01:01 -04:00
AOI-aware browse paths: AOI instances now fan out under directional
sub-folders (Inputs/, Outputs/, InOut/) instead of a flat layout. The
sub-folders only appear when at least one member carries a non-Local
AoiQualifier, so plain UDT tags keep the pre-2.6 flat structure.

- Add AoiQualifier enum (Local / Input / Output / InOut) + new property
  on AbCipStructureMember (defaults to Local).
- L5K parser learns ADD_ON_INSTRUCTION_DEFINITION blocks; PARAMETER
  entries' Usage attribute flows through L5kMember.Usage.
- L5X parser captures the Usage attribute on <Parameter> elements.
- L5kIngest maps Usage strings (Input/Output/InOut) to AoiQualifier;
  null + unknown values map to Local.
- AbCipDriver.DiscoverAsync groups directional members under
  Inputs / Outputs / InOut sub-folders when any member is non-Local.
- Tests for L5K AOI block parsing, L5X Usage capture, ingest mapping
  (both formats), and AOI-vs-plain UDT discovery fan-out.

Closes #234
dohertj2 merged commit 5ca2ad83cd into auto/driver-gaps 2026-04-25 19:01:05 -04:00
dohertj2 deleted branch auto/abcip/2.6 2026-04-25 19:01:06 -04:00
Sign in to join this conversation.