Sic02-new/Modules/Mainframe/LLs/LoadLockCoolingRoutine.cs

116 lines
2.8 KiB
C#

using System;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Device.Unit;
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.LoadLocks;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot.MAG7;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
namespace Mainframe.LLs
{
public class LoadLockCoolingRoutine : ModuleRoutine, IRoutine
{
enum RoutineStep
{
LiftMove,
Cooling,
}
private LoadLock _ll = null;
private int _timeout;
private int _paramCoolingTime;
public LoadLockCoolingRoutine(ModuleName module)
{
Module = module.ToString();
Name = "Cooling";
_ll = DEVICE.GetDevice<LoadLock>($"{module.ToString()}.{module.ToString()}");
}
public void Init(int coolingTime)
{
_paramCoolingTime = coolingTime;
}
public Result Start(params object[] objs)
{
Reset();
_timeout = SC.GetValue<int>("LoadLock.LiftMoveTimeout");
Notify("Start");
return Result.RUN;
}
public Result Monitor()
{
try
{
LiftMove((int)RoutineStep.LiftMove, 1, _timeout);
TimeDelay((int)RoutineStep.Cooling, _paramCoolingTime);
}
catch (RoutineBreakException)
{
return Result.RUN;
}
catch (RoutineFaildException)
{
return Result.FAIL;
}
Notify("Finished");
return Result.DONE;
}
public void Abort()
{
}
protected void LiftMove(int id, int slot, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Move {Module} Lift to {slot + 1}");
if (!_ll.SetLift(slot, out string reason))
{
Stop(reason);
return false;
}
return true;
}, () =>
{
return _ll.CheckLift(slot);
}, timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT) //timeout
{
Stop($"Timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
}
}