using ZB.MOM.WW.OtOpcUa.Core.Abstractions; namespace ZB.MOM.WW.OtOpcUa.Driver.TwinCAT; /// /// TwinCAT / IEC 61131-3 atomic data types. Wider type surface than Logix because IEC adds /// WSTRING (UTF-16) and TIME/DATE/DT/TOD variants. /// public enum TwinCATDataType { Bool, SInt, // signed 8-bit USInt, // unsigned 8-bit Int, // signed 16-bit UInt, // unsigned 16-bit DInt, // signed 32-bit UDInt, // unsigned 32-bit LInt, // signed 64-bit ULInt, // unsigned 64-bit Real, // 32-bit IEEE-754 LReal, // 64-bit IEEE-754 String, // ASCII string WString,// UTF-16 string Time, // TIME — ms since epoch of day, stored as UDINT Date, // DATE — days since 1970-01-01, stored as UDINT DateTime, // DT — seconds since 1970-01-01, stored as UDINT TimeOfDay,// TOD — ms since midnight, stored as UDINT /// UDT / FB instance. Resolved per member at discovery time. Structure, } public static class TwinCATDataTypeExtensions { public static DriverDataType ToDriverDataType(this TwinCATDataType t) => t switch { TwinCATDataType.Bool => DriverDataType.Boolean, TwinCATDataType.SInt or TwinCATDataType.USInt or TwinCATDataType.Int or TwinCATDataType.UInt or TwinCATDataType.DInt or TwinCATDataType.UDInt => DriverDataType.Int32, TwinCATDataType.LInt or TwinCATDataType.ULInt => DriverDataType.Int32, // matches Int64 gap TwinCATDataType.Real => DriverDataType.Float32, TwinCATDataType.LReal => DriverDataType.Float64, TwinCATDataType.String or TwinCATDataType.WString => DriverDataType.String, TwinCATDataType.Time or TwinCATDataType.Date or TwinCATDataType.DateTime or TwinCATDataType.TimeOfDay => DriverDataType.Int32, TwinCATDataType.Structure => DriverDataType.String, _ => DriverDataType.Int32, }; }