using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.SubstrateTrackings; using System; namespace FurnaceRT.Equipments.FIMSs { public class FIMSHomeRoutine : ModuleRoutine, IRoutine { enum RoutineStep { Home, Delay, CheckHomeFinish, } private int _timeout; private FIMSModule _fimsModule; public FIMSHomeRoutine(FIMSModule fimsModule) { Module = fimsModule.Module.ToString(); _fimsModule = fimsModule; Name = "Home"; } public Result Init() { return Result.DONE; } public Result Start(params object[] objs) { Reset(); _timeout = SC.GetValue($"FIMS.{Module}.HomeTimeout"); if (!_fimsModule.SensorWaferRobotEX1AxisHomePosition.Value) { _fimsModule.HomeFailAlarm.Set($"wafer robot EX1 axis not at home position"); return Result.FAIL; } if (!_fimsModule.SensorWaferRobotEX2AxisHomePosition.Value) { _fimsModule.HomeFailAlarm.Set($"wafer robot EX2 axis not at home position"); return Result.FAIL; } //if (_fimsModule.FIMSDevice.DoorOpenCloseStatus == Devices.DeviceStatus.Open && _fimsModule.IsWaferOnRobot) //{ // _fimsModule.HomeFailAlarm.Set($"wafer robot inside {Module}"); // return Result.FAIL; //} Notify($"{_fimsModule.Name} {Name} start"); return Result.RUN; } public override Result Monitor() { try { PauseRountine(_fimsModule.FIMSDevice.IsPause); if (_fimsModule.FIMSDevice.IsPause) return Result.RUN; Home((int)RoutineStep.Home, _timeout); Delay((int)RoutineStep.Delay, 3); CheckHomeFinish((int)RoutineStep.CheckHomeFinish, _timeout); } catch (RoutineBreakException) { return Result.RUN; } catch (RoutineFaildException) { _fimsModule.Stop(); return Result.FAIL; } _fimsModule.FIMSDevice.IsInitCompleted = true; _fimsModule.FIMSDevice.IsLoadCompleted = false; _fimsModule.FIMSDevice.IsUnloadCompleted = true; _fimsModule.Stop(); Notify($"{_fimsModule.Name} {Name} finished"); return Result.DONE; } public void Abort() { _fimsModule.Stop(); } private void Home(int id, int timeout) { Tuple ret = ExecuteAndWait(id, () => { Notify($"{Module} home"); if (!_fimsModule.FIMSDevice.Init(out string reason)) { Stop(reason); return false; } return true; }, () => { return true; }, timeout * 1000); if (ret.Item1) { if (ret.Item2 == Result.FAIL) { throw (new RoutineFaildException()); } else if (ret.Item2 == Result.TIMEOUT) //timeout { _fimsModule.HomeTimeoutAlarm.Set($"home timeout, can not complete in {timeout} seconds"); throw (new RoutineFaildException()); } else throw (new RoutineBreakException()); } } private void CheckHomeFinish(int id, int timeout) { Tuple ret = ExecuteAndWait(id, () => { Notify($"Check {Module} home finish"); return true; }, () => { return _fimsModule.FIMSDevice.IsPLCInitCompleted && !_fimsModule.FIMSDevice.IsRunning; }, timeout * 1000); if (ret.Item1) { if (ret.Item2 == Result.FAIL) { throw (new RoutineFaildException()); } else if (ret.Item2 == Result.TIMEOUT) //timeout { _fimsModule.HomeTimeoutAlarm.Set($"home timeout, can not complete in {timeout} seconds"); throw (new RoutineFaildException()); } else throw (new RoutineBreakException()); } } } }