using ZB.MOM.WW.OtOpcUa.Driver.AbCip; namespace ZB.MOM.WW.OtOpcUa.Driver.AbCip.IntegrationTests; /// /// Per-family marker for the ab_server Docker compose profile a given test /// targets. The compose file (Docker/docker-compose.yml) is the canonical /// source of truth for which tags a family seeds + which --plc mode the /// simulator boots in; this record just ties a family enum to operator-facing /// notes so fixture + test code can filter / branch by family. /// /// OtOpcUa driver family this profile targets. /// The docker compose --profile name that brings /// this family's ab_server up. Matches the service key in the compose file. /// Operator-facing description of coverage + any quirks. public sealed record AbServerProfile( AbCipPlcFamily Family, string ComposeProfile, string Notes) { /// Default ab_server port — matches the compose-file port-map + the /// CIP / EtherNet/IP standard. public const int DefaultPort = 44818; } /// Canonical profiles covering every AB CIP family shipped in PRs 9–12. public static class KnownProfiles { /// Gets all known server profiles. public static IReadOnlyList All { get; } = [ControlLogix, CompactLogix, Micro800, GuardLogix]; /// Gets the ControlLogix profile. public static readonly AbServerProfile ControlLogix = new( Family: AbCipPlcFamily.ControlLogix, ComposeProfile: "controllogix", Notes: "Widest-coverage profile — PR 9 baseline. UDTs unit-tested via golden Template Object buffers; ab_server lacks full UDT emulation."); /// Gets the CompactLogix profile. public static readonly AbServerProfile CompactLogix = new( Family: AbCipPlcFamily.CompactLogix, ComposeProfile: "compactlogix", Notes: "ab_server doesn't enforce the narrower ConnectionSize; driver-side profile caps it per PR 10."); /// Gets the Micro800 profile. public static readonly AbServerProfile Micro800 = new( Family: AbCipPlcFamily.Micro800, ComposeProfile: "micro800", Notes: "--plc=Micro800 mode (unconnected-only, empty path). Driver-side enforcement verified in the unit suite."); /// Gets the GuardLogix profile. public static readonly AbServerProfile GuardLogix = new( Family: AbCipPlcFamily.GuardLogix, ComposeProfile: "guardlogix", Notes: "ab_server has no safety subsystem — _S-suffixed seed tag triggers driver-side ViewOnly classification only."); /// Gets the profile for a specific family. /// The AB CIP PLC family. /// The corresponding server profile. public static AbServerProfile ForFamily(AbCipPlcFamily family) => All.FirstOrDefault(p => p.Family == family) ?? throw new ArgumentOutOfRangeException(nameof(family), family, "No integration profile for this family."); }