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 }));
}