diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusRtuFraming.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusRtuFraming.cs index 5f8b2b35..7cb765ce 100644 --- a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusRtuFraming.cs +++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusRtuFraming.cs @@ -105,8 +105,9 @@ public static class ModbusRtuFraming } else { - // Write-echo response (FC 05/06/15/16) or any other length-less fixed shape: - // fixed 4 payload bytes + CRC(2). + // Fixed 4-byte echo: correct for the write FCs this driver emits (05/06/0F/10). A future + // variable-length response FC outside 01-04 (e.g. FC23) would be mis-sized here and + // surface as a desync — revisit the FC-shape table if the driver starts emitting one. trailing = 4 + 2; } diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusTransportFactory.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusTransportFactory.cs index 88827a8e..beaccb1e 100644 --- a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusTransportFactory.cs +++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusTransportFactory.cs @@ -16,7 +16,11 @@ public static class ModbusTransportFactory /// /// Driver configuration options. /// A when - /// is selected; otherwise a (also the default/unrecognized fallback). + /// is selected; a when is selected. + /// + /// . is not a recognized + /// member — fail loudly rather than silently falling back to TCP/MBAP. + /// public static IModbusTransport Create(ModbusDriverOptions options) { ArgumentNullException.ThrowIfNull(options); @@ -27,11 +31,13 @@ public static class ModbusTransportFactory keepAlive: options.KeepAlive, idleDisconnect: options.IdleDisconnectTimeout, reconnect: options.Reconnect), - _ => new ModbusTcpTransport( + ModbusTransportMode.Tcp => new ModbusTcpTransport( options.Host, options.Port, options.Timeout, options.AutoReconnect, keepAlive: options.KeepAlive, idleDisconnect: options.IdleDisconnectTimeout, reconnect: options.Reconnect), + _ => throw new ArgumentOutOfRangeException( + nameof(options), options.Transport, "Unknown Modbus transport mode."), }; } } diff --git a/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusTransportFactoryTests.cs b/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusTransportFactoryTests.cs index 5644998f..13b8560a 100644 --- a/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusTransportFactoryTests.cs +++ b/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusTransportFactoryTests.cs @@ -19,4 +19,9 @@ public sealed class ModbusTransportFactoryTests public void Default_options_build_tcp_transport() => ModbusTransportFactory.Create(new ModbusDriverOptions()) .ShouldBeOfType(); + + [Fact] + public void Unknown_transport_mode_throws() + => Should.Throw( + () => ModbusTransportFactory.Create(new ModbusDriverOptions { Transport = (ModbusTransportMode)999 })); }