diff --git a/NModbus/src/Modbus.Extensions/EnronModbus.cs b/NModbus/src/Modbus.Extensions/EnronModbus.cs
index 495bb38..6fb301f 100644
--- a/NModbus/src/Modbus.Extensions/EnronModbus.cs
+++ b/NModbus/src/Modbus.Extensions/EnronModbus.cs
@@ -22,10 +22,12 @@ public static class EnronModbus
/// Holding registers status
public static uint[] ReadHoldingRegisters32(this ModbusMaster master, byte slaveAddress, ushort startAddress, ushort numberOfPoints)
{
+ if (master == null)
+ throw new ArgumentNullException("master");
ValidateNumberOfPoints(numberOfPoints, 62);
// read 16 bit chunks and perform conversion
- var rawRegisters = master.ReadHoldingRegisters(slaveAddress, startAddress, (ushort) (numberOfPoints * 2));
+ var rawRegisters = master.ReadHoldingRegisters(slaveAddress, startAddress, (ushort) (numberOfPoints * 2));
return Convert(rawRegisters).ToArray();
}
@@ -40,13 +42,30 @@ public static uint[] ReadHoldingRegisters32(this ModbusMaster master, byte slave
/// Input registers status
public static uint[] ReadInputRegisters32(this ModbusMaster master, byte slaveAddress, ushort startAddress, ushort numberOfPoints)
{
+ if (master == null)
+ throw new ArgumentNullException("master");
ValidateNumberOfPoints(numberOfPoints, 62);
var rawRegisters = master.ReadInputRegisters(slaveAddress, startAddress, (ushort) (numberOfPoints * 2));
return Convert(rawRegisters).ToArray();
}
-
+
+ ///
+ /// Write a single 16 bit holding register.
+ ///
+ /// The Modbus master.
+ /// Address of the device to write to.
+ /// Address to write.
+ /// Value to write.
+ public static void WriteSingleRegister32(this ModbusMaster master, byte slaveAddress, ushort registerAddress, uint value)
+ {
+ if (master == null)
+ throw new ArgumentNullException("master");
+
+ master.WriteMultipleRegisters32(slaveAddress, registerAddress, new[] { value });
+ }
+
///
/// Write a block of contiguous 32 bit holding registers.
///
@@ -56,12 +75,14 @@ public static uint[] ReadInputRegisters32(this ModbusMaster master, byte slaveAd
/// Values to write.
public static void WriteMultipleRegisters32(this ModbusMaster master, byte slaveAddress, ushort startAddress, uint[] data)
{
+ if (master == null)
+ throw new ArgumentNullException("master");
if (data == null)
throw new ArgumentNullException("data");
if (data.Length == 0 || data.Length > 61)
{
- throw new ArgumentException(String.Format(CultureInfo.InvariantCulture,
+ throw new ArgumentException(String.Format(CultureInfo.InvariantCulture,
"The length of argument data must be between 1 and 61 inclusive."));
}
diff --git a/NModbus/src/Modbus.IntegrationTests/EnronFixture.cs b/NModbus/src/Modbus.IntegrationTests/EnronFixture.cs
new file mode 100644
index 0000000..6aabea2
--- /dev/null
+++ b/NModbus/src/Modbus.IntegrationTests/EnronFixture.cs
@@ -0,0 +1,49 @@
+using MbUnit.Framework;
+using Modbus.Extensions.Enron;
+
+namespace Modbus.IntegrationTests
+{
+ [TestFixture]
+ public class EnronFixture : NModbusSerialRtuMasterDl06SlaveFixture
+ {
+ [Test]
+ public virtual void ReadHoldingRegisters32()
+ {
+ uint[] registers = Master.ReadHoldingRegisters32(SlaveAddress, 104, 2);
+ Assert.AreEqual(new uint[] { 0, 0 }, registers);
+ }
+
+ [Test]
+ public virtual void ReadInputRegisters32()
+ {
+ uint[] registers = Master.ReadInputRegisters32(SlaveAddress, 104, 2);
+ Assert.AreEqual(new uint[] { 0, 0 }, registers);
+ }
+
+ [Test]
+ public virtual void WriteSingleRegister32()
+ {
+ ushort testAddress = 200;
+ uint testValue = 350;
+
+ uint originalValue = Master.ReadHoldingRegisters32(SlaveAddress, testAddress, 1)[0];
+ Master.WriteSingleRegister32(SlaveAddress, testAddress, testValue);
+ Assert.AreEqual(testValue, Master.ReadHoldingRegisters32(SlaveAddress, testAddress, 1)[0]);
+ Master.WriteSingleRegister32(SlaveAddress, testAddress, originalValue);
+ Assert.AreEqual(originalValue, Master.ReadHoldingRegisters(SlaveAddress, testAddress, 1)[0]);
+ }
+
+ [Test]
+ public virtual void WriteMultipleRegisters32()
+ {
+ ushort testAddress = 120;
+ uint[] testValues = new uint[] { 10, 20, 30, 40, 50 };
+
+ uint[] originalValues = Master.ReadHoldingRegisters32(SlaveAddress, testAddress, (ushort) testValues.Length);
+ Master.WriteMultipleRegisters32(SlaveAddress, testAddress, testValues);
+ uint[] newValues = Master.ReadHoldingRegisters32(SlaveAddress, testAddress, (ushort) testValues.Length);
+ Assert.AreEqual(testValues, newValues);
+ Master.WriteMultipleRegisters32(SlaveAddress, testAddress, originalValues);
+ }
+ }
+}
diff --git a/NModbus/src/Modbus.IntegrationTests/Modbus.IntegrationTests.csproj b/NModbus/src/Modbus.IntegrationTests/Modbus.IntegrationTests.csproj
index 009ae04..8b36882 100644
--- a/NModbus/src/Modbus.IntegrationTests/Modbus.IntegrationTests.csproj
+++ b/NModbus/src/Modbus.IntegrationTests/Modbus.IntegrationTests.csproj
@@ -83,6 +83,7 @@
+
@@ -109,6 +110,10 @@
{16FFB4F2-5556-439E-8729-92FB3425EF1F}
FtdAdapter
+
+ {667F4D2C-C9DF-4CC4-A1A6-768F6E879CE5}
+ Modbus.Extensions
+
{FF96B252-2B24-44A1-A09C-6401B5D7ED23}
Modbus
diff --git a/NModbus/src/Modbus.IntegrationTests/ModbusMasterFixture.cs b/NModbus/src/Modbus.IntegrationTests/ModbusMasterFixture.cs
index 46b9327..c9332a6 100644
--- a/NModbus/src/Modbus.IntegrationTests/ModbusMasterFixture.cs
+++ b/NModbus/src/Modbus.IntegrationTests/ModbusMasterFixture.cs
@@ -142,7 +142,7 @@ public virtual void ReadHoldingRegisters()
{
ushort[] registers = Master.ReadHoldingRegisters(SlaveAddress, 104, 2);
Assert.AreEqual(new ushort[] { 0, 0 }, registers);
- }
+ }
[Test]
public virtual void ReadInputRegisters()
@@ -150,7 +150,7 @@ public virtual void ReadInputRegisters()
ushort[] registers = Master.ReadInputRegisters(SlaveAddress, 104, 2);
Assert.AreEqual(new ushort[] { 0, 0 }, registers);
}
-
+
[Test]
public virtual void WriteSingleCoil()
{
@@ -258,7 +258,7 @@ public virtual void ExecuteCustomMessage_WriteMultipleRegisters()
Assert.AreEqual(testValues, newValues);
writeRequest = new CustomWriteMultipleRegistersRequest(16, SlaveAddress, testAddress, new RegisterCollection(originalValues));
Master.ExecuteCustomMessage(writeRequest);
- }
+ }
///
/// Perform read registers command