|
@@ -26,6 +26,7 @@ using Aitex.Core.RT.Device;
|
|
|
using Aitex.Core.RT.Log;
|
|
|
using Aitex.Core.RT.RecipeCenter;
|
|
|
using Aitex.Core.RT.DataCenter;
|
|
|
+using Aitex.Core.Util;
|
|
|
|
|
|
namespace VirgoRT.Modules
|
|
|
{
|
|
@@ -1719,14 +1720,100 @@ namespace VirgoRT.Modules
|
|
|
|
|
|
#region public interface
|
|
|
|
|
|
+ private R_TRIG _trigLp1JobComplete = new R_TRIG();
|
|
|
+ private R_TRIG _trigLp2JobComplete = new R_TRIG();
|
|
|
+ private bool _isAutoUnloadFoup
|
|
|
+ {
|
|
|
+ get
|
|
|
+ {
|
|
|
+ return SC.GetValue<bool>("EFEM.LoadPort.EnableAutoUnloadFoup");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public bool CheckAllJobDone()
|
|
|
{
|
|
|
+ foreach (var moduleKey in dictSchedulers.Keys)
|
|
|
+ {
|
|
|
+ if (!ModuleHelper.IsLoadPort(moduleKey)) continue;
|
|
|
+ var lp = dictSchedulers[moduleKey] as SchedulerLoadPort;
|
|
|
+ if (lp != null && lp.IsAvailable)
|
|
|
+ {
|
|
|
+ var trigLP = lp.Module == ModuleName.LP1 ? _trigLp1JobComplete : _trigLp2JobComplete;
|
|
|
+ trigLP.CLK = CheckJobComplete(lp.Module.ToString());
|
|
|
+ if (trigLP.Q)
|
|
|
+ {
|
|
|
+ if (_isAutoUnloadFoup)
|
|
|
+ {
|
|
|
+ lp.Unload(lp.Module);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
foreach (var cj in _lstControlJobs)
|
|
|
{
|
|
|
if (cj.State == EnumControlJobState.Executing || cj.State == EnumControlJobState.Paused)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ return dictSchedulers.Where(p=>ModuleHelper.IsLoadPort(p.Key)).Select(p=>p.Value).All(p => p.IsAvailable);
|
|
|
+ //foreach (var cj in _lstControlJobs)
|
|
|
+ //{
|
|
|
+ // if (cj.State == EnumControlJobState.Executing || cj.State == EnumControlJobState.Paused)
|
|
|
+ // return false;
|
|
|
+ //}
|
|
|
+
|
|
|
+ //return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private bool CheckJobComplete(string lp = null)
|
|
|
+ {
|
|
|
+ if (_lstProcessJobs.Count == 0)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (_lstControlJobs.Count == 0)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (_isCycleMode && _cycledCount < _cycleSetPoint)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (lp != null)
|
|
|
+ {
|
|
|
+ var cj = _lstControlJobs.Find(x => x.Module == lp);
|
|
|
+ if (cj == null)
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach (var pj in _lstProcessJobs)
|
|
|
+ {
|
|
|
+ if (lp == null)
|
|
|
+ {
|
|
|
+ if (pj.State != EnumProcessJobState.ProcessingComplete)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach (var cj in _lstControlJobs)
|
|
|
+ {
|
|
|
+ if (lp == null)
|
|
|
+ {
|
|
|
+ if (cj.State != EnumControlJobState.Completed)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (cj.Module == lp && cj.State != EnumControlJobState.Completed)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|