123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- 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<WaferHolderTaskDispatcher>
- {
- /// <summary>
- /// 分析
- /// </summary>
- public void Analyse()
- {
- List <WaferHolderTask> waferHolderTasks = WaferHolderTaskManager.Instance.LoaderWaferHolderTaskList().ToList();
- bool exsitTransport2FromBuffer = false;
- List<WaferHolderTask> canceledWaferHolderTask = new List<WaferHolderTask>();
- 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);
- }
- /// <summary>
- /// 处理ProcessTransporter
- /// </summary>
- /// <param name="sequence"></param>
- private void DealProcessTransporterScheduler(SchedulerSequence currentSequence,WaferHolderTask item,List<WaferHolderTask> waferHolderTasks)
- {
- int transporterTransferSeconds = SC.GetValue<int>("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);
- }
- }
- /// <summary>
- /// 处理LoaderTransPorter
- /// </summary>
- /// <param name="currentSequence"></param>
- /// <param name="item"></param>
- /// <param name="waferHolderTasks"></param>
- private void DealLoaderTransporterScheduler(SchedulerSequence currentSequence,WaferHolderTask item, List<WaferHolderTask> waferHolderTasks,
- List<WaferHolderTask> 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();
- }
- }
- /// <summary>
- /// 是否存在未启动的WaferHolderTask
- /// </summary>
- /// <param name="waferHolderTasks"></param>
- /// <param name="waferHolderTask"></param>
- /// <returns></returns>
- private bool CheckExistWaferHolderTaskIsCreateState(List<WaferHolderTask> waferHolderTasks, WaferHolderTask waferHolderTask)
- {
- foreach(WaferHolderTask item in waferHolderTasks)
- {
- if (item.ID == waferHolderTask.ID)
- {
- continue;
- }
- if (item.State == WaferHolderTaskState.Created)
- {
- return true;
- }
- }
- return false;
- }
- /// <summary>
- /// 检验是否存在Dryer WaferHolder空闲(WaferHolder不存在WaferHolderTask中)
- /// </summary>
- /// <param name="waferHolderTasks"></param>
- /// <param name="module"></param>
- /// <returns></returns>
- private bool CheckDryerWaferHolderIdle(List<WaferHolderTask> waferHolderTasks,WaferHolderTask waferHolderTask)
- {
- List<string> dryerModules = DryerItemManager.Instance.InstalledModules;
- foreach (string item in dryerModules)
- {
- if (WaferHolderManager.Instance.HasWaferHolder(item))
- {
- DryerEntity dryerEntity = Singleton<RouteManager>.Instance.GetModule<DryerEntity>(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;
- }
- /// <summary>
- /// 移除状态为取消的WaferHolderTask
- /// </summary>
- /// <param name="waferHolderTasks"></param>
- private void RemoveCanceledTask(List<WaferHolderTask> 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<string> mathedWaferIds = WaferTaskManager.Instance.GetWaferHolderMathWaferId(item.WaferHolderInfo.Id);
- //foreach(string waferId in mathedWaferIds)
- //{
- // WaferTaskManager.Instance.RemoveWaferTask(waferId);
- // WaferTaskManager.Instance.RemoveWaferIdMatchWaferHolderTaskDic(waferId);
- //}
- }
- }
- /// <summary>
- /// 检验其他任务是否也是Transporter并且正在执行
- /// </summary>
- /// <param name="waferHolderTasks"></param>
- /// <param name="waferHolderTask"></param>
- /// <returns></returns>
- private bool CheckOtherTransporterIsRunning(List<WaferHolderTask> 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;
- }
- /// <summary>
- /// 检验其他任务是否也是Transporter1并且正在执行
- /// </summary>
- /// <param name="waferHolderTasks"></param>
- /// <param name="waferHolderTask"></param>
- /// <returns></returns>
- private bool CheckPrewetIsWaitForPick(List<WaferHolderTask> 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<RouteManager>.Instance.GetModule<PrewetEntity>(ModuleName.Prewet1.ToString());
- if(prewetEntity != null &&(prewetEntity.State==(int)PrewetState.PreparingToPick||
- prewetEntity.State==(int)PrewetState.WaitForPick))
- {
- return true;
- }
- }
- }
- }
- return false;
- }
- /// <summary>
- /// 解析Transporter1调度逻辑
- /// </summary>
- /// <param name="sequence"></param>
- 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();
- }
- }
- /// <summary>
- /// 是否存在当前阶段为Metal,剩余时间比Transporter搬运时间更小时
- /// </summary>
- /// <param name="transporterTransferSeconds"></param>
- /// <returns></returns>
- private bool CheckExistMetalRemainTime(int transporterTransferSeconds)
- {
- List<WaferHolderTask> 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<RouteManager>.Instance.GetModule<MetalEntity>(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;
- }
- }
- }
|