123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- 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 WindTurbineCalculator
- {
- private ILog logger = LogManager.GetLogger("AppLog");
- private WindTurbine windTurbine;
- private EDosProxy eDos;
- public WindTurbineCalculator(WindTurbine wt)
- {
- windTurbine = wt;
- eDos = EDosProxyFactory.Instance.Proxy;
- }
- /// <summary>
- /// 计算风机所有关联规则的值,并保存
- /// </summary>
- /// <returns>风机报警测点的值,关联到AlertRule表</returns>
- public void Calculate()
- {
- IList<AlertRuleInterpreter> interpreters = InterpreterFactory.Instance.GetInterpretersByWindturbineId(windTurbine.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(windTurbine.Id, AlertObjectType.WindTurbine);
- AlertSnap snap = AlertSnapRepository.GetAlertSnap(AlertObjectType.WindTurbine, windTurbine.Id, ari.AlertRule.EdnaValue);
- if (ruleResult)
- {
- double interval = 0;
- if (snap == null)
- {
- snap = AlertSnapFactory.CreateAlertSnap(ari.AlertRule, windTurbine);
- }
- 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 = GetWindTurbineAlertPoint(windTurbine.Id);
- logger.InfoFormat("写报警测点,key={0}, value={1}", key, ari.AlertRule.EdnaValue);
- eDos.SendSinglePoint(key, ari.AlertRule.EdnaValue);
- logger.InfoFormat("触发报警!风机:{0},{1},规则:{2},{3}",
- windTurbine.Id, windTurbine.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.LastClosePerson = "system";
- snap.LastCloseTime = DateTime.Now;
- AlertSnapRepository.SaveAlertSnap(snap);
- logger.InfoFormat("解除报警!风机:{0},{1},规则:{2},{3}",
- windTurbine.Id, windTurbine.Name, ari.AlertRule.Id, ari.AlertRule.Expression);
- }
- }
- }
- }
- }
- private string GetWindTurbineAlertPoint(string windTurbineId)
- {
- string ret;
- WindTurbineTestingPointAI point = DataCache.Instance.WindTurbineAlertPoints
- .Where(q => q.WindturbineId == windTurbineId)
- .FirstOrDefault();
- if (point == null)
- {
- ret = WindTurbineRepository.GetWindTurbineAIPointId(windTurbineId, "FJBJ3");
- if (ret == null)
- logger.InfoFormat("风机{0}没有首出报警测点", windTurbineId);
- }
- else
- ret = point.Id;
- return BuildPointId(ret);
- }
- private string BuildPointId(string PointID)
- {
- if (PointID == null)
- PointID = "";
- else
- {
- string[] ids = PointID.Split('.');
- if (ids != null && ids.Length == 3)
- {
- PointID = ids[1] + "_" + ids[2];
- }
- }
- return PointID;
- }
- }
- }
|