MessageBase.cs 5.0 KB

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