/// <summary> /// 插入总值 /// </summary> /// <param name="amv"></param> private void InserDataOaList(AutoMeasuredValue amv) { List <DataOa> list = new List <DataOa>(); Meterage meterage = _meterageService.Query(m => m.AreaId == amv.areaId && m.McId == amv.machineId && m.ParId == amv.monitorId && m.DirId == amv.position_HVA).FirstOrDefault(); foreach (var measuredValue in amv.MeasuredList) { DataOa oAData = new DataOa() { AreaId = amv.areaId, McId = amv.machineId, ParId = amv.monitorId, DirId = amv.position_HVA }; //获取采集时间 oAData.OaTime = new DateTime(measuredValue.year, measuredValue.month, measuredValue.day, measuredValue.hour, measuredValue.minute, measuredValue.second); if (!float.IsNaN(measuredValue.rms_Acc_F)) { oAData.OaAcc = measuredValue.rms_Acc_F; } if (!float.IsNaN(measuredValue.Disp)) { oAData.OaDisp = measuredValue.Disp; } if (!float.IsNaN(measuredValue.CF_Acc)) { oAData.OaCF = measuredValue.CF_Acc; } if (!float.IsNaN(measuredValue.Kurtosis_Acc)) { oAData.OaKurt = measuredValue.Kurtosis_Acc; } if (!float.IsNaN(measuredValue.rms_Vel_BP)) { oAData.OaVel = measuredValue.rms_Vel_BP; } if (!float.IsNaN(measuredValue.rms_Bg_HP)) { oAData.OaBg = measuredValue.rms_Bg_HP; } if (!float.IsNaN(measuredValue.rms_Bv_HP)) { oAData.OaBv = measuredValue.rms_Bv_HP; } if (!float.IsNaN(measuredValue.rms_Env)) { oAData.OaEnv = measuredValue.rms_Env; } oAData.OaTacho = measuredValue.Speed; if (!float.IsNaN(measuredValue.SensorStaticValue)) { oAData.OaTemp = measuredValue.SensorStaticValue; } oAData.OaWorkStatus = measuredValue.WorkStatus; oAData.OaAccType = "rms"; oAData.OaBgType = "rms"; oAData.OaBvType = "rms"; oAData.OaDispType = "rms"; oAData.OaEnvType = "rms"; oAData.OaVelType = "rms"; oAData.OaTempType = "gz1"; list.Add(oAData); Console.WriteLine(string.Format("总值数据BG:{0}, BV:{1}, ENV:{2}, DISP:{3}, VEL:{4}, ACC:{5}, CF:{6},KURT:{7},Temp:{8} ", oAData.OaBg, oAData.OaBv, oAData.OaEnv, oAData.OaDisp, oAData.OaVel, oAData.OaAcc, oAData.OaCF, oAData.OaKurt, oAData.OaTemp)); } //验证是否停机状态 报警验证及添加数据 if (!_stopModule.ValidateStop(list, meterage, _machineStopList)) { _dataOaService.InsertEntityList(list); _oaAlarmModule.ValidateAlarm(list, meterage); _oaAlarmModule.SaveCache(); } }
/// <summary> /// 验证报警 /// </summary> /// <param name="dataOaList"></param> public void ValidateAlarm(List <DataOa> dataOaList, Meterage meterage) { //获取内存中 方向下的总值数据信息 string key = $"{meterage.AreaId}{meterage.McId}{meterage.ParId}{meterage.DirId}"; Queue <DataOa> oaDataQueue = _dataOaQueue.DataQueue.GetValueOrDefault(key); int dilutedCount = _dataOaQueue.DilutedCount.GetValueOrDefault(key); if (oaDataQueue == null) { oaDataQueue = new Queue <DataOa>(); } //总值进队 foreach (DataOa item in dataOaList) { oaDataQueue.Enqueue(item); Console.WriteLine($"Bg:{item.OaBg},BV:{item.OaBv},Env:{item.OaEnv},Acc:{item.OaAcc},kurt:{item.OaKurt},Vel:{item.OaVel},CF:{item.OaCF},time:{item.OaTime.ToString("yyyy-MM-dd HH:mm:ss")}"); } //稀释数据 if ((oaDataQueue.Count - dilutedCount * 12) >= 12) { List <DataOa> dilutedOa = oaDataQueue.Skip(dilutedCount * 12).Take(12).ToList(); AvgDataOaSave(dilutedOa, 1); ++dilutedCount; if (dilutedCount > 5) { AvgDataOaSave(oaDataQueue.ToList(), 2); while (oaDataQueue.Count > _alarmCount) { DataOa item = oaDataQueue.Dequeue(); } dilutedCount = 0; } } _dataOaQueue.DataQueue[key] = oaDataQueue; _dataOaQueue.DilutedCount[key] = dilutedCount; List <Alarm> alarmList = _alarmService.Query(a => a.AlarmId == meterage.MeterAlarm1 || a.AlarmId == meterage.MeterAlarm2); Console.WriteLine($"一级报警线:Bg:{alarmList[0].AlarmBg},BV:{alarmList[0].AlarmBv},Env:{alarmList[0].AlarmEnv},Acc:{alarmList[0].AlarmAcc},kurt:{alarmList[0].AlarmKurt},Vel:{alarmList[0].AlarmVel},CF:{alarmList[0].AlarmCF}"); Console.WriteLine($"二级报警线:Bg:{alarmList[1].AlarmBg},BV:{alarmList[1].AlarmBv},Env:{alarmList[1].AlarmEnv},Acc:{alarmList[1].AlarmAcc},kurt:{alarmList[1].AlarmKurt},Vel:{alarmList[1].AlarmVel},CF:{alarmList[1].AlarmCF}"); //取最新几笔数据 计算报警次数 int len = oaDataQueue.Count; List <DataOa> oaList = null; if (len > _alarmCount) { oaList = oaDataQueue.Skip(len - _alarmCount).Take(_alarmCount).ToList(); } else { oaList = oaDataQueue.ToList(); } AlarmTimes alarmTimes = GetAlarmTimes(oaList, alarmList, meterage); //报警状态判断 int alarmGrad = 1; if (alarmTimes.GetAlarm1Times() == _alarmCount) { alarmGrad = 2; if (alarmTimes.GetAlarm2Times() == _alarmCount) { alarmGrad = 3; } CreateEmail(alarmTimes, dataOaList[0], alarmList[0], alarmList[1], alarmGrad); } //修改报警状态 if (alarmGrad != meterage.MeterStateOa) { meterage.MeterStateOa = alarmGrad; _meterageService.UpdateEntity(meterage); } }
/// <summary> /// 验证停机状态 /// </summary> /// <param name="dataOaList"></param> /// <param name="meterage"></param> /// <param name="machineStopList"></param> /// <returns></returns> public bool ValidateStop(List <DataOa> dataOaList, Meterage meterage, List <MachineStop> machineStopList) { string key = $"A{meterage.AreaId}M{meterage.McId}"; MachineStop machineStop = machineStopList.FirstOrDefault(m => m.AreaId == meterage.AreaId && m.McId == meterage.McId && m.ParId == meterage.ParId && m.DirId == meterage.DirId); if (machineStop == null) { bool isStop = _isStop.GetValueOrDefault(key); if (isStop) { return(true); } return(false); } //更新停机状态 Queue <DataOa> dataOaQueue = _dataOaStopQueue.DataQueue.GetValueOrDefault(key); if (dataOaQueue == null) { dataOaQueue = new Queue <DataOa>(); } foreach (DataOa item in dataOaList) { dataOaQueue.Enqueue(item); } if (dataOaQueue.Count >= 5) { while (dataOaQueue.Count > 5) { dataOaQueue.Dequeue(); } _dataOaStopQueue.DataQueue[key] = dataOaQueue; List <DataOa> validateData = dataOaQueue.ToList(); for (int i = 0; i < validateData.Count; i++) { double value = 0; if (machineStop.MsType == "Vel") { value = validateData[i].OaVel; } else if (machineStop.MsType == "Acc") { value = validateData[i].OaAcc; } else if (machineStop.MsType == "Disp") { value = validateData[i].OaDisp; } if (machineStop.MsValue < value) { _isStop[key] = false; SaveCache(); return(false); } } _isStop[key] = true; SaveCache(); return(true); } _dataOaStopQueue.DataQueue[key] = dataOaQueue; SaveCache(); return(false); }
/// <summary> /// 获取总值每个参数的报警次数 /// </summary> /// <param name="oaList"></param> /// <param name="alarmList"></param> /// <param name="meterage"></param> /// <returns></returns> private AlarmTimes GetAlarmTimes(List <DataOa> oaList, List <Alarm> alarmList, Meterage meterage) { AlarmTimes alarmTimes = new AlarmTimes(); Alarm alarm1 = alarmList[0]; Alarm alarm2 = alarmList[1]; foreach (DataOa oAData in oaList) { if (alarm1 != null && alarm2 != null) { float p_float_alarmTemp = (float)oAData.OaAcc; //-----------------------------------acc------------------------------------------- if (meterage.MeterAcc == 1 && alarm1.AlarmAcc != 0 && alarm2.AlarmAcc != 0) { //注意 if (alarm1.AlarmAcc < p_float_alarmTemp) { alarmTimes.AddAlarm1("Acc"); } //报警 if (p_float_alarmTemp > alarm2.AlarmAcc) { alarmTimes.AddAlarm2("Acc"); } } p_float_alarmTemp = (float)oAData.OaDisp; //-----------------------------------disp------------------------------------------- if (meterage.MeterDisp == 1 && alarm1.AlarmDisp != 0 && alarm2.AlarmDisp != 0) { if (alarm1.AlarmDisp < p_float_alarmTemp) { alarmTimes.AddAlarm1("Disp"); } //报警 if (p_float_alarmTemp > alarm2.AlarmDisp) { alarmTimes.AddAlarm2("Disp"); } } p_float_alarmTemp = (float)oAData.OaVel; //------------------------------------vel---------------------------------------------- if (meterage.MeterVel == 1 && alarm1.AlarmVel != 0 && alarm2.AlarmVel != 0) { //注意 if (alarm1.AlarmVel < p_float_alarmTemp) { alarmTimes.AddAlarm1("Vel"); } //报警 if (p_float_alarmTemp > alarm2.AlarmVel) { alarmTimes.AddAlarm2("Vel"); } } //------------------------------------bv---------------------------------------------- p_float_alarmTemp = (float)oAData.OaBv; if (meterage.MeterBv == 1 && alarm1.AlarmBv != 0 && alarm2.AlarmBv != 0) { //注意 if (alarm1.AlarmBv < p_float_alarmTemp) { alarmTimes.AddAlarm1("Bv"); } //报警 if (p_float_alarmTemp > alarm2.AlarmBv) { alarmTimes.AddAlarm2("Bv"); } } //------------------------------------bg---------------------------------------------- if (meterage.MeterBg == 1 && alarm1.AlarmBg != 0 && alarm2.AlarmBg != 0) { //注意 if (alarm1.AlarmBg < p_float_alarmTemp) { alarmTimes.AddAlarm1("Bg"); } //报警 if (p_float_alarmTemp > alarm2.AlarmBg) { alarmTimes.AddAlarm2("Bg"); } } //------------------------------------env---------------------------------------------- p_float_alarmTemp = (float)oAData.OaEnv; if (meterage.MeterEnv == 1 && alarm1.AlarmEnv != 0 && alarm2.AlarmEnv != 0) { //注意 if (alarm1.AlarmEnv < p_float_alarmTemp) { alarmTimes.AddAlarm1("Env"); } //报警 if (p_float_alarmTemp > alarm2.AlarmEnv) { alarmTimes.AddAlarm2("Env"); } } //------------------------------------temp---------------------------------------------- p_float_alarmTemp = (float)oAData.OaTemp; if (meterage.MeterT == 1 && alarm1.AlarmT != 0 && alarm2.AlarmT != 0) { //注意 if (alarm1.AlarmT < p_float_alarmTemp) { alarmTimes.AddAlarm1("Temp"); } //报警 if (p_float_alarmTemp > alarm2.AlarmT) { alarmTimes.AddAlarm2("Temp"); } } //------------------------------------cf---------------------------------------------- p_float_alarmTemp = (float)oAData.OaCF; if (meterage.MeterCF == 1 && alarm1.AlarmCF != 0 && alarm2.AlarmCF != 0) { //注意 if (alarm1.AlarmCF < p_float_alarmTemp) { alarmTimes.AddAlarm1("CF"); } //报警 if (p_float_alarmTemp > alarm2.AlarmCF) { alarmTimes.AddAlarm2("CF"); } } //------------------------------------kurt---------------------------------------------- p_float_alarmTemp = (float)oAData.OaKurt; if (meterage.MeterKurt == 1 && alarm1.AlarmKurt != 0 && alarm2.AlarmKurt != 0) { //注意 if (alarm1.AlarmKurt < p_float_alarmTemp) { alarmTimes.AddAlarm1("Kurt"); } //报警 if (p_float_alarmTemp > alarm2.AlarmKurt) { alarmTimes.AddAlarm2("Kurt"); } } } } return(alarmTimes); }