WriteSingleCoilRequestResponse.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net;
  6. using NModbus.Data;
  7. using NModbus.Unme.Common;
  8. namespace NModbus.Message
  9. {
  10. public class WriteSingleCoilRequestResponse : AbstractModbusMessageWithData<RegisterCollection>, IModbusRequest
  11. {
  12. public WriteSingleCoilRequestResponse()
  13. {
  14. }
  15. public WriteSingleCoilRequestResponse(byte slaveAddress, ushort startAddress, bool coilState)
  16. : base(slaveAddress, ModbusFunctionCodes.WriteSingleCoil)
  17. {
  18. StartAddress = startAddress;
  19. Data = new RegisterCollection(coilState ? Modbus.CoilOn : Modbus.CoilOff);
  20. }
  21. public override int MinimumFrameSize => 6;
  22. public ushort StartAddress
  23. {
  24. get => MessageImpl.StartAddress.Value;
  25. set => MessageImpl.StartAddress = value;
  26. }
  27. public override string ToString()
  28. {
  29. Debug.Assert(Data != null, "Argument Data cannot be null.");
  30. Debug.Assert(Data.Count() == 1, "Data should have a count of 1.");
  31. string msg = $"Write single coil {(Data.First() == Modbus.CoilOn ? 1 : 0)} at address {StartAddress}.";
  32. return msg;
  33. }
  34. public void ValidateResponse(IModbusMessage response)
  35. {
  36. var typedResponse = (WriteSingleCoilRequestResponse)response;
  37. if (StartAddress != typedResponse.StartAddress)
  38. {
  39. string msg = $"Unexpected start address in response. Expected {StartAddress}, received {typedResponse.StartAddress}.";
  40. throw new IOException(msg);
  41. }
  42. if (Data.First() != typedResponse.Data.First())
  43. {
  44. string msg = $"Unexpected data in response. Expected {Data.First()}, received {typedResponse.Data.First()}.";
  45. throw new IOException(msg);
  46. }
  47. }
  48. protected override void InitializeUnique(byte[] frame)
  49. {
  50. StartAddress = (ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(frame, 2));
  51. Data = new RegisterCollection(frame.Slice(4, 2).ToArray());
  52. }
  53. }
  54. }