MessageBase.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. using Edge.Core.Parser.BinaryParser.Attributes;
  2. using Edge.Core.Parser.BinaryParser.MessageEntity;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. namespace GroWattInverter.MessageEntity
  7. {
  8. public enum FunctionCodeEnum
  9. {
  10. /// <summary>
  11. /// 读保持寄存器
  12. /// </summary>
  13. 保持寄存器 = 0x03,
  14. /// <summary>
  15. /// 读输入寄存器
  16. /// 输入寄存器是一类read-only寄存器,比如运行时的实时信息(实时发电量)读取
  17. /// </summary>
  18. 只读寄存器 = 0x04,
  19. /// <summary>
  20. /// 对单个寄存器写入
  21. /// </summary>
  22. 命令码写入_对单个寄存器 = 0x06,
  23. /// <summary>
  24. /// 对1个或者多个寄存器写入
  25. /// </summary>
  26. 命令码写入_对单个或者多个寄存器 = 0x10,
  27. /// <summary>
  28. ///
  29. /// </summary>
  30. 预置多个寄存器 = 0x11,
  31. }
  32. public abstract class MessageBase : MessageTemplateBase
  33. {
  34. /// <summary>
  35. /// 目标设备的地址
  36. /// </summary>
  37. [Format(1, EncodingType.BIN, -9999)]
  38. [Range(1, 247, "SlaveAddress must be range from {1} to {2}, but actual is {0}")]
  39. public byte SlaveAddress { get; set; }
  40. /// <summary>
  41. /// 地址类型<br/>
  42. /// </summary>
  43. [Format(1, EncodingType.BIN, -9990)]
  44. public FunctionCodeEnum FunctionCode { get; set; }
  45. [EnumerableFormat(2, 1100)]
  46. public virtual List<byte> CRC16 { get; set; }
  47. }
  48. public class OutgoingQueryMessage : MessageBase
  49. {
  50. public OutgoingQueryMessage()
  51. {
  52. base.FunctionCode = FunctionCodeEnum.只读寄存器;
  53. }
  54. /// <summary>
  55. /// 支持 Modbus 错误码 02(地址错误)、04(设置失败)。
  56. /// 本协议所有寄存器地址在使用时需减 1 访问。如地址为 5000~5001,在程序中使用 4999~5000 访问。如“01 04 1387 00 02 + CRC”查询 5000~5001 地址数据。
  57. /// </summary>
  58. [Format(2, EncodingType.BIN, -9980)]
  59. [Range(0, 5999, "QueryStartAddress must be range from {1} to {2}, but actual is {0}")]
  60. public int StartingRegAddress { get; set; }
  61. [Format(2, EncodingType.BIN, -9970)]
  62. [Range(1, 50, "AddressRange must be range from {1} to {2}, but actual is {0}")]
  63. public byte NoOfRegAddress { get; set; }
  64. }
  65. public class IncomingQueryMessage : MessageBase
  66. {
  67. [Format(1, EncodingType.BIN, -9980)]
  68. public byte DataLength { get; set; }
  69. [EnumerableFormat("DataLength", -9970)]
  70. public List<byte> RawData { get; set; }
  71. //[EnumerableFormat(2, -9960)]
  72. //public List<byte> CRC16 { get; set; }
  73. }
  74. /// <summary>
  75. /// used for 设置单个或者多个寄存器数据
  76. /// </summary>
  77. public class OutgoingWriteToMultipleRegMessage : OutgoingQueryMessage
  78. {
  79. public OutgoingWriteToMultipleRegMessage()
  80. {
  81. base.FunctionCode = FunctionCodeEnum.命令码写入_对单个或者多个寄存器;
  82. }
  83. [Format(1, EncodingType.BIN, -9960)]
  84. public int DataLength { get; set; }
  85. [EnumerableFormat("DataLength", -9950)]
  86. public List<byte> RawData { get; set; }
  87. }
  88. /// <summary>
  89. /// used as a response for 设置单个或者多个寄存器数据
  90. /// </summary>
  91. public class IncomingWriteToMultipleRegMessage : OutgoingQueryMessage
  92. {
  93. }
  94. /// <summary>
  95. /// used for 设置单个寄存器数据
  96. /// </summary>
  97. public class OutgoingWriteToSingleRegMessage : MessageBase
  98. {
  99. public OutgoingWriteToSingleRegMessage()
  100. {
  101. this.FunctionCode = FunctionCodeEnum.命令码写入_对单个寄存器;
  102. }
  103. /// <summary>
  104. /// 支持 Modbus 错误码 02(地址错误)、04(设置失败)。
  105. /// 本协议所有寄存器地址在使用时需减 1 访问。如地址为 5000~5001,在程序中使用 4999~5000 访问。如“01 04 1387 00 02 + CRC”查询 5000~5001 地址数据。
  106. /// </summary>
  107. [Format(2, EncodingType.BIN, -9980)]
  108. [Range(3000, 5999, "QueryStartAddress must be range from {1} to {2}, but actual is {0}")]
  109. public int RegAddress { get; set; }
  110. [EnumerableFormat("DataLength", -9950)]
  111. public virtual List<byte> RawData { get; set; }
  112. //[EnumerableFormat(2, 1100)]
  113. //public virtual List<byte> CRC16 { get; set; }
  114. }
  115. /// <summary>
  116. /// used as a response for 设置单个寄存器数据
  117. /// </summary>
  118. public class IncomingWriteToSingleRegMessage : OutgoingWriteToSingleRegMessage
  119. {
  120. [EnumerableFormat(2, -9950)]
  121. public override List<byte> RawData { get; set; }
  122. }
  123. }