ReadCoilsInputsResponse.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using System;
  2. using System.Linq;
  3. using NModbus.Data;
  4. using NModbus.Unme.Common;
  5. namespace NModbus.Message
  6. {
  7. public class ReadCoilsInputsResponse : AbstractModbusMessageWithData<DiscreteCollection>, IModbusMessage
  8. {
  9. public ReadCoilsInputsResponse()
  10. {
  11. }
  12. public ReadCoilsInputsResponse(byte functionCode, byte slaveAddress, byte byteCount, DiscreteCollection data)
  13. : base(slaveAddress, functionCode)
  14. {
  15. ByteCount = byteCount;
  16. Data = data;
  17. }
  18. public byte ByteCount
  19. {
  20. get => MessageImpl.ByteCount.Value;
  21. set => MessageImpl.ByteCount = value;
  22. }
  23. public override int MinimumFrameSize => 3;
  24. public override string ToString()
  25. {
  26. string msg = $"Read {Data.Count()} {(FunctionCode == ModbusFunctionCodes.ReadInputs ? "inputs" : "coils")} - {Data}.";
  27. return msg;
  28. }
  29. protected override void InitializeUnique(byte[] frame)
  30. {
  31. if (frame.Length < 3 + frame[2])
  32. {
  33. throw new FormatException("Message frame data segment does not contain enough bytes.");
  34. }
  35. ByteCount = frame[2];
  36. Data = new DiscreteCollection(frame.Slice(3, ByteCount).ToArray());
  37. }
  38. }
  39. }