using ZB.MOM.WW.OtOpcUa.Core.Abstractions;
namespace ZB.MOM.WW.OtOpcUa.Driver.AbLegacy;
///
/// PCCC data types that map onto SLC / MicroLogix / PLC-5 files. Narrower than Logix — no
/// symbolic UDTs; every type is file-typed and fixed-width.
///
public enum AbLegacyDataType
{
/// B-file single bit (B3:0/0) or bit-within-N-file (N7:0/3).
Bit,
/// N-file integer (signed 16-bit).
Int,
/// L-file long integer — SLC 5/05+ only (signed 32-bit).
Long,
/// F-file float (32-bit IEEE-754).
Float,
/// A-file analog integer — some older hardware (signed 16-bit, semantically like N).
AnalogInt,
/// ST-file string (82-byte fixed-length + length word header).
String,
/// Timer sub-element — caller addresses .ACC, .PRE, .EN, .DN, .TT.
TimerElement,
/// Counter sub-element — caller addresses .ACC, .PRE, .CU, .CD, .DN.
CounterElement,
/// Control sub-element — caller addresses .LEN, .POS, .EN, .DN, .ER.
ControlElement,
}
/// Map a PCCC data type to the driver-surface .
public static class AbLegacyDataTypeExtensions
{
public static DriverDataType ToDriverDataType(this AbLegacyDataType t) => t switch
{
AbLegacyDataType.Bit => DriverDataType.Boolean,
AbLegacyDataType.Int or AbLegacyDataType.AnalogInt => DriverDataType.Int32,
AbLegacyDataType.Long => DriverDataType.Int32, // matches Modbus/AbCip 64→32 gap
AbLegacyDataType.Float => DriverDataType.Float32,
AbLegacyDataType.String => DriverDataType.String,
AbLegacyDataType.TimerElement or AbLegacyDataType.CounterElement
or AbLegacyDataType.ControlElement => DriverDataType.Int32,
_ => DriverDataType.Int32,
};
}