修改routine

This commit is contained in:
SIC1016\caipeilun 2026-08-22 11:39:58 +08:00
parent c446d8da61
commit 621c9f2939
9 changed files with 234 additions and 597 deletions

View File

@ -79,7 +79,7 @@
<Catalog DisplayName="StepInfo">
<Group DisplayName="SH Flow->Source1->Source1 Total Flow">
<Step ModuleName="" DeviceType="" InputType="DoubleInput" DisplayName="22. Source1 Total Flow" UnitName="sccm" ControlName="SiSourTotalFlow" InputMode="" Min="0" Max="10000" Description=""/>
<Step ModuleName="" DeviceType="" InputType="DoubleInput" DisplayName="22. Source1 Total Flow" UnitName="sccm" ControlName="Source1TotalFlow" InputMode="" Min="0" Max="10000" Description=""/>
</Group>
<Group DisplayName="SH Flow->Source1->Mo(CO)6 Flow">
@ -116,7 +116,7 @@
</Group>
<Group DisplayName="SH Flow->Source1->Source1 Split">
<Step ModuleName="" DeviceType="" InputType="Set3RatioInput" DisplayName="35. Source Split Ratio" UnitName="" ControlName="SourceSplitRatio"/>
<Step ModuleName="" DeviceType="" InputType="Set3RatioInput" DisplayName="35. Source Split Ratio" UnitName="" ControlName="Source1SplitRatio"/>
<Step ModuleName="" DeviceType="" InputType="DoubleInput" DisplayName="36. Source1 Push Pressure (PC5)" UnitName="mbar" ControlName="Pressure5.Ramp" InputMode="" Min="0" Max="3000" Description="PC5"/>
<Step ModuleName="" DeviceType="" InputType="DoubleInput" DisplayName="37. Source1 Inner Flow (M20)" UnitName="sccm" ControlName="Mfc20.Ramp" InputMode="" Min="0" Max="5000" IsColumnEditable="false" Description="M20"/>
<Step ModuleName="" DeviceType="" InputType="DoubleInput" DisplayName="38. Source1 Middle Flow (M19)" UnitName="sccm" ControlName="Mfc19.Ramp" InputMode="" Min="0" Max="10000" IsColumnEditable="false" Description="M19"/>
@ -128,7 +128,7 @@
</Group>
<Group DisplayName="SH Flow->Source2->CS2 Flow">
<Step ModuleName="" DeviceType="" InputType="FlowModeSelection" DisplayName="41. CS2 Flow Mode" UnitName="" ControlName="CS2.SetValve" Description="">
<Step ModuleName="" DeviceType="" InputType="FlowModeSelection" DisplayName="41. CS2 Flow Mode" UnitName="" ControlName="CS2Flow.SetValve" Description="">
<Item DisplayName="Purge" ControlName="Purge" />
<Item DisplayName="Vent" ControlName="Vent" />
<Item DisplayName="Run" ControlName="Run" />
@ -139,7 +139,7 @@
</Group>
<Group DisplayName="SH Flow->Source2->H2S Flow">
<Step ModuleName="" DeviceType="" InputType="FlowModeSelection" DisplayName="45. H2S Flow Mode" UnitName="" ControlName="H2S.SetValve" Description="">
<Step ModuleName="" DeviceType="" InputType="FlowModeSelection" DisplayName="45. H2S Flow Mode" UnitName="" ControlName="H2SFlow.SetValve" Description="">
<Item DisplayName="Purge" ControlName="Purge" />
<Item DisplayName="Vent" ControlName="Vent" />
<Item DisplayName="Run" ControlName="Run" />
@ -148,7 +148,7 @@
</Group>
<Group DisplayName="SH Flow->Source2->H2Se Flow">
<Step ModuleName="" DeviceType="" InputType="FlowModeSelection" DisplayName="47. H2Se Flow Mode" UnitName="" ControlName="H2Se.SetValve" Description="">
<Step ModuleName="" DeviceType="" InputType="FlowModeSelection" DisplayName="47. H2Se Flow Mode" UnitName="" ControlName="H2SeFlow.SetValve" Description="">
<Item DisplayName="Purge" ControlName="Purge" />
<Item DisplayName="Vent" ControlName="Vent" />
<Item DisplayName="Run" ControlName="Run" />
@ -169,7 +169,7 @@
</Group>
<Group DisplayName="SH Flow->Source3->O2 Flow">
<Step ModuleName="" DeviceType="" InputType="FlowModeSelection" DisplayName="55. O2 Flow Mode" UnitName="" ControlName="O2.SetValve" Description="">
<Step ModuleName="" DeviceType="" InputType="FlowModeSelection" DisplayName="55. O2 Flow Mode" UnitName="" ControlName="O2Flow.SetValve" Description="">
<Item DisplayName="Purge" ControlName="Purge" />
<Item DisplayName="Vent" ControlName="Vent" />
<Item DisplayName="Run" ControlName="Run" />
@ -182,7 +182,7 @@
</Group>
<Group DisplayName="SH Flow->Source3->SO2 Flow">
<Step ModuleName="" DeviceType="" InputType="FlowModeSelection" DisplayName="61. SO2 Flow Mode" UnitName="" ControlName="SO2.SetValve" Description="">
<Step ModuleName="" DeviceType="" InputType="FlowModeSelection" DisplayName="61. SO2 Flow Mode" UnitName="" ControlName="SO2Flow.SetValve" Description="">
<Item DisplayName="Purge" ControlName="Purge" />
<Item DisplayName="Vent" ControlName="Vent" />
<Item DisplayName="Run" ControlName="Run" />

View File

@ -227,24 +227,20 @@ namespace SicModules.PMs.RecipeExecutions
//{
// dic.Remove("Mfc30.Ramp");
//}
dic.Remove("HCLSourSplitRatio");
dic.Remove("SHTotalFlow");
dic.Remove("SHTotalFlowSplitRatio");
//dic.Remove("SiSourTotalFlow");
dic.Remove("SiSourSplitRatio");
//dic.Remove("CSourTotalFlow");
dic.Remove("CSourSplitRatio");
//dic.Remove("DopeTotalFlow");
dic.Remove("N2ActualFlow");
dic.Remove("NH3_2ActualFlow");
dic.Remove("DopeSplitRatio");
dic.Remove("Source1TotalFlow");
dic.Remove("Source1SplitRatio");
dic.Remove("Source2TotalFlow");
dic.Remove("Source2SplitRatio");
dic.Remove("Source3TotalFlow");
dic.Remove("Source3SplitRatio");
dic.Remove("SHSuppTotalFlow");
dic.Remove("SHInnerFlow");
dic.Remove("SHMidFlow");
dic.Remove("SHOutterFlow");
//dic.Remove("GRPurgeHCI");
//dic.Remove("TotalVentFlow");
dic.Remove("TotalVentFlow");
if (dic.ContainsKey("Loop"))
dic.Remove("Loop");

View File

