internal static ReadHoldingInputRegistersResponse ReadRegisters(ReadHoldingInputRegistersRequest request, ModbusDataCollection<ushort> dataSource)
        {
            RegisterCollection data = DataStore.ReadData<RegisterCollection, ushort>(dataSource, request.StartAddress, request.NumberOfPoints);
            ReadHoldingInputRegistersResponse response = new ReadHoldingInputRegistersResponse(request.FunctionCode, request.SlaveAddress, data);

            return response;
        }
Esempio n. 2
0
        internal ushort[] ReadRegisters(byte functionCode, byte slaveAddress, ushort startAddress, ushort numberOfPoints)
        {
            ReadHoldingInputRegistersRequest  request  = new ReadHoldingInputRegistersRequest(functionCode, slaveAddress, startAddress, numberOfPoints);
            ReadHoldingInputRegistersResponse response = Transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request);

            return(response.Data.ToArray());
        }
Esempio n. 3
0
        private ushort[] PerformReadRegisters(ReadWriteMultipleRegistersRequest request)
        {
            ReadHoldingInputRegistersResponse response =
                Transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request);

            return(response.Data.Take(request.ReadRequest.NumberOfPoints).ToArray());
        }
Esempio n. 4
0
 public void ReadRegistersHoldingRegisters()
 {
     var expectedResponse = new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection(1, 2, 3, 4, 5, 6));
     var response = ModbusSlave.ReadRegisters(new ReadHoldingInputRegistersRequest(Modbus.ReadHoldingRegisters, 1, 0, 6), _testDataStore, _testDataStore.HoldingRegisters);
     AssertModbusMessagePropertiesAreEqual(expectedResponse, response);
     Assert.AreEqual(expectedResponse.ByteCount, response.ByteCount);
 }
Esempio n. 5
0
        /// <summary>
        /// Performs a combination of one read operation and one write operation in a single Modbus transaction.
        /// The write operation is performed before the read.
        /// </summary>
        /// <param name="slaveAddress">Address of device to read values from.</param>
        /// <param name="startReadAddress">Address to begin reading (Holding registers are addressed starting at 0).</param>
        /// <param name="numberOfPointsToRead">Number of registers to read.</param>
        /// <param name="startWriteAddress">Address to begin writing (Holding registers are addressed starting at 0).</param>
        /// <param name="writeData">Register values to write.</param>
        public ushort[] ReadWriteMultipleRegisters(byte slaveAddress, ushort startReadAddress, ushort numberOfPointsToRead, ushort startWriteAddress, ushort[] writeData)
        {
            ReadWriteMultipleRegistersRequest request  = new ReadWriteMultipleRegistersRequest(slaveAddress, startReadAddress, numberOfPointsToRead, startWriteAddress, new RegisterCollection(writeData));
            ReadHoldingInputRegistersResponse response = Transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request);

            return(CollectionUtility.ToArray(response.Data));
        }
