|
|
@@ -41,6 +41,30 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
private const string TRNPA = "TRNPA";
|
|
|
private const string TRNPB = "TRNPB";
|
|
|
#endregion
|
|
|
+
|
|
|
+ #region 内部变量
|
|
|
+ /// <summary>
|
|
|
+ /// VPW是否包含相同尺寸
|
|
|
+ /// </summary>
|
|
|
+ private bool _vpwHasSameSize = false;
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 属性
|
|
|
+ /// <summary>
|
|
|
+ /// VPW是否包含相同尺寸
|
|
|
+ /// </summary>
|
|
|
+ public bool VPWHasSameSize
|
|
|
+ {
|
|
|
+ get { return _vpwHasSameSize; }
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+ /// <summary>
|
|
|
+ /// 初始化
|
|
|
+ /// </summary>
|
|
|
+ public void ConfirmVPW()
|
|
|
+ {
|
|
|
+ _vpwHasSameSize = CheckSystemHasTheSameSizeVpw();
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// 解析Wafer所有调度工序
|
|
|
/// </summary>
|
|
|
@@ -159,18 +183,31 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
SchedulerSequence alignerRobotSequence = CreateEfemRobotSequence(alignerToMoveItem, null, sequenceRecipe.SubstrateSize, ref index);
|
|
|
schedulerSequences.Add(alignerRobotSequence);
|
|
|
//解析sequence recipe后续的工序
|
|
|
- var sequences = AnalyseSequenceRecipeScheduler(sequenceRecipe,vpw, false);
|
|
|
+ var sequences = AnalyseSequenceRecipeScheduler(sequenceRecipe,vpw, true);
|
|
|
if (sequences.Count == 0)
|
|
|
{
|
|
|
return schedulerSequences;
|
|
|
}
|
|
|
- SchedulerSequence firstSequence = sequences[0];
|
|
|
- if (firstSequence.ModuleType != ModuleType.VPW)
|
|
|
+ if (_vpwHasSameSize)
|
|
|
{
|
|
|
- return schedulerSequences;
|
|
|
+ SchedulerSequence firstSequence = sequences[0];
|
|
|
+ if (firstSequence.ModuleType != ModuleType.VPW)
|
|
|
+ {
|
|
|
+ return schedulerSequences;
|
|
|
+ }
|
|
|
+ firstSequence.SchedulerModule = SchedulerManager.Instance.GetScheduler(vpw);
|
|
|
+ firstSequence.ModuleName = vpw;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SchedulerSequence firstSequence = sequences[0];
|
|
|
+ if (firstSequence.ModuleType != ModuleType.EfemRobot)
|
|
|
+ {
|
|
|
+ return schedulerSequences;
|
|
|
+ }
|
|
|
+ MoveItem firstMoveItem=firstSequence.Parameters as MoveItem;
|
|
|
+ firstMoveItem.SourceModule = vpw;
|
|
|
}
|
|
|
- firstSequence.SchedulerModule = SchedulerManager.Instance.GetScheduler(vpw);
|
|
|
- firstSequence.ModuleName = vpw;
|
|
|
//调整工序后面的索引
|
|
|
foreach (SchedulerSequence item in sequences)
|
|
|
{
|
|
|
@@ -181,17 +218,17 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
|
|
|
SchedulerSequence lastSequence=sequences[sequences.Count - 1];
|
|
|
//若无SRD,直接从VPW转LoadPort
|
|
|
- MoveItem srdToLoadPortItem = new MoveItem();
|
|
|
- srdToLoadPortItem.SourceModule = ModuleName.Unknown;
|
|
|
- srdToLoadPortItem.SourceType = lastSequence.ModuleType;
|
|
|
- srdToLoadPortItem.SourceSlot = 0;
|
|
|
- srdToLoadPortItem.DestinationType = ModuleType.Dummy;
|
|
|
- srdToLoadPortItem.DestinationModule = (ModuleName)waferInfo.OriginStation;
|
|
|
- srdToLoadPortItem.DestinationSlot = waferInfo.OriginSlot;
|
|
|
- srdToLoadPortItem.RobotHand = Hand.Blade1;
|
|
|
- srdToLoadPortItem.PickRobotFlip = Flip.Upper;
|
|
|
- srdToLoadPortItem.PlaceRobotFlip = Flip.Upper;
|
|
|
- SchedulerSequence toDummySequence = CreateEfemRobotSequence(srdToLoadPortItem, null, sequenceRecipe.SubstrateSize, ref index);
|
|
|
+ MoveItem srdToDummyItem = new MoveItem();
|
|
|
+ srdToDummyItem.SourceModule = ModuleName.Unknown;
|
|
|
+ srdToDummyItem.SourceType = lastSequence.ModuleType;
|
|
|
+ srdToDummyItem.SourceSlot = 0;
|
|
|
+ srdToDummyItem.DestinationType = ModuleType.Dummy;
|
|
|
+ srdToDummyItem.DestinationModule = (ModuleName)waferInfo.OriginStation;
|
|
|
+ srdToDummyItem.DestinationSlot = waferInfo.OriginSlot;
|
|
|
+ srdToDummyItem.RobotHand = Hand.Blade2;
|
|
|
+ srdToDummyItem.PickRobotFlip = Flip.Down;
|
|
|
+ srdToDummyItem.PlaceRobotFlip = Flip.Upper;
|
|
|
+ SchedulerSequence toDummySequence = CreateEfemRobotSequence(srdToDummyItem, null, sequenceRecipe.SubstrateSize, ref index);
|
|
|
schedulerSequences.Add(toDummySequence);
|
|
|
return schedulerSequences;
|
|
|
}
|
|
|
@@ -241,9 +278,13 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
int index = 0;
|
|
|
for(int i=0;i<tmpLst.Count;i++)
|
|
|
{
|
|
|
- tmpLst[i].SequenceIndex = 0;
|
|
|
- schedulerSequences.Add(tmpLst[i]);
|
|
|
- index++;
|
|
|
+ //不同尺寸的Dummy wafer跳过VPW recipe步骤
|
|
|
+ if (_vpwHasSameSize || !isDummy || tmpLst[i].ModuleType!=ModuleType.VPW)
|
|
|
+ {
|
|
|
+ tmpLst[i].SequenceIndex = 0;
|
|
|
+ schedulerSequences.Add(tmpLst[i]);
|
|
|
+ index++;
|
|
|
+ }
|
|
|
if (i < tmpLst.Count - 1)
|
|
|
{
|
|
|
MoveItem moveItem = new MoveItem();
|
|
|
@@ -576,7 +617,7 @@ namespace PunkHPX8_RT.Schedulers
|
|
|
/// 检验VPW是否相同尺寸
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- public bool CheckSystemHasTheSameSizeVpw()
|
|
|
+ private bool CheckSystemHasTheSameSizeVpw()
|
|
|
{
|
|
|
VpwCellEntity vpwCellEntity1 = Singleton<RouteManager>.Instance.GetModule<VpwCellEntity>(ModuleName.VPW1.ToString());
|
|
|
VpwCellEntity vpwCellEntity2 = Singleton<RouteManager>.Instance.GetModule<VpwCellEntity>(ModuleName.VPW2.ToString());
|