Sic08/Modules/Mainframe/TMs/Routines/TMPressureBalanceRoutine.cs

311 lines
9.9 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;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
using SicModules.TMs.Routines.Base;
namespace SicModules.TMs.Routines
{
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());
}
}
}
}