internal static ReadCoilsInputsResponse ReadDiscretes(ReadCoilsInputsRequest request, ModbusDataCollection<bool> dataSource) { DiscreteCollection data = DataStore.ReadData<DiscreteCollection, bool>(dataSource, request.StartAddress, request.NumberOfPoints); ReadCoilsInputsResponse response = new ReadCoilsInputsResponse(request.FunctionCode, request.SlaveAddress, data.ByteCount, data); return response; }
public void BuildMessageFrame() { byte[] message = {17, Modbus.ReadCoils, 0, 19, 0, 37, 14, 132}; ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 17, 19, 37); Assert.Equal(message, new ModbusRtuTransport(MockRepository.GenerateStub<IStreamResource>()).BuildMessageFrame(request)); }
public void ReadRequestResponse() { MockRepository mocks = new MockRepository(); var mockTransport = mocks.StrictMock<IStreamResource>(null); byte[] mbapHeader = { 45, 63, 0, 0, 0, 6 }; Expect.Call(mockTransport.Read(new byte[6], 0, 6)).Do(((Func<byte[], int, int, int>)delegate(byte[] buf, int offset, int count) { Array.Copy(mbapHeader, buf, 6); return 6; })); ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 3); Expect.Call(mockTransport.Read(new byte[6], 0, 6)).Do(((Func<byte[], int, int, int>)delegate(byte[] buf, int offset, int count) { Array.Copy(new byte[] { 1 }.Concat(request.ProtocolDataUnit).ToArray(), buf, 6); return 6; })); mocks.ReplayAll(); Assert.AreEqual(ModbusIpTransport.ReadRequestResponse(mockTransport), new byte[] { 45, 63, 0, 0, 0, 6, 1, 1, 0, 1, 0, 3 }); mocks.VerifyAll(); }
public void BuildMessageFrame() { byte[] expected = { 58, 48, 50, 48, 49, 48, 48, 48, 48, 48, 48, 48, 49, 70, 67, 13, 10 }; ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 2, 0, 1); var actual = new ModbusAsciiTransport(MockRepository.GenerateStub<IStreamResource>()).BuildMessageFrame(request); Assert.AreEqual(expected, actual); }
public void ChecksumsMatchFail() { ModbusRtuTransport transport = new ModbusRtuTransport(MockRepository.GenerateStub<IStreamResource>()); ReadCoilsInputsRequest message = new ReadCoilsInputsRequest(Modbus.ReadCoils, 17, 19, 38); byte[] frame = { 17, Modbus.ReadCoils, 0, 19, 0, 37, 14, 132 }; Assert.IsFalse(transport.ChecksumsMatch(message, frame)); }
public void ChecksumsMatchSucceed() { ModbusAsciiTransport transport = new ModbusAsciiTransport(MockRepository.GenerateStub<IStreamResource>()); ReadCoilsInputsRequest message = new ReadCoilsInputsRequest(Modbus.ReadCoils, 17, 19, 37); byte[] frame = { 17, Modbus.ReadCoils, 0, 19, 0, 37, 182 }; Assert.IsTrue(transport.ChecksumsMatch(message, frame)); }
public void CreateReadInputsRequest() { ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadInputs, 5, 1, 10); Assert.AreEqual(Modbus.ReadInputs, request.FunctionCode); Assert.AreEqual(5, request.SlaveAddress); Assert.AreEqual(1, request.StartAddress); Assert.AreEqual(10, request.NumberOfPoints); }
public void CreateModbusMessageReadCoilsRequest() { ReadCoilsInputsRequest request = ModbusMessageFactory.CreateModbusMessage<ReadCoilsInputsRequest>(new byte[] { 11, Modbus.ReadCoils, 0, 19, 0, 37 }); ReadCoilsInputsRequest expectedRequest = new ReadCoilsInputsRequest(Modbus.ReadCoils, 11, 19, 37); AssertModbusMessagePropertiesAreEqual(request, expectedRequest); Assert.AreEqual(expectedRequest.StartAddress, request.StartAddress); Assert.AreEqual(expectedRequest.NumberOfPoints, request.NumberOfPoints); }
public void BuildMessageFrame() { MockRepository mocks = new MockRepository(); ModbusIpTransport mockModbusTcpTransport = mocks.PartialMock<ModbusIpTransport>(MockRepository.GenerateStub<IStreamResource>()); ReadCoilsInputsRequest message = new ReadCoilsInputsRequest(Modbus.ReadCoils, 2, 10, 5); mocks.ReplayAll(); Assert.AreEqual(new byte[] { 0, 0, 0, 0, 0, 6, 2, 1, 0, 10, 0, 5 }, mockModbusTcpTransport.BuildMessageFrame(message)); mocks.VerifyAll(); }
public void Write() { MockRepository mocks = new MockRepository(); var mockTcpStreamAdapter = mocks.StrictMock<IStreamResource>(); mockTcpStreamAdapter.Write(new byte[] { 255, 255, 0, 0, 0, 6, 1, 1, 0, 1, 0, 3 }, 0, 12); ModbusIpTransport mockModbusTcpTransport = mocks.PartialMock<ModbusIpTransport>(mockTcpStreamAdapter); Expect.Call(mockModbusTcpTransport.GetNewTransactionId()).Return(UInt16.MaxValue); mocks.ReplayAll(); ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 3); mockModbusTcpTransport.Write(request); mocks.VerifyAll(); }
public void UnicastMessage_ErrorSlaveException() { MockRepository mocks = new MockRepository(); ModbusTransport transport = mocks.PartialMock<ModbusTransport>(); transport.Write(null); LastCall.IgnoreArguments(); Expect.Call(transport.ReadResponse<ReadCoilsInputsResponse>()) .Do((ThrowExceptionDelegate)delegate { throw new SlaveException(); }); mocks.ReplayAll(); ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadInputs, 2, 3, 4); Assert.Throws<SlaveException>(() => transport.UnicastMessage<ReadCoilsInputsResponse>(request)); mocks.VerifyAll(); }
public void UnicastMessage_WrongResponseFunctionCode() { MockRepository mocks = new MockRepository(); ModbusTransport transport = mocks.PartialMock<ModbusTransport>(); transport.Write(null); LastCall.IgnoreArguments().Repeat.Times(Modbus.DefaultRetries + 1); // read 4 coils from slave id 2 Expect.Call(transport.ReadResponse<ReadCoilsInputsResponse>()) .Return(new ReadCoilsInputsResponse(Modbus.ReadCoils, 2, 0, new DiscreteCollection())) .Repeat.Times(Modbus.DefaultRetries + 1); mocks.ReplayAll(); ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadInputs, 2, 3, 4); Assert.Throws<IOException>(() => transport.UnicastMessage<ReadCoilsInputsResponse>(request)); mocks.VerifyAll(); }
public void UnicastMessage_PurgeReceiveBuffer() { MockRepository mocks = new MockRepository(); IStreamResource serialResource = mocks.StrictMock<IStreamResource>(); ModbusSerialTransport transport = new ModbusRtuTransport(serialResource); serialResource.DiscardInBuffer(); serialResource.Write(null, 0, 0); LastCall.IgnoreArguments(); // mangled response Expect.Call(serialResource.Read(new byte[] { 0, 0, 0, 0 }, 0, 4)).Return(4); serialResource.DiscardInBuffer(); serialResource.Write(null, 0, 0); LastCall.IgnoreArguments(); // normal response ReadCoilsInputsResponse response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 2, 1, new DiscreteCollection(true, false, true, false, false, false, false, false)); // read header Expect.Call(serialResource.Read(new byte[] { 0, 0, 0, 0 }, 0, 4)).Do(((Func<byte[], int, int, int>) delegate(byte[] buf, int offset, int count) { Array.Copy(response.MessageFrame, 0, buf, 0, 4); return 4; })); // read remainder Expect.Call(serialResource.Read(new byte[] { 0, 0 }, 0, 2)).Do(((Func<byte[], int, int, int>) delegate(byte[] buf, int offset, int count) { Array.Copy(ModbusUtility.CalculateCrc(response.MessageFrame), 0, buf, 0, 2); return 2; })); mocks.ReplayAll(); ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 2, 3, 4); transport.UnicastMessage<ReadCoilsInputsResponse>(request); mocks.VerifyAll(); }
public void UnicastMessage() { MockRepository mocks = new MockRepository(); ModbusTransport transport = mocks.PartialMock<ModbusTransport>(); transport.Write(null); LastCall.IgnoreArguments(); // read 4 coils from slave id 2 Expect.Call(transport.ReadResponse<ReadCoilsInputsResponse>()) .Return(new ReadCoilsInputsResponse(Modbus.ReadCoils, 2, 1, new DiscreteCollection(true, false, true, false, false, false, false, false))); transport.OnValidateResponse(null, null); LastCall.IgnoreArguments(); mocks.ReplayAll(); ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 2, 3, 4); ReadCoilsInputsResponse expectedResponse = new ReadCoilsInputsResponse(Modbus.ReadCoils, 2, 1, new DiscreteCollection(true, false, true, false, false, false, false, false)); ReadCoilsInputsResponse response = transport.UnicastMessage<ReadCoilsInputsResponse>(request); Assert.AreEqual(expectedResponse.MessageFrame, response.MessageFrame); mocks.VerifyAll(); }
public void CalculateLrc2() { //: 02 01 0000 0001 FC ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 2, 0, 1); Assert.AreEqual(252, ModbusUtility.CalculateLrc(new byte[] { 2, 1, 0, 0, 0, 1})); }
public void CalculateLrc() { ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 10); Assert.AreEqual(243, ModbusUtility.CalculateLrc(new byte[] { 1, 1, 0, 1, 0, 10 })); }
public void CreateModbusRequestForReadCoils() { ReadCoilsInputsRequest req = new ReadCoilsInputsRequest(1, 2, 1, 10); IModbusMessage request = ModbusMessageFactory.CreateModbusRequest(req.MessageFrame); Assert.AreEqual(typeof (ReadCoilsInputsRequest), request.GetType()); }
public void MessageFrameReadCoilsRequest() { ModbusMessage message = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 2, 3); byte[] expectedMessageFrame = { 1, Modbus.ReadCoils, 0, 2, 0, 3 }; Assert.AreEqual(expectedMessageFrame, message.MessageFrame); }
public void ProtocolDataUnitReadCoilsRequest() { ModbusMessage message = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 100, 9); byte[] expectedResult = { Modbus.ReadCoils, 0, 100, 0, 9 }; Assert.AreEqual(expectedResult, message.ProtocolDataUnit); }
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(); }
public void UnicastMessage_TooManyFailingExceptions(Type exceptionType) { MockRepository mocks = new MockRepository(); ModbusTransport transport = mocks.PartialMock<ModbusTransport>(); transport.Write(null); LastCall.IgnoreArguments().Repeat.Times(transport.Retries + 1); Expect.Call(transport.ReadResponse<ReadCoilsInputsResponse>()) .Do((ThrowExceptionDelegate) delegate { throw (Exception) Activator.CreateInstance(exceptionType); }) .Repeat.Times(transport.Retries + 1); mocks.ReplayAll(); ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 2, 3, 4); Assert.Throws(exceptionType, () => transport.UnicastMessage<ReadCoilsInputsResponse>(request)); mocks.VerifyAll(); }
public void UnicastMessage_TimeoutException() { MockRepository mocks = new MockRepository(); ModbusTransport transport = mocks.PartialMock<ModbusTransport>(); transport.Write(null); LastCall.IgnoreArguments().Repeat.Times(Modbus.DefaultRetries + 1); Expect.Call(transport.ReadResponse<ReadCoilsInputsResponse>()) .Do((ThrowExceptionDelegate) delegate { throw new TimeoutException(); }) .Repeat.Times(Modbus.DefaultRetries + 1); mocks.ReplayAll(); ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadInputs, 2, 3, 4); transport.UnicastMessage<ReadCoilsInputsResponse>(request); mocks.VerifyAll(); }
public void CreateModbusRequestForReadCoils() { MockRepository mocks = new MockRepository(); var mockSlave = mocks.PartialMock<ModbusSlave>((byte) 1, new EmptyTransport()); ReadCoilsInputsRequest req = new ReadCoilsInputsRequest(1, 2, 1, 10); IModbusMessage request = ModbusMessageFactory.CreateModbusRequest(mockSlave, req.MessageFrame); Assert.AreEqual(typeof(ReadCoilsInputsRequest), request.GetType()); }
public void ToString_ReadInputsRequest() { ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadInputs, 5, 1, 10); Assert.AreEqual("Read 10 inputs starting at address 1.", request.ToString()); }
public void CreateReadCoilsInputsRequestMaxSize() { ReadCoilsInputsRequest response = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 2, Modbus.MaximumDiscreteRequestResponseSize); Assert.AreEqual(Modbus.MaximumDiscreteRequestResponseSize, response.NumberOfPoints); }
public void UnicastMessage_TooManyFailingExceptions(Type exceptionType) { MockRepository mocks = new MockRepository(); ModbusTransport transport = mocks.PartialMock<ModbusTransport>(); transport.Write(null); LastCall.IgnoreArguments().Repeat.Times(transport.Retries + 1); Expect.Call(transport.ReadResponse<ReadCoilsInputsResponse>()) .Do((ThrowExceptionDelegate) delegate { throw (Exception) Activator.CreateInstance(exceptionType); }) .Repeat.Times(transport.Retries + 1); mocks.ReplayAll(); ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 2, 3, 4); Action action = () => transport.UnicastMessage<ReadCoilsInputsResponse>(request); typeof(AssertUtility).GetMethod("Throws", BindingFlags.Public | BindingFlags.Static). MakeGenericMethod(new Type[] { exceptionType }). Invoke(transport, new object[] { action }); mocks.VerifyAll(); }
public void ValidateResponse_CallsOnValidateResponse() { MockRepository mocks = new MockRepository(); ModbusTransport transport = mocks.PartialMock<ModbusTransport>(); IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1); IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null); Expect.Call(transport.OnValidateResponse(request, response)) .Return(true); mocks.ReplayAll(); transport.ValidateResponse(request, response); mocks.VerifyAll(); }
public void ValidateResponse() { MockRepository mocks = new MockRepository(); ModbusTransport transport = mocks.PartialMock<ModbusTransport>(); IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 1, 1, 1); IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null); transport.OnValidateResponse(null, null); LastCall.IgnoreArguments(); mocks.ReplayAll(); transport.ValidateResponse(request, response); mocks.VerifyAll(); }
public void UnicastMessage_SingleFailingException(Type exceptionType) { MockRepository mocks = new MockRepository(); ModbusTransport transport = mocks.PartialMock<ModbusTransport>(); transport.Retries = 1; transport.Write(null); LastCall.IgnoreArguments().Repeat.Times(2); Expect.Call(transport.ReadResponse<ReadCoilsInputsResponse>()) .Do((ThrowExceptionDelegate) delegate { throw (Exception) Activator.CreateInstance(exceptionType); }); Expect.Call(transport.ReadResponse<ReadCoilsInputsResponse>()) .Return(new ReadCoilsInputsResponse(Modbus.ReadCoils, 2, 1, new DiscreteCollection(true, false, true, false, false, false, false, false))); transport.OnValidateResponse(null, null); LastCall.IgnoreArguments(); mocks.ReplayAll(); ReadCoilsInputsRequest request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 2, 3, 4); transport.UnicastMessage<ReadCoilsInputsResponse>(request); mocks.VerifyAll(); }
public void ShouldRetryResponse_ReturnsFalse_IfDifferentMessage() { ModbusIpTransport transport = new ModbusIpTransport(MockRepository.GenerateStub<IStreamResource>()); IModbusMessage request = new ReadCoilsInputsRequest(Modbus.ReadCoils, 2, 1, 1); IModbusMessage response = new ReadCoilsInputsResponse(Modbus.ReadCoils, 1, 1, null); Assert.False(transport.ShouldRetryResponse(request, response)); }