Esempio n. 6
0
        public void ToString_ReadInputRegistersResponse()
        {
            ReadHoldingInputRegistersResponse response = new ReadHoldingInputRegistersResponse(
                Modbus.ReadInputRegisters, 1, new RegisterCollection(1));

            Assert.Equal("Read 1 input registers.", response.ToString());
        }
        public void UnicastMessage_AcknowlegeSlaveException()
        {
            MockRepository  mocks     = new MockRepository();
            ModbusTransport transport = mocks.PartialMock <ModbusTransport>();

            // set the wait to retry property to a small value so the test completes quickly
            transport.WaitToRetryMilliseconds = 5;

            transport.Write(null);
            LastCall.IgnoreArguments();

            // return a slave exception a greater number of times than number of retries to make sure we aren't just retrying
            Expect.Call(transport.ReadResponse <ReadHoldingInputRegistersResponse>())
            .Return(new SlaveExceptionResponse(1, Modbus.ReadHoldingRegisters + Modbus.ExceptionOffset, Modbus.Acknowledge))
            .Repeat.Times(transport.Retries + 1);

            Expect.Call(transport.ReadResponse <ReadHoldingInputRegistersResponse>())
            .Return(new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection(1)));

            transport.Stub(x => x.OnValidateResponse(null, null))
            .IgnoreArguments()
            .Return(true);

            mocks.ReplayAll();

            ReadHoldingInputRegistersRequest  request          = new ReadHoldingInputRegistersRequest(Modbus.ReadHoldingRegisters, 1, 1, 1);
            ReadHoldingInputRegistersResponse expectedResponse = new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection(1));
            ReadHoldingInputRegistersResponse response         = transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request);

            Assert.AreEqual(expectedResponse.MessageFrame, response.MessageFrame);

            mocks.VerifyAll();
        }
        public void CreateModbusMessageReadHoldingRegistersResponse()
        {
            ReadHoldingInputRegistersResponse response         = ModbusMessageFactory.CreateModbusMessage <ReadHoldingInputRegistersResponse>(new byte[] { 11, Modbus.ReadHoldingRegisters, 4, 0, 3, 0, 4 });
            ReadHoldingInputRegistersResponse expectedResponse = new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 11, new RegisterCollection(3, 4));

            AssertModbusMessagePropertiesAreEqual(expectedResponse, response);
        }
Esempio n. 9
0
        public void UnicastMessage_ReReads_IfShouldRetryReturnTrue()
        {
            MockRepository  mocks     = new MockRepository();
            ModbusTransport transport = mocks.PartialMock <ModbusTransport>();

            transport.RetryOnOldResponseThreshold = 3;
            transport.Stub(x => x.Write(null)).IgnoreArguments();

            Expect.Call(transport.ReadResponse <ReadHoldingInputRegistersResponse>())
            .Return(new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection(1)))
            .Repeat.Times(2)
            .Message("ReadResponse should be called twice, one for the retry");

            transport.Expect(x => x.OnValidateResponse(null, null)).IgnoreArguments();

            Expect.Call(transport.OnShouldRetryResponse(null, null))
            .IgnoreArguments()
            .Return(true)
            .Repeat.Times(1);
            Expect.Call(transport.OnShouldRetryResponse(null, null))
            .IgnoreArguments()
            .Return(false)
            .Repeat.Times(1);

            mocks.ReplayAll();
            ReadHoldingInputRegistersRequest  request  = new ReadHoldingInputRegistersRequest(Modbus.ReadHoldingRegisters, 1, 1, 1);
            ReadHoldingInputRegistersResponse response = transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request);

            mocks.VerifyAll();
        }
Esempio n. 10
0
 public void ReadRegistersInputRegisters()
 {
     ReadHoldingInputRegistersResponse expectedResponse = new ReadHoldingInputRegistersResponse(Modbus.ReadInputRegisters, 1, new RegisterCollection(10, 20, 30, 40, 50, 60));
     ReadHoldingInputRegistersResponse response = ModbusSlave.ReadRegisters(new ReadHoldingInputRegistersRequest(Modbus.ReadInputRegisters, 1, 0, 6), _testDataStore, _testDataStore.InputRegisters);
     AssertModbusMessagePropertiesAreEqual(expectedResponse, response);
     Assert.AreEqual(expectedResponse.ByteCount, response.ByteCount);
 }
Esempio n. 11
0
        public void UnicastMessage_ReReads_IfShouldRetryReturnTrue()
        {
            var mock = new Mock <ModbusTransport>()
            {
                CallBase = true
            };
            var transport                       = mock.Object;
            var expectedResponse                = new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection(1));
            int readResponseCallsCount          = 0;
            int onShouldRetryResponseCallsCount = 0;

            bool[] expectedReturn = { true, false };

            transport.RetryOnOldResponseThreshold = 3;

            mock.Setup(t => t.Write(It.IsNotNull <IModbusMessage>()));
            ////transport.Stub(x => x.Write(null)).IgnoreArguments();

            mock.Setup(t => t.OnValidateResponse(It.IsNotNull <IModbusMessage>(), It.IsNotNull <IModbusMessage>()));

            mock.Setup(t => t.OnShouldRetryResponse(It.IsNotNull <IModbusMessage>(), It.IsNotNull <IModbusMessage>()))
            .Returns(() => expectedReturn[onShouldRetryResponseCallsCount++]);

            mock.Setup(t => t.ReadResponse <ReadHoldingInputRegistersResponse>())
            .Returns(expectedResponse)
            .Callback(() => ++ readResponseCallsCount);

            var request  = new ReadHoldingInputRegistersRequest(Modbus.ReadHoldingRegisters, 1, 1, 1);
            var response = transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request);

            Assert.Equal(2, readResponseCallsCount);
            Assert.Equal(2, onShouldRetryResponseCallsCount);
            Assert.Equal(expectedResponse.MessageFrame, response.MessageFrame);
            mock.VerifyAll();
        }
