using Aitex.Core.RT.Log; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using CyberX8_Core; using CyberX8_RT.Modules; using CyberX8_RT.Modules.Dryer; using CyberX8_RT.Modules.Metal; using CyberX8_RT.Modules.Prewet; using CyberX8_RT.Modules.Transporter; using CyberX8_RT.Schedulers; using MECF.Framework.Common.CommonData; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.ToolLayout; using MECF.Framework.Common.WaferHolder; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs; using SecsGem.Core.ItemModel; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Dispatch { public class WaferHolderTaskDispatcher : Singleton { /// /// 分析 /// public void Analyse() { List waferHolderTasks = WaferHolderTaskManager.Instance.LoaderWaferHolderTaskList().ToList(); bool exsitTransport2FromBuffer = false; List canceledWaferHolderTask = new List(); foreach (var item in waferHolderTasks) { SchedulerSequence currentSequence = item.GetCurrentSchedulerSequence(); if (currentSequence == null) { item.Run(); continue; } //处理ProcessTransporter逻辑 if (currentSequence.ModuleName == ModuleName.Transporter1) { DealProcessTransporterScheduler(currentSequence, item, waferHolderTasks); } //处理LoaderTransporter逻辑 else if(currentSequence.ModuleName==ModuleName.Transporter2) { DealLoaderTransporterScheduler(currentSequence, item, waferHolderTasks,canceledWaferHolderTask,ref exsitTransport2FromBuffer); } else { item.Run(); } } RemoveCanceledTask(canceledWaferHolderTask); } /// /// 处理ProcessTransporter /// /// private void DealProcessTransporterScheduler(SchedulerSequence currentSequence,WaferHolderTask item,List waferHolderTasks) { int transporterTransferSeconds = SC.GetValue("Transporter.TransporterTransferSeconds"); if (currentSequence.State == RState.End) { item.Run(); return; } if (currentSequence.State == RState.Running) { item.Run(); return; } if (CheckOtherTransporterIsRunning(waferHolderTasks, item,ModuleName.Transporter1)) { return; } //存在其他任务当前source为prewet同时prewet状态为WaitForPick if (CheckPrewetIsWaitForPick(waferHolderTasks, item) && currentSequence.State == RState.Init) { return; } if (currentSequence.State == RState.Init) { AnalyseProcessTransporterSchedulerSequence(currentSequence, item, transporterTransferSeconds); } } /// /// 处理LoaderTransPorter /// /// /// /// private void DealLoaderTransporterScheduler(SchedulerSequence currentSequence,WaferHolderTask item, List waferHolderTasks, List canceledWaferHolderTask, ref bool exsitTransport2FromBuffer) { if (currentSequence.State == RState.End) { item.Run(); return; } if (currentSequence.State == RState.Running) { item.Run(); return; } if (CheckOtherTransporterIsRunning(waferHolderTasks, item, ModuleName.Transporter2)) { return; } if (!(currentSequence.Parameters is WaferHolderMoveItem)) { return; } WaferHolderMoveItem waferHolderMoveItem = currentSequence.Parameters as WaferHolderMoveItem; if (waferHolderMoveItem.SourceModuleType == ModuleType.Buffer && waferHolderMoveItem.DestModuleType == ModuleType.Prewet) { if (item.State == WaferHolderTaskState.Canceled) { canceledWaferHolderTask.Add(item); return; } if (!exsitTransport2FromBuffer) { exsitTransport2FromBuffer = true; item.Run(); } } else if (waferHolderMoveItem.SourceModuleType == ModuleType.Dryer) { if (waferHolderMoveItem.DestModuleType == ModuleType.Buffer) { if (WaferHolderManager.Instance.HasWaferHolder("Loader")) { item.Run(); return; } if (CheckExistWaferHolderTaskIsCreateState(waferHolderTasks, item)) { item.Run(); return; } if (CheckDryerWaferHolderIdle(waferHolderTasks, item)) { item.Run(); return; } else { item.UpdateDryerLastSchedulerComplete(); } } else { item.Run(); } } else { item.Run(); } } /// /// 是否存在未启动的WaferHolderTask /// /// /// /// private bool CheckExistWaferHolderTaskIsCreateState(List waferHolderTasks, WaferHolderTask waferHolderTask) { foreach(WaferHolderTask item in waferHolderTasks) { if (item.ID == waferHolderTask.ID) { continue; } if (item.State == WaferHolderTaskState.Created) { return true; } } return false; } /// /// 检验是否存在Dryer WaferHolder空闲(WaferHolder不存在WaferHolderTask中) /// /// /// /// private bool CheckDryerWaferHolderIdle(List waferHolderTasks,WaferHolderTask waferHolderTask) { List dryerModules = DryerItemManager.Instance.InstalledModules; foreach (string item in dryerModules) { if (WaferHolderManager.Instance.HasWaferHolder(item)) { DryerEntity dryerEntity = Singleton.Instance.GetModule(item); if (dryerEntity == null) { continue; } if (!dryerEntity.IsIdle) { continue; } WaferHolderInfo waferHolderInfo=WaferHolderManager.Instance.GetWaferHolder(item); if(waferHolderInfo == null) { continue; } if (waferHolderInfo.Id == waferHolderTask.WaferHolderInfo.Id) { continue; } int index = waferHolderTasks.FindIndex(O => O.WaferHolderInfo.Id == waferHolderInfo.Id); if (index == -1) { return true; } else { WaferHolderTask task = waferHolderTasks[index]; if (task.State == WaferHolderTaskState.Created) { return true; } } } } return false; } /// /// 移除状态为取消的WaferHolderTask /// /// private void RemoveCanceledTask(List waferHolderTasks) { foreach(WaferHolderTask item in waferHolderTasks) { WaferHolderTaskManager.Instance.RemoveById(item.ID); LOG.WriteLog(eEvent.EV_SCHEDULER, "System", $"remove wafer shuttle {item.WaferHolderInfo.Id} task"); //List mathedWaferIds = WaferTaskManager.Instance.GetWaferHolderMathWaferId(item.WaferHolderInfo.Id); //foreach(string waferId in mathedWaferIds) //{ // WaferTaskManager.Instance.RemoveWaferTask(waferId); // WaferTaskManager.Instance.RemoveWaferIdMatchWaferHolderTaskDic(waferId); //} } } /// /// 检验其他任务是否也是Transporter并且正在执行 /// /// /// /// private bool CheckOtherTransporterIsRunning(List waferHolderTasks,WaferHolderTask waferHolderTask,ModuleName moduleName) { foreach(WaferHolderTask item in waferHolderTasks) { if (item.ID == waferHolderTask.ID) { continue; } SchedulerSequence schedulerSequence = item.GetCurrentSchedulerSequence(); if (schedulerSequence == null) { continue; } if (schedulerSequence.ModuleName == moduleName) { if(schedulerSequence.State==RState.Running) { return true; } } } return false; } /// /// 检验其他任务是否也是Transporter1并且正在执行 /// /// /// /// private bool CheckPrewetIsWaitForPick(List waferHolderTasks, WaferHolderTask waferHolderTask) { foreach (WaferHolderTask item in waferHolderTasks) { if (item.ID == waferHolderTask.ID) { continue; } SchedulerSequence schedulerSequence = item.GetCurrentSchedulerSequence(); if (schedulerSequence == null) { continue; } if (schedulerSequence.ModuleName == ModuleName.Transporter1) { WaferHolderMoveItem waferHolderMoveItem = schedulerSequence.Parameters as WaferHolderMoveItem; if (waferHolderMoveItem != null && waferHolderMoveItem.SourceModule == ModuleName.Prewet1) { PrewetEntity prewetEntity = Singleton.Instance.GetModule(ModuleName.Prewet1.ToString()); if(prewetEntity != null &&(prewetEntity.State==(int)PrewetState.PreparingToPick|| prewetEntity.State==(int)PrewetState.WaitForPick)) { return true; } } } } return false; } /// /// 解析Transporter1调度逻辑 /// /// private void AnalyseProcessTransporterSchedulerSequence(SchedulerSequence sequence,WaferHolderTask waferHolderTask,int transporterTransferSeconds) { SchedulerSequence preSequence = waferHolderTask.GetPreSchedulerSequence(); if (preSequence == null) { waferHolderTask.Run(); return; } if (preSequence.ModuleType == ModuleType.Metal) { //Metal处于Error if (preSequence.SchedulerModule.IsError) { waferHolderTask.Run(); return; } } if(CheckExistMetalRemainTime(transporterTransferSeconds)) { return; } else { waferHolderTask.Run(); } } /// /// 是否存在当前阶段为Metal,剩余时间比Transporter搬运时间更小时 /// /// /// private bool CheckExistMetalRemainTime(int transporterTransferSeconds) { List waferHolderTasks = WaferHolderTaskManager.Instance.LoaderWaferHolderTaskList().ToList(); foreach (var item in waferHolderTasks) { SchedulerSequence currentSequence = item.GetCurrentSchedulerSequence(); if (currentSequence == null) { continue; } if(currentSequence.ModuleType==ModuleType.Metal&&ModuleHelper.IsMetal(currentSequence.ModuleName)) { MetalEntity metalEntity = Singleton.Instance.GetModule(currentSequence.ModuleName.ToString()); if (metalEntity == null) { continue; } if (metalEntity.IsIdle && metalEntity.WaferHolderInfo != null) { return true; } if(metalEntity.TimeToReady<=transporterTransferSeconds&&metalEntity.IsBusy) { return true; } } if (currentSequence.ModuleName == ModuleName.Transporter1) { SchedulerSequence preSequence = item.GetPreSchedulerSequence(); if (preSequence.ModuleType==ModuleType.Metal&&WaferHolderManager.Instance.HasWaferHolder(preSequence.ModuleName.ToString())) { WaferHolderInfo waferHolderInfo = WaferHolderManager.Instance.GetWaferHolder(preSequence.ModuleName.ToString()); if (DateTime.Now.Subtract(waferHolderInfo.LastMetalRecipeCompleteTime).TotalMilliseconds <= 1000) { return true; } } } } return false; } } }