namespace ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.PlcFamilies; /// /// Per-family libplctag defaults for PCCC PLCs. SLC 500 / MicroLogix / PLC-5 / LogixPccc /// (Logix controller accessed via the PLC-5 compatibility layer — rare but real). /// public sealed record AbLegacyPlcFamilyProfile( string LibplctagPlcAttribute, string DefaultCipPath, int MaxTagBytes, bool SupportsStringFile, bool SupportsLongFile, bool OctalIoAddressing, bool SupportsFunctionFiles, bool SupportsPidFile, bool SupportsMessageFile, bool SupportsPlsFile, bool SupportsBlockTransferFile) { public static AbLegacyPlcFamilyProfile ForFamily(AbLegacyPlcFamily family) => family switch { AbLegacyPlcFamily.Slc500 => Slc500, AbLegacyPlcFamily.MicroLogix => MicroLogix, AbLegacyPlcFamily.Plc5 => Plc5, AbLegacyPlcFamily.LogixPccc => LogixPccc, _ => Slc500, }; public static readonly AbLegacyPlcFamilyProfile Slc500 = new( LibplctagPlcAttribute: "slc500", DefaultCipPath: "1,0", MaxTagBytes: 240, // SLC 5/05 PCCC max packet data SupportsStringFile: true, // ST file available SLC 5/04+ SupportsLongFile: true, // L file available SLC 5/05+ OctalIoAddressing: false, // SLC500 I:/O: indices are decimal in RSLogix 500 SupportsFunctionFiles: false, // SLC500 has no function files SupportsPidFile: true, // SLC 5/02+ supports PD via PID instruction SupportsMessageFile: true, // SLC 5/02+ supports MG via MSG instruction SupportsPlsFile: false, // SLC500 has no native PLS file (uses SQO/SQC instead) SupportsBlockTransferFile: false); // SLC500 has no BT file (BT is PLC-5 ChassisIO only) public static readonly AbLegacyPlcFamilyProfile MicroLogix = new( LibplctagPlcAttribute: "micrologix", DefaultCipPath: "", // MicroLogix 1100/1400 use direct EIP, no backplane path MaxTagBytes: 232, SupportsStringFile: true, SupportsLongFile: false, // ML 1100/1200/1400 don't ship L files OctalIoAddressing: false, // MicroLogix follows SLC-style decimal I/O addressing SupportsFunctionFiles: true, // ML 1100/1400 expose RTC/HSC/DLS/MMI/PTO/PWM/STI/EII/IOS/BHI SupportsPidFile: false, // MicroLogix 1100/1400 use PID-instruction-only addressing — no PD file type SupportsMessageFile: false, // No MG file — MSG instruction control words live in standard files SupportsPlsFile: false, SupportsBlockTransferFile: false); /// /// PR ablegacy-13 / #256 — PLC-5 is the only family that supports the 1756-DHRIO DH+ /// bridging form (CIP path 1,<slot>,2,<station-octal>). The DHRIO /// module only speaks DH+ to PLC-5 / SLC-DH+ peers, and libplctag's PCCC stack only /// exposes the PLC-5 side. SLC500 / MicroLogix / LogixPccc devices addressed through a /// DHRIO path are rejected at AbLegacyDriver.InitializeAsync time. See /// docs/drivers/AbLegacy-DH-Bridging.md for the full DH+ syntax + smoke procedure. /// public static readonly AbLegacyPlcFamilyProfile Plc5 = new( LibplctagPlcAttribute: "plc5", DefaultCipPath: "1,0", MaxTagBytes: 240, // DF1 full-duplex packet limit at 264 bytes, PCCC-over-EIP caps lower SupportsStringFile: true, SupportsLongFile: false, // PLC-5 predates L files OctalIoAddressing: true, // RSLogix 5 displays I:/O: word + bit indices as octal SupportsFunctionFiles: false, SupportsPidFile: true, // PLC-5 PID instruction needs PD file SupportsMessageFile: true, // PLC-5 MSG instruction needs MG file SupportsPlsFile: true, // PLC-5 has PLS (programmable limit switch) file SupportsBlockTransferFile: true); // PLC-5 chassis I/O block transfer (BTR/BTW) needs BT file /// /// Logix ControlLogix / CompactLogix accessed through the legacy PCCC compatibility layer. /// Rare but real — some legacy HMI integrations address Logix controllers as if they were /// PLC-5 via the PCCC-passthrough mechanism. /// public static readonly AbLegacyPlcFamilyProfile LogixPccc = new( LibplctagPlcAttribute: "logixpccc", DefaultCipPath: "1,0", MaxTagBytes: 240, SupportsStringFile: true, SupportsLongFile: true, OctalIoAddressing: false, // Logix natively uses decimal arrays even via the PCCC bridge SupportsFunctionFiles: false, // Logix native UDTs (PID_ENHANCED / MESSAGE) replace the legacy PD/MG file types — the // PCCC bridge does not expose them as letter-prefixed files. SupportsPidFile: false, SupportsMessageFile: false, SupportsPlsFile: false, SupportsBlockTransferFile: false); } /// Which PCCC PLC family the device is. public enum AbLegacyPlcFamily { Slc500, MicroLogix, Plc5, LogixPccc, }