Esempio n. 12
0
        #pragma warning restore CS1591 // O comentário XML ausente não foi encontrado para o tipo ou membro visível publicamente

        internal ushort[] ReadRegisters(byte functionCode, byte slaveAddress, ushort startAddress, ushort numberOfPoints)
        {
            ReadHoldingInputRegistersRequest  request  = new ReadHoldingInputRegistersRequest(functionCode, slaveAddress, startAddress, numberOfPoints);
            ReadHoldingInputRegistersResponse response = Transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request);

            try
            {
                if (response != null)
                {
                    return(response.Data.ToArray());
                }
                else
                {
                    error = "Erro Modbus";
                    ushort[] registers = new ushort[] { 1, 2, 3 };

                    return(registers);
                }
            }
            catch (Exception ex)
            {
                error = ex.ToString();

                ushort[] registers = new ushort[] { 1, 2, 3 };
                return(registers);
            }
        }
        public void UnicastMessage_ReReadsIfValidateResponseIsFalse()
        {
            MockRepository  mocks     = new MockRepository();
            ModbusTransport transport = mocks.PartialMock <ModbusTransport>();

            transport.WaitToRetryMilliseconds = 5;

            transport.Write(null);
            LastCall.IgnoreArguments();

            Expect.Call(transport.ReadResponse <ReadHoldingInputRegistersResponse>())
            .Return(new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection(1)))
            .Repeat.Times(2)
            .Message("ReadResponse should be called twice, one for the retry");

            Expect.Call(transport.OnValidateResponse(null, null))
            .IgnoreArguments()
            .Return(false)
            .Repeat.Times(1);
            Expect.Call(transport.OnValidateResponse(null, null))
            .IgnoreArguments()
            .Return(true)
            .Repeat.Times(1);

            mocks.ReplayAll();
            ReadHoldingInputRegistersRequest  request  = new ReadHoldingInputRegistersRequest(Modbus.ReadHoldingRegisters, 1, 1, 1);
            ReadHoldingInputRegistersResponse response = transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request);

            mocks.VerifyAll();
        }
Esempio n. 14
0
        internal static ReadHoldingInputRegistersResponse ReadRegisters(ReadHoldingInputRegistersRequest request, DataStore dataStore, ModbusDataCollection <ushort> dataSource)
        {
            RegisterCollection data = DataStore.ReadData <RegisterCollection, ushort>(dataStore, dataSource, request.StartAddress, request.NumberOfPoints, dataStore.SyncRoot);
            ReadHoldingInputRegistersResponse response = new ReadHoldingInputRegistersResponse(request.FunctionCode, request.SlaveAddress, data);

            return(response);
        }
Esempio n. 15
0
        public void ReadRegistersInputRegisters()
        {
            ReadHoldingInputRegistersResponse expectedResponse = new ReadHoldingInputRegistersResponse(Modbus.ReadInputRegisters, 1, new RegisterCollection(10, 20, 30, 40, 50, 60));
            ReadHoldingInputRegistersResponse response         = ModbusSlave.ReadRegisters(new ReadHoldingInputRegistersRequest(Modbus.ReadInputRegisters, 1, 0, 6), _testDataStore, _testDataStore.InputRegisters);

            AssertModbusMessagePropertiesAreEqual(expectedResponse, response);
            Assert.AreEqual(expectedResponse.ByteCount, response.ByteCount);
        }