@ -103,7 +103,7 @@ namespace SicModules.PMs.Routines
TimeDelay11,
TimeDelay12,
TimeDelay13,
TimeDelay14,
TimeDelay14, SetM18to40, SetM18to40_1,
}
private PMModule _pm1Module;
@ -172,9 +172,6 @@ namespace SicModules.PMs.Routines
//关闭V72,打开V25
SetIoValueByGroup((int)RoutineStep.VentPumpClose, IoGroupName.VentPump, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupV25, IoGroupName.V25, true, _IoValueOpenCloseTimeout);
//打开V103,关闭V105
//SetIoValueByGroup((int)RoutineStep.SetV103, IoGroupName.V103, true, _IoValueOpenCloseTimeout);
//SetIoValueByGroup((int)RoutineStep.SetV105, IoGroupName.V105, false, _IoValueOpenCloseTimeout);
//打开V31,打开V32
SetIoValueByGroup((int)RoutineStep.SetV31, IoGroupName.V31, true, _IoValueOpenCloseTimeout);
@ -195,51 +192,32 @@ namespace SicModules.PMs.Routines
SetIoValueByGroup((int)RoutineStep.SetGroupD, IoGroupName.D, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupG, IoGroupName.G, true, _IoValueOpenCloseTimeout);
//设置MFC和PC的模式
//6、 M1-M17 设定为 default 值,所有 PC 设定为 default 值(PC1-PC9)
SetMfcModeToNormalByGroup((int)RoutineStep.SetMFCMode, MfcGroupName.All);
SetPcModeToNormal((int)RoutineStep.SetPCMode, _lstPcList);
//M1-M16设定为default值(M2、M9、M15除外)
SetMfcToDefaultByGroup((int)RoutineStep.SetM1toM17, MfcGroupName.M1toM17, 0);
//M2、M9、M15、M19-M40 MFC 3s ramp 到 default值
SetMfcToDefaultByGroup((int)RoutineStep.SetM2to40_1, MfcGroupName.M2toM42, 3);
//设置所有PC到默认值
SetPcModeToNormal((int)RoutineStep.SetPCMode, _lstPcList);
SetPcToDefault((int)RoutineStep.SetPC, _lstPcList);
//打开V68
SetIoValueByGroup((int)RoutineStep.OpenGasIn1, IoGroupName.GasIn1, true, _IoValueOpenCloseTimeout);
//7、 M18-M40除 M30\M34\M39 3s ramp 到 default 值。。
SetMfcToDefaultByGroup((int)RoutineStep.SetM18to40, MfcGroupName.M18toM40No303439, 3);
//打开J阀门
//9、 打开 A Valves打开 J valve。
SetIoValueByGroup((int)RoutineStep.OpenGasIn1, IoGroupName.A, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupJ, IoGroupName.J, true, _IoValueOpenCloseTimeout);
//打开V65
//SetIoValueByGroup((int)RoutineStep.SetV65, IoGroupName.V65, true, _IoValueOpenCloseTimeout);
//打开EPV2
//10、 打开 EPV2等待 3s, 打开 TV enable, 压力模式,伺服压力默认设定为 0mbar
SetIoValueByGroup((int)RoutineStep.SetEPV2, IoGroupName.EPV2, true, _IoValueOpenCloseTimeout);
TimeDelay((int)RoutineStep.TimeDelay5, 3);
//设置蝶阀Enable
SetThrottleEnableAndWait((int)RoutineStep.SetTVEnable, _IoThrottle, 5);
//设置蝶阀为压力模式
SetThrottleToPressModeAndWait((int)RoutineStep.SetTVPressMode, _IoThrottle, 5);
//伺服压力设定值到0mbar
SetThrottleToTargetAndNoWait((int)RoutineStep.SetTv1, _IoThrottle, _pumpBasePressure);
//M2、M9、M15、M19-M40 MFC 3s ramp到0
SetMfcByGroup((int)RoutineStep.SetM2to40, MfcGroupName.M2toM42, 0, 3);
SetMfcByGroup((int)RoutineStep.SetM18, MfcGroupName.M18, 0, 3);
//关闭V87 V97
//11、当蝶阀设定值 ramp 到 0 后,将 M18-M40除 M30\M34\M39 MFC 5s ramp 到0 关闭 V87、 V97。
SetMfcByGroup((int)RoutineStep.SetM18to40_1, MfcGroupName.M18toM40No303439, 0, 3);
SetIoValueByGroup((int)RoutineStep.SetV87V97, IoGroupName.V87V97, false, _IoValueOpenCloseTimeout);
//等待腔体压力Pump到设定值
//12、等待腔体压力到 Pump Base Pressure可配置 蝶阀改为位置模式,开度设定 100%
WaitChamberPressDownTo((int)RoutineStep.WaitTv1, _pumpBasePressure, _pumpTimeOut);
//蝶阀设置为位置模式,开度设置为最大
SetThrottleToPositionMode((int)RoutineStep.SetTVPositionMode, _IoThrottle, _throttleTimeout);
SetThrottleSetPosition((int)RoutineStep.SetTVPositionMax, _IoThrottle, 100, _throttleTimeout);

View File

@ -34,8 +34,8 @@ namespace SicModules.PMs.Routines
SetPC,
SetGroupI, //V87-96
SetM18,
SetM2to40,
SetM2to40_1,
SetM18to40_1,
SetM18to40,
MfcAll,
SetGasOut,
@ -173,9 +173,6 @@ namespace SicModules.PMs.Routines
//关闭V72,打开V25
SetIoValueByGroup((int)RoutineStep.VentPumpClose, IoGroupName.VentPump, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupV25, IoGroupName.V25, true, _IoValueOpenCloseTimeout);
////打开V103,关闭V105
//SetIoValueByGroup((int)RoutineStep.SetV103, IoGroupName.V103, true, _IoValueOpenCloseTimeout);
//SetIoValueByGroup((int)RoutineStep.SetV105, IoGroupName.V105, false, _IoValueOpenCloseTimeout);
//打开V31,打开V32
SetIoValueByGroup((int)RoutineStep.SetV31, IoGroupName.V31, true, _IoValueOpenCloseTimeout);
@ -196,51 +193,32 @@ namespace SicModules.PMs.Routines
SetIoValueByGroup((int)RoutineStep.SetGroupD, IoGroupName.D, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupG, IoGroupName.G, true, _IoValueOpenCloseTimeout);
//设置MFC和PC的模式
//6、 M1-M17 设定为 default 值,所有 PC 设定为 default 值(PC1-PC9)
SetMfcModeToNormalByGroup((int)RoutineStep.SetMFCMode, MfcGroupName.All);
SetPcModeToNormal((int)RoutineStep.SetPCMode, _lstPcList);
//M1-M16设定为default值(M2、M9、M15除外)
SetMfcToDefaultByGroup((int)RoutineStep.SetM1toM17, MfcGroupName.M1toM17, 0);
//M2、M9、M15、M19-M40 MFC 3s ramp 到 default值
SetMfcToDefaultByGroup((int)RoutineStep.SetM2to40_1, MfcGroupName.M2toM42, 3);
//设置所有PC到默认值
SetPcModeToNormal((int)RoutineStep.SetPCMode, _lstPcList);
SetPcToDefault((int)RoutineStep.SetPC, _lstPcList);
//打开V68
SetIoValueByGroup((int)RoutineStep.OpenGasIn1, IoGroupName.GasIn1, true, _IoValueOpenCloseTimeout);
//7、 M18-M40除 M30\M34\M39 3s ramp 到 default 值。。
SetMfcToDefaultByGroup((int)RoutineStep.SetM18to40, MfcGroupName.M18toM40No303439, 3);
//打开J阀门
//9、 打开 A Valves打开 J valve。
SetIoValueByGroup((int)RoutineStep.OpenGasIn1, IoGroupName.A, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupJ, IoGroupName.J, true, _IoValueOpenCloseTimeout);
//打开V65
//SetIoValueByGroup((int)RoutineStep.SetV65, IoGroupName.V65, true, _IoValueOpenCloseTimeout);
//打开EPV2
//10、 打开 EPV2等待 3s, 打开 TV enable, 压力模式,伺服压力默认设定为 0mbar
SetIoValueByGroup((int)RoutineStep.SetEPV2, IoGroupName.EPV2, true, _IoValueOpenCloseTimeout);
TimeDelay((int)RoutineStep.TimeDelay5, 3);
//设置蝶阀Enable
SetThrottleEnableAndWait((int)RoutineStep.SetTVEnable, _IoThrottle, 5);
//设置蝶阀为压力模式
SetThrottleToPressModeAndWait((int)RoutineStep.SetTVPressMode, _IoThrottle, 5);
//伺服压力设定值到0mbar
SetThrottleToTargetAndNoWait((int)RoutineStep.SetTv1, _IoThrottle, _vacPumpBasePressure);
//M2、M9、M15、M19-M40 MFC 3s ramp到0
SetMfcByGroup((int)RoutineStep.SetM2to40, MfcGroupName.M2toM42, 0, 3);
SetMfcByGroup((int)RoutineStep.SetM18, MfcGroupName.M18, 0, 3);
//关闭V87 V97
//11、当蝶阀设定值 ramp 到 0 后,将 M18-M40除 M30\M34\M39 MFC 5s ramp 到0 关闭 V87、 V97。
SetMfcByGroup((int)RoutineStep.SetM18to40_1, MfcGroupName.M18toM40No303439, 0, 3);
SetIoValueByGroup((int)RoutineStep.SetV87V97, IoGroupName.V87V97, false, _IoValueOpenCloseTimeout);
//等待腔体压力Pump到设定值
//12、等待腔体压力到 Pump Base Pressure可配置 蝶阀改为位置模式,开度设定 100%
WaitChamberPressDownTo((int)RoutineStep.WaitTv1, _vacPumpBasePressure, _pumpTimeOut);
//蝶阀设置为位置模式,开度设置为最大
SetThrottleToPositionMode((int)RoutineStep.SetTVPositionMode, _IoThrottle, _throttleTimeout);
SetThrottleSetPosition((int)RoutineStep.SetTVPositionMax, _IoThrottle, 100, _throttleTimeout);

