namespace ZB.MOM.WW.OtOpcUa.Driver.AbCip.PlcFamilies; /// /// Per-family libplctag defaults. Picked up at device-initialization time so each PLC /// family gets the correct ConnectionSize, path semantics, and quirks applied without /// the caller having to know the protocol-level differences. /// /// /// Mirrors the shape of the Modbus driver's per-family profiles (DL205, Siemens S7, /// Mitsubishi MELSEC). ControlLogix is the baseline; each subsequent family is a delta. /// Family-specific wire tests ship in PRs 9–12. /// public sealed record AbCipPlcFamilyProfile( string LibplctagPlcAttribute, int DefaultConnectionSize, string DefaultCipPath, bool SupportsRequestPacking, bool SupportsConnectedMessaging, int MaxFragmentBytes, bool SupportsLogicalAddressing = true) { /// Look up the profile for a configured family. public static AbCipPlcFamilyProfile ForFamily(AbCipPlcFamily family) => family switch { AbCipPlcFamily.ControlLogix => ControlLogix, AbCipPlcFamily.CompactLogix => CompactLogix, AbCipPlcFamily.Micro800 => Micro800, AbCipPlcFamily.GuardLogix => GuardLogix, _ => ControlLogix, }; public static readonly AbCipPlcFamilyProfile ControlLogix = new( LibplctagPlcAttribute: "controllogix", DefaultConnectionSize: 4002, // Large Forward Open; FW20+ DefaultCipPath: "1,0", SupportsRequestPacking: true, SupportsConnectedMessaging: true, MaxFragmentBytes: 4000, SupportsLogicalAddressing: true); public static readonly AbCipPlcFamilyProfile CompactLogix = new( LibplctagPlcAttribute: "compactlogix", DefaultConnectionSize: 504, // 5069-L3x narrower buffer; safe baseline that never over-shoots DefaultCipPath: "1,0", SupportsRequestPacking: true, SupportsConnectedMessaging: true, MaxFragmentBytes: 500, SupportsLogicalAddressing: true); // PR abcip-3.2 — Micro800 firmware does not implement the Symbol Object class 0x6B // instance-ID addressing path; @tags returns the symbol set but reads keyed on instance // IDs trip a CIP "Path Segment Error" (0x04). Logical mode is therefore disabled here // + the driver silently falls back to Symbolic with a warning per AbCipDriverOptions.OnWarning. public static readonly AbCipPlcFamilyProfile Micro800 = new( LibplctagPlcAttribute: "micro800", DefaultConnectionSize: 488, // Micro800 hard cap DefaultCipPath: "", // no backplane routing SupportsRequestPacking: false, SupportsConnectedMessaging: false, // unconnected-only on most models MaxFragmentBytes: 484, SupportsLogicalAddressing: false); public static readonly AbCipPlcFamilyProfile GuardLogix = new( LibplctagPlcAttribute: "controllogix", // wire protocol identical; safety partition is tag-level DefaultConnectionSize: 4002, DefaultCipPath: "1,0", SupportsRequestPacking: true, SupportsConnectedMessaging: true, MaxFragmentBytes: 4000, SupportsLogicalAddressing: true); }