using Edge.Core.Parser.BinaryParser.Attributes; using Edge.Core.Parser.BinaryParser.MessageEntity; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SuZhouSuAnXin_BatteryEMS.MessageEntity { public enum FunctionCodeEnum { /// /// OPW 远端监控系统为主机,储能 EMS 为从机 /// 读多个寄存器,主机读取从机的数据 /// 读多个寄存器 = 0x03, /// /// OPW 远端监控系统为主机,储能 EMS 为从机 /// 主机修改从机的数据 /// 对单个寄存器写入 /// 写单个寄存器 = 0x06, /// /// OPW 远端监控系统为主机,储能 EMS 为从机 /// 主机修改从机的数据 /// 写多个寄存器 /// 写多个寄存器 = 0x10, ///// ///// ///// //预置多个寄存器 = 0x11, } public abstract class MessageBase : MessageTemplateBase { [Format(2, EncodingType.BIN, -9999)] public int 事务处理标识符 { get; set; } [Format(2, EncodingType.BIN, -9980)] public int 协议标识符 { get; set; } [Format(2, EncodingType.BIN, -9970)] public int OuterDataLength { get; set; } [EnumerableFormat("OuterDataLength", -9950)] public virtual List OuterRawData { get; set; } } public class IncomingMessage : MessageBase { /// /// OPW 远端监控系统为主机,储能 EMS 为从机 /// 表示被寻址的从机地址,本协议中规定从机地址为 20 H /// public byte SlaveAddress { get { return this.OuterRawData[0]; } } /// /// 功能码 /// public FunctionCodeEnum FunctionCode { get { var r = Enum.ToObject(typeof(FunctionCodeEnum), this.OuterRawData[1]); return (FunctionCodeEnum)r; } } public byte InnerDataLength { get { return this.OuterRawData[2]; } } public IEnumerable InnerRawData { get { return this.OuterRawData.Skip(3); } } } public class OutgoingQueryMessage : MessageBase { /// /// /// /// 地址分配规则: BMS 0x0000~0x009F 160 BMS 数据域, FMS 0x0100~0x019F 160 FMS 数据域, 系统 0x0200~0x029F 160 系统数据域 /// public OutgoingQueryMessage(int startingRegAddress, int noOfRegAddress) { //本协议中规定从机地址为 20 H base.OuterRawData = new List() { 0x20, (byte)FunctionCodeEnum.读多个寄存器 } .Concat(BitConverter.GetBytes(startingRegAddress).Take(2).Reverse()) .Concat(BitConverter.GetBytes(noOfRegAddress).Take(2).Reverse()).ToList(); } } //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 : MessageBase { /// /// /// /// 地址分配规则: BMS 0x0000~0x009F 160 BMS 数据域, FMS 0x0100~0x019F 160 FMS 数据域, 系统 0x0200~0x029F 160 系统数据域 /// /// byte[0]为高字节, byte[1]为低字节.... public OutgoingWriteToMultipleRegMessage(int startingRegAddress, int noOfRegAddress, byte[] datas) { base.OuterRawData = new List() { 0x20, (byte)FunctionCodeEnum.写多个寄存器 } .Concat(BitConverter.GetBytes(startingRegAddress).Take(2).Reverse()) .Concat(BitConverter.GetBytes(noOfRegAddress).Take(2).Reverse()) .Concat(datas).ToList(); } } /// /// used for 设置单个寄存器数据 /// public class OutgoingWriteToSingleRegMessage : MessageBase { /// /// /// /// 地址分配规则: BMS 0x0000~0x009F 160 BMS 数据域, FMS 0x0100~0x019F 160 FMS 数据域, 系统 0x0200~0x029F 160 系统数据域 /// byte[0]为高字节, byte[1]为低字节.... public OutgoingWriteToSingleRegMessage(int startingRegAddress, byte[] datas) { base.OuterRawData = new List() { 0x20, (byte)FunctionCodeEnum.写多个寄存器 } .Concat(BitConverter.GetBytes(startingRegAddress).Take(2).Reverse()) .Concat(BitConverter.GetBytes(1).Take(2).Reverse()) .Concat(datas).ToList(); } } }