using System.Linq; using SicModules.Cassettes; using SicModules.PMs; using SicRT.Equipments.Systems; namespace SicRT.Modules.Schedulers { public class SchedulerCassette : SchedulerModule { #region Variables private readonly CassetteModule _cass; private readonly PMModule _pm1, _pm2; /// /// 最后一次传盘动作是Pick还是Place。 /// private TaskType _lastTransferAction; /// /// 最后一次传盘的槽位。 /// private int _lastTransferSlot; #endregion #region Constructors public SchedulerCassette(ModuleName module) : base(module.ToString()) { _module = module.ToString(); _cass = Singleton.Instance.Modules[module] as CassetteModule; _pm1 = Singleton.Instance.Modules[ModuleName.PM1] as PMModule; _pm2 = Singleton.Instance.Modules[ModuleName.PM2] as PMModule; } #endregion #region Properties public override bool IsAvailable => IsOnline && _cass.IsIdle && CheckTaskDone(); public override bool IsOnline => _cass.IsOnline; public override bool IsError => _cass.IsError; #endregion #region Methods public bool Monitor() { return true; } public override bool IsReadyForPlace(ModuleName robot, int slot) { return WaferManager.Instance.CheckNoWafer(_cass.Module, slot) && WaferManager.Instance.CheckNoTray(ModuleHelper.Converter(_cass.Module), slot); } public override bool IsReadyForPick(ModuleName robot, int slot) { return true; } public bool WaitTransfer(ModuleName robot, bool isPick, int slot) { _lastTransferAction = isPick ? TaskType.Pick : TaskType.Place; _lastTransferSlot = slot; return base.WaitTransfer(robot); } public override bool StopWaitTransfer(ModuleName robot) { var ret = base.StopWaitTransfer(robot); if (ret) { // 当Wafer返回到Cassette时,触发警告,响蜂鸣器 if (_lastTransferAction == TaskType.Place && WaferManager.Instance.CheckHasWafer(_module, _lastTransferSlot)) { EV.PostMessage(Module.ToString(), EventEnum.PJ_DONE, _module, _lastTransferSlot.ToString()); } } return ret; } public override void ResetTask() { base.ResetTask(); _lastTransferAction = TaskType.None; _lastTransferSlot = -1; } public bool CheckTaskDone() { var taskSucceed = false; switch (_task) { case TaskType.None: taskSucceed = true; break; } return SuperCheckTaskDone(taskSucceed, _cass.IsIdle | _cass.IsError); } #endregion } }