|
@@ -17,6 +17,9 @@ using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
+using MECF.Framework.Common.CommonData;
|
|
|
+using System.Text.Json.Serialization;
|
|
|
+using Newtonsoft.Json;
|
|
|
|
|
|
namespace PunkHPX8_RT.Modules.EFEM
|
|
|
{
|
|
@@ -40,7 +43,7 @@ namespace PunkHPX8_RT.Modules.EFEM
|
|
|
/// </summary>
|
|
|
private int _currentCycle;
|
|
|
private RobotCycleMoveRoutine _cycleMoveRoutine;
|
|
|
- private List<ModuleName> _sequences;
|
|
|
+ private List<RobotCycleParameter> _sequences;
|
|
|
private int _alignerAngle;
|
|
|
private List<EfemCycleAction> _actions;
|
|
|
private int _dummySlotNumber = 25; //当前cycle中的dummy slot 数量
|
|
@@ -54,11 +57,7 @@ namespace PunkHPX8_RT.Modules.EFEM
|
|
|
{
|
|
|
_currentCycle = 0;
|
|
|
string str = objs[0].ToString();
|
|
|
- _sequences = new List<ModuleName>();
|
|
|
- foreach(string item in str.Split('-'))
|
|
|
- {
|
|
|
- _sequences.Add((ModuleName)Enum.Parse(typeof(ModuleName), item));
|
|
|
- }
|
|
|
+ _sequences = JsonConvert.DeserializeObject<List<RobotCycleParameter>>(str);
|
|
|
if(!CheckRobotCyclePreCondiction(_sequences))
|
|
|
{
|
|
|
return RState.Failed;
|
|
@@ -76,11 +75,8 @@ namespace PunkHPX8_RT.Modules.EFEM
|
|
|
}
|
|
|
private void GenerateCycleAction()
|
|
|
{
|
|
|
- if (!ModuleHelper.IsLoadPort(_sequences[0]))
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
- WaferInfo[] waferInfos = WaferManager.Instance.GetWafers(_sequences[0]);
|
|
|
+ ModuleName sequenceModuleName = _sequences[0].ModuleName;
|
|
|
+ WaferInfo[] waferInfos = WaferManager.Instance.GetWafers(sequenceModuleName);
|
|
|
int count = 0;
|
|
|
foreach (WaferInfo item in waferInfos)
|
|
|
{
|
|
@@ -88,24 +84,24 @@ namespace PunkHPX8_RT.Modules.EFEM
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
- _actions.AddRange(GenerateCycle(_sequences[0], item.Slot, _sequences[1], ModuleHelper.IsDummy(_sequences[1]) ? count : 0));
|
|
|
+ _actions.AddRange(GenerateCycle(_sequences[0], item.Slot, _sequences[1].ModuleName, ModuleHelper.IsDummy(_sequences[1].ModuleName) ? count : 0));
|
|
|
for (int i = 1; i < _sequences.Count; i++)
|
|
|
{
|
|
|
|
|
|
if (i == _sequences.Count - 1)
|
|
|
{
|
|
|
- _actions.AddRange(GenerateCycle(_sequences[i], ModuleHelper.IsDummy(_sequences[i]) ? count : 0, _sequences[0],
|
|
|
+ _actions.AddRange(GenerateCycle(_sequences[i], ModuleHelper.IsDummy(_sequences[i].ModuleName) ? count : 0, _sequences[0].ModuleName,
|
|
|
item.Slot));
|
|
|
}
|
|
|
//else (i == 1)
|
|
|
else
|
|
|
{
|
|
|
- _actions.AddRange(GenerateCycle(_sequences[i], ModuleHelper.IsDummy(_sequences[i]) ? count : 0, _sequences[i + 1],
|
|
|
- ModuleHelper.IsDummy(_sequences[i + 1]) ? count : 0));
|
|
|
+ _actions.AddRange(GenerateCycle(_sequences[i], ModuleHelper.IsDummy(_sequences[i].ModuleName) ? count : 0, _sequences[i + 1].ModuleName,
|
|
|
+ ModuleHelper.IsDummy(_sequences[i + 1].ModuleName) ? count : 0));
|
|
|
}
|
|
|
- if (ModuleHelper.IsDummy(_sequences[i]))
|
|
|
+ if (ModuleHelper.IsDummy(_sequences[i].ModuleName))
|
|
|
{
|
|
|
- WaferInfo[] dummywaferInfos = WaferManager.Instance.GetWafers(_sequences[i]);
|
|
|
+ WaferInfo[] dummywaferInfos = WaferManager.Instance.GetWafers(_sequences[i].ModuleName);
|
|
|
if (dummywaferInfos != null)
|
|
|
{
|
|
|
_dummySlotNumber = dummywaferInfos.Length;
|
|
@@ -120,10 +116,10 @@ namespace PunkHPX8_RT.Modules.EFEM
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private List<EfemCycleAction> GenerateCycle(ModuleName source,int sourceSlot,ModuleName destModule,int destSlot)
|
|
|
+ private List<EfemCycleAction> GenerateCycle(RobotCycleParameter sourceParameter,int sourceSlot,ModuleName destModule,int destSlot)
|
|
|
{
|
|
|
List<EfemCycleAction> actions = new List<EfemCycleAction>();
|
|
|
- if (source == ModuleName.Aligner1)
|
|
|
+ if (sourceParameter.ModuleName == ModuleName.Aligner1)
|
|
|
{
|
|
|
EfemCycleAction action = new EfemCycleAction();
|
|
|
action.Action = "Align";
|
|
@@ -132,8 +128,9 @@ namespace PunkHPX8_RT.Modules.EFEM
|
|
|
}
|
|
|
EfemCycleAction pick = new EfemCycleAction();
|
|
|
MoveItem pickMoveItem = new MoveItem();
|
|
|
- pickMoveItem.SourceModule = source;
|
|
|
+ pickMoveItem.SourceModule = sourceParameter.ModuleName;
|
|
|
pickMoveItem.SourceSlot = sourceSlot;
|
|
|
+ pickMoveItem.RobotHand = sourceParameter.RobotArm;
|
|
|
pick.Parameter = pickMoveItem;
|
|
|
pick.Action = "Pick";
|
|
|
actions.Add(pick);
|
|
@@ -141,6 +138,8 @@ namespace PunkHPX8_RT.Modules.EFEM
|
|
|
MoveItem placeMoveItem = new MoveItem();
|
|
|
placeMoveItem.DestinationModule = destModule;
|
|
|
placeMoveItem.DestinationSlot = destSlot;
|
|
|
+ placeMoveItem.RobotHand = sourceParameter.RobotArm;
|
|
|
+ placeMoveItem.RobotFlip = sourceParameter.RobotFlip;
|
|
|
place.Parameter = placeMoveItem;
|
|
|
place.Action = "Place";
|
|
|
actions.Add(place);
|
|
@@ -201,7 +200,7 @@ namespace PunkHPX8_RT.Modules.EFEM
|
|
|
{
|
|
|
return _currentCycle;
|
|
|
}
|
|
|
- private bool CheckRobotCyclePreCondiction(List<ModuleName> lists)
|
|
|
+ private bool CheckRobotCyclePreCondiction(List<RobotCycleParameter> lists)
|
|
|
{
|
|
|
bool result = true;
|
|
|
//Robot
|
|
@@ -210,14 +209,14 @@ namespace PunkHPX8_RT.Modules.EFEM
|
|
|
return false;
|
|
|
}
|
|
|
//LP
|
|
|
- if(lists.Contains(ModuleName.LP1))
|
|
|
+ if(lists.FindIndex(O=>O.ModuleName.ToString()==ModuleName.LP1.ToString())!=-1)
|
|
|
{
|
|
|
if (!CheckLoadPortStatus(ModuleName.LP1))
|
|
|
{
|
|
|
return false;
|
|
|
};
|
|
|
}
|
|
|
- else if (lists.Contains(ModuleName.LP2))
|
|
|
+ else if (lists.FindIndex(O => O.ModuleName.ToString() == ModuleName.LP1.ToString()) != -1)
|
|
|
{
|
|
|
if (!CheckLoadPortStatus(ModuleName.LP2))
|
|
|
{
|
|
@@ -232,34 +231,29 @@ namespace PunkHPX8_RT.Modules.EFEM
|
|
|
};
|
|
|
}
|
|
|
//Dummy
|
|
|
- if (lists.Contains(ModuleName.Dummy1))
|
|
|
+ if (lists.FindIndex(O => O.ModuleName.ToString() == ModuleName.Dummy1.ToString()) != -1)
|
|
|
{
|
|
|
if (!CheckDummyStatus(ModuleName.Dummy1))
|
|
|
{
|
|
|
return false;
|
|
|
};
|
|
|
}
|
|
|
- else if(lists.Contains(ModuleName.Dummy2))
|
|
|
+ else if(lists.FindIndex(O => O.ModuleName.ToString() == ModuleName.Dummy2.ToString()) != -1)
|
|
|
{
|
|
|
if (!CheckDummyStatus(ModuleName.Dummy2))
|
|
|
{
|
|
|
return false;
|
|
|
};
|
|
|
}
|
|
|
- //Puf
|
|
|
- if (lists.Contains(ModuleName.PUF1) && !CheckPufStatus(ModuleName.PUF1))
|
|
|
- {
|
|
|
- return false ;
|
|
|
- }
|
|
|
//Srd
|
|
|
- if (lists.Contains(ModuleName.SRD1))
|
|
|
+ if (lists.FindIndex(O => O.ModuleName.ToString() == ModuleName.SRD1.ToString()) != -1)
|
|
|
{
|
|
|
if (!CheckSrdStatus(ModuleName.SRD1))
|
|
|
{
|
|
|
return false;
|
|
|
};
|
|
|
}
|
|
|
- else if(lists.Contains(ModuleName.SRD2))
|
|
|
+ else if(lists.FindIndex(O => O.ModuleName.ToString() == ModuleName.SRD2.ToString()) != -1)
|
|
|
{
|
|
|
if (!CheckSrdStatus(ModuleName.SRD2))
|
|
|
{
|