MoS2/App/Modules/SicModules/PMs/Routines/PMCleanRoutine.cs
2026-08-19 10:25:32 +08:00

465 lines
20 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Aitex.Core.RT.Device;
using Aitex.Core.RT.Device.Devices;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.MFCs;
using SicModules.PMs.Routines.Base;
using System.Collections.Generic;
using System.Diagnostics;
namespace SicModules.PMs.Routines
{
public class PMCleanRoutine : PMBaseRoutine
{
private enum RoutineStep
{
RotationEnable,
HeatEnable,
VentPumpClose,
VentPumpClose_1,
VentPumpOpen,
ArSupply,
SetGroupB,
SetGroupC,
SetGroupE,
SetGroupF,
SetGroupH,
SetGroupD,
SetGroupG,
SetGroupK,
SetM1toM17,
SetM17M18,
SetPC,
SetGroupJ,
SetGroupJ_1,
SetM291519to38,
SetGasOut,
SetTv,
SetGasIn1, //V68
OpenFinal1, //V91-96
SetMfcFinal1, //M32-38
SetMfc19to26,
SetTVCloseMode,
SetTvPositionToZero,
SetGasIn2,
SetGroupJOpen,
SetM18toM40,
OpenFinal2,
SetMfcFinal2,
SetEPV1,
SetEPV2,
SetEPV2_1,
SetEPV2_2,
SetEPV2_3,
SetTvMode,
RoutinePre,
V27Open,
V27Close,
PressureTo1050,
SetPressureUp,
SetPressureUp1,
SetPressureUp2,
SetPressureDown,
PressureToMax,
PressureToMin,
SetPressUpOrDown1,
SetPressUpOrDown2,
WaitPressureDown,
WaitPressureUp,
SetMFCMode,
SetPCMode,
WaitPmTo1050,
SetTvOpen,
SetTvModeToPress,
SetEPV22,
SetV76,
SetV75,
SetTVto300,
CheckPM1000,
SetMfc28to40Special,
WaitPressUpTo1000,
SetMfc28to40Default,
SetPC567Close,
SetPC567Mode,
SetPC567Default,
OpenEPV2,
WaitV27Open,
SetTvTo1150,
WaitPressUpTo20,
SetMfc28to31To0,
WaitPressUpTo0,
SetMfc28to31ToDefault,
WaitPressDownTo20,
CheckPMPt21000,
SetPressureDown1,
SetMfc28to31Default1,
CheckFinal1Open,
SetGroupV25,
CloseGroupV25,
SetM39,
CheckEPV1Open1,
CheckEPV2Open1,
CheckTVOpen1,
CheckEPV1Open2,
SetTVEnable_1,
SetTVEnable_2,
SetTVPressMode,
SetTv1,
Set0M18toM40,
SetM18,
SetV31,
SetV32,
SetV35V36,
SetV65,
WaitTv1,
SetTVPositionMode,
SetTVPositionMode_1,
SetTVPositionMax,
SetTVPositionMax_1,
SetTVPressMode1,
SetTVPressMode2,
SetM2TOM40Default,
SetM2toM40_1,
SetMfc2to40Default,
SetM18Default,
SetM18_1,
SetM18_2,
SetV92V93V95,
SetV94,
SetV96,
SetV103,
SetV105,
SetV68,
SetM32M35M37,
SetM36,
SetM38,
WaitPmPressureUp1,
SetTVCloseMode1,
CLoseTV1,
StartLoop,
EndLoop,
TimeDelay1,
TimeDelay2,
TimeDelay3,
TimeDelay4,
TimeDelay5,
TimeDelay6,
TimeDelay7,
TimeDelay8,
TimeDelay9,
TimeDelay10,
TimeDelay11,
TimeDelay18,
TimeDelay20,
TimeDelay21,
TimeDelay22,
Notify1,
Notify2,
Notify3,
Notify4,
WaitPressUpTo950,
FirstWaitPressureUp,
FirstSetDefault_M18toM40,
FirstSet0_M18toM40,
FirstSetEPV2_1,
FirstSetEPV2_2,
FirstSetTv1,
LoopSetDefault_M18toM40,
LoopSetEPV2_1,
LoopWaitPressureUp,
LoopSetEPV2_2,
LoopSetTv1,
LoopSet0_M18toM40,
Loop2Set0_M18toM40,
LoopWaitTv1,
FinishSetM1toM17,
FinishSetM18toM40,
FinishVentPumpClose_1,
FinishCloseGroupV25,
FinishSetPressureUp2,
FinishSetTVto300
}
private ModuleName moduleName;
private PMModule _pmModule;
private IoThrottleValve2 _IoThrottle;
//private IoInterLock _pmIoInterLock;
private int _rotationCheckSpeed = 0; //设置旋转速度为0后检查是否转速低于此数值
private int _rotationCloseTimeout = 20; //旋转停止超时
private int _heatTimeOut = 5; //Heat关闭等待Di反馈超时时间
private int _pressureMaxDelay = 10; //到低压保持时间采用固定值10s
private int _pressureMinDelay = 10; //到高压保持时间采用固定值10s
private double _pressureMax; //Loop压力上限可设置600-800
private double _pressureMin; //Loop压力下限可设置 0-400
private int _pressureMinTimeout;
private int _pressureMaxTimeout;
private int _pressureLoopCount; //Loop次数
private int _IoValueOpenCloseTimeout = 10; //开关阀门超时时间
private double _pmPressureMaxDiff; //蝶阀与目标压力的差值范围(认为调整到位了)
private int _throttleTimeout; //蝶阀调整到指定压力的超时时间
private int _ventTimeout;
private int _pumpTimeout;
private double _throttleFinalPressure = 300;//蝶阀最终调整对的压力
private int _pmCleanTime = 20;
private Stopwatch _swTimer = new Stopwatch();
public PMCleanRoutine(ModuleName module, PMModule pm) : base(module, pm)
{
moduleName = module;
_pmModule = pm;
Name = "Clean";
_IoThrottle = DEVICE.GetDevice<IoThrottleValve2>($"{Module}.TV");
//_pmIoInterLock = DEVICE.GetDevice<IoInterLock>($"{Module}.PMInterLock");
}
public override Result Start(params object[] objs)
{
Reset();
_pmPressureMaxDiff = SC.GetValue<double>($"PM.{Module}.ThrottlePressureMaxDiff");
_throttleTimeout = SC.GetValue<int>($"PM.{Module}.ThrottlePressureTimeout");
_ventTimeout = SC.GetValue<int>($"PM.{Module}.Clean.VentTimeout");
_pumpTimeout = SC.GetValue<int>($"PM.{Module}.Clean.PumpTimeout");
_pressureLoopCount = SC.GetValue<int>($"PM.{Module}.Clean.CycleCleanCount");
_pressureMin = SC.GetValue<double>($"PM.{Module}.Clean.PumpBasePressure");
_pressureMinDelay = SC.GetValue<int>($"PM.{Module}.Clean.PumpDelayTime");
_pressureMinTimeout = SC.GetValue<int>($"PM.{Module}.Clean.PumpTimeout");
_pressureMax = SC.GetValue<double>($"PM.{Module}.Clean.VentBasePressure");
_pressureMaxDelay = SC.GetValue<int>($"PM.{Module}.Clean.VentDelayTime");
_pressureMaxTimeout = SC.GetValue<int>($"PM.{Module}.Clean.VentTimeout");
_pmCleanTime = SC.GetValue<int>($"PM.{Module}.Clean.CleanTime");
_throttleFinalPressure = SC.GetValue<double>($"PM.{Module}.Clean.FinalPressure");
//Purge Succeed 清掉
//_pmIoInterLock.DoLidOpenRoutineSucceed = false;
//_pmIoInterLock.DoLidCloseRoutineSucceed = false;
//if (!_pmIoInterLock.SetPMCleanRoutineRunning(true, out string reason))
//{
// EV.PostAlarmLog(Module, $"can not Clean,{reason}");
// return Result.FAIL;
//}
_checkPMPt2Over1000 = false;
_checkPMPressureOver1000 = false;
_finalOpen = false;
currentPressureUpOrDown = PressureUpOrDown.None;
_swTimer.Restart();
Notify($"Start LoopCount:{_pressureLoopCount}");
return Result.RUN;
}
public override Result Monitor()
{
try
{
//CheckRoutineTimeOut();
//关闭V76,打开V75
SetIoValueByGroup((int)RoutineStep.SetV76, IoGroupName.V76, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetV75, IoGroupName.V75, true, _IoValueOpenCloseTimeout);
//旋转停止,加热停止
SetHeatEnable((int)RoutineStep.HeatEnable, false, _heatTimeOut);
SetRotationValve((int)RoutineStep.RotationEnable, _rotationCheckSpeed, false, _rotationCloseTimeout);
//3、 关闭 V72(GasBox.Vent.Pump 打开 V25(GasBox.Vent.Bypass)。
SetIoValueByGroup((int)RoutineStep.VentPumpClose, IoGroupName.VentPump, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupV25, IoGroupName.V25, true, _IoValueOpenCloseTimeout);
//4、 打开 V31H2.Supply、 V32(Ar.Supply
SetIoValueByGroup((int)RoutineStep.SetV31, IoGroupName.V31, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetV32, IoGroupName.V32, true, _IoValueOpenCloseTimeout);
//5、 打开 V35(H2N2.Line1)、 V36(H2N2.Line2),关闭 B/C/E/F/H/KValves,打开 D/G Valves 打开 J valve。
SetIoValueByGroup((int)RoutineStep.SetV35V36, IoGroupName.V35V36, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupB, IoGroupName.B, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupC, IoGroupName.C, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupE, IoGroupName.E, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupF, IoGroupName.F, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupH, IoGroupName.H, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupK, IoGroupName.K, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupD, IoGroupName.D, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupG, IoGroupName.G, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupJ, IoGroupName.J, true, _IoValueOpenCloseTimeout);
//设置MFC和PC的模式
SetMfcModeToNormalByGroup((int)RoutineStep.SetMFCMode, MfcGroupName.All);
SetPcModeToNormal((int)RoutineStep.SetPCMode, _lstPcList);
//6、 M1-M17 设定为 default 值,所有 PC 设定为 default 值(PC1-PC9) M18-M40除M30\M34\M39 MFC 3s ramp 到 default 值。
SetMfcToDefaultByGroup((int)RoutineStep.SetM1toM17, MfcGroupName.M1toM17, 0);
SetPcToDefault((int)RoutineStep.SetPC, _lstPcList);
SetMfcToDefaultByGroup((int)RoutineStep.SetM18toM40, MfcGroupName.M18toM40No303439, 3);
//7、打开 EPV2等待 3s, 打开 TV enable, 压力模式,伺服压力默认设定为 0mbar
SetIoValueByGroup((int)RoutineStep.SetEPV2, IoGroupName.EPV2, true, _IoValueOpenCloseTimeout);
TimeDelay((int)RoutineStep.TimeDelay1, 3);
SetThrottleEnableAndWait((int)RoutineStep.SetTVEnable_1, _IoThrottle, 5);
SetThrottleToPressModeAndWait((int)RoutineStep.SetTVPressMode, _IoThrottle, 5);
SetThrottleToTargetAndNoWait((int)RoutineStep.SetTv1, _IoThrottle, _pressureMin);
//8、当蝶阀设定值 ramp 到 0 后,将 M18-M40除 M30\M34\M39 MFC 3s ramp 到 0
SetMfcByGroup((int)RoutineStep.Set0M18toM40, MfcGroupName.M18toM40No303439, 0, 3);
//9、等待腔体压力到 Pump Base Pressure可配置蝶阀改为位置模式开度设定 100%
WaitChamberPressDownTo((int)RoutineStep.WaitTv1, _pressureMin, _pumpTimeout);
TimeDelay((int)RoutineStep.TimeDelay2, 3);
SetThrottleToPositionMode((int)RoutineStep.SetTVPositionMode, _IoThrottle, _throttleTimeout);
TimeDelay((int)RoutineStep.TimeDelay11, 3);
SetThrottleSetPosition((int)RoutineStep.SetTVPositionMax, _IoThrottle, 100, _throttleTimeout);
//10、 M27、 M28、 M29、 M31、 M33、 M40 依次设定 3S ramp 到 default 值
SetMfcToDefaultByGroup((int)RoutineStep.SetMfcFinal2, MfcGroupName.Final2, 3);
//11、打开 V87 SHPurge.Final、 V88 OuterGas.Final、 V89 InnerGas.Final、 V90MiddleGas.Final、 V91OpticPurge.Final、 V97CarryGas.Final
SetIoValueByGroup((int)RoutineStep.OpenFinal2, IoGroupName.Final2, true, _IoValueOpenCloseTimeout);
//12、 打开 V68ChamBody.N2.Purge
SetIoValueByGroup((int)RoutineStep.SetV68, IoGroupName.GasIn1, true, _IoValueOpenCloseTimeout);
TimeDelay((int)RoutineStep.TimeDelay3, 1);
//13、 M32、 M35、 M36、 M37、 M38 依次设定 3S ramp 到 default 值
SetMfcToDefaultByGroup((int)RoutineStep.SetM32M35M37, MfcGroupName.M32M35M37, 1);
SetMfcToDefaultByGroup((int)RoutineStep.SetM36, MfcGroupName.M36, 1);
SetMfcToDefaultByGroup((int)RoutineStep.SetM38, MfcGroupName.M38, 1);
TimeDelay((int)RoutineStep.TimeDelay4, 3);
//14、打开 V92GasRingPurge.Final、 V93ChamberPurge.Final、 V95ConfinementRing.Final
//等待 950打开 V94RotationUpPurge.Final、 等待 3S打开 V96HeaterWF.Final
//蝶阀改为压力模式
SetIoValueByGroup((int)RoutineStep.SetV92V93V95, IoGroupName.V92V93V95, true, _IoValueOpenCloseTimeout);
WaitChamberPressUpTo((int)RoutineStep.WaitPressUpTo950, 950, 600);
SetIoValueByGroup((int)RoutineStep.SetV94, IoGroupName.V94, true, _IoValueOpenCloseTimeout);
TimeDelay((int)RoutineStep.TimeDelay4, 3);
SetIoValueByGroup((int)RoutineStep.SetV96, IoGroupName.V96, true, _IoValueOpenCloseTimeout);
SetThrottleToPressModeAndWait((int)RoutineStep.SetTVPressMode1, _IoThrottle, 5);
//M18 - M40除 M30\M34\M39 MFC 3s ramp 到 default 值。
//关闭 EPV2等待压力达到设定值压力达到后打开 EPV2
//M18 - M40除 M30\M34\M39 MFC 5s ramp 到 0。
//伺服压力到设定值 0可配置
SetMfcToDefaultByGroup((int)RoutineStep.FirstSetDefault_M18toM40, MfcGroupName.M18toM40No303439, 3);
SetIoValueByGroup((int)RoutineStep.FirstSetEPV2_1, IoGroupName.EPV2, false, _IoValueOpenCloseTimeout);
WaitThrottleToPressureAndSetMfcSpecial((int)RoutineStep.FirstWaitPressureUp, _IoThrottle, _pressureMax, _ventTimeout);
SetIoValueByGroup((int)RoutineStep.FirstSetEPV2_2, IoGroupName.EPV2, true, _IoValueOpenCloseTimeout);
SetMfcByGroup((int)RoutineStep.FirstSet0_M18toM40, MfcGroupName.M18toM40No303439, 0, 5);
SetThrottleToTargetAndNoWait((int)RoutineStep.FirstSetTv1, _IoThrottle, _pressureMin);
//循环开始
Loop((int)RoutineStep.StartLoop, _pressureLoopCount);
//M18 - M40除 M30\M34\M39 MFC 3s ramp 到 default 值。
//关闭 EPV2等待压力达到设定值压力达到后打开 EPV2
//M18 - M40除 M30\M34\M39 MFC 5s ramp 到 0。
//伺服压力到设定值 0可配置
//M18 - M40除 M30\M34\M39 MFC5s ramp 到 0。
//等待压力到达 0可配置
SetMfcToDefaultByGroup((int)RoutineStep.LoopSetDefault_M18toM40, MfcGroupName.M18toM40No303439, 3);
SetIoValueByGroup((int)RoutineStep.LoopSetEPV2_1, IoGroupName.EPV2, false, _IoValueOpenCloseTimeout);
WaitThrottleToPressureAndSetMfcSpecial((int)RoutineStep.LoopWaitPressureUp, _IoThrottle, _pressureMax, _ventTimeout);
SetIoValueByGroup((int)RoutineStep.LoopSetEPV2_2, IoGroupName.EPV2, true, _IoValueOpenCloseTimeout);
SetMfcByGroup((int)RoutineStep.LoopSet0_M18toM40, MfcGroupName.M18toM40No303439, 0, 5);
SetThrottleToTargetAndNoWait((int)RoutineStep.LoopSetTv1, _IoThrottle, _pressureMin);
SetMfcByGroup((int)RoutineStep.Loop2Set0_M18toM40, MfcGroupName.M18toM40No303439, 0, 5);
WaitChamberPressDownTo((int)RoutineStep.LoopWaitTv1, _pressureMin, _pumpTimeout);
EndLoop((int)RoutineStep.EndLoop);
//设置 M1-M17 3s ramp 到 default M18 - M40除 M30\M34\M39 MFC 3s ramp 到default 值。
//打开 V72(GasBox.Vent.Pump 关闭 V25(GasBox.Vent.Bypass) 反应腔压力伺服到300mbar可配置
SetMfcToDefaultByGroup((int)RoutineStep.FinishSetM1toM17, MfcGroupName.M1toM17, 3);
SetMfcToDefaultByGroup((int)RoutineStep.FinishSetM18toM40, MfcGroupName.M18toM40No303439, 3);
SetIoValueByGroup((int)RoutineStep.FinishVentPumpClose_1, IoGroupName.VentPump, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.FinishCloseGroupV25, IoGroupName.V25, false, _IoValueOpenCloseTimeout);
SetThrottleToTargetAndNoWait((int)RoutineStep.FinishSetPressureUp2, _IoThrottle, _throttleFinalPressure);
WaitThrottleToPressureAndSetMfcSpecial((int)RoutineStep.FinishSetTVto300, _IoThrottle, _throttleFinalPressure, _pmPressureMaxDiff, _throttleTimeout);
}
catch (RoutineBreakException)
{
return Result.RUN;
}
catch (RoutineFaildException)
{
return Result.FAIL;
}
Notify($"Finished ! Elapsed time: {(int)(_swTimer.ElapsedMilliseconds / 1000)} s");
_swTimer.Stop();
SetRoutineRuningDo();
SetRoutineSuccessedDo();
return Result.DONE;
}
public override void Abort()
{
SetRoutineRuningDo();
PmDevice._ioThrottleValve.StopRamp();
PmDevice.SetMfcStopRamp(PmDevice.GetMfcListByGroupName(MfcGroupName.All));
PmDevice.SetRotationServo(0, 0);
base.Abort();
}
private void SetRoutineRuningDo()
{
//_pmIoInterLock.DoLidCloseRoutineRunning = false;
}
private void SetRoutineSuccessedDo()
{
//_pmIoInterLock.SetLidClosedRoutineSucceed(true, out string reason);
//_pmIoInterLock.DoLidOpenRoutineSucceed = false;
}
//private void CheckRoutineTimeOut()
//{
// if (_routineTimeOut > 10)
// {
// if ((int)(_swTimer.ElapsedMilliseconds / 1000) > _routineTimeOut)
// {
// EV.PostAlarmLog(Module,$"Routine TimeOut! over {_routineTimeOut} s");
// throw (new RoutineFaildException());
// }
// }
//}
}
}