View File

@ -51,7 +51,7 @@ using System.Windows;
// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
// 方法是按如下所示使用“*”: :
[assembly: AssemblyVersion("1.1.0.60819")]
[assembly: AssemblyVersion("1.1.0.60822")]
[assembly: AssemblyInformationalVersion("MoS2无EFEM")]

View File

@ -511,18 +511,18 @@ namespace SicSimulator.Instances
}
}
}
//else
//{
// //判断是否有进气(V89到V97是否有开阀)
// if (IO.DI[$"{pm}.DO_FinalInnerGas(V89)"].Value || IO.DI[$"{pm}.DI_MiddleGasFinalFB(V90)"].Value || IO.DI[$"{pm}.DI_OpticPurgeFinalFB(V91)"].Value || IO.DI[$"{pm}.DI_GasRingPurgeFinalFB(V92)"].Value
// || IO.DI[$"{pm}.DI_ChamberPurgeFinalFB(V93)"].Value || IO.DI[$"{pm}.DI_RotationUpPurgeFinalFB(V94)"].Value || IO.DI[$"{pm}.DI_ConfinementRingFinalFB(V95)"].Value || IO.DI[$"{pm}.DI_HeaterWFFinalFB(V96)"].Value)
// {
// if (IO.AI[$"{pm}.AI_ActualPressure"].Value < 1200)
// {
// IO.AI[$"{pm}.AI_ActualPressure"].Value += 10;
// }
// }
//}
else
{
//判断是否有进气(V89到V97是否有开阀)
if (IO.DI[$"{pm}.DI_FinalInnerGasFB(V89)"].Value || IO.DI[$"{pm}.DI_FinalMiddleGasFB(V90)"].Value || IO.DI[$"{pm}.DI_FinalOpticPurgeFB(V91)"].Value || IO.DI[$"{pm}.DI_FinalGasRingFB(V92)"].Value
|| IO.DI[$"{pm}.DI_FinalChamberPurgeFB(V93)"].Value || IO.DI[$"{pm}.DI_FinalRotationPurgeFB(V94)"].Value || IO.DI[$"{pm}.DI_FinalShutterPurgeFB(V95)"].Value || IO.DI[$"{pm}.DI_FinalHeaterWFPurgeFB(V96)"].Value)
{
if (IO.AI[$"{pm}.AI_ActualPressure"].Value < 1200)
{
IO.AI[$"{pm}.AI_ActualPressure"].Value += 10;
}
}
}
//蝶阀Ramp有Bug,设置AO值可以化解
if (IO.AI[$"{pm}.AI_ActualPressure"].Value >= 1100)

View File

