diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusDriver.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusDriver.cs index c045297d..c9163936 100644 --- a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusDriver.cs +++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusDriver.cs @@ -1491,30 +1491,13 @@ public sealed class ModbusDriver /// Map a Modbus logical type to the driver-agnostic used /// by the address-space builder. /// - /// - /// - /// Driver.Modbus-007 — Int64 / UInt64 surfacing limitation: - /// does not yet include an Int64 enum member, so 64-bit - /// Modbus tags currently surface as on the OPC UA - /// address space. The wire codec (DecodeRegister / EncodeRegister) is - /// correct — values round-trip as 64-bit long / ulong through - /// ReadAsync / WriteAsync. Only the variable node's DataType - /// attribute is misreported. Clients that consume the type advertisement will see a - /// type/value mismatch for values outside the 32-bit signed range. Operators - /// configuring I_64 / UI_64 tags should be aware of this until the - /// tracked DriverDataType.Int64 follow-up ships. - /// - /// - private static DriverDataType MapDataType(ModbusDataType t) => t switch + internal static DriverDataType MapDataType(ModbusDataType t) => t switch { ModbusDataType.Bool or ModbusDataType.BitInRegister => DriverDataType.Boolean, ModbusDataType.Int16 or ModbusDataType.Int32 => DriverDataType.Int32, ModbusDataType.UInt16 or ModbusDataType.UInt32 => DriverDataType.Int32, - // Driver.Modbus-007: Int64 / UInt64 currently surface as Int32 because DriverDataType - // has no Int64 member yet. The wire codec preserves the 64-bit value; only the OPC UA - // node's declared DataType is widened. Tracked for a follow-up that adds the enum - // member + node-type advertisement. - ModbusDataType.Int64 or ModbusDataType.UInt64 => DriverDataType.Int32, + ModbusDataType.Int64 => DriverDataType.Int64, + ModbusDataType.UInt64 => DriverDataType.UInt64, ModbusDataType.Float32 => DriverDataType.Float32, ModbusDataType.Float64 => DriverDataType.Float64, ModbusDataType.String => DriverDataType.String, diff --git a/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusDataTypeTests.cs b/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusDataTypeTests.cs index e9b2a201..eea381c4 100644 --- a/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusDataTypeTests.cs +++ b/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusDataTypeTests.cs @@ -1,6 +1,7 @@ using System.Buffers.Binary; using Shouldly; using Xunit; +using ZB.MOM.WW.OtOpcUa.Core.Abstractions; using ZB.MOM.WW.OtOpcUa.Driver.Modbus; namespace ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests; @@ -278,6 +279,17 @@ public sealed class ModbusDataTypeTests ModbusDriver.DecodeRegister(wire, lo).ShouldBe("eH"); } + // --- MapDataType node DataType advertisement --- + + /// + /// Verifies that 64-bit Modbus types surface the correct DriverDataType (not the stale Int32 fallback). + /// + [Theory] + [InlineData(ModbusDataType.Int64, DriverDataType.Int64)] + [InlineData(ModbusDataType.UInt64, DriverDataType.UInt64)] + public void MapDataType_64bit_surfaces_correct_DriverDataType(ModbusDataType wire, DriverDataType expected) + => ModbusDriver.MapDataType(wire).ShouldBe(expected); + // --- BCD (binary-coded decimal, DL205/DL260 default numeric encoding) --- ///