using System.Linq; using Aitex.Core.RT.Event; using Aitex.Core.Util; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.SubstrateTrackings; 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) { // 传盘结束后,如果上个动作是Place,Wafer回到Cassette,则响蜂鸣器进行提示。 if (_lastTransferAction == TaskType.Place) { // PM1一定存在,PM2不一定;如果PM2不存在,则默认使用PM1的三色灯 var pmOfSt = _pm1; // 判断最后一次放的Wafer在哪个PM做的工艺,则点亮对应PM的蜂鸣器 var wi = GetWaferInfo(_lastTransferSlot); var whichPmName = wi.SubstHists.FirstOrDefault(x => x.locationID.Contains("PM")); if (whichPmName != null) { if (whichPmName.locationID.ToUpper() == "PM2" && _pm2 != null) pmOfSt = _pm2; } // 触发蜂鸣器 if (pmOfSt?.CreateProcessDoneSignal(out var reason) == false) EV.PostWarningLog(Module.ToString(), reason); } } 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 } }