2026-06-15 10:56:30 +08:00
using Aitex.Core.RT.DataCenter ;
using Aitex.Core.RT.Device.Devices ;
using Aitex.Core.RT.Device ;
using System ;
using System.Collections.Generic ;
using System.Xml.Serialization ;
using System.Threading.Tasks ;
using Aitex.Core.RT.Event ;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.GasFlow
{
/// <summary>
/// 单行真值表对应的逻辑对象,主要执行逻辑就在这里
/// </summary>
[XmlType(typeName: "GasTrueTableRows")]
public partial class GasTrueTableRows
{
[XmlArray("Inputs")]
public List < ControlNameValue > XMLInputList { get ; set ; }
[XmlArray("Outputs")]
public List < ControlNameValue > XMLOutputList { get ; set ; }
public string ModuleName { get ; set ; }
public string GasName { get ; set ; }
private Dictionary < IoValve , double > InputIoValveList = new Dictionary < IoValve , double > ( ) ;
private Dictionary < object , double > OutputMfcList = new Dictionary < object , double > ( ) ;
public void Initialize ( string moduleName , string gasName )
{
string strErrorMeg = "" ;
ModuleName = moduleName ;
GasName = gasName ;
try
{
foreach ( var rowInputs in XMLInputList )
{
strErrorMeg = $"Name = {rowInputs.Name} Value = {rowInputs.Value} ControlName = {rowInputs.ControlName} " ;
InputIoValveList . Add ( DEVICE . GetDevice < IoValve > ( $"{ModuleName}.{rowInputs.ControlName}" ) , rowInputs . Value ) ;
}
2026-08-25 14:49:11 +08:00
if ( GasName = = "O2_Run" | | GasName = = "O2_Vent" ) //PN2是特殊计算不能在此初始化
2026-06-15 10:56:30 +08:00
return ;
foreach ( var rowOutputs in XMLOutputList )
{
strErrorMeg = $"Name = {rowOutputs.Name} Value = {rowOutputs.Value} ControlName = {rowOutputs.ControlName} " ;
if ( rowOutputs . ControlName . Contains ( "Mfc" ) )
OutputMfcList . Add ( DEVICE . GetDevice < IoMFC > ( $"{ModuleName}.{rowOutputs.ControlName}" ) , rowOutputs . Value ) ;
else
OutputMfcList . Add ( rowOutputs . ControlName , rowOutputs . Value ) ;
}
}
catch ( Exception ex )
{
//输出打印过早,界面可能未加载,造成异常未输出到界面
Task . Delay ( 5000 ) . ContinueWith ( x = > EV . PostAlarmLog ( ModuleName , $"Truth table initialization error , {GasName}, {strErrorMeg} , Restart the software after the fault is rectified" ) ) ;
}
}
private bool IsCanOut ( )
{
//有一个集合为空,不用循环
if ( InputIoValveList . Count = = 0 | | XMLOutputList . Count = = 0 )
return false ;
//一行内单元格的输入输出配置
foreach ( var rowInput in InputIoValveList )
{
if ( rowInput . Key . Status = = true & & rowInput . Value = = 1 )
continue ;
if ( rowInput . Key . Status = = false & & rowInput . Value = = 0 )
continue ;
return false ;
}
return true ;
}
public double Accumulation ( )
{
double volue = 0 ;
if ( ! IsCanOut ( ) )
return 0 ;
foreach ( var rowOutput in OutputMfcList )
{
if ( rowOutput . Key is IoMFC _mfc )
volue + = _mfc . FeedBack * rowOutput . Value ;
else //混合气体流量
volue + = Convert . ToDouble ( DATA . Poll ( $"{ModuleName}.GasRealTimeFlow.{rowOutput.Key}_Run.FeedBack" ) ) * rowOutput . Value ;
}
return volue ;
}
public double AccumulationPN2Run ( )
{
double volue = 0 ;
if ( ! IsCanOut ( ) )
return 0 ;
foreach ( var rowOutputs in XMLOutputList )
{
2026-08-25 14:49:11 +08:00
if ( rowOutputs . ControlName . Contains ( "Mfc6" ) )
2026-06-15 10:56:30 +08:00
{
//特殊气体流量
var _mfc3 = DEVICE . GetDevice < IoMFC > ( $"{ModuleName}.Mfc3" ) ;
var _mfc4 = DEVICE . GetDevice < IoMFC > ( $"{ModuleName}.Mfc4" ) ;
var _mfc6 = DEVICE . GetDevice < IoMFC > ( $"{ModuleName}.Mfc6" ) ;
var m3 = _mfc3 . FeedBack ;
var m4 = _mfc4 . FeedBack ;
var m6 = _mfc6 . FeedBack ;
volue + = ( m6 * m4 / ( m3 + m4 ) ) * rowOutputs . Value ;
}
}
return volue ;
}
}
}