|
|
@@ -44,7 +44,7 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
/// </summary>
|
|
|
/// <param name="sequenceRecipe"></param>
|
|
|
/// <returns></returns>
|
|
|
- public List<SchedulerSequence> AnalyWaferAllSchedulerSequence(WaferInfo waferInfo, SequenceRecipe sequenceRecipe)
|
|
|
+ public List<SchedulerSequence> AnalyWaferAllSchedulerSequence(WaferInfo waferInfo,ModuleName vpw, SequenceRecipe sequenceRecipe)
|
|
|
{
|
|
|
List<SchedulerSequence> schedulerSequences = new List<SchedulerSequence>();
|
|
|
int index = 0;
|
|
|
@@ -54,6 +54,9 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
schedulerSequences.Add(efemRobotSequence);
|
|
|
SchedulerSequence alignerSequence = CreateAlignerSequence(sequenceRecipe, ref index);
|
|
|
schedulerSequences.Add(alignerSequence);
|
|
|
+ MoveItem alignerToMoveItem = new MoveItem(ModuleName.Aligner1, 0, vpw, 0,Hand.Blade1, Flip.Upper, Flip.Upper);
|
|
|
+ SchedulerSequence alignerRobotSequence = CreateEfemRobotSequence(alignerToMoveItem, null, sequenceRecipe.SubstrateSize, ref index);
|
|
|
+ schedulerSequences.Add(alignerRobotSequence);
|
|
|
//解析sequence recipe后续的工序
|
|
|
var sequences = AnalyseSequenceRecipeScheduler(sequenceRecipe,false);
|
|
|
if (sequences.Count == 0)
|
|
|
@@ -65,16 +68,8 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
{
|
|
|
return schedulerSequences;
|
|
|
}
|
|
|
- MoveItem alignerToFirstMoveItem = new MoveItem();
|
|
|
- alignerToFirstMoveItem.SourceModule = ModuleName.Aligner1;
|
|
|
- alignerToFirstMoveItem.SourceSlot = 0;
|
|
|
- alignerToFirstMoveItem.DestinationType = firstSequence.ModuleType;
|
|
|
- alignerToFirstMoveItem.DestinationSlot = 0;
|
|
|
- alignerToFirstMoveItem.RobotHand = Hand.Blade1;
|
|
|
- alignerToFirstMoveItem.PickRobotFlip = Flip.Upper;
|
|
|
- alignerToFirstMoveItem.PlaceRobotFlip = Flip.Upper;
|
|
|
- SchedulerSequence alignerToFirstSequence = CreateEfemRobotSequence(moveItem, null, sequenceRecipe.SubstrateSize, ref index);
|
|
|
- schedulerSequences.Add(efemRobotSequence);
|
|
|
+ firstSequence.SchedulerModule = SchedulerManager.Instance.GetScheduler(vpw);
|
|
|
+ firstSequence.ModuleName = vpw;
|
|
|
//调整工序后面的索引
|
|
|
foreach (SchedulerSequence item in sequences)
|
|
|
{
|
|
|
@@ -231,7 +226,7 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
schedulerSequence.Recipe = SequenceRecipeManager.Instance.LoadSequenceTypeRecipe(sequenceRecipe.SequenceType,item, recipeType);
|
|
|
schedulerSequence.SequenceType = sequenceRecipe.SequenceType;
|
|
|
schedulerSequence.State = RState.Init;
|
|
|
- schedulerSequence.MaterialType = MaterialType.WaferHolder;
|
|
|
+ schedulerSequence.MaterialType = MaterialType.Wafer;
|
|
|
tmpLst.Add(schedulerSequence);
|
|
|
if (i != lastIndex)
|
|
|
{
|
|
|
@@ -407,18 +402,18 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
/// <returns></returns>
|
|
|
public ModuleName GetAvaibleModuleCell(string sequenceType,ModuleType moduleType)
|
|
|
{
|
|
|
- List<IModuleEntity> entities = Singleton<RouteManager>.Instance.GetModulesByModuleType(moduleType);
|
|
|
- List<IModuleEntity> avaibles = new List<IModuleEntity>();
|
|
|
- foreach (var item in entities)
|
|
|
+ List<IModuleEntity> entities = Singleton<RouteManager>.Instance.GetModulesByModuleType(moduleType);
|
|
|
+ List<IModuleEntity> avaibles = new List<IModuleEntity>();
|
|
|
+ foreach (var item in entities)
|
|
|
+ {
|
|
|
+ bool result = CheckAvaibleModule(item,moduleType,sequenceType);
|
|
|
+ if (result)
|
|
|
{
|
|
|
- bool result = CheckAvaibleModule(item,moduleType,sequenceType);
|
|
|
- if (result)
|
|
|
- {
|
|
|
- avaibles.Add(item);
|
|
|
- }
|
|
|
+ avaibles.Add(item);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- return GetMinTimeToReadyModule(avaibles,moduleType);
|
|
|
+ return GetMinTimeToReadyModule(avaibles,moduleType);
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 根据化学液计算时间获取可用PlatingCellCell(参考其他PlatingCell剩余时间)
|
|
|
@@ -438,97 +433,6 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
return (ModuleName.Unknown, ModuleName.Unknown);
|
|
|
}
|
|
|
/// <summary>
|
|
|
- /// 根据化学液获取可用PlatingCell
|
|
|
- /// </summary>
|
|
|
- /// <param name="chemistry"></param>
|
|
|
- /// <param name="sequenceType"></param>
|
|
|
- /// <returns></returns>
|
|
|
- public bool CalculateAvaiblePlatingCellCellByChemistry(string chemistry,string sequenceType,int waferSize)
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 检验Process transporter正在Transfer WH移动至Rinse
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- private bool CheckProcessTransporterTransfering(List<string> rinseList)
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 计算PlatingCell所在Reservoir Busy PlatingCell数量
|
|
|
- /// </summary>
|
|
|
- /// <param name="item"></param>
|
|
|
- /// <returns></returns>
|
|
|
- private (bool success,int busyCount) CalculatePlatingCellReservoirAllBusyPlatingCellCount(string platingCellName)
|
|
|
- {
|
|
|
- string reservoirName = ReservoirItemManager.Instance.GetReservoirByPlatingCell(platingCellName);
|
|
|
- if (string.IsNullOrEmpty(reservoirName))
|
|
|
- {
|
|
|
- return (false,0);
|
|
|
- }
|
|
|
- List<string> platingCells = ReservoirItemManager.Instance.GetPlatingCellsByReservoir(reservoirName);
|
|
|
- int count = 0;
|
|
|
- foreach (string item in platingCells)
|
|
|
- {
|
|
|
- if (platingCellName == item)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
- return (true,count);
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 检验独立Rinse是否可用
|
|
|
- /// </summary>
|
|
|
- /// <param name="singleRinseItems"></param>
|
|
|
- /// <param name="platingCellName"></param>
|
|
|
- /// <returns></returns>
|
|
|
- private bool CheckSingleRinseItemsCanUsed(List<string> singleRinseItems, string platingCellName)
|
|
|
- {
|
|
|
- var result = CalculatePlatingCellReservoirAllBusyPlatingCellCount(platingCellName);
|
|
|
- if(result.success)
|
|
|
- {
|
|
|
- bool transporterTransfering = CheckProcessTransporterTransfering(singleRinseItems);
|
|
|
- if (transporterTransfering)
|
|
|
- {
|
|
|
- return result.busyCount + 1 < singleRinseItems.Count;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- return result.busyCount < singleRinseItems.Count;
|
|
|
- }
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 检验可用
|
|
|
- /// </summary>
|
|
|
- /// <param name="item"></param>
|
|
|
- /// <param name="moduleType"></param>
|
|
|
- /// <param name="sequenceType"></param>
|
|
|
- /// <param name="waferHolderId"></param>
|
|
|
- /// <param name="startTime"></param>
|
|
|
- /// <param name="processLength"></param>
|
|
|
- /// <returns></returns>
|
|
|
- public bool CheckAvaiblePlatingCellModule(IModuleEntity item, ModuleType moduleType, string sequenceType, string waferHolderId, DateTime startTime, int processLength, bool checkConflict)
|
|
|
- {
|
|
|
- bool result = CheckAvaibleModule(item, moduleType, sequenceType);
|
|
|
- if (!result)
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (checkConflict)
|
|
|
- {
|
|
|
- var conflict = SchedulerPlatingCellTimeManager.Instance.CheckPlatingCellConflict(item.Module.ToString(), waferHolderId, startTime, processLength);
|
|
|
- return !conflict.conflict;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- return result;
|
|
|
- }
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
/// 检验模块是否可用
|
|
|
/// </summary>
|
|
|
/// <param name="item"></param>
|
|
|
@@ -590,10 +494,6 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
selectedModule = item;
|
|
|
}
|
|
|
}
|
|
|
- if (idleModuleEtities.Count != 0)
|
|
|
- {
|
|
|
- return GetMinUsagePlatingCell(idleModuleEtities);
|
|
|
- }
|
|
|
if (selectedModule != null)
|
|
|
{
|
|
|
return selectedModule.Module;
|
|
|
@@ -601,53 +501,11 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
return ModuleName.Unknown;
|
|
|
}
|
|
|
/// <summary>
|
|
|
- /// 获取电量最小的PlatingCell
|
|
|
- /// </summary>
|
|
|
- /// <param name="idleModuleEntities"></param>
|
|
|
- /// <returns></returns>
|
|
|
- private ModuleName GetMinUsagePlatingCell(List<IModuleEntity> idleModuleEntities, int depProcessLength, SchedulerModulePartTime platingCellPartTime)
|
|
|
- {
|
|
|
- ModuleName selectedModuleName = ModuleName.Unknown;
|
|
|
- List<string> minDateModuleLst = new List<string>();
|
|
|
- return selectedModuleName;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 获取电量最小的PlatingCell
|
|
|
- /// </summary>
|
|
|
- /// <param name="idleModuleEntities"></param>
|
|
|
- /// <returns></returns>
|
|
|
- private ModuleName GetMinUsagePlatingCell(List<IModuleEntity> idleModuleEntities)
|
|
|
- {
|
|
|
- ModuleName selectedModuleName = ModuleName.Unknown;
|
|
|
- return selectedModuleName;
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 获取PlatingCell可用的Rinse模块
|
|
|
- /// </summary>
|
|
|
- /// <param name="platingCellName"></param>
|
|
|
- /// <returns></returns>
|
|
|
- private ModuleName GetPlatingCellAvaibleRinseModule(List<IModuleEntity> items, ModuleName platingCellName)
|
|
|
- {
|
|
|
- int platingCellId = CellItemManager.Instance.GetCellIdByModuleName(platingCellName.ToString());
|
|
|
- if (platingCellId == 0)
|
|
|
- {
|
|
|
- return ModuleName.Unknown;
|
|
|
- }
|
|
|
- List<LayoutCellItem> rinseItems = CellItemManager.Instance.GetRinseItemsByPlatingCell(platingCellName.ToString());
|
|
|
- if (rinseItems.Count == 0)
|
|
|
- {
|
|
|
- return ModuleName.Unknown;
|
|
|
- }
|
|
|
-
|
|
|
- return ModuleName.Unknown;
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
/// 根据化学液获取可用的PlatingCell集合
|
|
|
/// </summary>
|
|
|
/// <param name="chemistry"></param>
|
|
|
/// <returns></returns>
|
|
|
- public List<PlatingCellEntity> GetAvaiblePlatingCellList(string chemistry, string sequenceType, bool isEmpty)
|
|
|
+ public List<PlatingCellEntity> GetAvaiblePlatingCellList(string chemistry, string sequenceType, int waferSize, bool isEmpty)
|
|
|
{
|
|
|
List<IModuleEntity> reservoirEntities = Singleton<RouteManager>.Instance.GetModulesByModuleType(ModuleType.Reservoir);
|
|
|
List<string> avaibles = new List<string>();
|
|
|
@@ -675,6 +533,10 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
+ if (entity.MetalWaferSize != waferSize)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
if (!isEmpty || (isEmpty && entity.WaferInfo == null))
|
|
|
{
|
|
|
metals.Add(entity);
|
|
|
@@ -683,6 +545,7 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
}
|
|
|
return metals;
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|