using Edge.Core.Parser.BinaryParser.Attributes; using Edge.Core.Parser.BinaryParser.MessageEntity; using System; using System.Collections.Generic; using System.Text; namespace SunGrowInverter.MessageEntity { public enum FunctionCodeEnum { /// /// 可写入(也可能不允许写入)寄存器 /// 保持寄存器 = 0x03, /// /// read-only寄存器,比如运行时的实时信息(实时发电量)读取 /// 只读寄存器 = 0x04, /// /// 对单个寄存器写入 /// 命令码写入_对单个寄存器 = 0x06, /// /// 对1个或者多个寄存器写入 /// 命令码写入_对单个或者多个寄存器 = 0x10, /// /// /// 预置多个寄存器 = 0x11, } public abstract class MessageBase : MessageTemplateBase { /// /// 目标设备的地址 /// [Format(1, EncodingType.BIN, -9999)] [Range(1, 247, "SlaveAddress must be range from {1} to {2}, but actual is {0}")] public byte SlaveAddress { get; set; } /// /// 地址类型
/// 3x 地址类型为只读输入寄存器,支持 0x04 命令码查询 - 即此 FunctionCode == 0x04
/// 4x 地址类型为保持寄存器,支持 0x03 命令码查询 - 即此 FunctionCode == 0x03
/// FunctionCode == 0x06 命令码写入
///
[Format(1, EncodingType.BIN, -9990)] public FunctionCodeEnum FunctionCode { get; set; } [EnumerableFormat(2, 1100)] public virtual List CRC16 { get; set; } } public class OutgoingQueryMessage : MessageBase { public OutgoingQueryMessage() { base.FunctionCode = FunctionCodeEnum.只读寄存器; } /// /// 支持 Modbus 错误码 02(地址错误)、04(设置失败)。 /// 本协议所有寄存器地址在使用时需减 1 访问。如地址为 5000~5001,在程序中使用 4999~5000 访问。如“01 04 1387 00 02 + CRC”查询 5000~5001 地址数据。 /// [Format(2, EncodingType.BIN, -9980)] [Range(3000, 5999, "QueryStartAddress must be range from {1} to {2}, but actual is {0}")] public int StartingRegAddress { get; set; } [Format(2, EncodingType.BIN, -9970)] [Range(1, 50, "AddressRange must be range from {1} to {2}, but actual is {0}")] public byte NoOfRegAddress { get; set; } } public class IncomingQueryMessage : MessageBase { [Format(1, EncodingType.BIN, -9980)] public byte DataLength { get; set; } [EnumerableFormat("DataLength", -9970)] public List RawData { get; set; } //[EnumerableFormat(2, -9960)] //public List CRC16 { get; set; } } /// /// used for 设置单个或者多个寄存器数据 /// public class OutgoingWriteToMultipleRegMessage : OutgoingQueryMessage { public OutgoingWriteToMultipleRegMessage() { base.FunctionCode = FunctionCodeEnum.命令码写入_对单个或者多个寄存器; } [Format(1, EncodingType.BIN, -9960)] public int DataLength { get; set; } [EnumerableFormat("DataLength", -9950)] public List RawData { get; set; } } /// /// used as a response for 设置单个或者多个寄存器数据 /// public class IncomingWriteToMultipleRegMessage : OutgoingQueryMessage { } /// /// used for 设置单个寄存器数据 /// public class OutgoingWriteToSingleRegMessage : MessageBase { public OutgoingWriteToSingleRegMessage() { this.FunctionCode = FunctionCodeEnum.命令码写入_对单个寄存器; } /// /// 支持 Modbus 错误码 02(地址错误)、04(设置失败)。 /// 本协议所有寄存器地址在使用时需减 1 访问。如地址为 5000~5001,在程序中使用 4999~5000 访问。如“01 04 1387 00 02 + CRC”查询 5000~5001 地址数据。 /// [Format(2, EncodingType.BIN, -9980)] [Range(3000, 5999, "QueryStartAddress must be range from {1} to {2}, but actual is {0}")] public int RegAddress { get; set; } [EnumerableFormat("DataLength", -9950)] public virtual List RawData { get; set; } //[EnumerableFormat(2, 1100)] //public virtual List CRC16 { get; set; } } /// /// used as a response for 设置单个寄存器数据 /// public class IncomingWriteToSingleRegMessage : OutgoingWriteToSingleRegMessage { [EnumerableFormat(2, -9950)] public override List RawData { get; set; } } }