@ -1516,6 +1516,10 @@ namespace SicUI.Models.PMs
}
if (strPMOP.Contains("MOExchange"))
{
if (!ShowChoosenDialog("1.Make sure the CS2 has turned off \r\n2.Make sure the confinement in up position!\r\n3.Press OK to continue! "))
{
return;
}
var vm = new ExchangeMoSelectDialogViewModel();
var _windowmanager = new WindowManager();
_windowmanager.ShowDialog(vm);

View File

@ -55,6 +55,6 @@ using System.Windows;
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.1.0.60819")]
[assembly: AssemblyVersion("1.1.0.60822")]
[assembly: AssemblyInformationalVersion("MoS2无EFEM")]

View File

@ -3,6 +3,7 @@ using MECF.Framework.UI.Client.RecipeEditorLib.RecipeModel.Params;
using System;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.MECF.Framework.Common.Utilities;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
namespace MECF.Framework.UI.Client.RecipeEditorLib.RecipeModel
{
@ -15,258 +16,6 @@ namespace MECF.Framework.UI.Client.RecipeEditorLib.RecipeModel
public class RecipeGasFlowCalculatorBase : IRecipeGasFlowCalculator
{
#region Properties
/// <summary>
/// Mfc11.Ramp, 流量控制
/// </summary>
public virtual string NameTcsBubbleLowFlow => "Mfc11.Ramp";
/// <summary>
/// Mfc10.Ramp, 流量控制
/// </summary>
public virtual string NameTcsBubbleHighFlow => "Mfc10.Ramp";
/// <summary>
/// Mfc12.Ramp, 流量控制
/// </summary>
public virtual string NameTcsPushFlow => "Mfc12.Ramp";
/// <summary>
/// TCS.SetValve, 控制阀门模式
/// </summary>
public virtual string NameTcsFlowMode => "TCS.SetValve";
/// <summary>
/// Mfc7.Ramp, 流量控制
/// </summary>
public virtual string NameTmaBubbleFlow => "Mfc7.Ramp";
/// <summary>
/// Mfc8.Ramp, 流量控制
/// </summary>
public virtual string NameTmaPushFlow => "Mfc8.Ramp";
/// <summary>
/// TMA.SetValve, 控制阀门模式
/// </summary>
public virtual string NameTmaFlowMode => "TMA.SetValve";
/// <summary>
/// SiSourSplitRatio, 源分流比
/// </summary>
public virtual string NameSiSourceSplitRatio => "SiSourSplitRatio";
/// <summary>
/// SiSourTotalFlow, 源总流量
/// </summary>
public virtual string NameSiSourceTotalFlow => "SiSourTotalFlow";
/// <summary>
/// Mfc23.Ramp, 流量控制
/// </summary>
public virtual string NameSiSourceInnerFlow => "Mfc23.Ramp";
/// <summary>
/// Mfc22.Ramp, 流量控制
/// </summary>
public virtual string NameSiSourceMiddleFlow => "Mfc22.Ramp";
/// <summary>
/// Mfc9.Ramp, 流量控制
/// </summary>
public virtual string NameSiSourceOuterFlow => "Mfc9.Ramp";
/// <summary>
/// Mfc16.Ramp, 流量控制
/// </summary>
public virtual string NameCxHxFlow => "Mfc16.Ramp";
/// <summary>
/// C2H4.SetValve, 控制阀门模式
/// </summary>
public virtual string NameCxHxFlowMode => "C2H4.SetValve";
/// <summary>
/// CSourSplitRatio, 源分流比
/// </summary>
public virtual string NameCSourceSplitRatio => "CSourSplitRatio";
/// <summary>
/// CSourTotalFlow, 源总流量
/// </summary>
public virtual string NameCSourceTotalFlow => "CSourTotalFlow";
/// <summary>
/// Mfc15.Ramp, 流量控制
/// </summary>
public virtual string NameCSourcePushFlow => "Mfc15.Ramp";
/// <summary>
/// Mfc26.Ramp, 流量控制
/// </summary>
public virtual string NameCSourceInnerFlow => "Mfc26.Ramp";
/// <summary>
/// Mfc25.Ramp, 流量控制
/// </summary>
public virtual string NameCSourceMiddleFlow => "Mfc25.Ramp";
/// <summary>
/// Mfc15.Ramp, 流量控制
/// </summary>
public virtual string NameCSourceOuterFlow => "Mfc15.Ramp";
/// <summary>
/// DopeTotalFlow, 涂料总流量
/// </summary>
public virtual string NameDopeTotalFlow => "DopeTotalFlow";
/// <summary>
/// DopeSplitRatio, 涂料分流比
/// </summary>
public virtual string NameDopeSplitRatio => "DopeSplitRatio";
/// <summary>
/// Mfc20.Ramp, 流量控制
/// </summary>
public virtual string NameDopeInnerFlow => "Mfc20.Ramp";
/// <summary>
/// Mfc19.Ramp, 流量控制
/// </summary>
public virtual string NameDopeMiddleFlow => "Mfc19.Ramp";
/// <summary>
/// Mfc2.Ramp, 流量控制
/// </summary>
public virtual string NameDopeOuterFlow => "Mfc2.Ramp";
/// <summary>
/// N2ActualFlow, 氮气实际流量
/// </summary>
public virtual string NameN2ActualFlow => "N2ActualFlow";
/// <summary>
/// Mfc4.Ramp, 流量控制
/// </summary>
public virtual string NameN2LowFlow => "Mfc4.Ramp";
/// <summary>
/// Mfc3.Ramp, 稀释流量控制
/// </summary>
public virtual string NameDilutionFlowForN2 => "Mfc3.Ramp";
/// <summary>
/// Mfc6.Ramp, 稀释后的氮气流量控制
/// </summary>
public virtual string NameDilutedN2Flow => "Mfc6.Ramp";
/// <summary>
/// SHTotalFlow, 总流量
/// </summary>
public virtual string NameShTotalFlow => "SHTotalFlow";
/// <summary>
/// SHTotalFlowSplitRatio, 总流量分流比
/// </summary>
public virtual string NameShTotalFlowSplitRatio => "SHTotalFlowSplitRatio";
/// <summary>
/// SHSuppTotalFlow, 支持流量
/// </summary>
public virtual string NameShPushTotalFlow => "SHSuppTotalFlow";
/// <summary>
/// SHInnerFlow, 内部流量
/// </summary>
public virtual string NameShInnerFlow => "SHInnerFlow";
/// <summary>
/// SHMidFlow, 中间流量
/// </summary>
public virtual string NameShMiddleFlow => "SHMidFlow";
/// <summary>
/// SHOutterFlow, 外部流量
/// </summary>
public virtual string NameShOuterFlow => "SHOutterFlow";
/// <summary>
/// Mfc29.Ramp, 内部推送流量控制
/// </summary>
public virtual string NameInnerPushFlow => "Mfc29.Ramp";
/// <summary>
/// Mfc30.Ramp, 流量控制
/// </summary>
public virtual string Mfc30Flow => "Mfc30.Ramp";
public virtual string V47Value => "V47Value.SetValve";
/// <summary>
/// Mfc31.Ramp, 中间推送流量控制
/// </summary>
public virtual string NameMiddlePushFlow => "Mfc31.Ramp";
/// <summary>
/// Mfc28.Ramp, 外部推送流量控制
/// </summary>
public virtual string NameOuterPushFlow => "Mfc28.Ramp";
/// <summary>
/// Mfc40.Ramp, 输送气体流量控制
/// </summary>
public virtual string NameCarryGasFlow => "Mfc40.Ramp";
/// <summary>
/// Mfc14.Ramp, SiH4流量控制
/// </summary>
public virtual string NameSiH4Flow => "Mfc14.Ramp";
/// <summary>
/// SiH4.SetValve, 控制SiH4阀门模式
/// </summary>
public virtual string NameSiH4FlowMode => "SiH4.SetValve";
/// <summary>
/// Mfc1.Ramp, 排气推送流量控制
/// </summary>
public virtual string NameVentPushFlow => "Mfc1.Ramp";
/// <summary>
/// TotalVentFlow, 总排气流量
/// </summary>
public virtual string NameTotalVentFlow => "TotalVentFlow";
/// <summary>
/// Mfc13.Ramp, HCl流量控制
/// </summary>
public virtual string NameHclFlow => "Mfc13.Ramp";
/// <summary>
/// HCl.SetValve, 控制HCl阀门模式
/// </summary>
public virtual string NameHclFlowMode => "HCl.SetValve";
/// <summary>
/// Mfc5.Ramp, 高流量氮气控制
/// </summary>
public virtual string NameN2HighFlow => "Mfc5.Ramp";
/// <summary>
/// N2Dilution.SetValve, 控制氮气稀释阀门模式
/// </summary>
public virtual string NameN2FlowMode => "N2Dilution.SetValve";
/// <summary>
/// N2HighDoping.SetValve, 控制高流量氮气掺杂阀门模式
/// </summary>
public virtual string NameN2HighFlowMode => "N2HighDoping.SetValve";
#endregion
/// <summary>
/// 计算指定工艺步骤的气体流量。
/// </summary>
@ -283,294 +32,226 @@ namespace MECF.Framework.UI.Client.RecipeEditorLib.RecipeModel
/// </param>
public void Calculate(RecipeStep step, string chamberName)
{
CalSiSourceFlow(step);
CalCSourceFlow(step);
CalDopeFlow(step);
CalSourceFlow(step, NameSource1Flow, NameSource1SplitRatio, NameSource1InnerFlow, NameSource1MiddleFlow, NameSource1OuterFlow);
CalSourceFlow(step, NameSource2Flow, NameSource2SplitRatio, NameSource2InnerFlow, NameSource2MiddleFlow, NameSource2OuterFlow);
CalSourceFlow(step, NameSource3Flow, NameSource3SplitRatio, NameSource3InnerFlow, NameSource3MiddleFlow, NameSource3OuterFlow);
CalShSupplementFlow(step);
CalVentFlow(step, chamberName);
CheckM3M4M6(step);
}
#region Gas Flow Calculation
protected virtual void CheckM3M4M6(RecipeStep step)
{
var mfc3 = ((DoubleParam)step.FindParamByControlName(NameDilutionFlowForN2)).Value;
var mfc4 = ((DoubleParam)step.FindParamByControlName(NameN2LowFlow)).Value;
var mfc6 = ((DoubleParam)step.FindParamByControlName(NameDilutedN2Flow)).Value;
if (mfc3 + mfc4 > mfc6)
public virtual string NameShTotalFlowSplitRatio => "SHTotalFlowSplitRatio";
public virtual string NameShPushTotalFlow => "SHSuppTotalFlow";
public virtual string NameShInnerFlow => "SHInnerFlow";
public virtual string NameShMiddleFlow => "SHMiddleFlow";
public virtual string NameShOuterFlow => "SHOutterFlow";
public virtual string NameSHTotalFlow => "SHTotalFlow";
public virtual string NameCarryGasFlow => "Mfc40.Ramp";
public virtual string NameO2ActualFlow => "O2ActualFlow";
public virtual string NameO2Flow => "Mfc4.Ramp";
public virtual string NameDilutedO2Flow => "Mfc6.Ramp";
public virtual string NameDilutFlow => "Mfc3.Ramp";
protected virtual void CalO2Flow(RecipeStep currentStep)
{
step.FindParamByControlName(NameDilutionFlowForN2).ResetCalculatorError();
step.FindParamByControlName(NameN2LowFlow).ResetCalculatorError();
step.FindParamByControlName(NameDilutedN2Flow).ResetCalculatorError();
}
else
{
step.FindParamByControlName(NameDilutionFlowForN2).SetCalculatorError();
step.FindParamByControlName(NameN2LowFlow).SetCalculatorError();
step.FindParamByControlName(NameDilutedN2Flow).SetCalculatorError();
}
var p56 = ((DoubleParam)currentStep.FindParamByControlName(NameO2ActualFlow)).Value;
var p57 = ((DoubleParam)currentStep.FindParamByControlName(NameO2Flow)).Value;
var p58 = ((DoubleParam)currentStep.FindParamByControlName(NameDilutFlow)).Value;
var p59 = (p57 + p58) * p56 / p57;
((DoubleParam)currentStep.FindParamByControlName(NameDilutedO2Flow)).Value = Math.Round(p59, 1);
}
protected virtual double GetTcsFlow(RecipeStep step, string chamberName)
{
var currentTcsBubbleLowFlow = ((DoubleParam)step.FindParamByControlName(NameTcsBubbleLowFlow)).Value;
var currentTcsBubbleHighFlow = ((DoubleParam)step.FindParamByControlName(NameTcsBubbleHighFlow)).Value;
var currentTcsPushFlow = ((DoubleParam)step.FindParamByControlName(NameTcsPushFlow)).Value;
var currentTcsFlowMode = ((ComboxParam)step.FindParamByControlName(NameTcsFlowMode)).Value;
public virtual string NameSource1Flow => "Source1TotalFlow";
var tcsFlow = 0d;
public virtual string NameSource2Flow => "Source2TotalFlow";
var tcsEff =
(double)QueryDataClient.Instance.Service.GetConfig($"PM.{chamberName}.Efficiency.TCS-Eff");
if (currentTcsFlowMode.Equals(FlowModeParam.FlowModeEnum.Run)
|| currentTcsFlowMode.Equals(FlowModeParam.FlowModeEnum.Vent))
public virtual string NameSource3Flow => "Source3TotalFlow";
public virtual string NameSource1SplitRatio => "Source1SplitRatio";
public virtual string NameSource2SplitRatio => "Source2SplitRatio";
public virtual string NameSource3SplitRatio => "Source3SplitRatio";
public virtual string NameSource1InnerFlow => "Mfc20.Ramp";
public virtual string NameSource1MiddleFlow => "Mfc19.Ramp";
public virtual string NameSource1OuterFlow => "Mfc18.Ramp";
public virtual string NameSource2InnerFlow => "Mfc23.Ramp";
public virtual string NameSource2MiddleFlow => "Mfc22.Ramp";
public virtual string NameSource2OuterFlow => "Mfc21.Ramp";
public virtual string NameSource3InnerFlow => "Mfc25.Ramp";
public virtual string NameSource3MiddleFlow => "Mfc24.Ramp";
public virtual string NameSource3OuterFlow => "Mfc23.Ramp";
protected virtual void CalSourceFlow(RecipeStep currentStep,string nametotal,string nameratio,string nameinnflow, string namemidflow, string nameoutflow)
{
tcsFlow = (currentTcsBubbleHighFlow + currentTcsBubbleLowFlow) * tcsEff + currentTcsPushFlow;
}
else if (currentTcsFlowMode.Equals(FlowModeParam.FlowModeEnum.Purge))
var totalFlow = ((DoubleParam)currentStep.FindParamByControlName(nametotal)).Value;
var currentRatio = new double[3]; //63
if (currentStep.FindParamByControlName(nameratio) is Sets3RatioParam dopRatio)
currentRatio = dopRatio.Ratio;
double currentInnerFlow = 0;
double currentMidFlow = 0;
double currentOuterFlow = 0;
if (currentRatio.Length == 3)
{
tcsFlow = currentTcsBubbleHighFlow + currentTcsBubbleLowFlow + currentTcsPushFlow;
var ratioSum = currentRatio[0] + currentRatio[1] + currentRatio[2];
currentInnerFlow = currentRatio[0]/ ratioSum * totalFlow;
currentMidFlow = currentRatio[1] / ratioSum * totalFlow;
currentOuterFlow = currentRatio[2] / ratioSum * totalFlow;
}
return tcsFlow;
((DoubleParam)currentStep.FindParamByControlName(nameinnflow)).Value = Math.Round(currentInnerFlow, 1);
((DoubleParam)currentStep.FindParamByControlName(namemidflow)).Value = Math.Round(currentMidFlow, 1);
((DoubleParam)currentStep.FindParamByControlName(nameoutflow)).Value = Math.Round(currentOuterFlow, 1);
}
protected virtual double GetTmaFlow(RecipeStep step, string chamberName)
{
var currentTmaBubbleFlow = ((DoubleParam)step.FindParamByControlName(NameTmaBubbleFlow)).Value;
var currentTmaPushFlow = ((DoubleParam)step.FindParamByControlName(NameTmaPushFlow)).Value;
var currentTmaFlowMode = ((ComboxParam)step.FindParamByControlName(NameTmaFlowMode)).Value;
var tmaFlow = 0d;
var tmaEff =
(double)QueryDataClient.Instance.Service.GetConfig($"PM.{chamberName}.Efficiency.TMA-Eff");
if (currentTmaFlowMode.Equals(FlowModeParam.FlowModeEnum.Run)
|| currentTmaFlowMode.Equals(FlowModeParam.FlowModeEnum.Vent))
tmaFlow = currentTmaBubbleFlow * tmaEff + currentTmaPushFlow;
else if (currentTmaFlowMode.Equals(FlowModeParam.FlowModeEnum.Purge))
tmaFlow = currentTmaBubbleFlow + currentTmaPushFlow;
return tmaFlow;
}
protected virtual void CalSiSourceFlow(RecipeStep step)
{
var currentSiSourSplitRatio = new double[3];
if (step.FindParamByControlName(NameSiSourceSplitRatio) is Sets3RatioParam siSourceRatio)
currentSiSourSplitRatio = siSourceRatio.Ratio;
var currentSiSourTotalFlow = ((DoubleParam)step.FindParamByControlName(NameSiSourceTotalFlow)).Value;
//double currentSiSourPushFlow = currentSiSourTotalFlow - (currentSiH4FlowMode == FlowMode.Run.ToString() ? currentSiH4Flow : 0)
// - (currentTCSFlowMode == FlowMode.Run.ToString() ? TCSFlow : 0) - (currentHClFlowMode == FlowMode.Run.ToString() ? currentHClFlow : 0);
//(currentStep[(int)RecipColNo.SiSourceOuterFlow] as DoubleParam).Value = currentSiSourPushFlow.ToString("F1");
double currentSiSourInnerFlow = 0;
double currentSiSourMidFlow = 0;
double currentSiSourOutFlow = 0;
if (currentSiSourSplitRatio.Length == 3)
{
var rationSum = currentSiSourSplitRatio[0] + currentSiSourSplitRatio[1] + currentSiSourSplitRatio[2];
currentSiSourInnerFlow = currentSiSourTotalFlow / rationSum * currentSiSourSplitRatio[0];
currentSiSourMidFlow = currentSiSourTotalFlow / rationSum * currentSiSourSplitRatio[1];
currentSiSourOutFlow = currentSiSourTotalFlow / rationSum * currentSiSourSplitRatio[2];
}
((DoubleParam)step.FindParamByControlName(NameSiSourceInnerFlow)).Value = Math.Round(currentSiSourInnerFlow, 1);
((DoubleParam)step.FindParamByControlName(NameSiSourceMiddleFlow)).Value = Math.Round(currentSiSourMidFlow, 1);
((DoubleParam)step.FindParamByControlName(NameSiSourceOuterFlow)).Value = Math.Round(currentSiSourOutFlow, 1);
}
protected virtual void CalCSourceFlow(RecipeStep currentStep)
{
var currentC2H4Flow = ((DoubleParam)currentStep.FindParamByControlName(NameCxHxFlow)).Value;
var currentCSourSplitRatio = new double[3];
if (currentStep.FindParamByControlName(NameCSourceSplitRatio) is Sets3RatioParam cSourceRatio)
currentCSourSplitRatio = cSourceRatio.Ratio;
var currentCSourTotalFlow = ((DoubleParam)currentStep.FindParamByControlName(NameCSourceTotalFlow)).Value;
var currentC2H4FlowMode = (currentStep.FindParamByControlName(NameCxHxFlowMode) as ComboxParam)?.Value;
var currentCSourPushFlow =
currentCSourTotalFlow - (currentC2H4FlowMode != null &&
currentC2H4FlowMode.Equals(FlowModeParam.FlowModeEnum.Run)
? currentC2H4Flow
: 0d);
((DoubleParam)currentStep.FindParamByControlName(NameCSourcePushFlow)).Value = currentCSourPushFlow.Round(1);
double currentCSourInnerFlow = 0;
double currentCSourMidFlow = 0;
double currentCSourOuterFlow = 0;
if (currentCSourSplitRatio.Length == 3)
{
var ratioSum = currentCSourSplitRatio[0] + currentCSourSplitRatio[1] + currentCSourSplitRatio[2];
currentCSourInnerFlow = currentCSourTotalFlow / ratioSum * currentCSourSplitRatio[0];
currentCSourMidFlow = currentCSourTotalFlow / ratioSum * currentCSourSplitRatio[1];
currentCSourOuterFlow = currentCSourTotalFlow / ratioSum * currentCSourSplitRatio[2];
}
((DoubleParam)currentStep.FindParamByControlName(NameCSourceInnerFlow)).Value = currentCSourInnerFlow.Round(1);
((DoubleParam)currentStep.FindParamByControlName(NameCSourceMiddleFlow)).Value = currentCSourMidFlow.Round(1);
((DoubleParam)currentStep.FindParamByControlName(NameCSourceOuterFlow)).Value = currentCSourOuterFlow.Round(1);
}
protected virtual void CalDopeFlow(RecipeStep currentStep)
{
var currentDopeTotalFlow = ((DoubleParam)currentStep.FindParamByControlName(NameDopeTotalFlow)).Value;
var currentN2ActualFlow = ((DoubleParam)currentStep.FindParamByControlName(NameN2ActualFlow)).Value;
var currentN2LowFlow = ((DoubleParam)currentStep.FindParamByControlName(NameN2LowFlow)).Value;
var currentDiluFlowForN2 = ((DoubleParam)currentStep.FindParamByControlName(NameDilutionFlowForN2)).Value;
var currentDilutedN2Flow =
(currentN2LowFlow + currentDiluFlowForN2) * currentN2ActualFlow / currentN2LowFlow;
((DoubleParam)currentStep.FindParamByControlName(NameDilutedN2Flow)).Value = Math.Round(currentDilutedN2Flow, 1);
var currentDopeSplitRatio = new double[3];
if (currentStep.FindParamByControlName(NameDopeSplitRatio) is Sets3RatioParam dopRatio)
currentDopeSplitRatio = dopRatio.Ratio;
//double currentDopePushFlow = currentDopeTotalFlow
// - (currentN2FlowMode == FlowMode.Run.ToString() ? currentDilutedN2Flow : 0)
// - (currentN2HighFlowMode == FlowMode.Run.ToString() ? currentN2HighFlow : 0)
// - (currentTMAFlowMode == FlowMode.Run.ToString() ? TMAFlow : 0);
//(currentStep[(int)RecipColNo.DopeOuterFlow] as DoubleParam).Value = currentDopePushFlow.ToString("F1");
double currentDopeInnerFlow = 0;
double currentDopeMidFlow = 0;
double currentDopeOuterFlow = 0;
if (currentDopeSplitRatio.Length == 3)
{
var ratioSum = currentDopeSplitRatio[0] + currentDopeSplitRatio[1] + currentDopeSplitRatio[2];
currentDopeInnerFlow = currentDopeTotalFlow / ratioSum * currentDopeSplitRatio[0];
currentDopeMidFlow = currentDopeTotalFlow / ratioSum * currentDopeSplitRatio[1];
currentDopeOuterFlow = currentDopeTotalFlow / ratioSum * currentDopeSplitRatio[2];
}
((DoubleParam)currentStep.FindParamByControlName(NameDopeInnerFlow)).Value = Math.Round(currentDopeInnerFlow, 1);
((DoubleParam)currentStep.FindParamByControlName(NameDopeMiddleFlow)).Value = Math.Round(currentDopeMidFlow, 1);
((DoubleParam)currentStep.FindParamByControlName(NameDopeOuterFlow)).Value = Math.Round(currentDopeOuterFlow, 1);
}
public virtual string NameInnerPushFlow => "Mfc29.Ramp";
public virtual string NameMiddlePushFlow => "Mfc31.Ramp";
public virtual string NameOuterPushFlow => "Mfc28.Ramp";
protected virtual void CalShSupplementFlow(RecipeStep currentStep)
{
var currentSiSourTotalFlow = ((DoubleParam)currentStep.FindParamByControlName(NameSiSourceTotalFlow)).Value;
var currentCSourTotalFlow = ((DoubleParam)currentStep.FindParamByControlName(NameCSourceTotalFlow)).Value;
var currentDopeTotalFlow = ((DoubleParam)currentStep.FindParamByControlName(NameDopeTotalFlow)).Value;
var currentShTotalFlow = ((DoubleParam)currentStep.FindParamByControlName(NameShTotalFlow)).Value;
var currentSurroundingFlow = ((DoubleParam)currentStep.FindParamByControlName(NameCarryGasFlow)).Value;
var currentSiSourInnerFlow = ((DoubleParam)currentStep.FindParamByControlName(NameSiSourceInnerFlow)).Value;
var currentSiSourMidFlow = ((DoubleParam)currentStep.FindParamByControlName(NameSiSourceMiddleFlow)).Value;
var currentCSourInnerFlow = ((DoubleParam)currentStep.FindParamByControlName(NameCSourceInnerFlow)).Value;
var currentCSourMidFlow = ((DoubleParam)currentStep.FindParamByControlName(NameCSourceMiddleFlow)).Value;
var currentDopeInnerFlow = ((DoubleParam)currentStep.FindParamByControlName(NameDopeInnerFlow)).Value;
var currentDopeMidFlow = ((DoubleParam)currentStep.FindParamByControlName(NameDopeMiddleFlow)).Value;
var p2 = ((DoubleParam)currentStep.FindParamByControlName(NameSHTotalFlow)).Value;
var p3 = ((DoubleParam)currentStep.FindParamByControlName(NameCarryGasFlow)).Value;
var p22 = ((DoubleParam)currentStep.FindParamByControlName(NameSource1Flow)).Value;
var p40 = ((DoubleParam)currentStep.FindParamByControlName(NameSource2Flow)).Value;
var p54 = ((DoubleParam)currentStep.FindParamByControlName(NameSource3Flow)).Value;
var p68 = p2 - p3 - p22 - p40 - p54;
((DoubleParam)currentStep.FindParamByControlName(NameShPushTotalFlow)).Value = Math.Round(p68, 1);
//-------------------------------------------------------------------------------------------------------------------------------
var totalFlow = p2 - p3;
var currentShTotalFlowSplitRatio = new double[3];
if (currentStep.FindParamByControlName(NameShTotalFlowSplitRatio) is Sets3RatioParam shTotalRatio)
currentShTotalFlowSplitRatio = shTotalRatio.Ratio;
var currentShSuppTotalFlow = currentShTotalFlow - currentSurroundingFlow - currentSiSourTotalFlow -
currentCSourTotalFlow - currentDopeTotalFlow;
var sumShTotalFlowSplitRatio = currentShTotalFlowSplitRatio[0] + currentShTotalFlowSplitRatio[1] +
currentShTotalFlowSplitRatio[2];
var currentShInnerFlow = (currentShTotalFlow - currentSurroundingFlow) / sumShTotalFlowSplitRatio *
currentShTotalFlowSplitRatio[0];
var currentShMidFlow = (currentShTotalFlow - currentSurroundingFlow) / sumShTotalFlowSplitRatio *
currentShTotalFlowSplitRatio[1];
var currentShOutterFlow = (currentShTotalFlow - currentSurroundingFlow) / sumShTotalFlowSplitRatio *
currentShTotalFlowSplitRatio[2];
var currentInnerSuppFlow = currentShInnerFlow - currentSiSourInnerFlow - currentCSourInnerFlow -
currentDopeInnerFlow;
var currentMidSuppFlow = currentShMidFlow - currentSiSourMidFlow - currentCSourMidFlow - currentDopeMidFlow;
var currentOutterSuppFlow = currentShSuppTotalFlow - currentInnerSuppFlow - currentMidSuppFlow;
var currentShInnerFlow = currentShTotalFlowSplitRatio[0] / sumShTotalFlowSplitRatio * totalFlow;
var currentShMidFlow = currentShTotalFlowSplitRatio[1] / sumShTotalFlowSplitRatio * totalFlow;
var currentShOutterFlow = currentShTotalFlowSplitRatio[2] / sumShTotalFlowSplitRatio * totalFlow;
((DoubleParam)currentStep.FindParamByControlName(NameShPushTotalFlow)).Value = Math.Round(currentShSuppTotalFlow, 1);
((DoubleParam)currentStep.FindParamByControlName(NameShInnerFlow)).Value = Math.Round(currentShInnerFlow, 1);
((DoubleParam)currentStep.FindParamByControlName(NameShMiddleFlow)).Value = Math.Round(currentShMidFlow, 1);
((DoubleParam)currentStep.FindParamByControlName(NameShOuterFlow)).Value = Math.Round(currentShOutterFlow, 1);
//-------------------------------------------------------------------------------------------------------------------------------
var p37 = ((DoubleParam)currentStep.FindParamByControlName(NameSource1InnerFlow)).Value;
var p51 = ((DoubleParam)currentStep.FindParamByControlName(NameSource2InnerFlow)).Value;
var p65 = ((DoubleParam)currentStep.FindParamByControlName(NameSource3InnerFlow)).Value;
var p38 = ((DoubleParam)currentStep.FindParamByControlName(NameSource1MiddleFlow)).Value;
var p52 = ((DoubleParam)currentStep.FindParamByControlName(NameSource2MiddleFlow)).Value;
var p66 = ((DoubleParam)currentStep.FindParamByControlName(NameSource3MiddleFlow)).Value;
var currentInnerSuppFlow = currentShInnerFlow - p37 - p51 -p65;
var currentMidSuppFlow = currentShMidFlow - p38 - p52 - p66;
var currentOutterSuppFlow = p68 - currentInnerSuppFlow - currentMidSuppFlow;
((DoubleParam)currentStep.FindParamByControlName(NameInnerPushFlow)).Value = Math.Round(currentInnerSuppFlow, 1);
((DoubleParam)currentStep.FindParamByControlName(NameMiddlePushFlow)).Value = Math.Round(currentMidSuppFlow, 1);
((DoubleParam)currentStep.FindParamByControlName(NameOuterPushFlow)).Value = Math.Round(currentOutterSuppFlow, 1);
}
public const string NameMoCO6FlowMode = "MoCO6Flow";
public const string NameMoFlowMode = "MoFlow";
public const string NameWCO6FlowMode = "WCO6Flow";
public const string NameCS2FlowMode = "CS2Flow";
public const string NameH2SFlowMode = "H2SFlow";
public const string NameH2SEFlowMode = "H2SEFlow";
public const string NameO2FlowMode = "O2Flow";
public const string NameSO2FlowMode = "SO2Flow";
public const string NameMoCO6CarrierFlow = "Mfc9.Ramp";
public const string NameMoCO6PushFlow = "Mfc10.Ramp";
public const string NameMoCarrierFlow = "Mfc16.Ramp";
public const string NameMoPushFlow = "Mfc17.Ramp";
public const string NameWCO6CarrierFlow = "Mfc7.Ramp";
public const string NameWCO6PushFlow = "Mfc8.Ramp";
public const string NameCS2CarrierFlow = "Mfc11.Ramp";
public const string NameCS2PushFlow = "Mfc12.Ramp";
public const string NameH2SFlow = "Mfc13.Ramp";
public const string NameH2SeFlow = "Mfc14.Ramp";
//public const string NameO2Flow = "Mfc4.Ramp";
public const string NameSO2Flow = "Mfc15.Ramp";
public const string NameTotalVentFlow = "TotalVentFlow";
public const string NameVentPushFlow = "Mfc1.Ramp";
protected virtual void CalVentFlow(RecipeStep currentStep, string chamberName)
{
var currentSiH4Flow = ((DoubleParam)currentStep.FindParamByControlName(NameSiH4Flow)).Value;
var currentTotalVentFlow = ((DoubleParam)currentStep.FindParamByControlName(NameTotalVentFlow)).Value;
var currentHClFlow = ((DoubleParam)currentStep.FindParamByControlName(NameHclFlow)).Value;
var currentN2HighFlow = ((DoubleParam)currentStep.FindParamByControlName(NameN2HighFlow)).Value;
var currentC2H4Flow = ((DoubleParam)currentStep.FindParamByControlName(NameCxHxFlow)).Value;
var currentDilutedN2Flow = ((DoubleParam)currentStep.FindParamByControlName(NameDilutedN2Flow)).Value;
var p82 = ((DoubleParam)currentStep.FindParamByControlName(NameTotalVentFlow)).Value;
var bool23 = ((ComboxParam)currentStep.FindParamByControlName(NameMoCO6FlowMode)).Value;
var bool27 = ((ComboxParam)currentStep.FindParamByControlName(NameMoFlowMode)).Value;
var bool31 = ((ComboxParam)currentStep.FindParamByControlName(NameWCO6FlowMode)).Value;
var bool41 = ((ComboxParam)currentStep.FindParamByControlName(NameCS2FlowMode)).Value;
var bool45 = ((ComboxParam)currentStep.FindParamByControlName(NameH2SFlowMode)).Value;
var bool47 = ((ComboxParam)currentStep.FindParamByControlName(NameH2SEFlowMode)).Value;
var bool55 = ((ComboxParam)currentStep.FindParamByControlName(NameO2FlowMode)).Value;
var bool61 = ((ComboxParam)currentStep.FindParamByControlName(NameSO2FlowMode)).Value;
double x = 0;
var currentN2FlowMode = ((ComboxParam)currentStep.FindParamByControlName(NameN2FlowMode)).Value;
var currentN2HighFlowMode = ((ComboxParam)currentStep.FindParamByControlName(NameN2HighFlowMode)).Value;
var currentSiH4FlowMode = (currentStep.FindParamByControlName(NameSiH4FlowMode) as ComboxParam)?.Value;
var currentTcsFlowMode = (currentStep.FindParamByControlName(NameTcsFlowMode) as ComboxParam)?.Value;
var currentHClFlowMode = (currentStep.FindParamByControlName(NameHclFlowMode) as ComboxParam)?.Value;
var currentC2H4FlowMode = (currentStep.FindParamByControlName(NameCxHxFlowMode) as ComboxParam)?.Value;
var currentTmaFlowMode = ((ComboxParam)currentStep.FindParamByControlName(NameTmaFlowMode)).Value;
if (bool23 != null && bool23.Equals(FlowModeParam.FlowModeEnum.Run) == false)
{
x += ((DoubleParam)currentStep.FindParamByControlName(NameMoCO6CarrierFlow)).Value + ((DoubleParam)currentStep.FindParamByControlName(NameMoCO6PushFlow)).Value;
}
if (bool27 != null && bool27.Equals(FlowModeParam.FlowModeEnum.Run) == false)
{
x += ((DoubleParam)currentStep.FindParamByControlName(NameMoCarrierFlow)).Value + ((DoubleParam)currentStep.FindParamByControlName(NameMoPushFlow)).Value;
}
if (bool31 != null && bool31.Equals(FlowModeParam.FlowModeEnum.Run) == false)
{
x += ((DoubleParam)currentStep.FindParamByControlName(NameWCO6CarrierFlow)).Value + ((DoubleParam)currentStep.FindParamByControlName(NameWCO6PushFlow)).Value;
}
if (bool41 != null && bool41.Equals(FlowModeParam.FlowModeEnum.Run) == false)
{
x += ((DoubleParam)currentStep.FindParamByControlName(NameCS2CarrierFlow)).Value + ((DoubleParam)currentStep.FindParamByControlName(NameCS2PushFlow)).Value;
}
if (bool45 != null && bool45.Equals(FlowModeParam.FlowModeEnum.Run) == false)
{
x += ((DoubleParam)currentStep.FindParamByControlName(NameH2SFlow)).Value;
}
if (bool47 != null && bool47.Equals(FlowModeParam.FlowModeEnum.Run) == false)
{
x += ((DoubleParam)currentStep.FindParamByControlName(NameH2SeFlow)).Value;
}
if (bool55 != null && bool55.Equals(FlowModeParam.FlowModeEnum.Run) == false)
{
x += ((DoubleParam)currentStep.FindParamByControlName(NameO2Flow)).Value;
}
if (bool61 != null && bool61.Equals(FlowModeParam.FlowModeEnum.Run) == false)
{
x += ((DoubleParam)currentStep.FindParamByControlName(NameSO2Flow)).Value;
}
var tcsFlow = GetTcsFlow(currentStep, chamberName);
var tmaFlow = GetTmaFlow(currentStep, chamberName);
var currentSiSourTotalFlowForPurge =
(currentSiH4FlowMode != null && currentSiH4FlowMode.Equals(FlowModeParam.FlowModeEnum.Run) == false
? currentSiH4Flow
: 0d)
+ (currentTcsFlowMode != null && currentTcsFlowMode.Equals(FlowModeParam.FlowModeEnum.Run) == false
? tcsFlow
: 0d) +
(currentHClFlowMode != null && currentHClFlowMode.Equals(FlowModeParam.FlowModeEnum.Run) == false
? currentHClFlow
: 0d);
var currentCSourTotalFlowForPurge =
currentC2H4FlowMode != null && currentC2H4FlowMode.Equals(FlowModeParam.FlowModeEnum.Run) == false
? currentC2H4Flow
: 0d;
var n2Flow = (currentN2FlowMode.Equals(FlowModeParam.FlowModeEnum.Run) == false
? currentDilutedN2Flow
: 0d) +
(currentN2HighFlowMode.Equals(FlowModeParam.FlowModeEnum.Run) == false
? currentN2HighFlow
: 0d);
var currentDopeTotalFlowForPurge = n2Flow +
(currentTmaFlowMode.Equals(FlowModeParam.FlowModeEnum.Run) == false
? tmaFlow
: 0d);
var currentVentPushFlow = currentTotalVentFlow - currentSiSourTotalFlowForPurge -
currentCSourTotalFlowForPurge - currentDopeTotalFlowForPurge;
((DoubleParam)currentStep.FindParamByControlName(NameVentPushFlow)).Value = Math.Round(currentVentPushFlow, 1);
((DoubleParam)currentStep.FindParamByControlName(NameVentPushFlow)).Value = Math.Round(p82 - x, 1);
}
#endregion