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; }
}
}