Esempio n. 16
0
        public ushort[] GetReadInputRegistersResponse(byte[] readBytes, IModbusMessage request)
        {
            ReadHoldingInputRegistersResponse response = (ReadHoldingInputRegistersResponse)Transport.CreateResponse <ReadHoldingInputRegistersResponse>(readBytes);

            Transport.ValidateResponse(request, response);

            return(response.Data.ToArray());
        }
 public void ReadInputRegistersResponse()
 {
     ReadHoldingInputRegistersResponse response = new ReadHoldingInputRegistersResponse(Modbus.ReadInputRegisters, 5, new RegisterCollection(1, 2));
     Assert.AreEqual(Modbus.ReadInputRegisters, response.FunctionCode);
     Assert.AreEqual(5, response.SlaveAddress);
     Assert.AreEqual(4, response.ByteCount);
     RegisterCollection col = new RegisterCollection(1, 2);
     Assert.AreEqual(col.NetworkBytes, response.Data.NetworkBytes);
 }
 public void CreateModbusMessageReadHoldingRegistersResponse()
 {
     ReadHoldingInputRegistersResponse response =
         ModbusMessageFactory.CreateModbusMessage<ReadHoldingInputRegistersResponse>(new byte[]
         {11, Modbus.ReadHoldingRegisters, 4, 0, 3, 0, 4});
     ReadHoldingInputRegistersResponse expectedResponse =
         new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 11, new RegisterCollection(3, 4));
     AssertModbusMessagePropertiesAreEqual(expectedResponse, response);
 }
Esempio n. 19
0
        /// <summary>
        /// Performs a combination of one read operation and one write operation in a single Modbus transaction.
        /// The write operation is performed before the read.
        /// </summary>
        /// <param name="slaveAddress">Address of device to read values from.</param>
        /// <param name="startReadAddress">Address to begin reading (Holding registers are addressed starting at 0).</param>
        /// <param name="numberOfPointsToRead">Number of registers to read.</param>
        /// <param name="startWriteAddress">Address to begin writing (Holding registers are addressed starting at 0).</param>
        /// <param name="writeData">Register values to write.</param>
        public ushort[] ReadWriteMultipleRegisters(byte slaveAddress, ushort startReadAddress, ushort numberOfPointsToRead, ushort startWriteAddress, ushort[] writeData)
        {
            ValidateNumberOfPoints("numberOfPointsToRead", numberOfPointsToRead, 125);
            ValidateData("writeData", writeData, 121);

            ReadWriteMultipleRegistersRequest request  = new ReadWriteMultipleRegistersRequest(slaveAddress, startReadAddress, numberOfPointsToRead, startWriteAddress, new RegisterCollection(writeData));
            ReadHoldingInputRegistersResponse response = Transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request);

            return(response.Data.ToArray());
        }
    public void ValidateResponse_MismatchingSlaveAddress()
    {
        Mock <ModbusTransport>?mock      = new(MockBehavior.Strict) { CallBase = true };
        ModbusTransport?       transport = mock.Object;

        IModbusMessage request  = new ReadCoilsInputsRequest(Modbus.ReadCoils, 42, 1, 1);
        IModbusMessage response = new ReadHoldingInputRegistersResponse(Modbus.ReadCoils, 33, new RegisterCollection());

        Assert.Throws <IOException>(() => transport.ValidateResponse(request, response));
    }
        public void ReadInputRegistersResponse()
        {
            ReadHoldingInputRegistersResponse response = new ReadHoldingInputRegistersResponse(Modbus.ReadInputRegisters, 5, new RegisterCollection(1, 2));

            Assert.AreEqual(Modbus.ReadInputRegisters, response.FunctionCode);
            Assert.AreEqual(5, response.SlaveAddress);
            Assert.AreEqual(4, response.ByteCount);
            RegisterCollection col = new RegisterCollection(1, 2);

            Assert.AreEqual(col.NetworkBytes, response.Data.NetworkBytes);
        }
        public void ValidateResponse_MismatchingFunctionCodes()
        {
            MockRepository  mocks     = new MockRepository();
            ModbusTransport transport = mocks.PartialMock <ModbusTransport>();

            IModbusMessage request  = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);
            IModbusMessage response = new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection());

            mocks.ReplayAll();
            Assert.Throws <IOException>(() => transport.ValidateResponse(request, response));
        }
