Ejemplo n.º 1
0
        /// <summary>
        /// 单个告警处理
        /// </summary>
        private void SubProcessGroupAlarm(
            GroupAlarmType alarmType,
            SelectionGroup group)
        {
            AlarmConfigData alarmSet;
            AlarmInfo       info;
            float           temperature;

            switch (alarmType)
            {
            case GroupAlarmType.MaxTemperature:
                alarmSet    = group.mAlarmConfig.mMaxTempConfig;
                temperature = group.mTemperatureData.mMaxTemperature;
                info        = group.mAlarmInfo.mMaxTempAlarm;
                break;

            case GroupAlarmType.MaxTempRise:
                alarmSet    = group.mAlarmConfig.mMaxTempeRiseConfig;
                temperature = group.mTemperatureData.mTemperatureRise;
                info        = group.mAlarmInfo.mMaxTempRiseAlarmInfo;
                break;

            case GroupAlarmType.MaxTempDif:
                alarmSet    = group.mAlarmConfig.mMaxTempDifConfig;
                temperature = group.mTemperatureData.mTemperatureDif;
                info        = group.mAlarmInfo.mMaxTempDifAlarmInfo;
                break;

            case GroupAlarmType.RelativeTempDif:
                alarmSet    = group.mAlarmConfig.mRelativeTempDifConfig;
                temperature = group.mTemperatureData.mRelTemperatureDif;
                info        = group.mAlarmInfo.mRelativeTempDifAlarmInfo;
                break;

            default:
                return;
            }

            AlarmStatus lastStatus = info.mAlarmStatus;

            info.mLastAlarmLevel = info.mCurrentAlarmLevel;

            if ((alarmType == GroupAlarmType.MaxTemperature) || (alarmType == GroupAlarmType.RelativeTempDif))
            {
                CalcAlarmInfo(alarmSet, temperature, info);
            }
            else
            {
                SpecialCalAlarmInfo(alarmSet, temperature, info); // 特殊处理组选区温升/温差
            }
            if (alarmType == GroupAlarmType.MaxTemperature)
            {
                ProcessAlarmReadyEnd(alarmSet, temperature, info);
            }

            if (info.mAlarmStatus == AlarmStatus.AlarmStart)
            {
                info.mAlarmStatus = AlarmStatus.Alarming;

                // 添加告警
                string groupData       = group.Serialize();
                string temperatureInfo = JsonUtils.ObjectToJson(group.mTemperatureData);

                // 阈值设置序列化
                string condition = string.Format("{0},{1},{2}", alarmSet.mGeneralThreshold, alarmSet.mSeriousThreshold, alarmSet.mCriticalThreshold);

                // 记录告警开始时间
                info.mBeginTime = DateTime.Now;
                info.mIsTimeout = false;

                // 告警入库
                OnAddAlarmInfo?.Invoke(
                    (int)AlarmMode.GroupSelection,
                    (int)alarmType,
                    (int)alarmSet.mAlarmReason,
                    (int)info.mCurrentAlarmLevel,
                    condition,
                    temperature,
                    group.mId,
                    group.mGroupName,
                    groupData,
                    temperatureInfo,
                    mMaxTemperature,
                    mMinTemperature,
                    group.mSelections,
                    info);
            }
            else if (info.mAlarmStatus == AlarmStatus.AlarmEnd)
            {
                info.mAlarmStatus = AlarmStatus.Unknown;

                // 结束告警
                string selectionData = group.Serialize();
                OnUpdateAlarmInfo?.Invoke(
                    (int)AlarmMode.GroupSelection,
                    (int)alarmType,
                    group.mId,
                    selectionData,
                    info);

                // 取消超时
                info.mIsTimeout = true;
            }
            else if (info.mAlarmStatus == AlarmStatus.AlarmingChanged)
            {
                // 结束上一次告警
                string selectionData = group.Serialize();
                OnUpdateAlarmInfo?.Invoke(
                    (int)AlarmMode.GroupSelection,
                    (int)alarmType,
                    group.mId,
                    selectionData,
                    info);

                string temperatureInfo = JsonUtils.ObjectToJson(group.mTemperatureData);

                // 阈值设置序列化
                string condition = string.Format("{0},{1},{2}", alarmSet.mGeneralThreshold, alarmSet.mSeriousThreshold, alarmSet.mCriticalThreshold);

                // 记录告警开始时间
                info.mBeginTime   = DateTime.Now;
                info.mIsTimeout   = false;
                info.mAlarmStatus = AlarmStatus.Alarming;

                OnAddAlarmInfo?.Invoke(
                    (int)AlarmMode.GroupSelection,
                    (int)alarmType,
                    (int)alarmSet.mAlarmReason,
                    (int)info.mCurrentAlarmLevel,
                    condition,
                    temperature,
                    group.mId,
                    group.mGroupName,
                    selectionData,
                    temperatureInfo,
                    mMaxTemperature,
                    mMinTemperature,
                    group.mSelections,
                    info);
            }
            else if ((info.mAlarmStatus == AlarmStatus.Alarming ||
                      info.mAlarmStatus == AlarmStatus.AlarmingReadyChanged) &&
                     (info.mIsTimeout == false))
            {
                DateTime time = DateTime.Now;
                if ((time - info.mBeginTime).TotalMinutes >= mTimeout)
                {
                    string selectionData = group.Serialize();
                    OnAlarmTimeout?.Invoke(
                        (int)AlarmMode.GroupSelection,
                        (int)alarmType,
                        group.mId,
                        selectionData,
                        info);

                    info.mIsTimeout = true;
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 获取告警短信内容
        /// </summary>
        public static String GetShowMessage(
            String substation,
            String deviceName,
            Int32 alarmMode,
            Int32 alarmType,
            Int32 alarmLevel,
            Single temperature,
            DateTime time)
        {
            String msg = String.Format("变电站:{0}\n", substation);

            msg += String.Format("设备:{0}\n", deviceName);

            AlarmMode mode = (AlarmMode)alarmMode;

            if (mode == AlarmMode.Selection)
            {
                SelectionAlarmType type = (SelectionAlarmType)alarmType;
                switch (type)
                {
                case SelectionAlarmType.MaxTemp:
                    msg += "监控类型:最高温度\n";
                    break;

                case SelectionAlarmType.MinTemp:
                    msg += "监控类型:最低温度\n";
                    break;

                case SelectionAlarmType.AvgTemp:
                    msg += "监控类型:平均温度\n";
                    break;
                }
                msg += String.Format("温度值:{0:F2}℃\n", temperature);
            }
            else if (mode == AlarmMode.GroupSelection)
            {
                GroupAlarmType type = (GroupAlarmType)alarmType;
                switch (type)
                {
                case GroupAlarmType.MaxTemperature:
                    msg += "监控类型:最高温度(组)\n";
                    break;

                case GroupAlarmType.MaxTempDif:
                    msg += "监控类型:最大温差(组)\n";
                    break;

                case GroupAlarmType.MaxTempRise:
                    msg += "监控类型:最大温升(组)\n";
                    break;

                case GroupAlarmType.RelativeTempDif:
                    msg += "监控类型:相对温差(组)\n";
                    break;
                }

                if (type == GroupAlarmType.RelativeTempDif)
                {
                    msg += String.Format("百分比:{0:F2}%\n", temperature);
                }
                else
                {
                    msg += String.Format("温度值:{0:F2}℃\n", temperature);
                }
            }

            AlarmLevel level = (AlarmLevel)alarmLevel;

            switch (level)
            {
            case AlarmLevel.General:
                msg += "告警等级:一般\n";
                break;

            case AlarmLevel.Serious:
                msg += "告警等级:严重\n";
                break;

            case AlarmLevel.Critical:
                msg += "告警等级:危急\n";
                break;
            }

            msg += String.Format("时间:{0}", DateTime.Now.ToString("HH:mm:ss"));

            return(msg);
        }