SIC-12/App/Modules/SicModules/PMs/Routines/PMPurgeRoutine.cs
hanqiangqiang 9588fe0121 修改Routine
修改PC9相关仿真
2026-06-10 13:11:53 +08:00

516 lines
19 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 System.Collections.Generic;
using System.Diagnostics;
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 SicModules.PMs.Routines.Base;
namespace SicModules.PMs.Routines
{
public class PMPurgeRoutine : PMBaseRoutine
{
private enum RoutineStep
{
RotationEnable,
HeatEnable,
VentPumpClose,
ArSupply,
SetGroupA,
SetGroupB,
SetGroupC,
SetGroupE,
SetGroupF,
SetGroupH,
SetGroupD,
SetGroupG,
SetGroupK,
SetMFCMode,
SetPCMode,
SetM1to16,
SetPC,
SetGroupJ,
CloseGroupJ,
SetM291519to38,
SetGasOut,
SetTv,
SetGasIn1, //V68
OpenFinal1, //V91-96
SetMfcFinal1, //M32-38
SetMfc19to26,
SetTVCloseMode,
SetTvPositionToZero,
SetGasIn2,
SetGroupJOpen,
SetM2toM26M43M44M45,
SetM2M9M15_M19toM26,
OpenFinal2,
IsOpenFinal1,
IsOpenFinal2,
IsCloseFinal1,
IsCloseFinal2,
SetMfcFinal2,
SetEPV1,
SetEPV2,
SetTvMode,
SetTVEnable_1,
SetTVEnable_2,
SetTVPressMode,
SetTVPressMode1,
SetTv1,
WaitTv1,
SetTVPositionMode,
SetTVPositionMode_1,
SetTVPositionMax,
SetTVPositionMax_1,
SetTvOpen,
SetTvModeToPress,
SetTVtoCurrent,
RoutinePre,
SetPressureUp,
SetPressureDown,
WaitPressureDown,
WaitPressureUp,
VentPumpOpen,
PressureToMax,
PressureToMin,
StartLoop,
EndLoop,
SetMfc28to31,
SetReactorPress,
CloseFinanl1,
CloseFinanl2,
CloseEPV2,
SetTVCloseMode1,
SetTVCloseMode2,
CLoseTvvvv,
CLoseTV1,
CLoseTV2,
SetEPV2_1,
SetEPV2_2,
SetEPV2_3,
CLoseEPV1,
CheckPM1000,
WaitPressUpTo1000,
WaitPressUpTo1020,
SetPressUpOrDown1,
SetPressUpOrDown2,
SetMfc28to40Special,
WaitPmPressureUp,
SetMfc27to45Default,
SetV75,
SetV76,
SetV30,
SetV31,
SetV32,
SetV35V36,
SetV65,
SetV751,
SetV761,
SetM2toM45,
SetM2toM40_1,
SetM2TOM40Default,
SetV93V95,
SetV94,
SetV96,
SetV68,
SetM35M36M37M38,
SetM36,
SetM38,
SetM36_1,
SetM38_1,
SetV111_1,
SetV111_2,
SetPC567Close,
SetPC567Mode,
SetPC567Default,
OpenEPV2,
WaitPressUpTo20,
SetMfc291519to38,
WaitPressUpTo0,
SetMfc291519to38ToDefault,
WaitPressDownTo20,
SetPmPressureTo20,
CloseMfcFinal1,
CloseMfcFinal2,
CloseMfc2915,
CheckFinal1Open,
SetGroupV25,
Mfc36,
SetM39,
CloseMfc1to16, CloseMfc2to26, CloseJ,
CheckTVOpen1,
CheckTVOpen2,
CheckEPV1Open1,
CheckEPV2Open1,
CheckEPV2Open2,
CloseM32M35M37,
CloseM36,
CloseM38,
CloseGasIn1,
WaitPmPressureUp1,
TimeDelay1,
TimeDelay2,
TimeDelay3,
TimeDelay4,
TimeDelay5,
TimeDelay6,
TimeDelay7,
TimeDelay8,
TimeDelay9,
TimeDelay10,
TimeDelay11,
TimeDelay12,
TimeDelay14,
TimeDelay18,
TimeDelay19,
TimeDelay20,
TimeDelay21,
TimeDelay22,
Notify1,
Notify2
}
private ModuleName moduleName;
private PMModule _pmModule;
private IoThrottleValve2 _IoThrottle;
private IoInterLock _pmIoInterLock;
private int _rotationCheckSpeed = 0; //设置旋转速度为0后检查是否转速低于此数值
private int _rotationCloseTimeout; //旋转停止超时
private int _heatTimeOut = 5; //Heat关闭等待Di反馈超时时间
private int _EPV2OpenTimeDelay = 10;
private double _ventBasePressure;
private double _pumpBasePressure;
private int _pressureLoopCount; //Loop次数
private int _pressureMinDelay;
private int _pressureMaxDelay;
private int _pressureMinTimeout;
private int _pressureMaxTimeout;
private int _IoValueOpenCloseTimeout = 10; //开关阀门超时时间
private double _pmPressureMaxDiff; //蝶阀与目标压力的差值范围(认为调整到位了)
private int _throttleTimeout; //蝶阀调整到指定压力的超时时间
private int _ventTimeout;
private int _pumpTimeout;
private int _EPV12TimeSapn = 10;
private int _waitPressureTimeout = 600; //等待腔体压力上升到950的超时时间
private bool _needFinalValveOpen = false;
private Stopwatch _swTimer = new Stopwatch();
public PMPurgeRoutine(ModuleName module, PMModule pm) : base(module, pm)
{
moduleName = module;
_pmModule = pm;
Name = "Purge";
_IoThrottle = DEVICE.GetDevice<IoThrottleValve2>($"{Module}.TV");
_pmIoInterLock = DEVICE.GetDevice<IoInterLock>($"{Module}.PMInterLock");
}
public override Result Start(params object[] objs)
{
Reset();
_rotationCloseTimeout = SC.GetValue<int>($"PM.{Module}.RotationCloseTimeout");
_pmPressureMaxDiff = SC.GetValue<double>($"PM.{Module}.ThrottlePressureMaxDiff");
_throttleTimeout = SC.GetValue<int>($"PM.{Module}.ThrottlePressureTimeout");
_ventTimeout = SC.GetValue<int>($"PM.{Module}.Purge.VentTimeout");
_pumpTimeout = SC.GetValue<int>($"PM.{Module}.Purge.PumpTimeout");
_pressureLoopCount = SC.GetValue<int>($"PM.{Module}.Purge.CyclePurgeCount");
_pumpBasePressure = SC.GetValue<double>($"PM.{Module}.Purge.PumpBasePressure");
_pressureMinDelay = SC.GetValue<int>($"PM.{Module}.Purge.PumpDelayTime");
_pressureMinTimeout = SC.GetValue<int>($"PM.{Module}.Purge.PumpTimeout");
_ventBasePressure = SC.GetValue<double>($"PM.{Module}.Purge.VentBasePressure");
_pressureMaxDelay = SC.GetValue<int>($"PM.{Module}.Purge.VentDelayTime");
_pressureMaxTimeout = SC.GetValue<int>($"PM.{Module}.Purge.VentTimeout");
_waitPressureTimeout = SC.GetValue<int>($"PM.{Module}.Purge.WaitPressureTimeout");
_needFinalValveOpen = SC.GetValue<bool>($"PM.{Module}.Purge.NeedFinalValveOpen");
//Clean succeed 清掉
_pmIoInterLock.DoLidCloseRoutineSucceed = false;
_pmIoInterLock.DoLidOpenRoutineSucceed = false;
if (!_pmIoInterLock.SetPMPurgeRoutineRunning(true, out string reason))
{
EV.PostAlarmLog(Module, $"can not Purge,{reason}");
return Result.FAIL;
}
currentPressureUpOrDown = PressureUpOrDown.None;
_finalOpen = false;
_swTimer.Restart();
Notify($"Start LoopCount:{_pressureLoopCount}");
return Result.RUN;
}
public override Result Monitor()
{
try
{
//CheckRoutineTimeOut();
//1 关闭V76,打开V75
SetIoValueByGroup((int)RoutineStep.SetV76, IoGroupName.V76, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetV75, IoGroupName.V75, true, _IoValueOpenCloseTimeout);
//2 旋转停止,加热停止
SetHeatEnable((int)RoutineStep.HeatEnable, false, _heatTimeOut);
SetRotationValve((int)RoutineStep.RotationEnable, _rotationCheckSpeed, false, _rotationCloseTimeout);
//3 关闭V72,打开V25
SetIoValueByGroup((int)RoutineStep.VentPumpClose, IoGroupName.V72, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupV25, IoGroupName.V25, true, _IoValueOpenCloseTimeout);
//4 打开V30,打开V31,打开V32
SetIoValueByGroup((int)RoutineStep.SetV30, IoGroupName.V30, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetV31, IoGroupName.V31, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetV32, IoGroupName.V32, true, _IoValueOpenCloseTimeout);
//5 打开V35,打开V36
SetIoValueByGroup((int)RoutineStep.SetV35V36, IoGroupName.V35V36, true, _IoValueOpenCloseTimeout);
//关闭B/C/E/F/H/K 阀门
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);
//打开D/G 阀门
SetIoValueByGroup((int)RoutineStep.SetGroupD, IoGroupName.D, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetGroupG, IoGroupName.G, true, _IoValueOpenCloseTimeout);
//打开J阀门
SetIoValueByGroup((int)RoutineStep.SetGroupJ, IoGroupName.J, true, _IoValueOpenCloseTimeout);
////打开V65
//SetIoValueByGroup((int)RoutineStep.SetV65, IoGroupName.V65, true, _IoValueOpenCloseTimeout);
//设置MFC和PC的模式
SetMfcModeToNormalByGroup((int)RoutineStep.SetMFCMode, MfcGroupName.All);
SetPcModeToNormal((int)RoutineStep.SetPCMode, _lstPcList);
//6 M1-M16设定为default值(M2、M9、M15除外)
SetMfcToDefaultByGroup((int)RoutineStep.SetM1to16, MfcGroupName.M1to16, 0);
//设置所有PC到默认值
SetPcToDefault((int)RoutineStep.SetPC, _lstPcList);
//设置M2,M9,M15,M19-M26 3s ramp 到default 值
SetMfcToDefaultByGroup((int)RoutineStep.SetM2toM26M43M44M45, MfcGroupName.M2toM45, 3);
//7 打开EPV2
SetIoValueByGroup((int)RoutineStep.SetEPV2, IoGroupName.EPV2, true, _IoValueOpenCloseTimeout);
TimeDelay((int)RoutineStep.TimeDelay1, 3);
//设置蝶阀Enable
SetThrottleEnableAndWait((int)RoutineStep.SetTVEnable_1, _IoThrottle, 5);
//设置蝶阀为压力模式
SetThrottleToPressModeAndWait((int)RoutineStep.SetTVPressMode, _IoThrottle, 5);
//伺服压力设定值到0mbar
SetThrottleToTargetAndNoWait((int)RoutineStep.SetTv1, _IoThrottle, _pumpBasePressure);
//8 M2、M9、M15、M19-M45 MFC 3s ramp 到0
SetMfcByGroup((int)RoutineStep.SetM2toM45, MfcGroupName.M2toM45, 0, 3);
//9 等待腔体压力Pump到设定值
WaitChamberPressDownTo((int)RoutineStep.WaitTv1, _pumpBasePressure, _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 Final2阀对应的MFC 3s Ramp到Default值
SetMfcToDefaultByGroup((int)RoutineStep.SetMfcFinal2, MfcGroupName.Final2, 3);
//11 打开Final2阀
SetIoValueByGroup((int)RoutineStep.OpenFinal2, IoGroupName.Final2, true, _IoValueOpenCloseTimeout);
//12 打开 V65 V68
SetIoValueByGroup((int)RoutineStep.SetV65, IoGroupName.V65, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetV68, IoGroupName.V68, true, _IoValueOpenCloseTimeout);
TimeDelay((int)RoutineStep.TimeDelay3, 1);
//13 M35 36 37 38 MFC 3s ramp 到default
SetMfcToDefaultByGroup((int)RoutineStep.SetM35M36M37M38, MfcGroupName.M35M36M37M38, 3);
//14 14.打开V93、V95打开V94等待3S打开V96
SetIoValueByGroup((int)RoutineStep.SetV93V95, IoGroupName.V93V95, true, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetV94, IoGroupName.V94, true, _IoValueOpenCloseTimeout);
TimeDelay((int)RoutineStep.TimeDelay4, 3);
SetIoValueByGroup((int)RoutineStep.SetV96, IoGroupName.V96, true, _IoValueOpenCloseTimeout);
//循环开始
Loop((int)RoutineStep.StartLoop, _pressureLoopCount);
//M2、M9、M15、M19-M45 MFC 3s ramp 到 default 值
SetMfcToDefaultByGroup((int)RoutineStep.SetM2TOM40Default, MfcGroupName.M2toM45, 3);
//先关蝶阀,再关闭EPV2
SetThrottleToCloseMode((int)RoutineStep.SetTVCloseMode1, _IoThrottle, 8);
SetThrottleDisable((int)RoutineStep.CLoseTV1, _IoThrottle, 8);
TimeDelay((int)RoutineStep.TimeDelay5, 1);
SetIoValueByGroup((int)RoutineStep.SetEPV2_1, IoGroupName.EPV2, false, _IoValueOpenCloseTimeout);
//等待压力大于等于设定值(可配置)
SetPressureUpOrDown((int)RoutineStep.SetPressUpOrDown1, PressureUpOrDown.Uping);
WaitThrottleToPressureAndSetMfcSpecial((int)RoutineStep.WaitPressureUp, _IoThrottle, _ventBasePressure, _ventTimeout);
TimeDelay((int)RoutineStep.TimeDelay6, _pressureMaxDelay);
//打开EPV2
SetIoValueByGroup((int)RoutineStep.SetEPV2_2, IoGroupName.EPV2, true, _IoValueOpenCloseTimeout);
TimeDelay((int)RoutineStep.TimeDelay7, 1);
//设置蝶阀Enable
SetThrottleEnableAndWait((int)RoutineStep.SetTVEnable_2, _IoThrottle, 5);
//设置蝶阀为压力模式
SetThrottleToPressModeAndWait((int)RoutineStep.SetTVPressMode1, _IoThrottle, 5);
//M2、M9、M15、M19-M40 MFC 3s ramp 0
SetMfcByGroup((int)RoutineStep.SetM2toM40_1, MfcGroupName.M2toM45, 0, 3);
//伺服到0mbar
SetThrottlePressureAndWait((int)RoutineStep.SetPressureDown, _IoThrottle, _pumpBasePressure, _pumpTimeout);
EndLoop((int)RoutineStep.EndLoop);
//M2,M9,M15,M19-M26 3s ramp 到0
SetMfcToDefaultByGroup((int)RoutineStep.SetM2M9M15_M19toM26, MfcGroupName.M2M9M15_M19toM26, 3);
//M27-M45 MFC 3s ramp 到 default 值
SetMfcToDefaultByGroup((int)RoutineStep.SetMfc27to45Default, MfcGroupName.M27toM45, 3);
//打开J阀门
//SetIoValueByGroup((int)RoutineStep.CloseGroupJ, IoGroupName.J, true, _IoValueOpenCloseTimeout);
//关闭先关蝶阀,再EPV2
SetThrottleToCloseMode((int)RoutineStep.SetTVCloseMode2, _IoThrottle, 8);
SetThrottleDisable((int)RoutineStep.CLoseTV2, _IoThrottle, 8);
TimeDelay((int)RoutineStep.TimeDelay10, 1);
SetIoValueByGroup((int)RoutineStep.SetEPV2_3, IoGroupName.EPV2, false, _IoValueOpenCloseTimeout);
//等待反应腔压力到达950
NotifyInfo((int)RoutineStep.Notify1, $"Wait pm pressure to 950 mbar!");
WaitChamberPressUpTo((int)RoutineStep.WaitPressUpTo1000, 950, _waitPressureTimeout);
if (_needFinalValveOpen)
{
//打开Final1阀
SetIoValueByGroup((int)RoutineStep.IsOpenFinal1, IoGroupName.Final1, true, _IoValueOpenCloseTimeout);
//打开Final2阀
SetIoValueByGroup((int)RoutineStep.IsOpenFinal2, IoGroupName.Final2, true, _IoValueOpenCloseTimeout);
SetMfcToDefaultByGroup((int)RoutineStep.SetM36_1, MfcGroupName.M36, 3);
SetMfcToDefaultByGroup((int)RoutineStep.SetM38_1, MfcGroupName.M38, 3);
SetIoValueByGroup((int)RoutineStep.SetV111_1, IoGroupName.V111, true, _IoValueOpenCloseTimeout);
}
else
{
//关闭Final1阀
SetIoValueByGroup((int)RoutineStep.IsCloseFinal1, IoGroupName.Final1, false, _IoValueOpenCloseTimeout);
//关闭Final2阀
SetIoValueByGroup((int)RoutineStep.IsCloseFinal2, IoGroupName.Final2, false, _IoValueOpenCloseTimeout);
SetIoValueByGroup((int)RoutineStep.SetV111_2, IoGroupName.V111, false, _IoValueOpenCloseTimeout);
}
}
catch (RoutineBreakException)
{
return Result.RUN;
}
catch (RoutineFaildException)
{
return Result.FAIL;
}
Notify($"Finished ! Elapsed time: {(int)(_swTimer.ElapsedMilliseconds / 1000)} s");
_swTimer.Stop();
SetRoutineSuccessedDo();
return Result.DONE;
}
public override void Abort()
{
_pmIoInterLock.DoLidOpenRoutineRunning = false;
PmDevice._ioThrottleValve.StopRamp();
PmDevice.SetMfcStopRamp(PmDevice.GetMfcListByGroupName(MfcGroupName.All));
PmDevice.SetRotationServo(0, 0);
base.Abort();
}
private void SetRoutineSuccessedDo()
{
_pmIoInterLock.DoLidOpenRoutineRunning = false;
_pmIoInterLock.SetLidOpenRoutineSucceed(true, out string reason);
_pmIoInterLock.DoLidCloseRoutineSucceed = false;
}
//private void CheckRoutineTimeOut()
//{
// if (_routineTimeOut > 10)
// {
// if ((int)(_swTimer.ElapsedMilliseconds / 1000) > _routineTimeOut)
// {
// EV.PostAlarmLog(Module,$"Routine TimeOut! over {_routineTimeOut} s");
// throw (new RoutineFaildException());
// }
// }
//}
}
}