Esempio n. 23
0
        public void ReadRegistersHoldingRegisters()
        {
            ReadHoldingInputRegistersResponse expectedResponse =
                new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1,
                                                      new RegisterCollection(1, 2, 3, 4, 5, 6));
            ReadHoldingInputRegistersResponse response =
                ModbusSlave.ReadRegisters(new ReadHoldingInputRegistersRequest(Modbus.ReadHoldingRegisters, 1, 0, 6),
                                          _testDataStore, _testDataStore.HoldingRegisters);

            ModbusMessageFixture.AssertModbusMessagePropertiesAreEqual(expectedResponse, response);
            Assert.Equal(expectedResponse.ByteCount, response.ByteCount);
        }
Esempio n. 24
0
        public void ValidateResponse_MismatchingFunctionCodes()
        {
            var mock = new Mock <ModbusTransport>(MockBehavior.Strict)
            {
                CallBase = true
            };
            var transport = mock.Object;

            IModbusMessage request  = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);
            IModbusMessage response = new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection());

            Assert.Throws <IOException>(() => transport.ValidateResponse(request, response));
        }
Esempio n. 25
0
        public void ValidateResponse_MismatchingSlaveAddress()
        {
            var mock = new Mock <ModbusTransport>(MockBehavior.Strict, new ModbusFactory(), NullModbusLogger.Instance)
            {
                CallBase = true
            };
            ModbusTransport transport = mock.Object;

            IModbusMessage request  = new ReadCoilsInputsRequest(ModbusFunctionCodes.ReadCoils, 42, 1, 1);
            IModbusMessage response = new ReadHoldingInputRegistersResponse(ModbusFunctionCodes.ReadCoils, 33, new RegisterCollection());

            Assert.Throws <IOException>(() => transport.ValidateResponse(request, response));
        }
Esempio n. 26
0
        public void UnicastMessage_SlaveDeviceBusySlaveException()
        {
            var mock = new Mock <ModbusTransport>()
            {
                CallBase = true
            };
            var transport              = mock.Object;
            int writeCallsCount        = 0;
            int readResponseCallsCount = 0;

            // set the wait to retry property to a small value so the test completes quickly
            transport.WaitToRetryMilliseconds = 5;

            mock.Setup(t => t.Write(It.IsNotNull <IModbusMessage>()))
            .Callback(() => ++ writeCallsCount);

            // return a slave exception a greater number of times than number of retries to make sure we aren't just retrying
            mock.Setup(t => t.ReadResponse <ReadHoldingInputRegistersResponse>())
            .Returns(() =>
            {
                if (readResponseCallsCount == 0)
                {
                    return(new SlaveExceptionResponse(1, Modbus.ReadHoldingRegisters + Modbus.ExceptionOffset, Modbus.SlaveDeviceBusy));
                }
                else
                {
                    return(new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection(1)));
                }
            })
            .Callback(() => ++ readResponseCallsCount);

            mock.Setup(t => t.OnValidateResponse(It.IsNotNull <IModbusMessage>(), It.IsNotNull <IModbusMessage>()));

            var request          = new ReadHoldingInputRegistersRequest(Modbus.ReadHoldingRegisters, 1, 1, 1);
            var expectedResponse = new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection(1));
            var response         = transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request);

            Assert.Equal(2, writeCallsCount);
            Assert.Equal(2, readResponseCallsCount);
            Assert.Equal(expectedResponse.MessageFrame, response.MessageFrame);

            mock.VerifyAll();
        }
