Auto: abcip-2.6 — AOI input/output handling

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
This commit is contained in:
Joseph Doherty
2026-04-25 18:58:49 -04:00
parent 177d75784b
commit e3c0750f7d
9 changed files with 373 additions and 9 deletions

View File

@@ -218,12 +218,19 @@ public static class L5xParser
if (!string.IsNullOrEmpty(raw)) paramDescription = raw.Trim();
}
// PR abcip-2.6 — capture the AOI Usage attribute (Input / Output / InOut). RSLogix
// also serialises Local AOI tags inside <LocalTags>, but those don't go through this
// path — only <Parameters>/<Parameter> entries do — so any Usage value on a parameter
// is one of the directional buckets.
var usage = paramNode.GetAttribute("Usage", string.Empty);
members.Add(new L5kMember(
Name: paramName,
DataType: dataType,
ArrayDim: arrayDim,
ExternalAccess: string.IsNullOrEmpty(externalAccess) ? null : externalAccess,
Description: paramDescription));
Description: paramDescription,
Usage: string.IsNullOrEmpty(usage) ? null : usage));
}
return new L5kDataType(name, members);
}