311 lines
9.9 KiB
C#
311 lines
9.9 KiB
C#
|
using System;
|
|||
|
using Aitex.Core.RT.Device;
|
|||
|
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.TMs;
|
|||
|
|
|||
|
namespace Mainframe.TMs
|
|||
|
{
|
|||
|
public class TMPressureBalanceRoutine : TMBaseRoutine
|
|||
|
{
|
|||
|
enum RoutineStep
|
|||
|
{
|
|||
|
CheckPressureCondition,
|
|||
|
|
|||
|
PumpDownToBase,
|
|||
|
|
|||
|
CloseIsoValve,
|
|||
|
OpenTmSlowVent,
|
|||
|
|
|||
|
VentToSetPoint,
|
|||
|
StopVent,
|
|||
|
|
|||
|
WaitPressureToSetPoint,
|
|||
|
SlowPump, FastPump, VaccumDelay, CloseValves, CLoseSlowValue,
|
|||
|
CheckNeedVent
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private TM _tm;
|
|||
|
private TMPumpRoutine _pumpDownRoutine;
|
|||
|
|
|||
|
private ModuleName _paramTarget; //每个模块包含以下三个参数↓
|
|||
|
double maxDifferent = 0;
|
|||
|
private bool _needMfcVent; //是否需要Vent操作
|
|||
|
private double _ventMfcFlow; //MFC在Vent时设置的值
|
|||
|
private double _balancePressure; //目标压力值
|
|||
|
|
|||
|
private int _ventTimeout; //MFC 超时
|
|||
|
private int _waitPressureTimeout; //不需要Vent操作时,等待压力平衡时间
|
|||
|
|
|||
|
private bool _needPumpDown; //执行Routine之前已经是真空则不需要抽真空
|
|||
|
private bool _needBalance; //执行Routine之前已经在设定压力值则不需要继续平衡
|
|||
|
private double _slowFastPumpSwitchPressure; //慢快抽切换压力
|
|||
|
private int _fastPumpTime;
|
|||
|
private int _slowPumpTimeout;
|
|||
|
private bool isAtmMode = false;
|
|||
|
|
|||
|
public TMPressureBalanceRoutine()
|
|||
|
{
|
|||
|
Module = ModuleName.TM.ToString();
|
|||
|
Name = "Pressure Balance";
|
|||
|
_tm = DEVICE.GetDevice<SicTM>($"{ ModuleName.System.ToString()}.{ ModuleName.TM.ToString()}");
|
|||
|
|
|||
|
_pumpDownRoutine = new TMPumpRoutine();
|
|||
|
_paramTarget = ModuleName.System;
|
|||
|
}
|
|||
|
|
|||
|
public void Init(ModuleName target)
|
|||
|
{
|
|||
|
Name = "Pressure Balance with " + target;
|
|||
|
_paramTarget = target;
|
|||
|
}
|
|||
|
|
|||
|
public override Result Start(params object[] objs)
|
|||
|
{
|
|||
|
if (ModuleHelper.IsPm(_paramTarget))
|
|||
|
{
|
|||
|
_balancePressure = SC.GetValue<double>($"TM.PressureBalance.BalancePressure") + SC.GetValue<double>("TM.TMPressureBigThanPM");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_balancePressure = SC.GetValue<double>("TM.PressureBalance.BalancePressure");
|
|||
|
}
|
|||
|
|
|||
|
_ventMfcFlow = SC.GetValue<double>($"TM.MFCFlowWhenV77Open");
|
|||
|
_ventTimeout = SC.GetValue<int>("TM.PressureBalance.VentTimeout");
|
|||
|
_waitPressureTimeout = SC.GetValue<int>("TM.PressureBalance.WaitPressureAboveSetPointTimeout");
|
|||
|
_slowFastPumpSwitchPressure = SC.GetValue<double>("TM.Pump.SlowFastPumpSwitchPressure");
|
|||
|
_fastPumpTime = SC.GetValue<int>("TM.Pump.FastPumpTimeout");
|
|||
|
_slowPumpTimeout = SC.GetValue<int>("TM.Pump.PumpSlowTimeout");
|
|||
|
|
|||
|
//_needPumpDown = !_tm.CheckVacuum();
|
|||
|
maxDifferent = SC.GetValue<double>("TM.PressureBalance.BalanceMaxDiffPressure");
|
|||
|
|
|||
|
isAtmMode = SC.GetValue<bool>("System.IsATMMode");
|
|||
|
|
|||
|
if ((Math.Abs(_tm.ChamberPressure - _balancePressure) < maxDifferent) && _balancePressure != 0)
|
|||
|
{
|
|||
|
return Result.DONE;
|
|||
|
}
|
|||
|
|
|||
|
_needPumpDown = (_tm.ChamberPressure > _balancePressure) || _balancePressure == 0;
|
|||
|
|
|||
|
_needMfcVent = _balancePressure > 10;
|
|||
|
|
|||
|
Notify("Start");
|
|||
|
return Result.RUN;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public override Result Monitor()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if (SC.GetValue<bool>("System.IsATMMode"))
|
|||
|
{
|
|||
|
return Result.DONE;
|
|||
|
}
|
|||
|
|
|||
|
if (_needPumpDown)
|
|||
|
{
|
|||
|
if (_balancePressure < _slowFastPumpSwitchPressure)
|
|||
|
{
|
|||
|
OpenSlowPump((int)RoutineStep.SlowPump, _tm, _slowFastPumpSwitchPressure, _slowPumpTimeout);
|
|||
|
OpenFastPump((int)RoutineStep.FastPump, _tm, _balancePressure, _fastPumpTime);
|
|||
|
CloseFastPump((int)RoutineStep.CloseValves, _tm);
|
|||
|
CloseSlowPump((int)RoutineStep.CLoseSlowValue, _tm);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OpenSlowPump((int)RoutineStep.SlowPump, _tm, _balancePressure, _slowPumpTimeout);
|
|||
|
CloseSlowPump((int)RoutineStep.CLoseSlowValue, _tm);
|
|||
|
}
|
|||
|
}
|
|||
|
CheckNeedVent((int)RoutineStep.CheckNeedVent);
|
|||
|
|
|||
|
if (_needMfcVent)
|
|||
|
{
|
|||
|
VentToSetPoint((int)RoutineStep.VentToSetPoint, _tm, _balancePressure, _ventMfcFlow, _ventTimeout);
|
|||
|
StopVent((int)RoutineStep.StopVent, _tm, 2);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (RoutineBreakException)
|
|||
|
{
|
|||
|
return Result.RUN;
|
|||
|
}
|
|||
|
catch (RoutineFaildException)
|
|||
|
{
|
|||
|
return Result.FAIL;
|
|||
|
}
|
|||
|
|
|||
|
Notify("Finished");
|
|||
|
|
|||
|
return Result.DONE;
|
|||
|
}
|
|||
|
|
|||
|
public override void Abort()
|
|||
|
{
|
|||
|
_tm.SetSlowVentValve(false, out string reason);
|
|||
|
_tm.SetFastVentValve(false, out reason);
|
|||
|
_tm.SetSlowPumpValve(false, out reason);
|
|||
|
_tm.SetFastPumpValve(false, out reason);
|
|||
|
Notify("Aborted");
|
|||
|
|
|||
|
base.Abort();
|
|||
|
}
|
|||
|
|
|||
|
private void CheckNeedVent(int id)
|
|||
|
{
|
|||
|
Tuple<bool, Result> ret = Execute(id, () =>
|
|||
|
{
|
|||
|
if ((Math.Abs(_tm.ChamberPressure - _balancePressure) < maxDifferent) && _balancePressure != 0)
|
|||
|
{
|
|||
|
_needMfcVent = false;
|
|||
|
}
|
|||
|
else if (_tm.ChamberPressure < _balancePressure)
|
|||
|
{
|
|||
|
_needMfcVent = true;
|
|||
|
}
|
|||
|
return true;
|
|||
|
});
|
|||
|
|
|||
|
if (ret.Item1)
|
|||
|
{
|
|||
|
if (ret.Item2 == Result.FAIL)
|
|||
|
{
|
|||
|
throw (new RoutineFaildException());
|
|||
|
}
|
|||
|
else
|
|||
|
throw (new RoutineBreakException());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void OpenTMSlowVent(int id,int delayTime)
|
|||
|
{
|
|||
|
Tuple<bool, Result> ret = Wait(id, () =>
|
|||
|
{
|
|||
|
Notify($"Open tm slowVent");
|
|||
|
if (!_tm.SetSlowVentValve(true, out string reason))
|
|||
|
{
|
|||
|
Stop(reason);
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}, delayTime * 1000);
|
|||
|
|
|||
|
if (ret.Item1)
|
|||
|
{
|
|||
|
if (ret.Item2 == Result.FAIL)
|
|||
|
{
|
|||
|
throw (new RoutineFaildException());
|
|||
|
}
|
|||
|
else
|
|||
|
throw (new RoutineBreakException());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void VentToSetPoint(int id, TM tm, double balancePressure, double ventFlow, int timeout)
|
|||
|
{
|
|||
|
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
|
|||
|
{
|
|||
|
Notify($"vent to {balancePressure} mbar with {ventFlow} sccm");
|
|||
|
if (!_tm.SetSlowVentValve(true, out string reason))
|
|||
|
{
|
|||
|
Stop(reason);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!_tm.SetVentMfc(ventFlow, out reason))
|
|||
|
{
|
|||
|
Stop(reason);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}, () =>
|
|||
|
{
|
|||
|
return _tm.ChamberPressure >= balancePressure;
|
|||
|
|
|||
|
}, timeout * 1000);
|
|||
|
|
|||
|
if (ret.Item1)
|
|||
|
{
|
|||
|
if (ret.Item2 == Result.FAIL)
|
|||
|
{
|
|||
|
throw (new RoutineFaildException());
|
|||
|
}
|
|||
|
else if (ret.Item2 == Result.TIMEOUT) //timeout
|
|||
|
{
|
|||
|
Stop($"can not vent to {balancePressure} in {timeout} seconds");
|
|||
|
throw (new RoutineFaildException());
|
|||
|
}
|
|||
|
else
|
|||
|
throw (new RoutineBreakException());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void StopVent(int id, TM tm, int delayTime)
|
|||
|
{
|
|||
|
Tuple<bool, Result> ret = Wait(id, () =>
|
|||
|
{
|
|||
|
Notify($"stop vent");
|
|||
|
|
|||
|
if (!_tm.SetSlowVentValve(false, out string reason))
|
|||
|
{
|
|||
|
Stop(reason);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!_tm.SetVentMfc(0, out reason))
|
|||
|
{
|
|||
|
Stop(reason);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
return true;
|
|||
|
}, delayTime * 1000);
|
|||
|
|
|||
|
if (ret.Item1)
|
|||
|
{
|
|||
|
if (ret.Item2 == Result.FAIL)
|
|||
|
{
|
|||
|
throw (new RoutineFaildException());
|
|||
|
}
|
|||
|
else
|
|||
|
throw (new RoutineBreakException());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void WaitPressureToSetPoint(int id, TM tm, double pressure, int timeout)
|
|||
|
{
|
|||
|
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
|
|||
|
{
|
|||
|
Notify($"Wait pressure above {pressure} mbar");
|
|||
|
|
|||
|
return true;
|
|||
|
}, () =>
|
|||
|
{
|
|||
|
return tm.ChamberPressure >= pressure;
|
|||
|
|
|||
|
}, timeout * 1000);
|
|||
|
|
|||
|
if (ret.Item1)
|
|||
|
{
|
|||
|
if (ret.Item2 == Result.TIMEOUT) //timeout
|
|||
|
{
|
|||
|
Stop($"{tm.Name} pressure can not above {pressure} in {timeout} seconds");
|
|||
|
throw (new RoutineFaildException());
|
|||
|
}
|
|||
|
else
|
|||
|
throw (new RoutineBreakException());
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|