From 621c9f2939f62cd5a567da59b566ec8835184f71 Mon Sep 17 00:00:00 2001 From: "SIC1016\\caipeilun" <905168240@qq.com> Date: Sat, 22 Aug 2026 11:39:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9routine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Config/Recipe/Sic/Process/PN2.xml | 14 +- .../PMs/RecipeExecutions/RecipeParser.cs | 18 +- .../SicModules/PMs/Routines/PMPumpRoutine.cs | 44 +- .../PMs/Routines/PMVacIdleRoutine.cs | 46 +- App/SicRT/Properties/AssemblyInfo.cs | 2 +- App/SicSimulator/Instances/SimulatorSystem.cs | 24 +- App/SicUI/Models/PMs/PMOperationViewModel.cs | 4 + App/SicUI/Properties/AssemblyInfo.cs | 2 +- .../RecipeGasFlowCalculatorBase.cs | 677 +++++------------- 9 files changed, 234 insertions(+), 597 deletions(-) diff --git a/App/Modules/SicModules/Config/Recipe/Sic/Process/PN2.xml b/App/Modules/SicModules/Config/Recipe/Sic/Process/PN2.xml index 62c896e..c965ee8 100644 --- a/App/Modules/SicModules/Config/Recipe/Sic/Process/PN2.xml +++ b/App/Modules/SicModules/Config/Recipe/Sic/Process/PN2.xml @@ -79,7 +79,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -139,7 +139,7 @@ - + @@ -148,7 +148,7 @@ - + @@ -169,7 +169,7 @@ - + @@ -182,7 +182,7 @@ - + diff --git a/App/Modules/SicModules/PMs/RecipeExecutions/RecipeParser.cs b/App/Modules/SicModules/PMs/RecipeExecutions/RecipeParser.cs index bee879f..276ea39 100644 --- a/App/Modules/SicModules/PMs/RecipeExecutions/RecipeParser.cs +++ b/App/Modules/SicModules/PMs/RecipeExecutions/RecipeParser.cs @@ -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"); diff --git a/App/Modules/SicModules/PMs/Routines/PMPumpRoutine.cs b/App/Modules/SicModules/PMs/Routines/PMPumpRoutine.cs index c571890..a785971 100644 --- a/App/Modules/SicModules/PMs/Routines/PMPumpRoutine.cs +++ b/App/Modules/SicModules/PMs/Routines/PMPumpRoutine.cs @@ -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); diff --git a/App/Modules/SicModules/PMs/Routines/PMVacIdleRoutine.cs b/App/Modules/SicModules/PMs/Routines/PMVacIdleRoutine.cs index d4da874..183e1dd 100644 --- a/App/Modules/SicModules/PMs/Routines/PMVacIdleRoutine.cs +++ b/App/Modules/SicModules/PMs/Routines/PMVacIdleRoutine.cs @@ -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); diff --git a/App/SicRT/Properties/AssemblyInfo.cs b/App/SicRT/Properties/AssemblyInfo.cs index a889842..f64d9d1 100644 --- a/App/SicRT/Properties/AssemblyInfo.cs +++ b/App/SicRT/Properties/AssemblyInfo.cs @@ -51,7 +51,7 @@ using System.Windows; // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 // 方法是按如下所示使用“*”: : -[assembly: AssemblyVersion("1.1.0.60819")] +[assembly: AssemblyVersion("1.1.0.60822")] [assembly: AssemblyInformationalVersion("MoS2(无EFEM)")] diff --git a/App/SicSimulator/Instances/SimulatorSystem.cs b/App/SicSimulator/Instances/SimulatorSystem.cs index 35cd337..f8f84b2 100644 --- a/App/SicSimulator/Instances/SimulatorSystem.cs +++ b/App/SicSimulator/Instances/SimulatorSystem.cs @@ -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) diff --git a/App/SicUI/Models/PMs/PMOperationViewModel.cs b/App/SicUI/Models/PMs/PMOperationViewModel.cs index 8a6485c..b5a5122 100644 --- a/App/SicUI/Models/PMs/PMOperationViewModel.cs +++ b/App/SicUI/Models/PMs/PMOperationViewModel.cs @@ -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); diff --git a/App/SicUI/Properties/AssemblyInfo.cs b/App/SicUI/Properties/AssemblyInfo.cs index 6808584..b1a88ac 100644 --- a/App/SicUI/Properties/AssemblyInfo.cs +++ b/App/SicUI/Properties/AssemblyInfo.cs @@ -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)")] diff --git a/Framework/MECF.Framework.UI.Client/RecipeEditorLib/RecipeModel/RecipeGasFlowCalculators/RecipeGasFlowCalculatorBase.cs b/Framework/MECF.Framework.UI.Client/RecipeEditorLib/RecipeModel/RecipeGasFlowCalculators/RecipeGasFlowCalculatorBase.cs index e8fd157..cc4d533 100644 --- a/Framework/MECF.Framework.UI.Client/RecipeEditorLib/RecipeModel/RecipeGasFlowCalculators/RecipeGasFlowCalculatorBase.cs +++ b/Framework/MECF.Framework.UI.Client/RecipeEditorLib/RecipeModel/RecipeGasFlowCalculators/RecipeGasFlowCalculatorBase.cs @@ -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 - - /// - /// Mfc11.Ramp, 流量控制 - /// - public virtual string NameTcsBubbleLowFlow => "Mfc11.Ramp"; - - /// - /// Mfc10.Ramp, 流量控制 - /// - public virtual string NameTcsBubbleHighFlow => "Mfc10.Ramp"; - - /// - /// Mfc12.Ramp, 流量控制 - /// - public virtual string NameTcsPushFlow => "Mfc12.Ramp"; - - /// - /// TCS.SetValve, 控制阀门模式 - /// - public virtual string NameTcsFlowMode => "TCS.SetValve"; - - /// - /// Mfc7.Ramp, 流量控制 - /// - public virtual string NameTmaBubbleFlow => "Mfc7.Ramp"; - - /// - /// Mfc8.Ramp, 流量控制 - /// - public virtual string NameTmaPushFlow => "Mfc8.Ramp"; - - /// - /// TMA.SetValve, 控制阀门模式 - /// - public virtual string NameTmaFlowMode => "TMA.SetValve"; - - /// - /// SiSourSplitRatio, 源分流比 - /// - public virtual string NameSiSourceSplitRatio => "SiSourSplitRatio"; - - /// - /// SiSourTotalFlow, 源总流量 - /// - public virtual string NameSiSourceTotalFlow => "SiSourTotalFlow"; - - /// - /// Mfc23.Ramp, 流量控制 - /// - public virtual string NameSiSourceInnerFlow => "Mfc23.Ramp"; - - /// - /// Mfc22.Ramp, 流量控制 - /// - public virtual string NameSiSourceMiddleFlow => "Mfc22.Ramp"; - - /// - /// Mfc9.Ramp, 流量控制 - /// - public virtual string NameSiSourceOuterFlow => "Mfc9.Ramp"; - - /// - /// Mfc16.Ramp, 流量控制 - /// - public virtual string NameCxHxFlow => "Mfc16.Ramp"; - - /// - /// C2H4.SetValve, 控制阀门模式 - /// - public virtual string NameCxHxFlowMode => "C2H4.SetValve"; - - /// - /// CSourSplitRatio, 源分流比 - /// - public virtual string NameCSourceSplitRatio => "CSourSplitRatio"; - - /// - /// CSourTotalFlow, 源总流量 - /// - public virtual string NameCSourceTotalFlow => "CSourTotalFlow"; - - /// - /// Mfc15.Ramp, 流量控制 - /// - public virtual string NameCSourcePushFlow => "Mfc15.Ramp"; - - /// - /// Mfc26.Ramp, 流量控制 - /// - public virtual string NameCSourceInnerFlow => "Mfc26.Ramp"; - - /// - /// Mfc25.Ramp, 流量控制 - /// - public virtual string NameCSourceMiddleFlow => "Mfc25.Ramp"; - - /// - /// Mfc15.Ramp, 流量控制 - /// - public virtual string NameCSourceOuterFlow => "Mfc15.Ramp"; - - /// - /// DopeTotalFlow, 涂料总流量 - /// - public virtual string NameDopeTotalFlow => "DopeTotalFlow"; - - /// - /// DopeSplitRatio, 涂料分流比 - /// - public virtual string NameDopeSplitRatio => "DopeSplitRatio"; - - /// - /// Mfc20.Ramp, 流量控制 - /// - public virtual string NameDopeInnerFlow => "Mfc20.Ramp"; - - /// - /// Mfc19.Ramp, 流量控制 - /// - public virtual string NameDopeMiddleFlow => "Mfc19.Ramp"; - - /// - /// Mfc2.Ramp, 流量控制 - /// - public virtual string NameDopeOuterFlow => "Mfc2.Ramp"; - - /// - /// N2ActualFlow, 氮气实际流量 - /// - public virtual string NameN2ActualFlow => "N2ActualFlow"; - - /// - /// Mfc4.Ramp, 流量控制 - /// - public virtual string NameN2LowFlow => "Mfc4.Ramp"; - - /// - /// Mfc3.Ramp, 稀释流量控制 - /// - public virtual string NameDilutionFlowForN2 => "Mfc3.Ramp"; - - /// - /// Mfc6.Ramp, 稀释后的氮气流量控制 - /// - public virtual string NameDilutedN2Flow => "Mfc6.Ramp"; - - /// - /// SHTotalFlow, 总流量 - /// - public virtual string NameShTotalFlow => "SHTotalFlow"; - - /// - /// SHTotalFlowSplitRatio, 总流量分流比 - /// - public virtual string NameShTotalFlowSplitRatio => "SHTotalFlowSplitRatio"; - - /// - /// SHSuppTotalFlow, 支持流量 - /// - public virtual string NameShPushTotalFlow => "SHSuppTotalFlow"; - - /// - /// SHInnerFlow, 内部流量 - /// - public virtual string NameShInnerFlow => "SHInnerFlow"; - - /// - /// SHMidFlow, 中间流量 - /// - public virtual string NameShMiddleFlow => "SHMidFlow"; - - /// - /// SHOutterFlow, 外部流量 - /// - public virtual string NameShOuterFlow => "SHOutterFlow"; - - /// - /// Mfc29.Ramp, 内部推送流量控制 - /// - public virtual string NameInnerPushFlow => "Mfc29.Ramp"; - - /// - /// Mfc30.Ramp, 流量控制 - /// - public virtual string Mfc30Flow => "Mfc30.Ramp"; - - public virtual string V47Value => "V47Value.SetValve"; - - /// - /// Mfc31.Ramp, 中间推送流量控制 - /// - public virtual string NameMiddlePushFlow => "Mfc31.Ramp"; - - /// - /// Mfc28.Ramp, 外部推送流量控制 - /// - public virtual string NameOuterPushFlow => "Mfc28.Ramp"; - - /// - /// Mfc40.Ramp, 输送气体流量控制 - /// - public virtual string NameCarryGasFlow => "Mfc40.Ramp"; - - /// - /// Mfc14.Ramp, SiH4流量控制 - /// - public virtual string NameSiH4Flow => "Mfc14.Ramp"; - - /// - /// SiH4.SetValve, 控制SiH4阀门模式 - /// - public virtual string NameSiH4FlowMode => "SiH4.SetValve"; - - /// - /// Mfc1.Ramp, 排气推送流量控制 - /// - public virtual string NameVentPushFlow => "Mfc1.Ramp"; - - /// - /// TotalVentFlow, 总排气流量 - /// - public virtual string NameTotalVentFlow => "TotalVentFlow"; - - /// - /// Mfc13.Ramp, HCl流量控制 - /// - public virtual string NameHclFlow => "Mfc13.Ramp"; - - /// - /// HCl.SetValve, 控制HCl阀门模式 - /// - public virtual string NameHclFlowMode => "HCl.SetValve"; - - /// - /// Mfc5.Ramp, 高流量氮气控制 - /// - public virtual string NameN2HighFlow => "Mfc5.Ramp"; - - /// - /// N2Dilution.SetValve, 控制氮气稀释阀门模式 - /// - public virtual string NameN2FlowMode => "N2Dilution.SetValve"; - - /// - /// N2HighDoping.SetValve, 控制高流量氮气掺杂阀门模式 - /// - public virtual string NameN2HighFlowMode => "N2HighDoping.SetValve"; - - #endregion - - /// /// 计算指定工艺步骤的气体流量。 /// @@ -283,294 +32,226 @@ namespace MECF.Framework.UI.Client.RecipeEditorLib.RecipeModel /// 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) - { - 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(); - } + 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) + { + 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) + public virtual string NameSource1Flow => "Source1TotalFlow"; + + public virtual string NameSource2Flow => "Source2TotalFlow"; + + 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) { - 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; + var totalFlow = ((DoubleParam)currentStep.FindParamByControlName(nametotal)).Value; + var currentRatio = new double[3]; //63 + if (currentStep.FindParamByControlName(nameratio) is Sets3RatioParam dopRatio) + currentRatio = dopRatio.Ratio; - var tcsFlow = 0d; + double currentInnerFlow = 0; + double currentMidFlow = 0; + double currentOuterFlow = 0; - var tcsEff = - (double)QueryDataClient.Instance.Service.GetConfig($"PM.{chamberName}.Efficiency.TCS-Eff"); - if (currentTcsFlowMode.Equals(FlowModeParam.FlowModeEnum.Run) - || currentTcsFlowMode.Equals(FlowModeParam.FlowModeEnum.Vent)) + if (currentRatio.Length == 3) { - tcsFlow = (currentTcsBubbleHighFlow + currentTcsBubbleLowFlow) * tcsEff + currentTcsPushFlow; - } - else if (currentTcsFlowMode.Equals(FlowModeParam.FlowModeEnum.Purge)) - { - 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