using CompressorXN_Model; using CompressorXN_Model.ViewModel.Response; using CompressorXN_Service; using System; using System.Collections.Generic; using System.Linq; using thinger.DataConvertLib; namespace CompressorXN.Untils { public class AgteementHelper { private static readonly AgreementConfigService _agreementConfigService = new AgreementConfigService(); private static readonly AgreementMsgService _agreementMsgService = new AgreementMsgService(); private static readonly ParaService _paraService = new ParaService(); /// /// 生成协议 /// /// 机型名称 /// 协议名称 public static bool GenerateAgreement(string productTypeName, string agreementName) { T_Agreement_Msg agreementMsg = new T_Agreement_Msg { ProductTypeName = productTypeName }; //根据机型名称查询参数项 List paras = _paraService.QueryParaByProductTypeName(productTypeName) .Where(m => m.ParaName == "转速[rmp]").ToList(); //根据协议名称查询协议配置规则 AgreementVM agreementVM = _agreementConfigService.QueryAgreementByName(agreementName); //发送和接收报文明细规则 T_Agreement_Detail_Rule sendDetailRule = agreementVM.AgreementDetailRuleList.FirstOrDefault(m => m.MsgType == "send"); T_Agreement_Detail_Rule reciveDetailRule = agreementVM.AgreementDetailRuleList.FirstOrDefault(m => m.MsgType == "recive"); //辅助位 bool[] helperBitArr = new bool[512]; int i = 0; foreach (var item in agreementVM.AgreementHelpRuleList) { helperBitArr[i] = item.Bit0; helperBitArr[i + 1] = item.Bit1; helperBitArr[i + 2] = item.Bit2; helperBitArr[i + 3] = item.Bit3; helperBitArr[i + 4] = item.Bit4; helperBitArr[i + 5] = item.Bit5; helperBitArr[i + 6] = item.Bit6; helperBitArr[i + 7] = item.Bit7; i += 8; } #region 空载 //T_Para idlingPara = paras.FirstOrDefault(m => m.ParaType == "空载"); //if (idlingPara != null && idlingPara.TargetVal.HasValue) //{ // agreementMsg.IdlingSpeed = (int)idlingPara.TargetVal.Value; // //发送值=设定值/精度-偏移量 // decimal tempSpeed = (agreementMsg.IdlingSpeed - sendDetailRule.Offset) / sendDetailRule.Precision+1; // int speedVal = Convert.ToInt32(tempSpeed); // string hex = GetHexData(agreementVM.AgreementConfig.MsgFormat, sendDetailRule.StartBit, sendDetailRule.Len, speedVal, helperBitArr); // agreementMsg.IdlingHex = hex; //} #endregion #region 一段升速 T_Para speed1UpPara = paras.FirstOrDefault(m => m.ParaType == "一段升速"); if (speed1UpPara != null && speed1UpPara.TargetVal.HasValue) { agreementMsg.Speed1 = (int)speed1UpPara.TargetVal.Value; //发送值=设定值/精度-偏移量 decimal tempSpeed = (agreementMsg.Speed1 - sendDetailRule.Offset) / sendDetailRule.Precision; int speedVal = Convert.ToInt32(tempSpeed); string hex = GetHexData(agreementVM.AgreementConfig.MsgFormat, sendDetailRule.StartBit, sendDetailRule.Len, speedVal, helperBitArr); agreementMsg.Speed1Hex = hex; } #endregion #region 二段升速 T_Para speed2UpPara = paras.FirstOrDefault(m => m.ParaType == "二段升速"); if (speed2UpPara != null && speed2UpPara.TargetVal.HasValue) { agreementMsg.Speed2 = (int)speed2UpPara.TargetVal.Value; //发送值=设定值/精度-偏移量 decimal tempSpeed = (agreementMsg.Speed2 - sendDetailRule.Offset) / sendDetailRule.Precision; int speedVal = Convert.ToInt32(tempSpeed); string hex = GetHexData(agreementVM.AgreementConfig.MsgFormat, sendDetailRule.StartBit, sendDetailRule.Len, speedVal, helperBitArr); agreementMsg.Speed2Hex = hex; } #endregion #region 三段升速 T_Para speed3UpPara = paras.FirstOrDefault(m => m.ParaType == "三段升速"); if (speed3UpPara != null && speed3UpPara.TargetVal.HasValue) { agreementMsg.Speed3 = (int)speed3UpPara.TargetVal.Value; //发送值=设定值/精度-偏移量 decimal tempSpeed = (agreementMsg.Speed3 - sendDetailRule.Offset) / sendDetailRule.Precision; int speedVal = Convert.ToInt32(tempSpeed); string hex = GetHexData(agreementVM.AgreementConfig.MsgFormat, sendDetailRule.StartBit, sendDetailRule.Len, speedVal, helperBitArr); agreementMsg.Speed3Hex = hex; } #endregion #region 内漏 //T_Para endoleadPara = paras.FirstOrDefault(m => m.ParaType == "内漏"); //if (endoleadPara != null && endoleadPara.TargetVal.HasValue) //{ // agreementMsg.EndoleadSpeed = (int)endoleadPara.TargetVal.Value; // decimal tempSpeed = (agreementMsg.EndoleadSpeed - sendDetailRule.Offset) * sendDetailRule.Precision; // int speedVal = Convert.ToInt32(tempSpeed); // string hex = GetHexData(agreementVM.AgreementConfig.MsgFormat, sendDetailRule.StartBit, sendDetailRule.Len, speedVal, helperBitArr); // agreementMsg.EndoleadHex = hex; //} #endregion #region 单驱模式 //T_Para singleDriverPara = paras.FirstOrDefault(m => m.ParaType == "单驱模式"); //if (singleDriverPara != null && singleDriverPara.TargetVal.HasValue) //{ // agreementMsg.SingleDriverSpeed = (int)singleDriverPara.TargetVal.Value; // //发送值=设定值/精度-偏移量 // decimal tempSpeed = (agreementMsg.SingleDriverSpeed - sendDetailRule.Offset) / sendDetailRule.Precision + 1; // int speedVal = Convert.ToInt32(tempSpeed); // string hex = GetHexData(agreementVM.AgreementConfig.MsgFormat, sendDetailRule.StartBit, sendDetailRule.Len, speedVal, helperBitArr); // agreementMsg.SingleDriverHex = hex; //} #endregion return _agreementMsgService.SaveAgreementMsg(agreementMsg, productTypeName); } /// /// 获取十六进制报文 /// /// /// /// /// /// /// private static string GetHexData(string msgType, int startBit, int len, int val, bool[] helperBitArr) { string hex = string.Empty; switch (msgType) { case "Intel": bool[] bitArr = GetIntel(startBit, len, val, helperBitArr); //将bit数组转成十六进制字符串 var byteArr = ByteArrayLib.GetByteArrayFromBoolArray(bitArr); hex = StringLib.GetHexStringFromByteArray(byteArr); break; case "Motorola(LSB)": bitArr = GetMotoralaLsb(startBit, len, val, helperBitArr); //将bit数组转成十六进制字符串 byteArr = ByteArrayLib.GetByteArrayFromBoolArray(bitArr); hex = StringLib.GetHexStringFromByteArray(byteArr); break; case "Motorola(MSB)": bitArr = GetIntel(startBit, len, val, helperBitArr); //将bit数组转成十六进制字符串 byteArr = ByteArrayLib.GetByteArrayFromBoolArray(bitArr); hex = StringLib.GetHexStringFromByteArray(byteArr); break; } return hex; } #region 通用部分 /// /// 获取Intel规则的发送报文 /// /// /// /// /// /// private static bool[] GetIntel(int startBit, int len, int val, bool[] baseBitArr) { var needBitArr = HexToBoolArr((ushort)val, len); for (int j = 0; j < len; j++) { baseBitArr[startBit] = needBitArr[j]; startBit++; } return baseBitArr; } /// /// 获取MotoralaLsb规则的发送报文 /// /// /// /// /// /// private static bool[] GetMotoralaLsb(int startBit, int len, int val, bool[] baseBitArr) { var needBitArr = GetBitArrFromInt(val, len); for (int j = len - 1; j >= 0; j--) { byte bits = (byte)(1 << (startBit % 8)); baseBitArr[startBit] = needBitArr[j]; startBit++; if (bits == 0x80) { startBit -= 16; } } return baseBitArr; } /// /// 获取MotoralaMsb规则的发送报文 /// /// /// /// /// /// private static bool[] GetMotoralaMsb(int startBit, int len, int val, bool[] baseBitArr) { var needBitArr = GetBitArrFromInt(val, len); for (int j = len - 1; j >= 0; j--) { byte bits = (byte)(1 << (startBit % 8)); baseBitArr[startBit] = needBitArr[j]; startBit--; if (bits == 0x01) { startBit += 16; } } return baseBitArr; } /// /// 将值按照IntelLsb规则获取bool数组 /// /// /// /// private static bool[] HexToBoolArr(ushort val, int len) { bool[] boolArr = new bool[len]; for (int i = 0; i < len; i++) { boolArr[i] = (val & (1 << i)) != 0; } return boolArr; } /// /// 从int数值获取指定长度的Bit数组 /// /// /// /// private static bool[] GetBitArrFromInt(int val, int length) { string binaryString = Convert.ToString(val, 2); List bits = new List(); // 补零操作,使得二进制位数达到指定长度 for (int i = 0; i < length - binaryString.Length; i++) { bits.Add(false); } // 将二进制字符串的每一位转换为bool值 foreach (char digit in binaryString) { bits.Add(digit == '1'); } return bits.ToArray(); } #endregion } /// /// 辅助位 /// class HelperBit { public bool Bit7 { get; set; } public bool Bit6 { get; set; } public bool Bit5 { get; set; } public bool Bit4 { get; set; } public bool Bit3 { get; set; } public bool Bit2 { get; set; } public bool Bit1 { get; set; } public bool Bit0 { get; set; } } }