|
@@ -45,6 +45,11 @@ namespace Venus_RT.Modules
|
|
|
WaitProcess,
|
|
|
StartProcess,
|
|
|
Processing,
|
|
|
+
|
|
|
+ // Align Status
|
|
|
+ WaitAlign,
|
|
|
+ StartAlign,
|
|
|
+ Aligning,
|
|
|
}
|
|
|
class ModuleFlag
|
|
|
{
|
|
@@ -564,6 +569,7 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
CheckWaferArrived();
|
|
|
ProcessPMTask();
|
|
|
+ ProcessAlignerTask();
|
|
|
|
|
|
UpdateProcessJobStatus();
|
|
|
UpdateControlJobStatus();
|
|
@@ -1302,7 +1308,7 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
private bool ProcessAlignerEFEMRobotTask(ModuleName aligner)
|
|
|
{
|
|
|
- if(WaferManager.Instance.CheckHasWafer(aligner, 0) && IsAtmWaferReadyOut(aligner, 0))
|
|
|
+ if(WaferManager.Instance.CheckHasWafer(aligner, 0) && IsAtmWaferReadyOut(aligner, 0) && _atmModules[aligner].MovingStatus == MovingStatus.Idle)
|
|
|
{
|
|
|
var hand = GetEFEMRobotFreeHand();
|
|
|
if(hand != Hand.None)
|
|
@@ -1399,6 +1405,61 @@ namespace Venus_RT.Modules
|
|
|
return Hand.None;
|
|
|
}
|
|
|
|
|
|
+ private void ProcessAlignerTask()
|
|
|
+ {
|
|
|
+ foreach(var align in _atmModules)
|
|
|
+ {
|
|
|
+ if(ModuleHelper.IsAligner(align.Key))
|
|
|
+ {
|
|
|
+ switch(align.Value.MovingStatus)
|
|
|
+ {
|
|
|
+ case MovingStatus.WaitAlign:
|
|
|
+ if(_efemRobot.IsAvailable)
|
|
|
+ {
|
|
|
+ WaferInfo wafer = WaferManager.Instance.GetWafer(align.Key, 0);
|
|
|
+ if(!wafer.IsEmpty)
|
|
|
+ {
|
|
|
+ string attr = "AlignAngle";
|
|
|
+ string angle = string.Empty;
|
|
|
+ int step = wafer.NextSequenceStep;
|
|
|
+ if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules.Contains(align.Key))
|
|
|
+ {
|
|
|
+ step = wafer.NextSequenceStep - 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (wafer.ProcessJob.Sequence.Steps[step].StepParameter.ContainsKey(attr))
|
|
|
+ {
|
|
|
+ angle = (string)wafer.ProcessJob.Sequence.Steps[step].StepParameter[attr];
|
|
|
+ if (_efemRobot.Align(float.Parse(angle)))
|
|
|
+ {
|
|
|
+ align.Value.MovingStatus = MovingStatus.StartAlign;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ align.Value.MovingStatus = MovingStatus.Idle;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case MovingStatus.StartAlign:
|
|
|
+ if(!_efemRobot.IsAvailable)
|
|
|
+ {
|
|
|
+ align.Value.MovingStatus = MovingStatus.Aligning;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case MovingStatus.Aligning:
|
|
|
+ {
|
|
|
+ if(_efemRobot.IsAvailable)
|
|
|
+ {
|
|
|
+ align.Value.MovingStatus = MovingStatus.Idle;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
#endregion Atm System
|
|
|
|
|
|
#region Sequence validation
|
|
@@ -1668,6 +1729,11 @@ namespace Venus_RT.Modules
|
|
|
LOG.Write(eEvent.EV_ROUTER, ModuleName.System, $"wafer {wafer.WaferOrigin}: {wafer.InnerId} arrived {tar.Key.Module}{tar.Key.Slot + 1}");
|
|
|
// wafer arrive
|
|
|
_atmWaferTargets.Remove(tar.Key);
|
|
|
+
|
|
|
+ if(ModuleHelper.IsAligner(tar.Key.Module))
|
|
|
+ {
|
|
|
+ _atmModules[tar.Key.Module].MovingStatus = MovingStatus.WaitAlign;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|