[TestMethod] // Oficial Example public void WriteMultipleRegistersPDU_DocSampleReq() { var ClientPDU = new WriteMultipleRegistersPDU(1, new int[] { 10, 258 }); var DacRequest = new byte[] { 0x10, // Code Function 0x00, 0x01, // Starting Address 0x00, 0x02, // Quantity 0x04, // Byte Count 0x00, 0x0A, // Value[0] 0x01, 0x02, // Value[1] }; var OKResponse = new byte[] { 0x10, // Code Function 0x00, 0x01, // Starting Address 0x00, 0x02, // Quantity }; var ExResponse = new byte[] { 0x90, 0x01, }; CollectionAssert.AreEqual(DacRequest, ClientPDU.BuildRequest(), "Wrong Request"); Assert.AreEqual(Status.OK, ClientPDU.CheckResponse(OKResponse), "OK Status not recognited"); Assert.AreEqual(Status.Exception, ClientPDU.CheckResponse(ExResponse), "Exception Status not recognited"); Assert.AreEqual(0x01, ClientPDU.ExceptionCode, "Exception not recognited"); }
public void WriteMultipleRegistersPDU_ArgumentRange() { IProtocolDataUnit TestingPDU; try { TestingPDU = new WriteMultipleRegistersPDU(MinAddress - 1, new int[NormQuantity]); Assert.Fail("Min Address Error"); } catch (ArgumentOutOfRangeException) { } try { TestingPDU = new WriteMultipleRegistersPDU(MaxAddress + 1, new int[NormQuantity]); Assert.Fail("Max Address Error"); } catch (ArgumentOutOfRangeException) { } try { TestingPDU = new WriteMultipleRegistersPDU(NormAddress, new int[MinQuantity - 1]); Assert.Fail("Min Quantity Error"); } catch (ArgumentOutOfRangeException) { } try { TestingPDU = new WriteMultipleRegistersPDU(NormAddress, new int[MaxQuantity + 1]); Assert.Fail("Max Quantity Error"); } catch (ArgumentOutOfRangeException) { } }
public void RTU_ADU_DocSampleReq() { var DocRequest = new byte[] { 0x01, 0x10, 0x00, 0x01, 0x00, 0x01, 0x02, 0xFF, 0xFF, 0xA6, 0x31, }; var DocResponse = new byte[] { 0x01, 0x10, 0x00, 0x01, 0x00, 0x01, 0x50, 0x09, }; var ClientPDU = new WriteMultipleRegistersPDU(1, new int[] { 0xFFFF }); var Device = new RTU_Device(1); var ClientADU = new RTU_ADU(Device, ClientPDU); CollectionAssert.AreEqual(DocRequest, ClientADU.BuildRequest()); Assert.AreEqual(Status.OK, ClientADU.CheckResponse(DocResponse)); }
public void WriteMultipleRegisters(IModbusDevice Device, int StartAddr, int[] Value) { if (!(Device is RTU_Device)) { throw new ArgumentException("Wrong Type", "Device"); } var PDU = new WriteMultipleRegistersPDU(StartAddr, Value); var ADU = new RTU_ADU((Device as RTU_Device), PDU); Query(ADU); }
public Status CheckRequest(byte[] Request) { if (Request.Length < 13) { return(Status.Error); } Header = new MBAP(Request); if (Header.ProtocolID != 0) { return(Status.Error); } switch (Request[1]) { case 0x01: PDU = new ReadCoilsPDU(); break; case 0x02: PDU = new ReadDiscreteInputsPDU(); break; case 0x03: PDU = new ReadHoldingRegistersPDU(); break; case 0x04: PDU = new ReadInputRegistersPDU(); break; case 0x05: PDU = new WriteSingleCoilPDU(); break; case 0x06: PDU = new WriteSingleRegisterPDU(); break; case 0x0F: PDU = new WriteMultipleCoilsPDU(); break; case 0x10: PDU = new WriteMultipleRegistersPDU(); break; default: return(Status.Error); } var PDURequest = new byte[Request.Length - 3]; for (int i = 0; i < PDURequest.Length; i++) { PDURequest[i] = Request[i + 1]; } return(PDU.CheckRequest(PDURequest)); }
public Status CheckRequest(byte[] Request) { if ((Request.Length < 4) || (Request[0] != Device.Address)) // 3 = Address + FuncCode + CRC_Lo + CRC_Hi { return(Status.Error); } if (CRC.Get(Request) != 0) { return(Status.Error); } switch (Request[1]) { case 0x01: PDU = new ReadCoilsPDU(); break; case 0x02: PDU = new ReadDiscreteInputsPDU(); break; case 0x03: PDU = new ReadHoldingRegistersPDU(); break; case 0x04: PDU = new ReadInputRegistersPDU(); break; case 0x05: PDU = new WriteSingleCoilPDU(); break; case 0x06: PDU = new WriteSingleRegisterPDU(); break; case 0x0F: PDU = new WriteMultipleCoilsPDU(); break; case 0x10: PDU = new WriteMultipleRegistersPDU(); break; default: return(Status.Error); } var PDURequest = new byte[Request.Length - 3]; for (int i = 0; i < PDURequest.Length; i++) { PDURequest[i] = Request[i + 1]; } return(PDU.CheckRequest(PDURequest)); }
[TestMethod] // Handling Request on Server public void WriteMultipleRegistersPDU_LifeCycle() { var RandomGen = new Random(); int Address = RandomGen.Next(MinAddress, MaxAddress); int Quantity = RandomGen.Next(MinQuantity, MaxQuantity); #region Build Server and Values var Server = new BaseModbusServer(); var Value = new int[Quantity]; for (int i = 0; i < Quantity; i++) { Value[i] = RandomGen.Next(0xFFFF); Server.AddHoldingRegister(Address + i); } #endregion var ClientPDU = new WriteMultipleRegistersPDU(Address, Value); var Request = ClientPDU.BuildRequest(); var ServerPDU = new WriteMultipleRegistersPDU(); var ReqStatus = ServerPDU.CheckRequest(Request); Assert.AreEqual(Status.OK, ReqStatus, "Recognition Error"); Assert.AreEqual(Address, ServerPDU.StartingAddress, "Whong Address recognition in CheckRequest"); ServerPDU.Handle(Server); CollectionAssert.AreEqual(Value, ServerPDU.Value, "Whong Address recognition in CheckRequest"); ClientPDU.CheckResponse(ServerPDU.BuildResponse()); CollectionAssert.AreEqual(Value, ClientPDU.Value, "Whong Address recognition in CheckRequest"); }