Esempio n. 27
0
        public void UnicastMessage_AcknowlegeSlaveException()
        {
            var mock = new Mock <ModbusTransport>(new ModbusFactory(), NullModbusLogger.Instance)
            {
                CallBase = true
            };
            ModbusTransport transport  = mock.Object;
            int             callsCount = 0;

            // set the wait to retry property to a small value so the test completes quickly
            transport.WaitToRetryMilliseconds = 5;

            mock.Setup(t => t.Write(It.IsNotNull <IModbusMessage>()));

            // return a slave exception a greater number of times than number of retries to make sure we aren't just retrying
            mock.Setup(t => t.ReadResponse <ReadHoldingInputRegistersResponse>())
            .Returns(() =>
            {
                if (callsCount < transport.Retries + 1)
                {
                    ++callsCount;
                    return(new SlaveExceptionResponse(1, ModbusFunctionCodes.ReadHoldingRegisters + Modbus.ExceptionOffset, SlaveExceptionCodes.Acknowledge));
                }

                return(new ReadHoldingInputRegistersResponse(ModbusFunctionCodes.ReadHoldingRegisters, 1, new RegisterCollection(1)));
            });

            mock.Setup(t => t.OnValidateResponse(It.IsNotNull <IModbusMessage>(), It.IsNotNull <IModbusMessage>()));

            var request          = new ReadHoldingInputRegistersRequest(ModbusFunctionCodes.ReadHoldingRegisters, 1, 1, 1);
            var expectedResponse = new ReadHoldingInputRegistersResponse(ModbusFunctionCodes.ReadHoldingRegisters, 1, new RegisterCollection(1));
            ReadHoldingInputRegistersResponse response = transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request);

            Assert.Equal(transport.Retries + 1, callsCount);
            Assert.Equal(expectedResponse.MessageFrame, response.MessageFrame);
            mock.VerifyAll();
        }
 public void ToString_ReadInputRegistersResponse()
 {
     ReadHoldingInputRegistersResponse response = new ReadHoldingInputRegistersResponse(Modbus.ReadInputRegisters, 1, new RegisterCollection(1));
     Assert.AreEqual("Read 1 input registers.", response.ToString());
 }
        public void UnicastMessage_AcknowlegeSlaveException()
        {
            MockRepository mocks = new MockRepository();
            ModbusTransport transport = mocks.PartialMock<ModbusTransport>();

            // set the wait to retry property to a small value so the test completes quickly
            transport.WaitToRetryMilliseconds = 5;

            transport.Write(null);
            LastCall.IgnoreArguments();

            // return a slave exception a greater number of times than number of retries to make sure we aren't just retrying
            Expect.Call(transport.ReadResponse<ReadHoldingInputRegistersResponse>())
                .Return(new SlaveExceptionResponse(1, Modbus.ReadHoldingRegisters + Modbus.ExceptionOffset,
                    Modbus.Acknowledge))
                .Repeat.Times(transport.Retries + 1);

            Expect.Call(transport.ReadResponse<ReadHoldingInputRegistersResponse>())
                .Return(new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection(1)));

            transport.OnValidateResponse(null, null);
            LastCall.IgnoreArguments();

            mocks.ReplayAll();

            ReadHoldingInputRegistersRequest request = new ReadHoldingInputRegistersRequest(
                Modbus.ReadHoldingRegisters, 1, 1, 1);
            ReadHoldingInputRegistersResponse expectedResponse =
                new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1, new RegisterCollection(1));
            ReadHoldingInputRegistersResponse response =
                transport.UnicastMessage<ReadHoldingInputRegistersResponse>(request);
            Assert.AreEqual(expectedResponse.MessageFrame, response.MessageFrame);

            mocks.VerifyAll();
        }
        public void ValidateResponse_MismatchingFunctionCodes()
        {
            MockRepository mocks = new MockRepository();
            ModbusTransport transport = mocks.PartialMock<ModbusTransport>();

            IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1);
            IModbusMessage response = new ReadHoldingInputRegistersResponse(Modbus.ReadHoldingRegisters, 1,
                new RegisterCollection());

            mocks.ReplayAll();
            transport.ValidateResponse(request, response);
            mocks.VerifyAll();
        }