Sic08/SicRT/Equipments/Schedulers/SchedulerCassette.cs

115 lines
3.2 KiB
C#
Raw Normal View History

2023-05-05 16:09:03 +08:00
using System.Linq;
2023-04-13 15:35:13 +08:00
using SicModules.Cassettes;
2023-05-05 16:09:03 +08:00
using SicModules.PMs;
2023-03-03 15:42:13 +08:00
using SicRT.Equipments.Systems;
namespace SicRT.Modules.Schedulers
{
public class SchedulerCassette : SchedulerModule
{
2023-05-05 16:09:03 +08:00
#region Variables
2023-03-03 15:42:13 +08:00
2023-05-05 16:09:03 +08:00
private readonly CassetteModule _cass;
2023-03-03 15:42:13 +08:00
2023-05-05 16:09:03 +08:00
private readonly PMModule _pm1, _pm2;
/// <summary>
/// 最后一次传盘动作是Pick还是Place。
/// </summary>
private TaskType _lastTransferAction;
2023-03-03 15:42:13 +08:00
2023-05-05 16:09:03 +08:00
/// <summary>
/// 最后一次传盘的槽位。
/// </summary>
private int _lastTransferSlot;
2023-03-03 15:42:13 +08:00
2023-05-05 16:09:03 +08:00
#endregion
#region Constructors
2023-03-03 15:42:13 +08:00
public SchedulerCassette(ModuleName module) : base(module.ToString())
{
_module = module.ToString();
_cass = Singleton<EquipmentManager>.Instance.Modules[module] as CassetteModule;
2023-05-05 16:09:03 +08:00
_pm1 = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
_pm2 = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM2] as PMModule;
2023-03-03 15:42:13 +08:00
}
2023-05-05 16:09:03 +08:00
#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
2023-03-03 15:42:13 +08:00
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;
}
2023-05-05 16:09:03 +08:00
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))
2023-05-05 16:09:03 +08:00
{
EV.PostMessage(Module.ToString(), EventEnum.PJ_DONE, _module, _lastTransferSlot.ToString());
2023-05-05 16:09:03 +08:00
}
}
return ret;
}
public override void ResetTask()
{
base.ResetTask();
_lastTransferAction = TaskType.None;
_lastTransferSlot = -1;
}
2023-03-03 15:42:13 +08:00
public bool CheckTaskDone()
{
var taskSucceed = false;
switch (_task)
{
case TaskType.None:
taskSucceed = true;
break;
}
return SuperCheckTaskDone(taskSucceed, _cass.IsIdle | _cass.IsError);
}
2023-05-05 16:09:03 +08:00
#endregion
2023-03-03 15:42:13 +08:00
}
}