/// <summary> /// 获一组取DBC通道值,若存在计算公式则必须保证计算公式为一元计算(即只有一个通道参与公式计算),其他值的计算方式与第一个通道相同。 /// </summary> /// <param name="config">配置信息</param> /// <param name="data">CAN通道</param> /// <returns>结果信息</returns> public OperationResult <List <decimal?> > GetDbcValues(ProtocolMapConfigEnttity config, decimal?[] data) { var result = new OperationResult <List <decimal?> >(); if (data == null) { throw new ArgumentNullException("data"); } if (config == null) { throw new ArgumentNullException("config"); } if (config.Serials == null) { return(result.False(string.Format("项:{0} 未配置映射关系", config.ItemId))); } // 判断是否需要公式计算 var values = string.IsNullOrEmpty(config.Formula) ? config.Serials.Select(index => index <1 || index> data.Length ? null : data[index - 1]).ToList() : //直接返回数据 config.Serials.Select(index => Compute(config.Formula, new[] { index - 1 }, data)). // 返回计算后的数据 Select(value => value).ToList(); // 类型转换 return(result.True(values)); }
public decimal?FindValueFromDbc(ExchangeProtocolEntity data, ProtocolMapConfigEnttity config) { // 记录通道信息,方便日志打印 var channelString = string.Empty; // 记录通道值信息,方便日志打印 var channelValueString = string.Empty; // 记录计算公式信息,方便日志打印 var formula = string.Empty; try { // 未配置 if (config.Serial == -1) { return(null); } //记录通道信息 channelString = config.Serial.ToString(CultureInfo.InvariantCulture); // 记录计算公式信息 formula = string.IsNullOrEmpty(config.Formula) ? "null" : config.Formula; // 计算结果 var resultValues = ComputeDbcValue(config, data.VariablesData); if (!resultValues.Successed) { if (!string.IsNullOrEmpty(resultValues.ErrorMessage) && ErrorEvent != null) { ErrorEvent(string.Format("车辆:{0},md5code:{1},DBC配置公式计算错误:{2}", data.Vin, data.Md5Code, resultValues.ErrorMessage), data); } return(null); } return(resultValues.Data); } catch (Exception ex) { if (ExceptionEvent != null) { ExceptionEvent(ex, string.Format("车辆:{0},{1} 查询DBC映射关系表异常,相关信息:通道 {2},通道值:{3},计算公式:{4}", data.Vin, config.ItemId, channelString, channelValueString, formula), data); } } return(null); }
/// <summary> /// 计算DBC通道值,如果未填写公式则按照公式计算 /// </summary> /// <param name="config">配置信息</param> /// <param name="data">CAN通道</param> /// <exception cref="ArgumentNullException">参数异常</exception> /// <returns>结果信息</returns> public OperationResult <decimal?> ComputeDbcValue(ProtocolMapConfigEnttity config, decimal?[] data) { var result = new OperationResult <decimal?>(); if (data == null) { throw new ArgumentNullException("data"); } if (config == null) { throw new ArgumentNullException("config"); } if (config.Serials == null) { return(result.False(string.Format("项:{0} 未配置映射关系", config.ItemId))); } if (string.IsNullOrEmpty(config.Formula)) { if (config.Serial > data.Length) { throw new ArgumentNullException(string.Format("配置通道为:{0},大于数据通道总数:{1}", config.Serial, data == null ? 0 : data.Length)); } return(result.True(data[config.Serial - 1])); } try { var value = Compute(config.Formula, config.Serials.Select(index => index - 1).ToArray(), data); return(result.True(value)); } catch (Exception ex) { return(result.False(ex.ToString())); } }
public void FindValueFromDbc(string propertyName, List <string> subPropertyName, ExchangeProtocolEntity data, ProtocolMapConfigEnttity dbcmap, out List <Dictionary <string, decimal?> > valueDic) { valueDic = null; // 记录通道信息,方便日志打印 var channelString = string.Empty; // 记录通道值信息,方便日志打印 var channelValueString = string.Empty; // 记录计算公式信息,方便日志打印 var formula = string.Empty; try { #region 查找父节点 // 获取配置 if (dbcmap == null || dbcmap.SubItem == null || !dbcmap.SubItem.ContainsKey(propertyName)) { return; } var config = dbcmap.SubItem[propertyName]; #endregion #region 查找子节点 if (config.SubItem == null || config.SubItem.Count == 0) { return; } // 创建结果集 valueDic = new List <Dictionary <string, decimal?> >(); #region 循环读取子项 foreach (var item in config.SubItem.Values) { var dictoinary = new Dictionary <string, decimal?>(); foreach (var subProperty in subPropertyName) { decimal?value = null; // 读取到子项 if (item.SubItem.ContainsKey(subProperty) && item.SubItem[subProperty].Serial != -1) { // 计算子项 var resultValue = ComputeDbcValue(item.SubItem[subProperty], data.VariablesData); // 子项计算失败 if (!resultValue.Successed) { if (!string.IsNullOrEmpty(resultValue.ErrorMessage) && ErrorEvent != null) { ErrorEvent(string.Format("md5code:{0},协议ID:{2},父项 {1} 子项:{3} 读取失败:{4}", data.Md5Code, propertyName, 8, subProperty, resultValue.ErrorMessage), data); } } else//计算成功 { // 子项赋值 value = resultValue.Data; } } // 记录子项 dictoinary[subProperty] = value; } // 添加到结果集 valueDic.Add(dictoinary); } #endregion 循环读取子项 #endregion 查找子节点 } catch (Exception ex) { if (ExceptionEvent != null) { ExceptionEvent(ex, string.Format("车辆:{0},{1} 查询DBC映射关系表异常,相关信息:通道 {2},通道值:{3},计算公式:{4}", data.Vin, propertyName, channelString, channelValueString, formula), data); } } }
public decimal?FindValueFromDbc(string propertyName, ExchangeProtocolEntity data, ProtocolMapConfigEnttity dbcmap) { if (dbcmap == null || dbcmap.SubItem == null || !dbcmap.SubItem.ContainsKey(propertyName)) { return(null); } var config = dbcmap.SubItem[propertyName]; return(FindValueFromDbc(data, config)); }
public void FindValueFromDbc(string propertyName, string subPropertyName, ExchangeProtocolEntity data, ProtocolMapConfigEnttity dbcmap, out List <decimal?> valueList) { valueList = null; // 记录通道信息,方便日志打印 var channelString = string.Empty; // 记录通道值信息,方便日志打印 var channelValueString = string.Empty; // 记录计算公式信息,方便日志打印 var formula = string.Empty; try { #region 查找父节点 // 获取配置 if (dbcmap == null || dbcmap.SubItem == null || dbcmap.SubItem.Count == 0) { return; } #endregion var parentConfig = dbcmap.SubItem[propertyName]; #region 查找子节点 if (parentConfig.SubItem == null || parentConfig.SubItem.Count == 0) { return; } var configData = parentConfig.SubItem.Values.Where(item => item.SubItem.ContainsKey(subPropertyName)).Select(item => item.SubItem[subPropertyName]).FirstOrDefault(); #endregion #region 计算数据结果 if (configData == null || configData.Serials == null) { return; } //记录通道信息 channelString = configData.Serials != null?string.Join(",", configData.Serials) : "null"; // 记录计算公式信息 formula = string.IsNullOrEmpty(configData.Formula) ? "null" : configData.Formula; var resultData = GetDbcValues(configData, data.VariablesData); if (!resultData.Successed) { if (!string.IsNullOrEmpty(resultData.ErrorMessage) && ErrorEvent != null) { ErrorEvent(string.Format("车辆:{0},md5code:{1},协议ID:{3},获取多通道数据失败:{2}", data.Vin, data.Md5Code, resultData.ErrorMessage, 8), data); } return; } valueList = resultData.Data; #endregion } catch (Exception ex) { if (ExceptionEvent != null) { ExceptionEvent(ex, string.Format("车辆:{0},{1} 查询DBC映射关系表异常,相关信息:通道 {2},通道值:{3},计算公式:{4}", data.Vin, propertyName, channelString, channelValueString, formula), data); } } }
public bool CheckDbcMapParent(string propertyName, ExchangeProtocolEntity data, ProtocolMapConfigEnttity dbcmap) { return(dbcmap != null && dbcmap.SubItem != null && dbcmap.SubItem.ContainsKey(propertyName)); }