/// <summary> /// 当前报警等级分析 /// </summary> /// <param name="ssz">当前实时值</param> /// <param name="ratioAlarmConditionItems">已定义的判断条件</param> /// <param name="basicValue">分析基数(周平均值)</param> /// <returns></returns> private int JudgeAlarmType(double ssz, List <RatioAlarmConditions> ratioAlarmConditionItems, double basicValue) { int alarmType = 0; try { RatioAlarmConditions ratioAlarmConditions = null; for (int i = ratioAlarmConditionItems.Count - 1; i >= 0; i--) { ratioAlarmConditions = ratioAlarmConditionItems[i]; if (!ratioAlarmConditions.isExsit) { continue; } if (basicValue >= ratioAlarmConditions.minValue && basicValue <= ratioAlarmConditions.maxValue) { if (ssz >= basicValue * ratioAlarmConditions.ratioValue) { alarmType = i + 1; break; } } } } catch (Exception ex) { LogHelper.Error("RatioAlarmProcHandle GetAlarmType Error" + ex.Message); } return(alarmType); }
/// <summary> /// 将数据库存储的文本转换成实体 /// </summary> /// <param name="ratioAlarmConditions">0,0.2,5|0.2,0.3,3|0.3,0.4,2.5 ...</param> /// <returns></returns> private List <RatioAlarmConditions> GetRatioAlarmConditionsFromStr(JC_MultiplesettingInfo multiplesettingInfo) { List <RatioAlarmConditions> ratioAlarmConditionItems = null; try { RatioAlarmConditions ratioAlarmConditions = null; string[] strItems = multiplesettingInfo.MultipleText.Split('|'); string[] items; if (strItems.Length == 10) { ratioAlarmConditionItems = new List <RatioAlarmConditions>(); for (int i = 0; i < strItems.Length; i++) { items = strItems[i].Split(','); if (items.Length == 3) { ratioAlarmConditions = new RatioAlarmConditions(); try { ratioAlarmConditions.minValue = Convert.ToDouble(items[0]); ratioAlarmConditions.maxValue = Convert.ToDouble(items[1]); ratioAlarmConditions.ratioValue = Convert.ToDouble(items[2]); ratioAlarmConditions.alarmTyepe = i + 1; if (ratioAlarmConditions.ratioValue != 0) { ratioAlarmConditions.isExsit = true; } else { ratioAlarmConditions.isExsit = false; } } catch { ratioAlarmConditions.isExsit = false; } } else { //定义的倍数报警条件存储有误,默认此逻辑不生效 ratioAlarmConditions = new RatioAlarmConditions(); ratioAlarmConditions.isExsit = false; LogHelper.Error(multiplesettingInfo.Devid + "定义的倍数报警条件存储有误,存在条件" + strItems[i]); } ratioAlarmConditionItems.Add(ratioAlarmConditions); } } else { LogHelper.Error(multiplesettingInfo.Devid + "定义的倍数报警条件存储有误,共" + strItems.Length + "条"); } } catch (Exception ex) { LogHelper.Error(multiplesettingInfo.Devid + "定义的倍数报警条件有误," + ex.Message); } return(ratioAlarmConditionItems); }
private JC_MbInfo JCMB_Copy(JC_MbInfo jcmb, RatioAlarmConditions ratioAlarmConditionItem, DateTime stime, double ssz, double basicValue) { JC_MbInfo newJcmb = new JC_MbInfo(); newJcmb.Id = IdHelper.CreateLongId().ToString(); newJcmb.Point = jcmb.Point; newJcmb.PointID = jcmb.PointID; newJcmb.Fzh = jcmb.Fzh; newJcmb.Kh = jcmb.Kh; newJcmb.Dzh = jcmb.Dzh; newJcmb.Devid = jcmb.Devid; newJcmb.Wzid = jcmb.Wzid; newJcmb.Type = jcmb.Type; newJcmb.Bstj = "[" + ratioAlarmConditionItem.minValue + "," + ratioAlarmConditionItem.maxValue + "," + ratioAlarmConditionItem.ratioValue + "]"; newJcmb.Bsz = ratioAlarmConditionItem.ratioValue; newJcmb.Stime = stime; newJcmb.Etime = new DateTime(1900, 1, 1, 0, 0, 0); newJcmb.Ssz = ssz; newJcmb.Zdz = ssz; newJcmb.Pjz = basicValue; newJcmb.Zdzs = stime; return(newJcmb); }
private void DataProc() { List <Jc_DefInfo> pointDefineItems = null; SettingInfo settingInfo = null; string settingTime = ""; //上次加载倍率报警配置时间 List <JC_MultiplesettingInfo> multiplesettingInfotems = null; JC_MultiplesettingInfo multiplesettingInfotem = null; List <RatioAlarmConditions> ratioAlarmConditionItems = null; RatioAlarmConditions ratioAlarmConditionItem = null; double sszValue = 0; double basicValue = 0; int alarmType = 0; JC_MbInfo ratioAlarm = null; DateTime getBasicValueDate = DateTime.Now.AddDays(-1); //上次获取周平均值的时间 List <JC_MbInfo> alarm_AddItems = new List <JC_MbInfo>(); List <JC_MbInfo> alarm_DelItems = new List <JC_MbInfo>(); List <JC_MbInfo> alarm_UpdateItems = new List <JC_MbInfo>(); DateTime lastProcData = DateTime.Now; //最后一次处理数据的日期 DateTime nowTime = DateTime.Now; //本次处理时间 for (; ;) { try { nowTime = DateTime.Now; if (isStop) { break; } //获取定义信息 pointDefineItems = CacheDataHelper.GetKJPointDefineItems(); //判断是否重载倍率报警定义 settingInfo = CacheDataHelper.GetSettingByKeyStr("MultipleSettingUpdateTime"); if (settingInfo != null) { if (settingTime != settingInfo.StrValue) { //重新加载倍率报警定义信息 multiplesettingInfotems = GetAllMultiplesettingInfo(); settingTime = settingInfo.StrValue; } } else { Thread.Sleep(timeSpan * 1000); continue; } //筛选模拟量 pointDefineItems = pointDefineItems.Where(a => (a.DevPropertyID == (int)DeviceProperty.Analog) && (multiplesettingInfotems.FirstOrDefault(b => b.Devid == a.Devid) != null)).ToList(); if (pointDefineItems.Count == 0) { Thread.Sleep(timeSpan * 1000); continue; } //重载周平均值 if (getBasicValueDate.Date != nowTime.Date) { ReloadBasicValues(pointDefineItems); getBasicValueDate = nowTime; } if (pointDefineItems == null) { Thread.Sleep(timeSpan * 1000); continue; } if (pointDefineItems.Count == 0) { Thread.Sleep(timeSpan * 1000); continue; } alarm_AddItems = new List <JC_MbInfo>(); alarm_DelItems = new List <JC_MbInfo>(); alarm_UpdateItems = new List <JC_MbInfo>(); if (lastProcData.Date != nowTime.Date) { //结束报警重新生成 CrossDay(pointDefineItems, multiplesettingInfotems, new DateTime(lastProcData.Year, lastProcData.Month, lastProcData.Day, 23, 59, 59), new DateTime(nowTime.Year, nowTime.Month, nowTime.Day, 0, 0, 0)); lastProcData = nowTime; } foreach (Jc_DefInfo def in pointDefineItems) { if (isStop) { break; } if (double.TryParse(def.Ssz, out sszValue)) { multiplesettingInfotem = multiplesettingInfotems.FirstOrDefault(a => a.Devid == def.Devid); if (multiplesettingInfotem == null) { continue; } //未定义该设备类型的倍率报警 ratioAlarmConditionItems = GetRatioAlarmConditionsFromStr(multiplesettingInfotem); //解析倍率报警配置 if (ratioAlarmConditionItems == null) { continue; } //提取倍率报警定义出错,不继续计算 basicValue = GetBasicValueByDef(def); //获取周平均值 if (basicValue == 0) { continue; } //没有基础值,不计算 //计算报警等级 alarmType = JudgeAlarmType(sszValue, ratioAlarmConditionItems, basicValue); if (alarmType != 0) { ratioAlarmConditionItem = ratioAlarmConditionItems[alarmType - 1]; //获取当前报警的倍率信息配置 } ratioAlarm = GetAlarmInfo(def.Point); #region ----报警处理---- if (ratioAlarm == null) { if (alarmType > 0) { //之前没有报警 现在有报警(新增报警) ratioAlarm = new JC_MbInfo(); ratioAlarm.Id = IdHelper.CreateLongId().ToString(); ratioAlarm.Point = def.Point; ratioAlarm.PointID = def.PointID; ratioAlarm.Fzh = def.Fzh.ToString(); ratioAlarm.Kh = def.Kh.ToString(); ratioAlarm.Dzh = def.Dzh.ToString(); ratioAlarm.Devid = def.Devid; ratioAlarm.Wzid = def.Wzid; ratioAlarm.Type = alarmType.ToString(); ratioAlarm.Bstj = "[" + ratioAlarmConditionItem.minValue + "," + ratioAlarmConditionItem.maxValue + "," + ratioAlarmConditionItem.ratioValue + "]"; ratioAlarm.Bsz = ratioAlarmConditionItem.ratioValue; ratioAlarm.Stime = nowTime; ratioAlarm.Ssz = Convert.ToDouble(def.Ssz); ratioAlarm.Pjz = basicValue; ratioAlarm.Zdz = sszValue; ratioAlarm.Zdzs = nowTime; alarm_AddItems.Add(ratioAlarm); } } else { if (alarmType == 0) { //之前有报警 现在没有报警(结束报警) ratioAlarm.Etime = nowTime; alarm_DelItems.Add(ratioAlarm); } else { if (alarmType.ToString() != ratioAlarm.Type) { //之前有报警 报警切换(结束旧报警,生成新报警) ratioAlarm.Etime = nowTime; alarm_DelItems.Add(ratioAlarm); //生成新报警 ratioAlarm = new JC_MbInfo(); ratioAlarm.Id = IdHelper.CreateLongId().ToString(); ratioAlarm.Point = def.Point; ratioAlarm.PointID = def.PointID; ratioAlarm.Fzh = def.Fzh.ToString(); ratioAlarm.Kh = def.Kh.ToString(); ratioAlarm.Dzh = def.Dzh.ToString(); ratioAlarm.Devid = def.Devid; ratioAlarm.Wzid = def.Wzid; ratioAlarm.Type = alarmType.ToString(); ratioAlarm.Bstj = "[" + ratioAlarmConditionItem.minValue + "," + ratioAlarmConditionItem.maxValue + "," + ratioAlarmConditionItem.ratioValue + "]"; ratioAlarm.Bsz = ratioAlarmConditionItem.ratioValue; ratioAlarm.Stime = nowTime; ratioAlarm.Ssz = Convert.ToDouble(def.Ssz); ratioAlarm.Pjz = basicValue; ratioAlarm.Zdz = sszValue; ratioAlarm.Zdzs = nowTime; alarm_AddItems.Add(ratioAlarm); } else { //报警状态持续,更新报警期间最大值 if (sszValue > ratioAlarm.Zdz) { ratioAlarm.Zdz = sszValue; ratioAlarm.Zdzs = nowTime; //更新报警 alarm_UpdateItems.Add(ratioAlarm); } } } } #endregion } } if (alarm_DelItems.Count > 0) { EndAlarmItems(alarm_DelItems); } if (alarm_AddItems.Count > 0) { StartAlarms(alarm_AddItems); } if (alarm_UpdateItems.Count > 0) { UpdateAlarm(alarm_UpdateItems); } } catch (Exception ex) { LogHelper.Error("RatioAlarmProcHandle DataProc Error" + ex.Message); } Thread.Sleep(timeSpan * 1000); } }