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; }
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()); }
private ushort[] PerformReadRegisters(ReadWriteMultipleRegistersRequest request) { ReadHoldingInputRegistersResponse response = Transport.UnicastMessage <ReadHoldingInputRegistersResponse>(request); return(response.Data.Take(request.ReadRequest.NumberOfPoints).ToArray()); }
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); }
/// <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)); }
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); }
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(); }
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); }
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(); }
#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(); }
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); }
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); }
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); }
/// <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)); }
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); }
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)); }
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)); }
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(); }
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(); }