Пример #1
0
        /// <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);
            }
        }
Пример #2
0
        /// <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();
            }
        }
Пример #3
0
        /// <summary>
        /// 构建邮件
        /// </summary>
        /// <param name="alarmTimes"></param>
        private void CreateEmail(AlarmTimes alarmTimes, DataOa dataOa, Alarm alarm1, Alarm alarm2, int alarmGrad)
        {
            string oaType = string.Empty;

            if (alarmGrad == 2)
            {
                if (alarmTimes.Alarm1.FirstOrDefault(a => a.Key == "Temp").Value == _alarmCount)
                {
                    oaType = "Temp";
                }

                if (alarmTimes.Alarm1.FirstOrDefault(a => a.Key == "Vel").Value == _alarmCount)
                {
                    oaType = "Vel";
                }
                if (string.IsNullOrEmpty(oaType))
                {
                    return;
                }
                //oaType = alarmTimes.Alarm1.FirstOrDefault(t => t.Value >= _alarmCount).Key;
            }
            else
            {
                if (alarmTimes.Alarm1.FirstOrDefault(a => a.Key == "Temp").Value == _alarmCount)
                {
                    oaType = "Temp";
                }

                if (alarmTimes.Alarm1.FirstOrDefault(a => a.Key == "Vel").Value == _alarmCount)
                {
                    oaType = "Vel";
                }
                if (string.IsNullOrEmpty(oaType))
                {
                    return;
                }
                //oaType = alarmTimes.Alarm2.FirstOrDefault(t => t.Value >= _alarmCount).Key;
            }

            //是否发送过邮件
            string key = $"{_clientInfo.Database}{dataOa.AreaId}{dataOa.McId}{dataOa.ParId}{dataOa.DirId}";

            if (RedisHelper.Get <bool>(key))
            {
                return;
            }
            RedisHelper.Set(key, true, 60 * 60 * 24);

            //报警的总值类型
            string   unit       = "";
            double   value      = 0;
            float    alarmLine1 = 0;
            float    alarmLine2 = 0;
            PathName pathName   = Program.container.Resolve <IAreaService>().GetPathName(dataOa.AreaId, dataOa.McId, dataOa.ParId);
            string   dirName    = dataOa.DirId == 1 ?"H":dataOa.DirId == 2 ?"V":"A-T";
            string   ftName     = _clientInfo.FtName;
            string   color      = alarmGrad == 2 ? "#ff9900" : "#ed4014";
            string   grad       = alarmGrad == 2 ? "警告" : "危险";
            string   dataBase   = _clientInfo.Database;

            _clientInfo.Database = "bpdm_user";
            CallContext.SetData("clientInfo", _clientInfo);
            List <UserInfo> users = Program.container.Resolve <IUserInfoService>().Query(u => u.CpId == _clientInfo.CpId);

            _clientInfo.Database = dataBase;
            CallContext.SetData("clienInfo", _clientInfo);

            switch (oaType)
            {
            case "Acc":
                value      = dataOa.OaAcc;
                unit       = "g RMS";
                alarmLine1 = alarm1.AlarmAcc;
                alarmLine2 = alarm2.AlarmAcc; break;

            case "Vel":
                unit       = "mm/s RMS";
                value      = dataOa.OaVel;
                alarmLine1 = alarm1.AlarmVel;
                alarmLine2 = alarm2.AlarmVel; break;

            case "Disp":
                unit       = "μm/s RMS";
                value      = dataOa.OaDisp;
                alarmLine1 = alarm1.AlarmDisp;
                alarmLine2 = alarm2.AlarmDisp; break;

            case "Env":
                unit       = "g RMS";
                value      = dataOa.OaEnv;
                alarmLine1 = alarm1.AlarmEnv;
                alarmLine2 = alarm2.AlarmEnv; break;

            case "CF":
                value      = dataOa.OaCF;
                alarmLine1 = alarm1.AlarmCF;
                alarmLine2 = alarm2.AlarmCF; break;

            case "Kurt":
                value      = dataOa.OaKurt;
                alarmLine1 = alarm1.AlarmKurt;
                alarmLine2 = alarm2.AlarmKurt; break;

            case "Temp":
                unit       = "℃";
                value      = dataOa.OaTemp;
                alarmLine1 = alarm1.AlarmT;
                alarmLine2 = alarm2.AlarmT; break;

            case "Bg":
                unit       = "g RMS";
                value      = dataOa.OaBg;
                alarmLine1 = alarm1.AlarmBg;
                alarmLine2 = alarm2.AlarmBg; break;

            case "Bv":
                unit       = "mm/s RMS";
                value      = dataOa.OaBv;
                alarmLine1 = alarm1.AlarmBv;
                alarmLine2 = alarm2.AlarmBv; break;

            default:
                break;
            }
            foreach (UserInfo user in users)
            {
                if (string.IsNullOrEmpty(user.UserEmail))
                {
                    continue;
                }

                EmailModel model = new EmailModel()
                {
                    SenderAddress   = "*****@*****.**",
                    SenderName      = "VS-View云在线监测系统",
                    SenderPassword  = "******",
                    Title           = "VS-View 状态监测云报警通知",
                    ReceiverAddress = user.UserEmail
                };
                StringBuilder sb = new StringBuilder();
                sb.Append("<table  border='0' bgcolor='white' cellpadding='0' cellspacing='1'>");
                sb.Append($"<tr style='background-color:{color};'><td style='padding:5px 10px;color:white' colspan=3>报警等级:{grad}</td></tr>");
                sb.Append($"<tr style='background-color:#D0D8E8;'><td style='padding:5px 10px;'>日期/时间</td><td style='padding:5px; 10px'>{DateTime.Now.ToString("yyyy-MM-dd")}</td><td style='padding:5px; 10px'>{DateTime.Now.ToString("HH:mm:ss")}</td></tr>");
                sb.Append($"<tr style='background-color:#E9EDF4;'><td style='padding:5px 10px;'>工厂/区域/机器/测点/方向</td><td colspan=2 style='padding:5px; 10px'>{ftName}/{pathName.AreaName}/{pathName.McName}/{pathName.ParName}/{dirName}</td></tr>");
                sb.Append($"<tr style='background-color:#D0D8E8;'><td style='padding:5px 10px;'>测量值({oaType})</td><td colspan=2 style='padding:5px; 10px'><span style='color:{color}'>{Math.Round(value, 2)}</span> {unit}</td></tr>");
                sb.Append($"<tr style='background-color:#E9EDF4;'><td style='padding:5px 10px;'>阈值</td><td style='padding:5px; 10px'>警告:{alarmLine1} {unit}</td><td style='padding:5px; 10px'>危险:{alarmLine2} {unit}</td></tr></table>");
                sb.Append("<br/><br/><p>警告 – 机器存在问题,需查明原因或限制运行</p>");
                sb.Append("<p>危险 – 机器存在严重问题,需查明原因并安排方便的时间停机检修</p>");
                sb.Append("<p>详情分析请登录<a href='http://www.bpdm.cloud'>http://www.bpdm.cloud</a></p>");

                model.Content = sb.ToString();
                Program.EmailModelQueue.Enqueue(model);
            }
        }