Sic.Framework/MECF.Framework.RT.Equipment.../HardwareUnits/GasFlow/GasFlowUnit.cs

117 lines
4.1 KiB
C#

using System;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using System.Collections.Generic;
using System.Xml.Serialization;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.GasFlow
{
/// <summary>
/// 单个气体的真值表数据,所有配置行数据集合,气体需要的属性数据
/// </summary>
[XmlType(typeName: "GasFlowUnit")]
public class GasFlowUnit
{
/// <summary>
/// 单个真值表内所有的行数据
/// </summary>
[XmlElement("GasTrueTableRows")]
public List<GasTrueTableRows> GasTrueTableRowList { get; set; }
/// <summary>
/// 气体名称
/// </summary>
[XmlAttribute()]
public string GasName { get; set; }
/// <summary>
/// 气体流量系数名称
/// </summary>
[XmlAttribute()]
public string GasFlowRatioName { get; set; }
public string ModuleName { get; set; }
/// <summary>
/// 系统中配置的气体流量系数
/// </summary>
public double GasFlowRatioValue { get; set; }
/// <summary>
/// 气体流量计算值
/// </summary>
public double GasFlowFeedBack { get; set; } = 0;
/// <summary>
/// PN2的特殊计算,仅作为界面显示用,不存储到数据库
/// </summary>
public double PN2_VentSpecial { get; set; } = 0;
private R_TRIG _trigError = new();
public void Initialize(string moduleName)
{
ModuleName = moduleName;
SC.RegisterValueChangedCallback($"PM.{ModuleName}.Efficiency.{GasFlowRatioName}", (o) => { Set_Callback(o.ToString()); });
GasFlowRatioValue = SC.GetValue<double>($"PM.{ModuleName}.Efficiency.{GasFlowRatioName}");
if (GasName == "PN2_Vent")
DATA.Subscribe($"{ModuleName}.GasRealTimeFlow.{GasName}.FeedBackSpecial", () => PN2_VentSpecial, SubscriptionAttribute.FLAG.IgnoreSaveDB);//仅作为显示用,不存储数据库
DATA.Subscribe($"{ModuleName}.GasRealTimeFlow.{GasName}.FeedBack", () => GasFlowFeedBack);
foreach (var row in GasTrueTableRowList)
row.Initialize(moduleName, GasName);
}
public void Set_Callback(string str = "")
{
GasFlowRatioValue = SC.GetValue<double>($"PM.{ModuleName}.Efficiency.{GasFlowRatioName}");
}
public double GetGasFlowFeedBack()
{
double _feedBack = 0;
try
{
//循环检测气阀状态
if (GasTrueTableRowList.Count > 0)
{
for (int i = 0; i < GasTrueTableRowList.Count; i++)//遍历每一行配置的内容,统计气体输出
{
//PN2是特殊计算
if (GasName == "PN2_Run")
_feedBack += GasTrueTableRowList[i].AccumulationPN2Run();
else if (GasName == "PN2_Vent")
{
double cache = GasTrueTableRowList[i].AccumulationPN2Run();
if (i == 2)
PN2_VentSpecial = cache;//洪膺只要输出项的第三条数据作为显示
else
_feedBack += cache;//储存前面两行
}
else
_feedBack += GasTrueTableRowList[i].Accumulation();
}
if (_feedBack < 0)
_feedBack = 0;
GasFlowFeedBack = _feedBack * GasFlowRatioValue;//计算得到的结果*系数
}
}
catch (Exception ex)
{
_trigError.CLK = true;
if (_trigError.Q)
EV.PostWarningLog(ModuleName, $"{GasName} , The truth table calculation is error : {ex}");
}
_trigError.RST = true;
return GasFlowFeedBack;
}
}
}