2023-07-12 17:48:06 +08:00
using Aitex.Core.RT.DataCenter ;
using Aitex.Core.RT.Device.Devices ;
using Aitex.Core.RT.Device ;
using System ;
2023-07-11 17:46:32 +08:00
using System.Collections.Generic ;
2023-07-12 17:48:06 +08:00
using System.Xml.Serialization ;
2023-07-18 17:10:21 +08:00
using System.Threading.Tasks ;
using Aitex.Core.RT.Event ;
2023-07-11 17:46:32 +08:00
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.GasFlow
{
/// <summary>
2023-07-12 17:48:06 +08:00
/// 单行真值表对应的逻辑对象,主要执行逻辑就在这里
2023-07-11 17:46:32 +08:00
/// </summary>
2023-07-13 14:03:54 +08:00
[XmlType(typeName: "GasTrueTableRows")]
public partial class GasTrueTableRows
2023-07-11 17:46:32 +08:00
{
2023-07-12 17:48:06 +08:00
2023-07-13 14:03:54 +08:00
[XmlArray("Inputs")]
2023-07-17 15:22:15 +08:00
public List < ControlNameValue > XMLInputList { get ; set ; }
2023-07-13 14:03:54 +08:00
[XmlArray("Outputs")]
2023-07-17 15:22:15 +08:00
public List < ControlNameValue > XMLOutputList { get ; set ; }
2023-07-13 14:03:54 +08:00
2023-08-08 13:30:26 +08:00
public string ModuleName { get ; set ; }
2023-07-17 15:22:15 +08:00
public string GasName { get ; set ; }
2023-08-08 13:30:26 +08:00
private Dictionary < IoValve , double > InputIoValveList = new Dictionary < IoValve , double > ( ) ;
2023-07-17 15:22:15 +08:00
private Dictionary < object , double > OutputMfcList = new Dictionary < object , double > ( ) ;
2023-08-08 13:30:26 +08:00
public void Initialize ( string moduleName , string gasName )
2023-07-17 15:22:15 +08:00
{
2023-07-18 17:10:21 +08:00
string strErrorMeg = "" ;
ModuleName = moduleName ;
GasName = gasName ;
try
{
2023-08-08 13:30:26 +08:00
2023-07-18 17:10:21 +08:00
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 ) ;
}
2023-08-08 13:30:26 +08:00
2023-07-18 17:10:21 +08:00
if ( GasName . Contains ( "PN2" ) ) //PN2是特殊计算不能在此初始化
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 )
2023-07-17 15:22:15 +08:00
{
2023-07-18 17:10:21 +08:00
//输出打印过早,界面可能未加载,造成异常未输出到界面
Task . Delay ( 5000 ) . ContinueWith ( x = > EV . PostAlarmLog ( ModuleName , $"Truth table initialization error , {GasName}, {strErrorMeg} , Restart the software after the fault is rectified" ) ) ;
2023-07-17 15:22:15 +08:00
}
2023-08-08 13:30:26 +08:00
2023-07-17 15:22:15 +08:00
}
private bool IsCanOut ( )
2023-07-12 17:48:06 +08:00
{
//有一个集合为空,不用循环
2023-07-17 15:22:15 +08:00
if ( InputIoValveList . Count = = 0 | | XMLOutputList . Count = = 0 )
2023-07-12 17:48:06 +08:00
return false ;
2023-07-17 15:22:15 +08:00
2023-07-12 17:48:06 +08:00
//一行内单元格的输入输出配置
2023-07-17 15:22:15 +08:00
foreach ( var rowInput in InputIoValveList )
2023-07-12 17:48:06 +08:00
{
2023-08-08 13:30:26 +08:00
if ( rowInput . Key . Status = = true & & rowInput . Value = = 1 )
2023-07-17 15:22:15 +08:00
continue ;
if ( rowInput . Key . Status = = false & & rowInput . Value = = 0 )
continue ;
2023-07-12 17:48:06 +08:00
return false ;
}
return true ;
}
2023-07-17 15:22:15 +08:00
public double Accumulation ( )
2023-07-12 17:48:06 +08:00
{
double volue = 0 ;
2023-07-17 15:22:15 +08:00
if ( ! IsCanOut ( ) )
2023-07-12 17:48:06 +08:00
return 0 ;
2023-07-17 15:22:15 +08:00
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 ;
2023-08-08 13:30:26 +08:00
2023-07-12 17:48:06 +08:00
}
2023-07-17 15:22:15 +08:00
2023-07-12 17:48:06 +08:00
return volue ;
}
2023-08-08 13:30:26 +08:00
2023-07-17 15:22:15 +08:00
public double AccumulationPN2Run ( )
2023-07-12 17:48:06 +08:00
{
double volue = 0 ;
2023-07-17 15:22:15 +08:00
if ( ! IsCanOut ( ) )
2023-07-12 17:48:06 +08:00
return 0 ;
2023-07-17 15:22:15 +08:00
foreach ( var rowOutputs in XMLOutputList )
2023-07-12 17:48:06 +08:00
{
2023-08-08 13:30:26 +08:00
if ( rowOutputs . ControlName . Contains ( "Mfc5" ) )
2023-07-12 17:48:06 +08:00
{
2023-08-08 13:30:26 +08:00
//Output配置的单元格
var _mfc = DEVICE . GetDevice < IoMFC > ( $"{ModuleName}.{rowOutputs.ControlName}" ) ;
volue + = _mfc . FeedBack * rowOutputs . Value ;
2023-07-12 17:48:06 +08:00
}
2023-08-08 13:30:26 +08:00
else if ( rowOutputs . ControlName . Contains ( "Mfc6" ) )
2023-07-12 17:48:06 +08:00
{
2023-08-08 13:30:26 +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 ;
2023-07-12 17:48:06 +08:00
}
}
return volue ;
}
2023-07-11 17:46:32 +08:00
}
}