using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IStation.Calculation
{
///
/// 监测公式计算辅助类
///
public class MonitorFormulaCalcuHelper
{
#region 统计
///
/// 统计
///
public static double Statistical
(
string analyParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func> getRecordList,
out string Msg
)
{
Msg = string.Empty;
double srcValue = 0;
var analyModel = Model.Monitor.AnalyseParameters.ToModel(analyParas);
if (analyModel == null)
{
Msg= "分析参数配置错误";
return srcValue;
}
if (string.IsNullOrEmpty(analyModel.FormulaType))
{
Msg = "公式参数配置错误";
return srcValue;
}
switch (analyModel.FormulaType)
{
case Model.Monitor.FormulaType.Statistics_Max:
{
srcValue = StatisticalMaxValue(analyModel.FormulaParas,getMonitorPoint,getSignal,getRecordList,out Msg);
}
break;
case Model.Monitor.FormulaType.Statistics_Min:
{
srcValue = StatisticalMinValue(analyModel.FormulaParas, getMonitorPoint, getSignal, getRecordList, out Msg);
}
break;
case Model.Monitor.FormulaType.Statistics_Avg:
{
srcValue = StatisticalAvgValue(analyModel.FormulaParas, getMonitorPoint, getSignal, getRecordList, out Msg);
}
break;
case Model.Monitor.FormulaType.Statistics_Diff:
{
srcValue = StatisticalDiffValue(analyModel.FormulaParas, getMonitorPoint, getSignal, getRecordList, out Msg);
}
break;
case Model.Monitor.FormulaType.Statistics_Sum:
{
srcValue = StatisticalSumValue(analyModel.FormulaParas, getMonitorPoint, getSignal, getRecordList, out Msg);
}
break;
default:
{
Msg = "公式参数配置错误";
}
break;
}
return srcValue;
}
///
/// 统计最大值
///
public static double StatisticalMaxValue
(
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func> getRecordList,
out string Msg
)
{
Msg = string.Empty;
#region 数据验证
var formulaModel = Model.Monitor.MaxValueStatisticsFormulaParas.ToModel(formularParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
#endregion
#region 计算原始值
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID,relatedMonitor.CronType);
if (relatedRecordList == null || relatedRecordList.Count < 1)
{
Msg = "获取关联记录失败";
return default;
}
var srcValueList = new List();
foreach (var relatedRecord in relatedRecordList)
{
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
{
srcValueList.Add(relatedDataValue);
}
}
if (srcValueList.Count < 1)
{
Msg = "获取有效关联记录为空";
return default;
}
var srcValue = formulaModel.Statistic(srcValueList);
#endregion
return srcValue;
}
///
/// 统计最小值
///
public static double StatisticalMinValue
(
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func> getRecordList,
out string Msg
)
{
Msg = string.Empty;
#region 数据验证
var formulaModel = Model.Monitor.MinValueStatisticsFormulaParas.ToModel(formularParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
#endregion
#region 计算原始值
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID,relatedMonitor.CronType);
if (relatedRecordList == null || relatedRecordList.Count < 1)
{
Msg = "获取关联记录失败";
return default;
}
var srcValueList = new List();
foreach (var relatedRecord in relatedRecordList)
{
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
{
srcValueList.Add(relatedDataValue);
}
}
if (srcValueList.Count < 1)
{
Msg = "获取有效关联记录为空";
return default;
}
var srcValue = formulaModel.Statistic(srcValueList);
#endregion
return srcValue;
}
///
/// 统计平均值
///
public static double StatisticalAvgValue
(
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func> getRecordList,
out string Msg
)
{
Msg = string.Empty;
#region 数据验证
var formulaModel = Model.Monitor.AvgValueStatisticsFormulaParas.ToModel(formularParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
#endregion
#region 计算原始值
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID,relatedMonitor.CronType);
if (relatedRecordList == null || relatedRecordList.Count < 1)
{
Msg = "获取关联记录失败";
return default;
}
var srcValueList = new List();
foreach (var relatedRecord in relatedRecordList)
{
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
{
srcValueList.Add(relatedDataValue);
}
}
if (srcValueList.Count < 1)
{
Msg = "获取有效关联记录为空";
return default;
}
var srcValue = formulaModel.Statistic(srcValueList);
#endregion
return srcValue;
}
///
/// 统计差值
///
public static double StatisticalDiffValue
(
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func> getRecordList,
out string Msg
)
{
Msg = string.Empty;
#region 数据验证
var formulaModel = Model.Monitor.DiffValueStatisticsFormulaParas.ToModel(formularParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
#endregion
#region 计算原始值
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID,relatedMonitor.CronType);
if (relatedRecordList == null || relatedRecordList.Count < 1)
{
Msg = "获取关联记录失败";
return default;
}
var srcValueList = new List();
foreach (var relatedRecord in relatedRecordList)
{
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
{
srcValueList.Add(relatedDataValue);
}
}
if (srcValueList.Count < 1)
{
Msg = "获取有效关联记录为空";
return default;
}
var srcValue = formulaModel.Statistic(srcValueList);
#endregion
return srcValue;
}
///
/// 统计和值
///
public static double StatisticalSumValue
(
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func> getRecordList,
out string Msg
)
{
Msg = string.Empty;
#region 数据验证
var formulaModel = Model.Monitor.SumValueStatisticsFormulaParas.ToModel(formularParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
#endregion
#region 计算原始值
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID,relatedMonitor.CronType);
if (relatedRecordList == null || relatedRecordList.Count < 1)
{
Msg = "获取关联记录失败";
return default;
}
var srcValueList = new List();
foreach (var relatedRecord in relatedRecordList)
{
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
{
srcValueList.Add(relatedDataValue);
}
}
if (srcValueList.Count < 1)
{
Msg = "获取有效关联记录为空";
return default;
}
var srcValue = formulaModel.Statistic(srcValueList);
#endregion
return srcValue;
}
#endregion
#region 映射
///
/// 计算单一映射(实时)
///
public static double CalcuSingleMapping
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func getLastRecord,//获取最后一条记录
out string Msg//错误信息
)
{
Msg = string.Empty;
double srcValue = 0;
#region 数据验证
var formulaModel = Model.Monitor.SingleMappingCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return srcValue;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
{
Msg = "关联测点不是实时测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
#endregion
#region 计算原始值
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID,relatedSignal.ID);
var endTime = DateTime.Now;
var error_second = (endTime - startTime).TotalSeconds;
if (relatedRecord == null)
{
Msg = "未检索到记录信息";
return srcValue;
}
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-error_second))
{
Msg = "关联记录已失效";
return srcValue;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
return srcValue;
}
if (!formulaModel.Calculate(dataValue, out srcValue))
{
Msg = "计算原始值发生错误";
return srcValue;
}
return srcValue;
#endregion
}
///
/// 计算比较映射(实时)
///
public static double CalcuCompareMapping
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func getLastRecord,//获取最后一条记录
out string Msg//错误信息
)
{
Msg = string.Empty;
double srcValue = 0;
#region 数据验证
var formulaModel = Model.Monitor.CompareMappingCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return srcValue;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
{
Msg = "关联测点不是实时测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
#endregion
#region 计算原始值
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var error_second = (endTime - startTime).TotalSeconds;
if (relatedRecord == null)
{
Msg = "未检索到记录信息";
return srcValue;
}
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-error_second))
{
Msg = "关联记录已失效";
return srcValue;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
return srcValue;
}
if (!formulaModel.Calculate(dataValue, out srcValue))
{
Msg = "计算原始值发生错误";
return srcValue;
}
return srcValue;
#endregion
}
///
/// 计算区间映射(实时)
///
public static double CalcuRangeMapping
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func getLastRecord,//获取最后一条记录
out string Msg//错误信息
)
{
Msg = string.Empty;
double srcValue = 0;
#region 数据验证
var formulaModel = Model.Monitor.RangeMappingCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return srcValue;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
{
Msg = "关联测点不是实时测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
#endregion
#region 计算原始值
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var error_second = (endTime - startTime).TotalSeconds;
if (relatedRecord == null)
{
Msg = "未检索到记录信息";
return srcValue;
}
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-error_second))
{
Msg = "关联记录已失效";
return srcValue;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
return srcValue;
}
if (!formulaModel.Calculate(dataValue, out srcValue))
{
Msg = "计算原始值发生错误";
return srcValue;
}
return srcValue;
#endregion
}
#endregion
#region 系数
///
/// 计算一元系数(实时)
///
public static double CalcuOnceRatio
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func getLastRecord,//获取最后一条记录
out string Msg//错误信息
)
{
Msg = string.Empty;
double srcValue = 0;
#region 数据验证
var formulaModel = Model.Monitor.OnceRatioCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return srcValue;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
{
Msg = "关联测点不是实时测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
#endregion
#region 计算原始值
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var error_second = (endTime - startTime).TotalSeconds;
if (relatedRecord == null)
{
Msg = "未检索到记录信息";
return srcValue;
}
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-error_second))
{
Msg = "关联记录已失效";
return srcValue;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
return srcValue;
}
if (!formulaModel.Calculate(dataValue, out srcValue))
{
Msg = "计算原始值发生错误";
return srcValue;
}
return srcValue;
#endregion
}
///
/// 计算二元系数(实时)
///
public static double CalcuTwiceRatio
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func getLastRecord,//获取最后一条记录
out string Msg//错误信息
)
{
Msg = string.Empty;
double srcValue = 0;
#region 数据验证
var formulaModel = Model.Monitor.TwiceRatioCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return srcValue;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
{
Msg = "关联测点不是实时测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
#endregion
#region 计算原始值
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var error_second = (endTime - startTime).TotalSeconds;
if (relatedRecord == null)
{
Msg = "未检索到记录信息";
return srcValue;
}
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-error_second))
{
Msg = "关联记录已失效";
return srcValue;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
return srcValue;
}
if (!formulaModel.Calculate(dataValue, out srcValue))
{
Msg = "计算原始值发生错误";
return srcValue;
}
return srcValue;
#endregion
}
#endregion
///
/// 计算运行状态
///
public static double CalcuRunStatus
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func getLastRecord,//获取最后一条记录
out string Msg//错误信息
)
{
Msg = string.Empty;
var formulaModel = Model.Monitor.RunStatusCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
if (formulaModel.JudgeItems == null || formulaModel.JudgeItems.Count < 1)
{
Msg = "公式参数配置错误";
return default;
}
int runStatus = RunStatus.UnKnown;
//必须满足的列表
var judgeAndItemList = formulaModel.JudgeItems.Where(x => x.OperateType == Model.Monitor.RunStatusCalculationFormulaParas.eOperateType.And).ToList();
foreach (var judgeAndItem in judgeAndItemList)
{
switch (judgeAndItem.JudgeType)
{
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.RS:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.RunStatusJudgeParas.ToModel(judgeAndItem.JudgeParas);
if (judgeModel == null)
{
runStatus = RunStatus.Shut;
Msg = "公式参数配置错误(根据运行状态项)";
break;
}
var relatedMonitor = getMonitorPoint(judgeModel.ObjectID);
if (relatedMonitor == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},不存在";
break;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},不可用";
break;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
runStatus = RunStatus.Shut;
Msg = "关联信号不存在";
break;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID,relatedSignal.ID);
var endTime = DateTime.Now;
var errorSecond = (endTime - startTime).TotalSeconds;
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-errorSecond))
{
runStatus = RunStatus.Shut;
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
runStatus = RunStatus.Shut;
Msg = "关联记录数据格式错误";
break;
}
runStatus = dataValue > 0 ? RunStatus.Run : RunStatus.Shut;
}
break;
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.P:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeAndItem.JudgeParas);
if (judgeModel == null)
{
runStatus = RunStatus.Shut;
Msg = "公式参数配置错误(根据功率项)";
break;
}
var relatedMonitor = getMonitorPoint(judgeModel.ObjectID);
if (relatedMonitor == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},不存在";
break;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},不可用";
break;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},未检索到信号信息";
break;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var errorSecond = (endTime - startTime).TotalSeconds;
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-errorSecond))
{
runStatus = RunStatus.Shut;
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
runStatus = RunStatus.Shut;
Msg = "关联记录数据格式错误";
break;
}
runStatus = dataValue >= judgeModel.ThresholdValue ? RunStatus.Run : RunStatus.Shut;
}
break;
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.Pr:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.PressureDiffThresholdJudgeParas.ToModel(judgeAndItem.JudgeParas);
if (judgeModel == null)
{
runStatus = RunStatus.Shut;
Msg = "公式参数配置错误(根据压差项)";
break;
}
#region 进口压力
var relatedMonitorPr1 = getMonitorPoint(judgeModel.Pr1);
if (relatedMonitorPr1 == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.Pr1},不存在";
break;
}
if (relatedMonitorPr1.UseStatus != Model.eUseStatus.Enable)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.Pr1},不可用";
break;
}
var relatedSignalPr1 = getSignal(relatedMonitorPr1.ID);
if (relatedSignalPr1 == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{relatedMonitorPr1.ID},未检索到信号信息";
break;
}
var startTimePr1 = DateTime.Now;
var relatedRecordPr1 = getLastRecord(relatedMonitorPr1.ID, relatedSignalPr1.ID);
var endTimePr1 = DateTime.Now;
var errorSecondPr1 = (endTimePr1 - startTimePr1).TotalSeconds;
var realSoltPr1 = Model.Monitor.RealSlot.ToModel(relatedMonitorPr1.CronParas);
if (realSoltPr1 == null)
{
realSoltPr1 = new Model.Monitor.RealSlot();
}
if (relatedRecordPr1.DataTime < realSoltPr1.GetStartTime(startTimePr1).AddSeconds(-errorSecondPr1))
{
runStatus = RunStatus.Shut;
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecordPr1.DataValue, out double dataValuePr1))
{
runStatus = RunStatus.Shut;
Msg = "关联记录数据格式错误";
break;
}
#endregion
#region 进口压力
var relatedMonitorPr2 = getMonitorPoint(judgeModel.Pr2);
if (relatedMonitorPr2 == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.Pr2},不存在";
break;
}
if (relatedMonitorPr2.UseStatus != Model.eUseStatus.Enable)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.Pr2},不可用";
break;
}
var relatedSignalPr2 = getSignal(relatedMonitorPr2.ID);
if (relatedSignalPr2 == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{relatedMonitorPr2.ID},未检索到信号信息";
break;
}
var startTimePr2 = DateTime.Now;
var relatedRecordPr2 = getLastRecord(relatedMonitorPr2.ID, relatedSignalPr2.ID);
var endTimePr2 = DateTime.Now;
var errorSecondPr2 = (endTimePr2 - startTimePr2).TotalSeconds;
var realSoltPr2 = Model.Monitor.RealSlot.ToModel(relatedMonitorPr2.CronParas);
if (realSoltPr2 == null)
{
realSoltPr2 = new Model.Monitor.RealSlot();
}
if (relatedRecordPr2.DataTime < realSoltPr2.GetStartTime(startTimePr2).AddSeconds(-errorSecondPr2))
{
runStatus = RunStatus.Shut;
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecordPr2.DataValue, out double dataValuePr2))
{
runStatus = RunStatus.Shut;
Msg = "关联记录数据格式错误";
break;
}
#endregion
runStatus = dataValuePr2 - dataValuePr1 >= judgeModel.ThresholdValue ? RunStatus.Run : RunStatus.Shut;
}
break;
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.Q:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeAndItem.JudgeParas);
if (judgeModel == null)
{
runStatus = RunStatus.Shut;
Msg = "公式参数配置错误(根据流量项)";
break;
}
var relatedMonitor = getMonitorPoint(judgeModel.ObjectID);
if (relatedMonitor == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},不存在";
break;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},不可用";
break;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},未检索到信号信息";
break;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var errorSecond = (endTime - startTime).TotalSeconds;
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-errorSecond))
{
runStatus = RunStatus.Shut;
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
runStatus = RunStatus.Shut;
Msg = "关联记录数据格式错误";
break;
}
runStatus = dataValue >= judgeModel.ThresholdValue ? RunStatus.Run : RunStatus.Shut;
}
break;
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.I:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeAndItem.JudgeParas);
if (judgeModel == null)
{
runStatus = RunStatus.Shut;
Msg = "公式参数配置错误(根据电流项)";
break;
}
var relatedMonitor = getMonitorPoint(judgeModel.ObjectID);
if (relatedMonitor == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},不存在";
break;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},不可用";
break;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},未检索到信号信息";
break;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var errorSecond = (endTime - startTime).TotalSeconds;
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-errorSecond))
{
runStatus = RunStatus.Shut;
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
runStatus = RunStatus.Shut;
Msg = "关联记录数据格式错误";
break;
}
runStatus = dataValue >= judgeModel.ThresholdValue ? RunStatus.Run : RunStatus.Shut;
}
break;
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.HZ:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeAndItem.JudgeParas);
if (judgeModel == null)
{
runStatus = RunStatus.Shut;
Msg = "公式参数配置错误(根据频率项)";
break;
}
var relatedMonitor = getMonitorPoint(judgeModel.ObjectID);
if (relatedMonitor == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},不存在";
break;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},不可用";
break;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
runStatus = RunStatus.Shut;
Msg = $"关联测点:{judgeModel.ObjectID},未检索到信号信息";
break;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var errorSecond = (endTime - startTime).TotalSeconds;
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-errorSecond))
{
runStatus = RunStatus.Shut;
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
runStatus = RunStatus.Shut;
Msg = "关联记录数据格式错误";
break;
}
runStatus = dataValue >= judgeModel.ThresholdValue ? RunStatus.Run : RunStatus.Shut;
}
break;
default: break;
}
if (runStatus == RunStatus.Shut)
{
break;
}
}
//不需要满足的条件
if (runStatus == RunStatus.UnKnown)
{
var judgeOrItemList = formulaModel.JudgeItems.Where(x => x.OperateType == Model.Monitor.RunStatusCalculationFormulaParas.eOperateType.Or).ToList();
foreach (var judgeOrItem in judgeOrItemList)
{
switch (judgeOrItem.JudgeType)
{
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.RS:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.RunStatusJudgeParas.ToModel(judgeOrItem.JudgeParas);
if (judgeModel == null)
{
Msg = "公式参数配置错误(根据运行状态项)";
break;
}
var relatedMonitor = getMonitorPoint(judgeModel.ObjectID);
if (relatedMonitor == null)
{
Msg = $"关联测点:{judgeModel.ObjectID},不存在";
break;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = $"关联测点:{judgeModel.ObjectID},不可用";
break;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = $"关联测点:{judgeModel.ObjectID},未检索到信号信息";
break;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var errorSecond = (endTime - startTime).TotalSeconds;
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-errorSecond))
{
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
break;
}
if (dataValue > 0)
{
runStatus = RunStatus.Run;
}
}
break;
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.P:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeOrItem.JudgeParas);
if (judgeModel == null)
{
Msg = "公式参数配置错误(根据功率项)";
break;
}
var relatedMonitor = getMonitorPoint(judgeModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点:{judgeModel.ObjectID},不存在";
break;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{judgeModel.ObjectID},不可用";
break;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联测点:{judgeModel.ObjectID},未检索到信号信息";
break;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var errorSecond = (endTime - startTime).TotalSeconds;
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-errorSecond))
{
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
break;
}
if (dataValue >= judgeModel.ThresholdValue)
{
runStatus = RunStatus.Run;
}
}
break;
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.Pr:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.PressureDiffThresholdJudgeParas.ToModel(judgeOrItem.JudgeParas);
if (judgeModel == null)
{
Msg = "公式参数配置错误(根据压差项)";
break;
}
#region 进口压力
var relatedMonitorPr1 = getMonitorPoint(judgeModel.Pr1);
if (relatedMonitorPr1 == null)
{
Msg = $"关联测点:{judgeModel.Pr1},不存在";
break;
}
if (relatedMonitorPr1.UseStatus != Model.eUseStatus.Enable)
{
Msg = $"关联测点:{judgeModel.Pr1},不可用";
break;
}
var relatedSignalPr1 = getSignal(relatedMonitorPr1.ID);
if (relatedSignalPr1 == null)
{
Msg = $"关联测点:{relatedMonitorPr1.ID},未检索到信号信息";
break;
}
var startTimePr1 = DateTime.Now;
var relatedRecordPr1 = getLastRecord(relatedMonitorPr1.ID, relatedSignalPr1.ID);
var endTimePr1 = DateTime.Now;
var errorSecondPr1 = (endTimePr1 - startTimePr1).TotalSeconds;
var realSoltPr1 = Model.Monitor.RealSlot.ToModel(relatedMonitorPr1.CronParas);
if (realSoltPr1 == null)
{
realSoltPr1 = new Model.Monitor.RealSlot();
}
if (relatedRecordPr1.DataTime < realSoltPr1.GetStartTime(startTimePr1).AddSeconds(-errorSecondPr1))
{
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecordPr1.DataValue, out double dataValuePr1))
{
Msg = "关联记录数据格式错误";
break;
}
#endregion
#region 进口压力
var relatedMonitorPr2 = getMonitorPoint(judgeModel.Pr2);
if (relatedMonitorPr2 == null)
{
Msg = $"关联测点:{judgeModel.Pr2},不存在";
break;
}
if (relatedMonitorPr2.UseStatus != Model.eUseStatus.Enable)
{
Msg = $"关联测点:{judgeModel.Pr2},不可用";
break;
}
var relatedSignalPr2 = getSignal(relatedMonitorPr2.ID);
if (relatedSignalPr2 == null)
{
Msg = $"关联测点:{relatedMonitorPr2.ID},未检索到信号信息";
break;
}
var startTimePr2 = DateTime.Now;
var relatedRecordPr2 = getLastRecord(relatedMonitorPr2.ID, relatedSignalPr2.ID);
var endTimePr2 = DateTime.Now;
var errorSecondPr2 = (endTimePr2 - startTimePr2).TotalSeconds;
var realSoltPr2 = Model.Monitor.RealSlot.ToModel(relatedMonitorPr2.CronParas);
if (realSoltPr2 == null)
{
realSoltPr2 = new Model.Monitor.RealSlot();
}
if (relatedRecordPr2.DataTime < realSoltPr2.GetStartTime(startTimePr2).AddSeconds(-errorSecondPr2))
{
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecordPr2.DataValue, out double dataValuePr2))
{
Msg = "关联记录数据格式错误";
break;
}
#endregion
if (dataValuePr2 - dataValuePr1 >= judgeModel.ThresholdValue)
{
runStatus = RunStatus.Run;
}
}
break;
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.Q:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeOrItem.JudgeParas);
if (judgeModel == null)
{
Msg = "公式参数配置错误(根据流量项)";
break;
}
var relatedMonitor = getMonitorPoint(judgeModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点:{judgeModel.ObjectID},不存在";
break;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{judgeModel.ObjectID},不可用";
break;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联测点:{judgeModel.ObjectID},未检索到信号信息";
break;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var errorSecond = (endTime - startTime).TotalSeconds;
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-errorSecond))
{
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
break;
}
if (dataValue >= judgeModel.ThresholdValue)
{
runStatus = RunStatus.Run;
}
}
break;
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.I:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeOrItem.JudgeParas);
if (judgeModel == null)
{
Msg = "公式参数配置错误(根据电流项)";
break;
}
var relatedMonitor = getMonitorPoint(judgeModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点:{judgeModel.ObjectID},不存在";
break;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{judgeModel.ObjectID},不可用";
break;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联测点:{judgeModel.ObjectID},未检索到信号信息";
break;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var errorSecond = (endTime - startTime).TotalSeconds;
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-errorSecond))
{
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
break;
}
if (dataValue >= judgeModel.ThresholdValue)
{
runStatus = RunStatus.Run;
}
}
break;
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.HZ:
{
var judgeModel = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeOrItem.JudgeParas);
if (judgeModel == null)
{
Msg = "公式参数配置错误(根据频率项)";
break;
}
var relatedMonitor = getMonitorPoint(judgeModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点:{judgeModel.ObjectID},不存在";
break;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{judgeModel.ObjectID},不可用";
break;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联测点:{judgeModel.ObjectID},未检索到信号信息";
break;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var errorSecond = (endTime - startTime).TotalSeconds;
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-errorSecond))
{
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
break;
}
if (dataValue >= judgeModel.ThresholdValue)
{
runStatus = RunStatus.Run;
}
}
break;
default: break;
}
if (runStatus == RunStatus.Run)
{
break;
}
}
}
if (runStatus == RunStatus.UnKnown)
{
runStatus = RunStatus.Shut;
}
return runStatus;
}
///
/// 计算-和值
///
public static double CalcuSum
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func getLastRecord,//获取最后一条记录
out string Msg//错误信息
)
{
Msg = string.Empty;
var formulaModel = Model.Monitor.SumValueCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
if (formulaModel.ObjectIds == null || formulaModel.ObjectIds.Count < 1)
{
Msg = "公式参数配置错误";
return default;
}
var relatedDataValueList = new List();
foreach (var objectId in formulaModel.ObjectIds)
{
var relatedMonitor = getMonitorPoint(objectId);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
break;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
break;
}
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
{
Msg = "关联测点不是实时测点";
break;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
break;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
break;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var error_second = (endTime - startTime).TotalSeconds;
if (relatedRecord == null)
{
Msg = "未检索到记录信息";
break;
}
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-error_second))
{
Msg = "关联记录已失效";
break;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
break;
}
relatedDataValueList.Add(dataValue);
}
if (relatedDataValueList.Count != formulaModel.ObjectIds.Count)
{
Msg = "关联数据记录异常";
return default;
}
var srcValue = formulaModel.Calculate(relatedDataValueList);
return srcValue;
}
///
/// 计算-差值
///
public static double CalcuDiff
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func getLastRecord,//获取最后一条记录
out string Msg//错误信息
)
{
Msg = string.Empty;
var formulaModel = Model.Monitor.DiffValueCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
#region 第一个参数
var relatedMonitor1 = getMonitorPoint(formulaModel.First);
if (relatedMonitor1 == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor1.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor1.CronType != Model.Monitor.eCronType.Real)
{
Msg = "关联测点不是实时测点";
return default;
}
if (relatedMonitor1.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal1 = getSignal(relatedMonitor1.ID);
if (relatedSignal1 == null)
{
Msg = "关联信号不存在";
return default;
}
var startTime1 = DateTime.Now;
var relatedRecord1 = getLastRecord(relatedMonitor1.ID, relatedSignal1.ID);
var endTime1 = DateTime.Now;
var errorSecond1 = (endTime1 - startTime1).TotalSeconds;
if (relatedRecord1 == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSolt1 = Model.Monitor.RealSlot.ToModel(relatedMonitor1.CronParas);
if (realSolt1 == null)
{
realSolt1 = new Model.Monitor.RealSlot();
}
if (relatedRecord1.DataTime < realSolt1.GetStartTime(startTime1).AddSeconds(-errorSecond1))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecord1.DataValue, out double dataValue1))
{
Msg = "关联记录数据格式错误";
return default;
}
#endregion
#region 第二个参数
var relatedMonitor2 = getMonitorPoint(formulaModel.Second);
if (relatedMonitor2 == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor2.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor2.CronType != Model.Monitor.eCronType.Real)
{
Msg = "关联测点不是实时测点";
return default;
}
if (relatedMonitor2.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal2 = getSignal(relatedMonitor2.ID);
if (relatedSignal2 == null)
{
Msg = "关联信号不存在";
return default;
}
var startTime2 = DateTime.Now;
var relatedRecord2 = getLastRecord(relatedMonitor2.ID, relatedSignal2.ID);
var endTime2 = DateTime.Now;
var errorSecond2 = (endTime2 - startTime2).TotalSeconds;
if (relatedRecord2 == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSolt2 = Model.Monitor.RealSlot.ToModel(relatedMonitor2.CronParas);
if (realSolt2 == null)
{
realSolt2 = new Model.Monitor.RealSlot();
}
if (relatedRecord2.DataTime < realSolt2.GetStartTime(startTime2).AddSeconds(-errorSecond2))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecord2.DataValue, out double dataValue2))
{
Msg = "关联记录数据格式错误";
return default;
}
#endregion
var srcValue =formulaModel.Calculate(dataValue2, dataValue1);
return srcValue;
}
///
/// 计算数值累积
///
public static double CalcuNumberAccumulate
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
int timeStep,
Func getLastRecord,//获取最后一条记录
Func getCurrentLastRecord,
out string Msg//错误信息
)
{
Msg = string.Empty;
var formulaModel = Model.Monitor.NumberAccumulateCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
{
Msg = "关联测点不是实时测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var error_second = (endTime - startTime).TotalSeconds;
if (relatedRecord == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-error_second))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
return default;
}
//原始值计算
double second = timeStep;
var record = getCurrentLastRecord();
if (record != null)
{
second = (DateTime.Now - record.DataTime).TotalSeconds;
}
var srcValue = formulaModel.Calculate(dataValue, second);
return srcValue;
}
///
/// 计算枚举累积
///
public static double CalcuEnumAccumulate
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
int timeStep,
Func getLastRecord,//获取最后一条记录
Func getCurrentLastRecord,
out string Msg//错误信息
)
{
Msg = string.Empty;
var formulaModel = Model.Monitor.EnumAccumulateCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
if (relatedMonitor == null)
{
Msg = "关联测点不存在";
return default;
}
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
{
Msg = "关联测点不是常规测点";
return default;
}
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
{
Msg = "关联测点不是实时测点";
return default;
}
if (relatedMonitor.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点不可用";
return default;
}
var relatedSignal = getSignal(relatedMonitor.ID);
if (relatedSignal == null)
{
Msg = "关联信号不存在";
return default;
}
var startTime = DateTime.Now;
var relatedRecord = getLastRecord(relatedMonitor.ID, relatedSignal.ID);
var endTime = DateTime.Now;
var error_second = (endTime - startTime).TotalSeconds;
if (relatedRecord == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSolt = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
if (realSolt == null)
{
realSolt = new Model.Monitor.RealSlot();
}
if (relatedRecord.DataTime < realSolt.GetStartTime(startTime).AddSeconds(-error_second))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
{
Msg = "关联记录数据格式错误";
return default;
}
//原始值计算
double second = timeStep;
var record = getCurrentLastRecord();
if (record != null)
{
second = (DateTime.Now - record.DataTime).TotalSeconds;
}
var srcValue = formulaModel.Calculate(dataValue, second);
return srcValue;
}
///
/// 计算效率
///
public static double CalcuE
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func getLastRecord,//获取最后一条记录
out string Msg//错误信息
)
{
Msg = string.Empty;
var formulaModel = Model.Monitor.ECalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
#region 流量参数
var relatedMonitorQ = getMonitorPoint(formulaModel.Q);
if (relatedMonitorQ == null)
{
Msg = "关联测点:{formulaModel.Q},不存在";
return default;
}
if (relatedMonitorQ.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{formulaModel.Q},不可用";
return default;
}
var relatedSignalQ = getSignal(relatedMonitorQ.ID);
if (relatedSignalQ == null)
{
Msg = "关联测点:{formulaModel.Q},未检索到信号信息";
return default;
}
var startTimeQ = DateTime.Now;
var relatedRecordQ = getLastRecord(relatedMonitorQ.ID, relatedSignalQ.ID);
var endTimeQ = DateTime.Now;
var errorSecondQ = (startTimeQ - endTimeQ).TotalSeconds;
if (relatedRecordQ == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSoltQ = Model.Monitor.RealSlot.ToModel(relatedMonitorQ.CronParas);
if (realSoltQ == null)
{
realSoltQ = new Model.Monitor.RealSlot();
}
if (relatedRecordQ.DataTime < realSoltQ.GetStartTime(startTimeQ).AddSeconds(-errorSecondQ))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecordQ.DataValue, out double dataValueQ))
{
Msg = "关联记录数据格式错误";
return default;
}
#endregion
#region 扬程参数
var relatedMonitorH = getMonitorPoint(formulaModel.H);
if (relatedMonitorH == null)
{
Msg = "关联测点:{formulaModel.H},不存在";
return default;
}
if (relatedMonitorH.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{formulaModel.H},不可用";
return default;
}
var relatedSignalH = getSignal(relatedMonitorH.ID);
if (relatedSignalH == null)
{
Msg = "关联测点:{formulaModel.H},未检索到信号信息";
return default;
}
var startTimeH = DateTime.Now;
var relatedRecordH = getLastRecord(relatedMonitorH.ID, relatedSignalH.ID);
var endTimeH = DateTime.Now;
var errorSecondH = (startTimeH - endTimeH).TotalSeconds;
if (relatedRecordH == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSoltH = Model.Monitor.RealSlot.ToModel(relatedMonitorH.CronParas);
if (realSoltH == null)
{
realSoltH = new Model.Monitor.RealSlot();
}
if (relatedRecordH.DataTime < realSoltH.GetStartTime(startTimeH).AddSeconds(-errorSecondH))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecordH.DataValue, out double dataValueH))
{
Msg = "关联记录数据格式错误";
return default;
}
#endregion
#region 功率参数
var relatedMonitorP = getMonitorPoint(formulaModel.P);
if (relatedMonitorP == null)
{
Msg = "关联测点:{formulaModel.P},不存在";
return default;
}
if (relatedMonitorP.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{formulaModel.P},不可用";
return default;
}
var relatedSignalP = getSignal(relatedMonitorP.ID);
if (relatedSignalP == null)
{
Msg = "关联测点:{formulaModel.P},未检索到信号信息";
return default;
}
var startTimeP = DateTime.Now;
var relatedRecordP = getLastRecord(relatedMonitorP.ID, relatedSignalP.ID);
var endTimeP = DateTime.Now;
var errorSecondP = (startTimeP - endTimeP).TotalSeconds;
if (relatedRecordP == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSoltP = Model.Monitor.RealSlot.ToModel(relatedMonitorP.CronParas);
if (realSoltP == null)
{
realSoltP = new Model.Monitor.RealSlot();
}
if (relatedRecordP.DataTime < realSoltP.GetStartTime(startTimeP).AddSeconds(-errorSecondP))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecordP.DataValue, out double dataValueP))
{
Msg = "关联记录数据格式错误";
return default;
}
#endregion
//原始值计算
if (!formulaModel.Calculate(dataValueQ, dataValueH, dataValueP, out double dataValue))
{
Msg = "计算原始值错误";
return default;
}
return dataValue;
}
///
/// 计算千吨能耗
///
public static double CalcuWP
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func getLastRecord,//获取最后一条记录
out string Msg//错误信息
)
{
Msg = string.Empty;
var formulaModel = Model.Monitor.WPCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
#region 流量参数
var relatedMonitorQ = getMonitorPoint(formulaModel.Q);
if (relatedMonitorQ == null)
{
Msg = "关联测点:{formulaModel.Q},不存在";
return default;
}
if (relatedMonitorQ.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{formulaModel.Q},不可用";
return default;
}
var relatedSignalQ = getSignal(relatedMonitorQ.ID);
if (relatedSignalQ == null)
{
Msg = "关联测点:{formulaModel.Q},未检索到信号信息";
return default;
}
var startTimeQ = DateTime.Now;
var relatedRecordQ = getLastRecord(relatedMonitorQ.ID, relatedSignalQ.ID);
var endTimeQ = DateTime.Now;
var errorSecondQ = (startTimeQ - endTimeQ).TotalSeconds;
if (relatedRecordQ == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSoltQ = Model.Monitor.RealSlot.ToModel(relatedMonitorQ.CronParas);
if (realSoltQ == null)
{
realSoltQ = new Model.Monitor.RealSlot();
}
if (relatedRecordQ.DataTime < realSoltQ.GetStartTime(startTimeQ).AddSeconds(-errorSecondQ))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecordQ.DataValue, out double dataValueQ))
{
Msg = "关联记录数据格式错误";
return default;
}
#endregion
#region 功率参数
var relatedMonitorP = getMonitorPoint(formulaModel.P);
if (relatedMonitorP == null)
{
Msg = "关联测点:{formulaModel.P},不存在";
return default;
}
if (relatedMonitorP.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{formulaModel.P},不可用";
return default;
}
var relatedSignalP = getSignal(relatedMonitorP.ID);
if (relatedSignalP == null)
{
Msg = "关联测点:{formulaModel.P},未检索到信号信息";
return default;
}
var startTimeP = DateTime.Now;
var relatedRecordP = getLastRecord(relatedMonitorP.ID, relatedSignalP.ID);
var endTimeP = DateTime.Now;
var errorSecondP = (startTimeP - endTimeP).TotalSeconds;
if (relatedRecordP == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSoltP = Model.Monitor.RealSlot.ToModel(relatedMonitorP.CronParas);
if (realSoltP == null)
{
realSoltP = new Model.Monitor.RealSlot();
}
if (relatedRecordP.DataTime < realSoltP.GetStartTime(startTimeP).AddSeconds(-errorSecondP))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecordP.DataValue, out double dataValueP))
{
Msg = "关联记录数据格式错误";
return default;
}
#endregion
//原始值计算
if (!formulaModel.Calculate(dataValueP,dataValueQ, out double dataValue))
{
Msg = "计算原始值错误";
return default;
}
return dataValue;
}
///
/// 计算效率
///
public static double CalcuUWP
(
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func getSignal,//获取信号
Func getLastRecord,//获取最后一条记录
out string Msg//错误信息
)
{
Msg = string.Empty;
var formulaModel = Model.Monitor.UWPCalculationFormulaParas.ToModel(formulaParas);
if (formulaModel == null)
{
Msg = "公式参数配置错误";
return default;
}
#region 流量参数
var relatedMonitorQ = getMonitorPoint(formulaModel.Q);
if (relatedMonitorQ == null)
{
Msg = "关联测点:{formulaModel.Q},不存在";
return default;
}
if (relatedMonitorQ.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{formulaModel.Q},不可用";
return default;
}
var relatedSignalQ = getSignal(relatedMonitorQ.ID);
if (relatedSignalQ == null)
{
Msg = "关联测点:{formulaModel.Q},未检索到信号信息";
return default;
}
var startTimeQ = DateTime.Now;
var relatedRecordQ = getLastRecord(relatedMonitorQ.ID, relatedSignalQ.ID);
var endTimeQ = DateTime.Now;
var errorSecondQ = (startTimeQ - endTimeQ).TotalSeconds;
if (relatedRecordQ == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSoltQ = Model.Monitor.RealSlot.ToModel(relatedMonitorQ.CronParas);
if (realSoltQ == null)
{
realSoltQ = new Model.Monitor.RealSlot();
}
if (relatedRecordQ.DataTime < realSoltQ.GetStartTime(startTimeQ).AddSeconds(-errorSecondQ))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecordQ.DataValue, out double dataValueQ))
{
Msg = "关联记录数据格式错误";
return default;
}
#endregion
#region 扬程参数
var relatedMonitorH = getMonitorPoint(formulaModel.H);
if (relatedMonitorH == null)
{
Msg = "关联测点:{formulaModel.H},不存在";
return default;
}
if (relatedMonitorH.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{formulaModel.H},不可用";
return default;
}
var relatedSignalH = getSignal(relatedMonitorH.ID);
if (relatedSignalH == null)
{
Msg = "关联测点:{formulaModel.H},未检索到信号信息";
return default;
}
var startTimeH = DateTime.Now;
var relatedRecordH = getLastRecord(relatedMonitorH.ID, relatedSignalH.ID);
var endTimeH = DateTime.Now;
var errorSecondH = (startTimeH - endTimeH).TotalSeconds;
if (relatedRecordH == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSoltH = Model.Monitor.RealSlot.ToModel(relatedMonitorH.CronParas);
if (realSoltH == null)
{
realSoltH = new Model.Monitor.RealSlot();
}
if (relatedRecordH.DataTime < realSoltH.GetStartTime(startTimeH).AddSeconds(-errorSecondH))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecordH.DataValue, out double dataValueH))
{
Msg = "关联记录数据格式错误";
return default;
}
#endregion
#region 功率参数
var relatedMonitorP = getMonitorPoint(formulaModel.P);
if (relatedMonitorP == null)
{
Msg = "关联测点:{formulaModel.P},不存在";
return default;
}
if (relatedMonitorP.UseStatus != Model.eUseStatus.Enable)
{
Msg = "关联测点:{formulaModel.P},不可用";
return default;
}
var relatedSignalP = getSignal(relatedMonitorP.ID);
if (relatedSignalP == null)
{
Msg = "关联测点:{formulaModel.P},未检索到信号信息";
return default;
}
var startTimeP = DateTime.Now;
var relatedRecordP = getLastRecord(relatedMonitorP.ID, relatedSignalP.ID);
var endTimeP = DateTime.Now;
var errorSecondP = (startTimeP - endTimeP).TotalSeconds;
if (relatedRecordP == null)
{
Msg = "未检索到记录信息";
return default;
}
var realSoltP = Model.Monitor.RealSlot.ToModel(relatedMonitorP.CronParas);
if (realSoltP == null)
{
realSoltP = new Model.Monitor.RealSlot();
}
if (relatedRecordP.DataTime < realSoltP.GetStartTime(startTimeP).AddSeconds(-errorSecondP))
{
Msg = "关联记录已失效";
return default;
}
if (!double.TryParse(relatedRecordP.DataValue, out double dataValueP))
{
Msg = "关联记录数据格式错误";
return default;
}
#endregion
//原始值计算
if (!formulaModel.Calculate(dataValueP,dataValueQ, dataValueH, out double dataValue))
{
Msg = "计算原始值错误";
return default;
}
return dataValue;
}
}
}