Sic05/Modules/SicPM1/Routines/PMBaseRoutine.cs

2177 lines
69 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 System.Collections.Generic;
using Aitex.Core.Common.DeviceData;
using Aitex.Core.RT.Device.Devices;
using Aitex.Core.RT.Device.Unit;
using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Equipment;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
namespace SicPM1.Routines
{
public class PMBaseRoutine : ModuleRoutine, IRoutine
{
protected PressureUpOrDown currentPressureUpOrDown = PressureUpOrDown.None;
protected PressureLevel _lastPressureLevel = PressureLevel.Leavel0;
protected bool _checkPMPressureOver1000;
protected bool _checkPMPt2Over1000;
protected bool _checkChamberLowThan20 = false;
protected bool _checkChamberHighThan20 = false;
protected bool _v72IsOpen = false;
protected bool _finalOpen = false;
protected bool _isTvOpen = false;
protected bool _isEPV2Open = false;
protected bool _setMfc291519to38Flag = false; //在LidOpen和LidClose过程中是否已经设置过了MFC的值
protected enum PressureLevel
{
Leavel0 = 50,
Leavel1 = 150,
Leavel2 = 250,
Leavel3 = 350,
Leavel4 = 450,
Leavel5 = 550,
Leavel6 = 650,
Leavel7 = 750,
Leavel8 = 850,
Leavel9 = 950,
Leavel10= 1150,
}
protected PressureLevel GetPressure(double pressure)
{
if (pressure < 100)
{
return PressureLevel.Leavel0;
}
else if (pressure < 200)
{
return PressureLevel.Leavel1;
}
else if (pressure < 300)
{
return PressureLevel.Leavel2;
}
else if (pressure < 400)
{
return PressureLevel.Leavel3;
}
else if (pressure < 500)
{
return PressureLevel.Leavel4;
}
else if (pressure < 600)
{
return PressureLevel.Leavel5;
}
else if (pressure < 700)
{
return PressureLevel.Leavel6;
}
else if (pressure < 800)
{
return PressureLevel.Leavel7;
}
else if (pressure < 900)
{
return PressureLevel.Leavel8;
}
else
{
return PressureLevel.Leavel9;
}
}
protected enum PressureUpOrDown
{
Uping,
Dowing,
None,
}
protected PM1Module PmDevice
{
get { return _pm; }
}
private PM1Module _pm;
public PMBaseRoutine(ModuleName module, PM1Module pm1)
{
Module = module.ToString();
_pm = pm1;
}
public virtual Result Start(params object[] objs)
{
return Result.DONE;
}
public virtual Result Monitor()
{
return Result.DONE;
}
public virtual void Abort()
{
_pm.SetMfcToDefaultByGroup(MfcGroupName.M27toM40);
}
protected void PreparePump(int id, PMModuleBase pm, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"{pm.Name} prepare pump");
if (!pm.PreparePump(out string reason))
{
Stop(reason);
return false;
}
return true;
}, () =>
{
return pm.CheckPreparePump();
}, timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
if (ret.Item2 == Result.TIMEOUT)
{
Stop($"{pm.Name} prepare pump timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
{
throw (new RoutineBreakException());
}
}
}
protected void TurnPumpOn(int id, PMModuleBase pm, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Turn on {pm.Name} pump");
if (!pm.TurnOnPump(out string reason))
{
Stop(reason);
return false;
}
return true;
}, () =>
{
return pm.CheckPumpIsOn();
}, timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
if (ret.Item2 == Result.TIMEOUT)
{
Stop($"{pm.Name} turn on pump timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
{
throw (new RoutineBreakException());
}
}
}
protected void PumpToBase(int id, PMModuleBase pm, double basePressure, int tvPosition, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Run {pm.Name} pump to base pressure {basePressure:F2} mbar");
if (!pm.FastPump(tvPosition, out string reason))
{
Stop(reason);
return false;
}
return true;
}, () =>
{
if (pm.IsError)
{
Stop($"{pm.Name} error");
return null;
}
return pm.ChamberPressure < basePressure;
}, timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT) //timeout
{
Stop($"{pm.Name} pump to base pressure {basePressure:F2} timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void PumpToHighVacuum(int id, string stepName, PM pm, double pumpHighVacuumPressure, int tvPosition, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Run {pm.Name} fast pump to {pumpHighVacuumPressure:F2} mbar");
//if (!pm.FastPump(tvPosition, out string reason))
//{
// Stop(reason);
// return false;
//}
_stepSpan = new TimeSpan(0, 0, 0, (int)timeout);
_stepStartTime = DateTime.Now;
_stepName = stepName;
return true;
}, () =>
{
if (pm.IsError)
{
Stop($"{pm.Name} error");
return null;
}
return pm.ChamberPressure < pumpHighVacuumPressure;
}, timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT) //timeout
{
Stop($"{pm.Name} pump to gas line pump pressure timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SlowPump(int id, PMModuleBase pm, double slowPumpBasePressure, int tvPosition, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Run {pm.Name} slow pump to {slowPumpBasePressure:F2} mbar");
if (!pm.SlowPump(tvPosition, out string reason))
{
Stop(reason);
return false;
}
return true;
}, () =>
{
if (pm.IsError)
{
Stop($"{pm.Name} error");
return null;
}
return pm.ChamberPressure < slowPumpBasePressure;
}, timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT) //timeout
{
Stop($"{pm.Name} slow pump timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void CheckForelinePressure(int id, string stepName, PM pm, double forelineBasePressure, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Run {pm.Name} check foreline pressure lower than {forelineBasePressure:F2} mbar");
_stepSpan = new TimeSpan(0, 0, 0, (int)timeout);
_stepStartTime = DateTime.Now;
_stepName = stepName;
return true;
}, () =>
{
if (pm.IsError)
{
Stop($"{pm.Name} error");
return null;
}
return pm.ForelinePressure <= forelineBasePressure;
}, timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT) //timeout
{
Stop($"{pm.Name} wait foreline lower than {forelineBasePressure:F2} mbar timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void CheckPumpOn(int id, PMModuleBase pm)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Run {pm.Name} check pump is on");
if (!pm.CheckPumpIsOn())
{
Stop("Pump not on");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
{
throw (new RoutineBreakException());
}
}
}
protected void CheckChamberOk(int id, PMModuleBase pm)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Run {pm.Name} check chamber running no error");
if (pm.IsError)
{
Stop($"{pm.Name} error");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
{
throw (new RoutineBreakException());
}
}
}
protected void EnableRotation(int id, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set {Module} rotation enable");
if (!_pm.SetRotationEnable(true, out string reason))
{
Stop($"Set {Module} rotation enable failed, {reason}");
return false;
}
return true;
}, () =>
{
return _pm.CheckRotationEnable();
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set {Module} rotation enable timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
//protected void EnableHeater(int id,int timeout)
//{
// Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
// {
// Notify($"Set {_pm.Name} Heater Enable");
// if (!_pm.EnableHeater(true, out string reason))
// {
// Stop($"Set {_pm.Name} Heater Enable failed, {reason}");
// return false;
// }
// return true;
// }, () =>
// {
// return _pm.CheckHeaterEnable();
// }, timeout * 1000);
// if (ret.Item1)
// {
// if (ret.Item2 == Result.FAIL)
// {
// throw (new RoutineFaildException());
// }
// if (ret.Item2 == Result.TIMEOUT)
// {
// Stop($"Set {_pm.Name} Heater Enable timeout, over {timeout} seconds");
// throw (new RoutineFaildException());
// }
// else
// {
// throw (new RoutineBreakException());
// }
// }
//}
/// <summary>
/// 设置电机转速
/// </summary>
/// <param name="checkSpeed">检查是否低于此速度</param>
protected void SetRotationValve(int id, float checkSpeed,bool bigThan, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set {Module} rotation to {checkSpeed}");
if (!_pm.SetRotationServo(checkSpeed, 0))
{
Stop($"Set {Module} rotation error");
return false;
}
return true;
}, () =>
{
return _pm.CheckRotationServoOn(checkSpeed, bigThan);
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"{Module} rotation move timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetRotationValveAndNoWait(int id, float checkSpeed)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
//Notify($"Set {Module} rotation");
if (!_pm.SetRotationServo(checkSpeed, 0))
{
//Stop($"Set {Module} rotation error");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void WaitRotationValve(int id, float checkSpeed, bool bigThan, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Wait {Module} rotation to {checkSpeed}");
return true;
}, () =>
{
return _pm.CheckRotationServoOn(checkSpeed, bigThan);
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"{Module} rotation move timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetHeatEnable(int id, bool enable, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
string state = enable ? "true" : "false";
Notify($"Set {Module} heat {state}");
if (!_pm.SetHeatEnable(enable))
{
Stop($"Set {Module} heat error");
return false;
}
return true;
}, () =>
{
return _pm.CheckHeatEnable(enable);
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"{Module} Set heat timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetPSUEnable(int id, bool enable, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set {Module} heat TC1");
if (!_pm.SetHeatEnableTC(enable,true))
{
Stop($"Set {Module} heat TC1 error");
return false;
}
return true;
}, () =>
{
return _pm.CheckHeatEnableTC(enable,true);
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"{Module} Set heat TC1 timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetSCRReset(int id)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set {Module} SCR Reset");
if (!_pm.SetSCRReset())
{
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetSCREnable(int id, bool enable, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set {Module} heat TC2");
if (!_pm.SetHeatEnableTC(enable,false))
{
Stop($"Set {Module} heat TC2 error");
return false;
}
return true;
}, () =>
{
return _pm.CheckHeatEnableTC(enable,false);
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"{Module} Set heat TC2 timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetPSUHeatMode(int id, float mode)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set PSU HeatMode");
if (!_pm.TC1.SetHeaterMode(mode,0))
{
Stop($"Set PSU HeatMode error");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetPSUHeatRatio(int id,float lp1,float lp2,float lp3)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set PSU Ratio");
if (!_pm.TC1.SetRatio(lp1, lp2, lp3))
{
Stop($"Set PSU Ratio error");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
//protected void SetTC1PowerRef(int id, float powerRef)
//{
// Tuple<bool, Result> ret = Execute(id, () =>
// {
// Notify($"Set PSU PowerRef1");
// if (!_pm.TC1.SetPowerRef1(powerRef))
// {
// Stop($"Set PSU SetPowerRef1 error");
// return false;
// }
// return true;
// });
// if (ret.Item1)
// {
// if (ret.Item2 == Result.FAIL)
// {
// throw (new RoutineFaildException());
// }
// else
// throw (new RoutineBreakException());
// }
//}
protected void SetSCRHeatMode(int id, float mode)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set SCR HeatMode");
if (!_pm.TC2.SetHeaterMode2(mode,0))
{
Stop($"Set SCR HeatMode error");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetSCRHeatRatio(int id, float lp1, float lp2, float lp3)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set SCR Ratio");
if (!_pm.TC2.SetRatio(lp1, lp2, lp3))
{
Stop($"Set SCR Ratio error");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
//protected void SetTC2PowerRef(int id, float powerRef)
//{
// Tuple<bool, Result> ret = Execute(id, () =>
// {
// Notify($"Set SCR PowerRef1");
// if (!_pm.TC2.SetPowerRef(powerRef))
// {
// Stop($"Set SCR SetPowerRef1 error");
// return false;
// }
// return true;
// });
// if (ret.Item1)
// {
// if (ret.Item2 == Result.FAIL)
// {
// throw (new RoutineFaildException());
// }
// else
// throw (new RoutineBreakException());
// }
//}
protected void CheckFinalIoStatue(int id)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Check Final valve is open or closed!");
_finalOpen = _pm.CheckIOValueByGroup(IoGroupName.Final1, true) && _pm.CheckIOValueByGroup(IoGroupName.Final2, true);
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
{
throw (new RoutineBreakException());
}
}
}
protected void CheckTvOpen(int id)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
_isTvOpen = _pm._ioThrottleValve.TVValveEnable && _pm._ioThrottleValve.PressureMode == PressureCtrlMode.TVPressureCtrl;
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
{
throw (new RoutineBreakException());
}
}
}
protected void CheckEPV2Open(int id)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
_isEPV2Open = _pm.EPV2.Status;
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
{
throw (new RoutineBreakException());
}
}
}
protected void CheckChamberV72Open(int id,double pressure)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
_v72IsOpen = _pm.CheckIOValueByGroup(IoGroupName.VentPump, true) && _pm.CheckIOValueByGroup(IoGroupName.V888990, true) && _pm.PT1.FeedBack >= pressure;
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
{
throw (new RoutineBreakException());
}
}
}
protected void WaitV27Open(int id, int timeout)
{
Tuple<bool, Result> ret = Wait(id, () =>
{
return _pm.CheckIOValueByGroup(IoGroupName.V27,true);
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Wait V27 Open Timeout;");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void WaitChamberPressUpTo(int id, double press, int timeout)
{
Tuple<bool, Result> ret = Wait(id, () =>
{
return _pm.GetChamberPressure() >= press;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Wait Chamber Pressure to {press} Timeout,over {timeout} seconds;");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void WaitChamberPressDownTo(int id, double press, double _pmPressureMaxDiff, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Wait pm pressure to {press} mbar");
return true;
},
() =>
{
return Math.Abs(_pm.GetChamberPressure() - press) <= _pmPressureMaxDiff;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Wait Chamber Pressure Down to {press} Timeout,over {timeout} seconds;");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetIoValueByGroup(int id, IoGroupName groupName, bool close, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify((close ? "Open" : "Close") + $" {groupName.ToString()} value");
return _pm.SetIOValueByGroup(groupName, close);
}, () =>
{
return _pm.CheckIOValueByGroup(groupName, close);
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop((close ? "Open" : "Close") + $" {groupName.ToString()} value timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetIoValueByGroupNoWait(int id, IoGroupName groupName, bool close)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify((close ? "Open" : "Close") + $" {groupName.ToString()} value");
return _pm.SetIOValueByGroup(groupName, close);
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void OpenH2Valve(int id, PM1Module pm1, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Open {pm1.Name} V31 valve");
if (!pm1.V31.TurnValve(true, out string reason))
{
Stop($"Open {pm1.Name} V31 valve failed, {reason}");
return false;
}
return true;
}, () =>
{
return pm1.V31.Status;
}, timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Open {pm1.Name} V31 valve timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
{
throw (new RoutineBreakException());
}
}
}
protected void SetMfcModeToNormalByGroup(int id, MfcGroupName groupName)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set {groupName.ToString()} MFC Mode to normal");
_pm.SetMfcModelToNormal(groupName);
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetMfcToDefaultByGroup(int id, MfcGroupName groupName,int time)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set {GetMfcTipsByGroup(groupName)} MFC value to default");
if (!_pm.SetMfcToDefaultByGroupRamp(groupName, time))
{
Stop($"Set {GetMfcTipsByGroup(groupName)} MFC value to default failed");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetMfc28to40Special(int id, double mfc28Flow,double mfc29Flow,double mfc31Flow, double mfc40Flow,int time)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set MFC28,29,31,40 to {mfc28Flow},{mfc29Flow},{mfc31Flow},{mfc40Flow}");
if (!_pm.SetMFC28to40Special(mfc28Flow, mfc29Flow, mfc31Flow, mfc40Flow, time))
{
Stop($"Set MFC28,29,31,40 to {mfc28Flow},{mfc29Flow},{mfc31Flow},{mfc40Flow} failed");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetMfcByGroup(int id, MfcGroupName groupName, double dValue,int time)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set {GetMfcTipsByGroup(groupName)} MFC value to {dValue}");
if (!_pm.SetMfcByGroup(groupName, dValue, time))
{
Stop($"Set {GetMfcTipsByGroup(groupName)} MFC value to {dValue} failed");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetMfcForPurgeConfigByGroup(int id, MfcGroupName groupName, string dValue, int time)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set {GetMfcTipsByGroup(groupName)} MFC value to {dValue}");
if (!_pm.SetMfcForPurgeConfigByGroup(groupName, dValue, time))
{
Stop($"Set {GetMfcTipsByGroup(groupName)} MFC value by config {dValue} failed");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetMfcRampByGroupAndPressureAlways(PressureUpOrDown presOpera)
{
try
{
if (presOpera == PressureUpOrDown.None)
{
return;
}
else
{
PressureLevel level = GetPressure(_pm.GetChamberPressure());
if ((int)level != (int)_lastPressureLevel)
{
int cIntLv = (int)level;
if (cIntLv < 100)
{
Notify($"Set MFC28,29,31,40 to pressureLevel [20-100]");
}
else if (cIntLv >= 950)
{
Notify($"Set MFC28,29,31,40 to pressureLevel [950]");
}
else
{
Notify($"Set MFC28,29,31,40 to pressureLevel [{cIntLv - 50},{cIntLv + 50})");
}
_lastPressureLevel = level;
_pm.SetMfcRampByGroupAndPressure(MfcGroupName.M28293140, Convert.ToDouble((int)level));
}
}
}
catch
{
}
}
protected void SetPcModeToNormal(int id, List<int> _lstPcList)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
string str = null;
foreach (var item in _lstPcList)
{
str += item.ToString() + ",";
}
str=str.Remove(str.Length-1);
Notify($"Set PC{str} mode to normal");
if (!_pm.SetPcModelToNormal(_lstPcList))
{
Stop($"Set PC{str} mode to normal failed");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetPcModel(int id, List<int> _lstPcList,PcCtrlMode mode)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
string str = null;
foreach (var item in _lstPcList)
{
str += item.ToString() + ",";
}
str = str.Remove(str.Length - 1);
Notify($"Set PC{str} mode to {mode.ToString()}");
if (!_pm.SetPcModel(_lstPcList,mode))
{
Stop($"Set PC{str} mode to {mode.ToString()} failed");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetPcToDefault(int id, List<int> _lstPcList)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
string str = null;
foreach (var item in _lstPcList)
{
str += item.ToString() + ",";
}
str = str.Remove(str.Length - 1);
Notify($"Set PC{str} value to default");
if (!_pm.SetPCValueToDefault(_lstPcList))
{
Stop($"Set PC{str} value to default failed");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
//protected void SetThrottlePositionToZero(int id, IoThrottleValve2 _IoThrottle)
//{
// Tuple<bool, Result> ret = Execute(id, () =>
// {
// Notify($"Set Throttle pozition to 0");
// _IoThrottle.SetPositionToZero("", null);
// return true;
// });
// if (ret.Item1)
// {
// if (ret.Item2 == Result.FAIL)
// {
// throw (new RoutineFaildException());
// }
// else
// throw (new RoutineBreakException());
// }
//}
//protected void SetThrottlePressureToCurrent(int id, IoThrottleValve2 _IoThrottle)
//{
// Tuple<bool, Result> ret = Execute(id, () =>
// {
// double currentPressure = _pm.PT1.FeedBack;
// Notify($"Set Throttle value to {currentPressure}");
// string reason = String.Empty;
// if (!_IoThrottle.SetPressure(out reason, 0, new object[] { currentPressure }))
// {
// Stop($"Set Throttle value to {currentPressure} failed");
// return false;
// }
// return true;
// });
// if (ret.Item1)
// {
// if (ret.Item2 == Result.FAIL)
// {
// throw (new RoutineFaildException());
// }
// else
// throw (new RoutineBreakException());
// }
//}
//protected void SetThrottlePressureAndSetMfcRamp(int id, IoThrottleValve2 _IoThrottle, MfcGroupName groupName, double pressure, double _pmPressureMaxDiff, int timeout)
//{
// Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
// {
// Notify($"Set Throttle value to {pressure}");
// string reason = String.Empty;
// _pm.SetMfcRampByGroupAndPressure(groupName, pressure);
// _IoThrottle.SetPressure(out reason, 0, new object[] { pressure });
// return true;
// },
// () =>
// {
// return Math.Abs(_IoThrottle.PressureFeedback - pressure) <= _pmPressureMaxDiff;
// },
// timeout * 1000);
// if (ret.Item1)
// {
// if (ret.Item2 == Result.FAIL)
// {
// throw (new RoutineFaildException());
// }
// else if (ret.Item2 == Result.TIMEOUT)
// {
// Stop($"Set Throttle Pressure to {pressure} timeout, over {timeout} seconds");
// throw (new RoutineFaildException());
// }
// else
// throw (new RoutineBreakException());
// }
//}
/// <summary>
/// 设置压力是上升还是下降趋势以便调节特殊MFC的流量
/// </summary>
/// <param name="id"></param>
/// <param name="pressureUpOrD"></param>
protected void SetPressureUpOrDown(int id,PressureUpOrDown pressureUpOrD)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
_setMfc291519to38Flag = false;
currentPressureUpOrDown = pressureUpOrD;
if (currentPressureUpOrDown == PressureUpOrDown.Uping)
{
_lastPressureLevel = PressureLevel.Leavel10;
}
else if (currentPressureUpOrDown == PressureUpOrDown.Dowing)
{
_lastPressureLevel = PressureLevel.Leavel10;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetPressureUpOrDown(int id,double targetPressure)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
if (_pm.PT1.FeedBack > targetPressure)
{
currentPressureUpOrDown = PressureUpOrDown.Dowing;
}
else
{
currentPressureUpOrDown = PressureUpOrDown.Uping;
}
if (currentPressureUpOrDown == PressureUpOrDown.Uping)
{
_lastPressureLevel = PressureLevel.Leavel0;
}
else if (currentPressureUpOrDown == PressureUpOrDown.Dowing)
{
_lastPressureLevel = PressureLevel.Leavel9;
}
Notify($"Set PressureUpOrDown {currentPressureUpOrDown.ToString()}");
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
/// <summary>
/// 检查PM压力是否超过定值,以便省略步骤
/// </summary>
/// <param name="id"></param>
/// <param name="pmPressure"></param>
protected void GetPressureCondition(int id,double pmPressure)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Check PM Pressure over {pmPressure}");
_checkPMPressureOver1000 = _pm.GetChamberPressure() > pmPressure;
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
/// <summary>
/// 检查PM压力是否超过定值,以便省略步骤
/// </summary>
/// <param name="id"></param>
/// <param name="pmPressure"></param>
protected void GetPressureConditionPT2(int id, double pmPressure)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
_checkPMPt2Over1000 = _pm.PT2.FeedBack > pmPressure;
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
/// <summary>
/// 等待PM压力达到特定值
/// </summary>
/// <param name="id"></param>
/// <param name="pressure"></param>
/// <param name="timeout"></param>
protected void WaitPmPressureUPto(int id, double pressure, int timeout)
{
Tuple<bool, Result> ret = Wait(id, () =>
{
return _pm.GetChamberPressure() > pressure;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Wait Pm Pressure to {pressure} timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetThrottlePressureAndWaitSetPoint(int id, IoThrottleValve2 _IoThrottle, double pressure, double _pmPressureMaxDiff, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set Throttle pressure to {pressure} and wait");
string reason = String.Empty;
//将当前值赋值给设定值
_IoThrottle.PressureSetpoint = _IoThrottle.PressureFeedback;
if (!_IoThrottle.SetPressure(out reason, 0, new object[] { pressure }))
{
Stop($"Set Throttle pressure to { pressure} failed, { reason}");
return false;
}
return true;
},
() =>
{
return Math.Abs(_IoThrottle.PressureSetpoint - pressure) <= 1;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set Throttle Pressure to {pressure} timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetThrottlePressureAndWait(int id, IoThrottleValve2 _IoThrottle, double pressure, double _pmPressureMaxDiff, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set Throttle pressure to {pressure} and wait");
string reason = String.Empty;
if (!_IoThrottle.SetPressure(out reason, 0, new object[] { pressure }))
{
Stop($"Set Throttle pressure to { pressure} failed, { reason}");
return false;
}
return true;
},
() =>
{
return Math.Abs(_IoThrottle.PressureFeedback - pressure) <= _pmPressureMaxDiff;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set Throttle Pressure to {pressure} timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetThrottleToTargetAndNoWait(int id, IoThrottleValve2 _IoThrottle, double pressure)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set Throttle pressure to {pressure}");
string reason = String.Empty;
if (!_IoThrottle.SetPressure(out reason, 0, new object[] { pressure }))
{
Stop($"Set Throttle pressure to {pressure} failed, {reason}");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void WaitThrottleToPressureAndSetMfcSpecial(int id, IoThrottleValve2 _IoThrottle, double pressure, double _pmPressureMaxDiff, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
return true;
},
() =>
{
SetMfcRampByGroupAndPressureAlways(currentPressureUpOrDown);
return Math.Abs(_IoThrottle.PressureFeedback - pressure) <= _pmPressureMaxDiff;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set Throttle Pressure to {pressure} timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void WaitPMPressureAndSetMfcSpecial(int id, double pressure, int timeout)
{
Tuple<bool, Result> ret = Wait(id, () =>
{
SetMfcRampByGroupAndPressureAlways(PressureUpOrDown.Uping);
return _pm.GetChamberPressure() >= pressure;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set PM Pressure to {pressure} timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
/// <summary>
/// 等待压力上升下降过程中(顺便调节MFC2,9,15,19到38 以及特殊MFC流量)
/// </summary>
/// <param name="id"></param>
/// <param name="_IoThrottle"></param>
/// <param name="pressure"></param>
/// <param name="_pmPressureMaxDiff"></param>
/// <param name="timeout"></param>
protected void WaitThrottleToPressureAndSetMfcSpecialForLidOpen(int id, IoThrottleValve2 _IoThrottle, double pressure, double _pmPressureMaxDiff, int timeout)
{
Tuple<bool, Result> ret = Wait(id, () =>
{
if (_IoThrottle.PressureFeedback > 20)
{
SetMfcRampByGroupAndPressureAlways(currentPressureUpOrDown);
}
if (!_setMfc291519to38Flag && currentPressureUpOrDown == PressureUpOrDown.Dowing && _IoThrottle.PressureFeedback < 20)
{
Notify($"Set M2toM40 value to 0 ");
_pm.SetMfcByGroup(MfcGroupName.M2toM40, 0, 2);
_setMfc291519to38Flag = true;
}
else if (!_setMfc291519to38Flag && currentPressureUpOrDown == PressureUpOrDown.Uping && _IoThrottle.PressureFeedback < 20)
{
Notify($"Set M2toM40 value to default");
_pm.SetMfcToDefaultByGroupRamp(MfcGroupName.M2toM40, 2);
_setMfc291519to38Flag = true;
}
return Math.Abs(_IoThrottle.PressureFeedback - pressure) <= _pmPressureMaxDiff;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set Throttle Pressure to {pressure} timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
/// <summary>
/// 在Wait步骤之前打印日志
/// </summary>
/// <param name="id"></param>
/// <param name="message"></param>
protected void NotifyInfo(int id,string message)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify(message);
return true;
});
}
protected void SetThrottleToPressModeAndWait(int id, IoThrottleValve2 _IoThrottle, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set Throttle To PressMode");
if (!_IoThrottle.SetMode(Aitex.Core.Common.DeviceData.PressureCtrlMode.TVPressureCtrl, out string reason))
{
Stop($"Set Throttle To PressMode failed, {reason}");
return false;
}
return true;
}, () =>
{
return _IoThrottle.ControlModeFeedback == Aitex.Core.Common.DeviceData.PressureCtrlMode.TVPressureCtrl;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set Throttle To PressMode timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetThrottleToCloseMode(int id, IoThrottleValve2 _IoThrottle, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set Throttle To CloseMode");
if (!_IoThrottle.SetMode(Aitex.Core.Common.DeviceData.PressureCtrlMode.TVClose, out string reason))
{
Stop($"Set Throttle To CloseMode failed, {reason}");
return false;
}
return true;
}, () =>
{
return _IoThrottle.ControlModeFeedback == PressureCtrlMode.TVClose;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set Throttle To CloseMode timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
//设置蝶阀为位置模式
protected void SetThrottleToPositionMode(int id, IoThrottleValve2 _IoThrottle, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set Throttle To PositionMode");
if (!_IoThrottle.SetMode(PressureCtrlMode.TVPositionCtrl, out string reason))
{
Stop($"Set Throttle To PositionMode failed, {reason}");
return false;
}
return true;
}, () =>
{
return _IoThrottle.ControlModeFeedback == PressureCtrlMode.TVPositionCtrl;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set Throttle To PositionMode timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetThrottleSetPositionNoWait(int id, IoThrottleValve2 _IoThrottle, float position, int timeout)
{
Tuple<bool, Result> ret = Execute(id, () =>
{
Notify($"Set Throttle To Position to {position}");
if (!_IoThrottle.SetPosition(out string reason, timeout, new object[] { position }))
{
Stop($"Set Throttle To Position to {position} failed, {reason}");
return false;
}
return true;
});
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetThrottleSetPosition(int id, IoThrottleValve2 _IoThrottle, float position,int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set Throttle To Position to {position}");
if (!_IoThrottle.SetPosition(out string reason,timeout,new object[] { position}))
{
Stop($"Set Throttle To Position to {position} failed, {reason}");
return false;
}
return true;
}, () =>
{
return _IoThrottle.PositionFeedback == position;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set Throttle To Position to {position} timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetThrottleEnableAndWait(int id, IoThrottleValve2 _IoThrottle, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set Throttle Enable");
if (!_IoThrottle.SetTVEnableState(true, out string reason))
{
Stop(reason);
return false;
}
return true;
}, () =>
{
return _IoThrottle.TVValveEnable == true ;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set Throttle Enable timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetThrottleDisable(int id, IoThrottleValve2 _IoThrottle,int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set Throttle to Disable");
string reason = String.Empty;
if (!_IoThrottle.SetTVEnableState(false, out reason))
{
Stop(reason);
return false;
}
return true;
},
() =>
{
return _IoThrottle.TVValveEnable == false ;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set Throttle to Disable timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected bool IsCmdSkip(string cmd)
{
if (cmd == "StepUid" || cmd == "SiSourTotalFlow" || cmd == "CSourTotalFlow" || cmd == "DopeTotalFlow" || cmd == "TotalVentFlow")
return true;
return false;
}
protected string GetMfcTipsByGroup(MfcGroupName groupName)
{
return groupName.ToString();
}
protected void SetConfinementRingUpAndWait(int id, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set ConfinementRing Up");
if (!_pm.ConfinementRing.MoveUpPos(out string reason))
{
Stop(reason);
return false;
}
return true;
}, () =>
{
return _pm.ConfinementRing.RingDone && _pm.ConfinementRing.RingUpSensor;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set ConfinementRing Up, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void SetConfinementRingDownAndWait(int id, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set ConfinementRing Down");
if(!_pm.ConfinementRing.MoveDownPos(out string reason))
{
Stop(reason);
return false;
}
return true;
}, () =>
{
return _pm.ConfinementRing.RingDone && _pm.ConfinementRing.RingDownSensor;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set ConfinementRing Down, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void ConfinementServoOn(int id,int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set ConfinementRing Servo On");
if (!_pm.ConfinementRing.ServoOn(out string reason))
{
Stop(reason);
return false;
}
return true;
},()=>
{
return _pm.ConfinementRing.RingServoOn;
}, timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set ConfinementRing Servo On Failed, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void RotationServoOn(int id, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Set Rotation Servo On");
if (!_pm._sicServo.SetServoEnable(true,out string reason))
{
Stop(reason);
return false;
}
return true;
}, () =>
{
return _pm._sicServo.ServoEnable;
},timeout *1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"Set Rotation Servo On Failed, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
}
}