WriteFileRecordRequest.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using NModbus.Data;
  2. using System;
  3. using System.IO;
  4. namespace NModbus.Message
  5. {
  6. public class WriteFileRecordRequest : AbstractModbusMessageWithData<FileRecordCollection>, IModbusRequest
  7. {
  8. public WriteFileRecordRequest()
  9. {
  10. }
  11. public WriteFileRecordRequest(byte slaveAdress, FileRecordCollection data)
  12. : base(slaveAdress, ModbusFunctionCodes.WriteFileRecord)
  13. {
  14. Data = data;
  15. ByteCount = data.ByteCount;
  16. }
  17. public override int MinimumFrameSize => 10;
  18. public byte ByteCount
  19. {
  20. get => MessageImpl.ByteCount.Value;
  21. set => MessageImpl.ByteCount = value;
  22. }
  23. public void ValidateResponse(IModbusMessage response)
  24. {
  25. var typedResponse = (WriteFileRecordResponse)response;
  26. if (Data.FileNumber != typedResponse.Data.FileNumber)
  27. {
  28. string msg = $"Unexpected file number in response. Expected {Data.FileNumber}, received {typedResponse.Data.FileNumber}.";
  29. throw new IOException(msg);
  30. }
  31. if (Data.StartingAddress != typedResponse.Data.StartingAddress)
  32. {
  33. string msg = $"Unexpected starting address in response. Expected {Data.StartingAddress}, received {typedResponse.Data.StartingAddress}.";
  34. throw new IOException(msg);
  35. }
  36. }
  37. protected override void InitializeUnique(byte[] frame)
  38. {
  39. if (frame.Length < frame[2])
  40. {
  41. throw new FormatException("Message frame does not contain enough bytes.");
  42. }
  43. ByteCount = frame[2];
  44. Data = new FileRecordCollection(frame);
  45. }
  46. public override string ToString()
  47. {
  48. string msg = $"Write {Data.DataBytes.Count} bytes for file {Data.FileNumber} starting at address {Data.StartingAddress}.";
  49. return msg;
  50. }
  51. }
  52. }