using Aitex.Core.Common.DeviceData; using Aitex.Core.Util; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.SubstrateTrackings; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aitex.Core.RT.Device; using Aitex.Core.RT.Event; using Aitex.Core.RT.Log; using Aitex.Sorter.Common; using Venus_RT.Modules; using MECF.Framework.Common.Schedulers; using Venus_RT.Devices; using Aitex.Core.Common; using Venus_Core; namespace Venus_RT.Scheduler { public class WaferMoveArgs : EventArgs { public ModuleName SrcModule { get; set; } public int SrcSlot { get; set; } public ModuleName DstModule { get; set; } public int DstSlot { get; set; } public WaferMoveArgs(ModuleName sourceModule, int sourceSlot, ModuleName dstModule, int dstSlot) { SrcModule = sourceModule; SrcSlot = sourceSlot; DstModule = dstModule; DstSlot = dstSlot; } } public class SchedulerModule { public enum TaskType { None, PrepareTransfer, Pick, Place, PickAndPlace, PostTransfer, Preprocess, Process, PostProcess, IdlePurgeProcess, IdleCleanProcess, PreJobProcess, CompleteJobProcess, OpenCover, CloseCover, Load, Unload, Align, TransferTarget, Cooling, Heating, Map, Goto, Flip, } public ModuleName Module { get { return ModuleHelper.Converter(_module); } } public virtual bool IsAvailable { get; } public virtual bool IsOnline { get; } public virtual bool IsIdle { get; } public virtual bool IsError { get; } public virtual bool IsAtm { get { return true; } } public virtual bool IsVac { get { return false; } } public int InTransferSlot { get { return _inTransferSlot; } } protected string _module; protected TaskType _task = TaskType.None; protected EnumTransferType _inTransferType; protected int _inTransferSlot; protected ModuleName _inProcessRobot; public Dictionary WaferArriveTicks { get; set; } public EventHandler EventWaferArrived; public EventHandler EventWaferLeaved; public SchedulerModule(string module) { _module = module; WaferArriveTicks = new Dictionary(); WaferArriveTicks[3] = WaferArriveTicks[2] = WaferArriveTicks[1] = WaferArriveTicks[0] = DateTime.Now.Ticks; } protected void LogTaskStart(TaskType cmd, string message) { LOG.Write(eEvent.EV_SCHEDULER, ModuleName.System, $"Task start:{_module}, {cmd}, {message}"); } protected void LogTaskDone(TaskType cmd, string message) { LOG.Write(eEvent.EV_SCHEDULER, ModuleName.System, $"Task done:{_module}, {cmd}, {message}"); } public virtual void ResetTask() { _task = TaskType.None; } public bool WaitTransfer(ModuleName robot, EnumTransferType transferType, int slot) { _task = TaskType.TransferTarget; _inProcessRobot = robot; _inTransferType = transferType; _inTransferSlot = slot; LogTaskStart(_task, $"Note {robot} in transfer"); return true; } public bool IsWaitTransfer(ModuleName robot) { return _task == TaskType.TransferTarget && _inProcessRobot == robot; } public bool IsWaitTransfer(ModuleName robot, EnumTransferType transferType) { return _task == TaskType.TransferTarget && _inProcessRobot == robot && _inTransferType==transferType; } public virtual bool StopWaitTransfer(ModuleName robot) { LogTaskDone(_task, $"Note {robot} transfer complete"); _inProcessRobot = ModuleName.System; _task = TaskType.None; WaferArriveTicks[_inTransferSlot] = DateTime.Now.Ticks; return true; } public bool HasWafer(int slot) { return WaferManager.Instance.CheckHasWafer(ModuleHelper.Converter(_module), slot); } public bool NoWafer(int slot) { return WaferManager.Instance.CheckNoWafer(ModuleHelper.Converter(_module), slot); } public virtual bool IsReadyForPick(ModuleName robot, int slot, Hand blade) { return true; } public virtual bool IsReadyForPlace(ModuleName robot, int slot, Hand blade) { return true; } public virtual bool PrepareTransfer(ModuleName robot, EnumTransferType type, int slot) { return true; } public virtual bool PostTransfer(ModuleName robot, EnumTransferType type, int slot) { StopWaitTransfer(robot); return true; } public virtual bool PostTransfer(ModuleName robot ) { StopWaitTransfer(robot); return true; } public virtual bool Process(string recipeName, bool isCleanRecipe, RecipeType recipeType, WaferInfo wafer) { return true; } public virtual bool Cooling(int coolingTime) { return true; } public virtual bool Align(float time) { return true; } public virtual bool Preheating(float temperature) { return true; } #region Virgo_T // 传片序列 // 1. 每个槽(Slot)具有三种状态, 根据槽的状态, 决定wafer是否可以 前行 // 2. 每个可以前行的wafer, 再跟聚下一个 槽是否 ReadyIn, 决定是否把命令压栈 // preheat 序列 // prepare transfer 序列 // flipper 序列 public enum SlotStatus { ReadyIn, ReadOut, Busy, } public virtual SlotItem GetReadyOutSlot() { return new SlotItem(ModuleName.System, -1); } public virtual SlotItem GetReadyInSlot() { return new SlotItem(ModuleName.System, -1); } public virtual int GetTimeToReady() { return 0; } public virtual void WaferArrived(int slot) { WaferArriveTicks[slot] = DateTime.Now.Ticks; } public virtual long WaferArrivedTicks(int slot) { return DateTime.Now.Ticks - WaferArriveTicks[slot]; } #endregion } }