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