123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- using EDosApiWrapper;
- using GDNXFD.Data;
- using GDNXFD.Data.Repositories;
- using log4net;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- namespace GDNXFD.Alert.Interpreter
- {
- public class ElectricalCalculator
- {
- private ILog logger = LogManager.GetLogger("AppLog");
-
- private WindPowerStation station;
- private EDosProxy eDos;
- public ElectricalCalculator(WindPowerStation wt)
- {
- station = wt;
- eDos = EDosProxyFactory.Instance.Proxy;
- }
- /// <summary>
- /// 计算电气所有关联规则的值,并保存
- /// </summary>
- /// <returns>电气报警测点的值,关联到AlertRule表</returns>
- public void Calculate()
- {
- IList<AlertRuleInterpreter> interpreters = InterpreterFactory.Instance.GetInterpretersByElectricalId(station.Id);
- if (interpreters != null && interpreters.Count > 0)
- {
- logger.Debug("适用规则数:" + interpreters.Count);
- foreach(AlertRuleInterpreter ari in interpreters)
- {
- logger.Debug("处理报警规则:" + ari.AlertRule.Expression);
- ari.DataInfo = "";
- bool ruleResult = ari.Interpret(station.Id, AlertObjectType.Electrical);
- AlertSnap snap = AlertSnapRepository.GetAlertSnap(AlertObjectType.Electrical, station.Id, ari.AlertRule.EdnaValue);
- if (ruleResult)
- {
- double interval = 0;
- if (snap == null)
- {
- snap = AlertSnapFactory.CreateAlertSnap(ari.AlertRule, station);
- }
- else if (snap.IsOpened)
- {
- TimeSpan ts = DateTime.Now.Subtract((DateTime)snap.LastUpdateTime);
- interval = ts.TotalHours;
- }
- if (snap.IsOpened == false || interval > 1)
- {
- snap.IsOpened = true;
- snap.DataInfo = CommonMethod.StringCopy(ari.DataInfo, 2000);
- snap.LastUpdatePerson = "system";
- snap.LastUpdateTime = DateTime.Now;
- if (snap.IsConfirmed == true && interval > 8)
- snap.IsConfirmed = false;
- AlertSnapRepository.SaveAlertSnap(snap);
- //写实时库
- string key = GetWindPowerStationAlertPoint(station.Id);
- logger.InfoFormat("写报警测点,key={0}, value={1}", key, ari.AlertRule.EdnaValue);
- eDos.SendSinglePoint(key, ari.AlertRule.EdnaValue);
- logger.InfoFormat("触发报警!电气:{0},{1},规则:{2},{3}",
- station.Id, station.Name, ari.AlertRule.Id, ari.AlertRule.Expression);
- }
- }
- else
- {
- //解除报警
- if (snap != null && snap.IsOpened)
- {
- snap.IsOpened = false;
- snap.DataInfo = CommonMethod.StringCopy(ari.DataInfo, 2000);
- snap.IsConfirmed = false;
- snap.LastUpdatePerson = "system";
- snap.LastCloseTime = DateTime.Now;
- AlertSnapRepository.SaveAlertSnap(snap);
- logger.InfoFormat("解除报警!电气:{0},{1},规则:{2},{3}",
- station.Id, station.Name, ari.AlertRule.Id, ari.AlertRule.Expression);
- }
- }
- }
- }
- }
- private string GetWindPowerStationAlertPoint(string id)
- {
- string ret = WindPowerStationRepository.GetWindPowerStationPointId(id, "FJBJ3");
- return BuildPointId(ret);
- }
- private string BuildPointId(string PointID)
- {
- string[] ids = PointID.Split('.');
- if (ids != null && ids.Length == 3)
- {
- PointID = ids[1] + "_" + ids[2];
- }
- return PointID;
- }
- }
- }
|