2022-09-19 09:16:33 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using Aitex.Core.Common;
|
|
|
|
|
using Aitex.Core.RT.Device;
|
|
|
|
|
using Aitex.Core.RT.Fsm;
|
|
|
|
|
using Aitex.Core.Util;
|
|
|
|
|
using Aitex.Sorter.Common;
|
|
|
|
|
using MECF.Framework.Common.Equipment;
|
|
|
|
|
using MECF.Framework.Common.Schedulers;
|
|
|
|
|
using MECF.Framework.Common.SubstrateTrackings;
|
|
|
|
|
using Mainframe.LLs;
|
|
|
|
|
using SicRT.Equipments.Systems;
|
|
|
|
|
using SicRT.Modules.Schedulers;
|
|
|
|
|
|
|
|
|
|
namespace SicRT.Scheduler
|
|
|
|
|
{
|
|
|
|
|
public class SchedulerLoadLock : SchedulerModule
|
|
|
|
|
{
|
2022-11-14 09:22:13 +08:00
|
|
|
|
|
|
|
|
|
#region Variables
|
|
|
|
|
|
|
|
|
|
private LoadLockModuleBase _ll = null;
|
|
|
|
|
private ModuleName _taskRobot;
|
|
|
|
|
private int _taskSlot;
|
|
|
|
|
private int _entityTaskToken = (int)FSM_MSG.NONE;
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Constructors
|
2022-11-16 14:18:05 +08:00
|
|
|
|
|
2022-11-14 09:22:13 +08:00
|
|
|
|
public SchedulerLoadLock(ModuleName module) : base(module.ToString())
|
|
|
|
|
{
|
|
|
|
|
_module = module.ToString();
|
|
|
|
|
_ll = Singleton<EquipmentManager>.Instance.Modules[module] as LoadLockModuleBase;
|
|
|
|
|
}
|
2022-11-16 14:18:05 +08:00
|
|
|
|
|
2022-11-14 09:22:13 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Properties
|
2022-11-16 14:18:05 +08:00
|
|
|
|
|
2022-09-19 09:16:33 +08:00
|
|
|
|
public override bool IsAvailable
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
get { return _ll.IsIdle && _ll.IsOnline && CheckTaskDone() && _ll.CheckSlitValveClosed(); }
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool IsOnline
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
get { return _ll.IsOnline; }
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool IsError
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
get { return _ll.IsError; }
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-11-14 09:22:13 +08:00
|
|
|
|
public bool IsInPumping =>
|
|
|
|
|
_task == TaskType.Pump || _task == TaskType.Purge || _task == TaskType.PrepareTransfer;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-14 09:22:13 +08:00
|
|
|
|
/// <summary>
|
2022-11-17 10:31:18 +08:00
|
|
|
|
/// 是否执行放Wafer后,TM放Tray前的Purge。
|
|
|
|
|
/// <para>如果Tray来自TMRobot,放完Wafer马上Purge。</para>
|
|
|
|
|
/// <para>如果Tray来自TrayCassette,放完Tray以后统一Purge。</para>
|
2022-11-14 09:22:13 +08:00
|
|
|
|
/// </summary>
|
2022-11-17 10:31:18 +08:00
|
|
|
|
public bool HasPurgedAfterWaferPlaced { get; private set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 是否已执行组合后、TM取盘前的Purge.
|
|
|
|
|
/// <para>无论Tray来自TMRobot还是TrayRobot,Group以后一定要Purge。</para>
|
|
|
|
|
/// <para>Purge次数使用Sequence中的配置。</para>
|
|
|
|
|
public bool HasPurgedAfterGrouped { get; private set; }
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-14 09:22:13 +08:00
|
|
|
|
#endregion
|
2022-11-16 14:18:05 +08:00
|
|
|
|
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
|
|
|
|
public override bool PrepareTransfer(ModuleName robot, EnumTransferType type, int slot)
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
_task = TaskType.PrepareTransfer;
|
|
|
|
|
_taskRobot = robot;
|
|
|
|
|
_taskSlot = slot;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
LogTaskStart(_task, $"{robot} {type} slot {slot + 1}");
|
|
|
|
|
return _ll.PrepareTransfer(robot, Hand.Blade1, slot, type, out _);
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal bool CheckAtAtm()
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
SicLoadLock deviceLL = DEVICE.GetDevice<SicLoadLock>($"{_module}.{_module}");
|
|
|
|
|
return deviceLL.CheckAtm();
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
2022-11-16 14:18:05 +08:00
|
|
|
|
|
2022-09-19 09:16:33 +08:00
|
|
|
|
internal bool CheckAtVacuum()
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
SicLoadLock deviceLL = DEVICE.GetDevice<SicLoadLock>($"{_module}.{_module}");
|
|
|
|
|
return deviceLL.CheckVacuum();
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
2022-11-16 14:18:05 +08:00
|
|
|
|
|
2022-09-19 09:16:33 +08:00
|
|
|
|
internal void SetJobStatue()
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
SicLoadLock deviceLL = DEVICE.GetDevice<SicLoadLock>($"{_module}.{_module}");
|
|
|
|
|
//deviceLL.SetJobDoneStatus();
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool IsReadyForPick(ModuleName robot, int slot)
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
2022-09-19 09:16:33 +08:00
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (robot == ModuleName.WaferRobot)
|
|
|
|
|
{
|
|
|
|
|
return _ll.CheckReadyForTransfer(robot, Hand.Blade1, slot, EnumTransferType.Pick, out _)
|
|
|
|
|
&& WaferManager.Instance.CheckHasWafer(ModuleHelper.Converter(_module), slot);
|
|
|
|
|
}
|
|
|
|
|
else if (robot == ModuleName.TMRobot || robot == ModuleName.TrayRobot)
|
|
|
|
|
{
|
|
|
|
|
return _ll.CheckReadyForTransfer(robot, Hand.Blade1, slot, EnumTransferType.Pick, out _)
|
|
|
|
|
&& WaferManager.Instance.CheckHasTray(ModuleHelper.Converter(_module), slot);
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
return false;
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool IsReadyForPlace(ModuleName robot, int slot)
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
2022-09-19 09:16:33 +08:00
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (robot == ModuleName.WaferRobot)
|
|
|
|
|
{
|
|
|
|
|
return _ll.CheckReadyForTransfer(robot, Hand.Blade1, slot, EnumTransferType.Place, out _);
|
|
|
|
|
}
|
|
|
|
|
else if (robot == ModuleName.TMRobot || robot == ModuleName.TrayRobot)
|
|
|
|
|
{
|
|
|
|
|
return _ll.CheckReadyForTransfer(robot, Hand.Blade1, slot, EnumTransferType.Place, out _)
|
|
|
|
|
&& WaferManager.Instance.CheckNoTray(ModuleHelper.Converter(_module), slot);
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
return false;
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
2022-11-16 14:18:05 +08:00
|
|
|
|
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-14 09:22:13 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 重置HasPurged和HasGrouped标记。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void ResetPurgedAndGroupedStatus()
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
2022-11-17 10:31:18 +08:00
|
|
|
|
HasPurgedAfterWaferPlaced = false;
|
|
|
|
|
HasPurgedAfterGrouped = false;
|
2022-11-16 14:18:05 +08:00
|
|
|
|
}
|
2022-11-14 09:22:13 +08:00
|
|
|
|
}
|
2022-11-16 14:18:05 +08:00
|
|
|
|
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
|
|
|
|
public bool Vent()
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
_task = TaskType.Vent;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
_entityTaskToken = _ll.InvokeVent();
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
LogTaskStart(_task, $"{Module} vent to ATM");
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
return _entityTaskToken != (int)FSM_MSG.NONE;
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool Pump()
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
2022-09-19 09:16:33 +08:00
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
_entityTaskToken = _ll.InvokePump();
|
|
|
|
|
if (_entityTaskToken != (int)FSM_MSG.NONE)
|
|
|
|
|
{
|
|
|
|
|
_task = TaskType.Pump;
|
|
|
|
|
LogTaskStart(_task, $"{Module} pump to Vaccum");
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-17 18:01:52 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Wafer放好后,如果Tray将从TMRobot喂进来,执行此Purge。
|
|
|
|
|
/// <para>Purge次数有Configuration\LoadLock\Purge中的相关次数决定。</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="args"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public bool PurgeAfterWaferPlaced(params object[] args)
|
2022-09-19 09:16:33 +08:00
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
2022-09-19 09:16:33 +08:00
|
|
|
|
{
|
2022-11-17 18:01:52 +08:00
|
|
|
|
// 如果循环次数为0,则跳过此步骤。
|
|
|
|
|
if (args is null || (args[0] is int cycle && cycle <= 0))
|
|
|
|
|
{
|
|
|
|
|
LogTaskStart(_task, " Purge after wafer placed was ignored since the cycle is zero");
|
|
|
|
|
HasPurgedAfterGrouped = true;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_entityTaskToken = _ll.InvokePurge(args);
|
|
|
|
|
if (_entityTaskToken != (int)FSM_MSG.NONE)
|
|
|
|
|
{
|
|
|
|
|
_task = TaskType.Purge;
|
|
|
|
|
LogTaskStart(_task, $" Purge after wafer placed");
|
|
|
|
|
HasPurgedAfterWaferPlaced = true;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 当Wafer和Tray组合完毕后,执行此Purge。
|
|
|
|
|
/// <para>组合完毕后无条件支持此Purge,Purge次数有Sequence设定。</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="args"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public bool PurgeAfterGrouped(params object[] args)
|
|
|
|
|
{
|
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
// 如果循环次数为0,则跳过此步骤。
|
|
|
|
|
if (args is null || (args[0] is int cycle && cycle <= 0))
|
|
|
|
|
{
|
|
|
|
|
LogTaskStart(_task, " Purge after Grouping was ignored since the cycle is zero");
|
|
|
|
|
HasPurgedAfterGrouped = true;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_entityTaskToken = _ll.InvokePurge(args);
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (_entityTaskToken != (int)FSM_MSG.NONE)
|
|
|
|
|
{
|
|
|
|
|
_task = TaskType.Purge;
|
2022-11-17 18:01:52 +08:00
|
|
|
|
LogTaskStart(_task, $"Purge after grouping");
|
2022-11-17 10:31:18 +08:00
|
|
|
|
HasPurgedAfterGrouped = true;
|
2022-11-16 14:18:05 +08:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool GroupWaferTray()
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
2022-09-19 09:16:33 +08:00
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
_entityTaskToken = _ll.InvokeGroupWaferTray();
|
|
|
|
|
if (_entityTaskToken != (int)FSM_MSG.NONE)
|
|
|
|
|
{
|
|
|
|
|
_task = TaskType.Group;
|
|
|
|
|
LogTaskStart(_task, $"{Module} start group wafer and tray");
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool SeparateWaferTray()
|
|
|
|
|
{
|
2022-11-14 09:22:13 +08:00
|
|
|
|
throw new NotSupportedException();
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int? GetWaferPurgeCount(int slot)
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
if (!WaferManager.Instance.CheckHasWafer(Module, slot))
|
|
|
|
|
return null;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
WaferInfo wafer = WaferManager.Instance.GetWafer(Module, slot);
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null)
|
|
|
|
|
return null;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (wafer.NextSequenceStep >= wafer.ProcessJob.Sequence.Steps.Count)
|
|
|
|
|
return null;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules
|
|
|
|
|
.Any(m => m == ModuleName.LoadLock || m == ModuleName.Load))
|
|
|
|
|
return null;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepParameter.ContainsKey("PurgeCount"))
|
|
|
|
|
return null;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (int.TryParse(
|
|
|
|
|
wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepParameter["PurgeCount"].ToString(),
|
|
|
|
|
out int purgeCount))
|
|
|
|
|
{
|
|
|
|
|
return purgeCount;
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
return null;
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int? GetWaferPumpDelayTime(int slot)
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
if (!WaferManager.Instance.CheckHasWafer(Module, slot))
|
|
|
|
|
return null;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
WaferInfo wafer = WaferManager.Instance.GetWafer(Module, slot);
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null)
|
|
|
|
|
return null;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (wafer.NextSequenceStep >= wafer.ProcessJob.Sequence.Steps.Count)
|
|
|
|
|
return null;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules
|
|
|
|
|
.Any(m => m == ModuleName.LoadLock || m == ModuleName.Load))
|
|
|
|
|
return null;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepParameter.ContainsKey("PumpDelayTime"))
|
|
|
|
|
return null;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (int.TryParse(
|
|
|
|
|
wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepParameter["PumpDelayTime"]
|
|
|
|
|
.ToString(), out int pumpDelayTime))
|
|
|
|
|
{
|
|
|
|
|
return pumpDelayTime;
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
return null;
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool CheckWaferNextStepIsThis(ModuleName module, int slot)
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
if (!WaferManager.Instance.CheckHasWafer(module, slot))
|
|
|
|
|
return false;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
WaferInfo wafer = WaferManager.Instance.GetWafer(module, slot);
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null)
|
|
|
|
|
return false;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (wafer.NextSequenceStep >= wafer.ProcessJob.Sequence.Steps.Count)
|
|
|
|
|
return false;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules
|
|
|
|
|
.Any(m => m == ModuleName.LoadLock || m == ModuleName.Load))
|
|
|
|
|
return false;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
|
2022-11-16 14:18:05 +08:00
|
|
|
|
return true;
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool CheckWaferTrayGrouped()
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
return !_ll.CheckWaferClamped() && WaferManager.Instance.CheckHasWafer(Module, 0);
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool CheckWaferTraySeparated()
|
|
|
|
|
{
|
2022-11-14 09:22:13 +08:00
|
|
|
|
throw new NotSupportedException();
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool CheckSlitValveClosed()
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
return _ll.CheckSlitValveClosed();
|
|
|
|
|
}
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool Monitor()
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string GetTaskRunning()
|
|
|
|
|
{
|
|
|
|
|
return $"{_task.ToString()}/{_taskRobot}";
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool CheckTaskDone()
|
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
lock (SyncRoot)
|
2022-09-19 09:16:33 +08:00
|
|
|
|
{
|
2022-11-16 14:18:05 +08:00
|
|
|
|
bool ret = false;
|
|
|
|
|
switch (_task)
|
|
|
|
|
{
|
|
|
|
|
case TaskType.None:
|
|
|
|
|
ret = true;
|
|
|
|
|
break;
|
|
|
|
|
case TaskType.PrepareTransfer:
|
|
|
|
|
ret = _ll.CheckAcked(
|
|
|
|
|
_entityTaskToken); //&& _ll.CheckReadyForTransfer(_taskRobot, Hand.Blade1, _taskSlot, EnumTransferType.Place, out _);
|
|
|
|
|
break;
|
|
|
|
|
case TaskType.Cooling:
|
|
|
|
|
ret = _ll.CheckAcked(_entityTaskToken);
|
|
|
|
|
break;
|
|
|
|
|
case TaskType.Vent:
|
|
|
|
|
ret = _ll.CheckAcked(_entityTaskToken);
|
|
|
|
|
break;
|
|
|
|
|
case TaskType.Pump:
|
|
|
|
|
ret = _ll.CheckAcked(_entityTaskToken);
|
|
|
|
|
break;
|
|
|
|
|
case TaskType.Purge:
|
|
|
|
|
ret = _ll.CheckAcked(_entityTaskToken);
|
|
|
|
|
break;
|
|
|
|
|
case TaskType.Group:
|
|
|
|
|
ret = _ll.CheckAcked(_entityTaskToken);
|
|
|
|
|
break;
|
|
|
|
|
case TaskType.Separate:
|
|
|
|
|
ret = _ll.CheckAcked(_entityTaskToken);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ret && _task != TaskType.None)
|
|
|
|
|
{
|
|
|
|
|
LogTaskDone(_task, "");
|
|
|
|
|
_task = TaskType.None;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
2022-09-19 09:16:33 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|