|
@@ -15,6 +15,7 @@ using System.Collections.Generic;
|
|
|
using FurnaceRT.Equipments.PMs.Routines;
|
|
|
using System.Diagnostics;
|
|
|
using MECF.Framework.Common.DataCenter;
|
|
|
+using System.Runtime.Remoting.Metadata.W3cXsd2001;
|
|
|
|
|
|
namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
{
|
|
@@ -195,7 +196,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
private string _infoAUXWaitCondition = "";
|
|
|
private string _infoHeaterWaitCondition = "";
|
|
|
private string _infoMFCWaitCondition = "";
|
|
|
- private Dictionary<int, Tuple<bool,int>> _callSubSteps = new Dictionary<int, Tuple<bool, int>>();
|
|
|
+ private Dictionary<int, Tuple<bool, int>> _callSubSteps = new Dictionary<int, Tuple<bool, int>>();
|
|
|
private bool _isJumpStep = false;
|
|
|
|
|
|
public Process(ModuleName module, PMModule pm) : base(module, pm)
|
|
@@ -330,7 +331,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
curSteps = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps;
|
|
|
|
|
|
if (!_callSubSteps.ContainsKey(_currentStepNumber))
|
|
|
- _callSubSteps.Add(_currentStepNumber, Tuple.Create(false,0));
|
|
|
+ _callSubSteps.Add(_currentStepNumber, Tuple.Create(false, 0));
|
|
|
if (PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].IsCallSubStep)
|
|
|
_callSubSteps[_currentStepNumber] = Tuple.Create(true, PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeLoopCount);
|
|
|
|
|
@@ -384,7 +385,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
_currentSubRecipeStepNumber = curSteps[_currentSubRecipeStepNumber].JumpStepNo;
|
|
|
}
|
|
|
|
|
|
- RecipeExec("Sub recipe", curSteps, _currentSubRecipeStepNumber, _curStepElpasedTimeBeforePaused, _currentSubRecipeStepNumber+1);
|
|
|
+ RecipeExec("Sub recipe", curSteps, _currentSubRecipeStepNumber, _curStepElpasedTimeBeforePaused, _currentSubRecipeStepNumber + 1);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -539,10 +540,10 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
if (_stepTimer.IsTimeout())
|
|
|
{
|
|
|
|
|
|
- if(PMModule.IsBoatMoveToLoadPosition)
|
|
|
+ if (PMModule.IsBoatMoveToLoadPosition)
|
|
|
{
|
|
|
_trigBoatMoveToLoadPositionTimeout.CLK = !boatWaitCondition;
|
|
|
- if(_trigBoatMoveToLoadPositionTimeout.Q)
|
|
|
+ if (_trigBoatMoveToLoadPositionTimeout.Q)
|
|
|
PMModule.BoatMoveToLoadPositionTimeoutWarning.Set();
|
|
|
}
|
|
|
//_trigInputSignalTimeOutAlarm.CLK = !PMModule.CheckExternalSensorCondition();
|
|
@@ -619,14 +620,14 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
{
|
|
|
stepName = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[_currentSubRecipeStepNumber].StepName;
|
|
|
float.TryParse(PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[_currentSubRecipeStepNumber].FilmThickFormula, out thickness);
|
|
|
-
|
|
|
+
|
|
|
//放在前面,stepnumber后面会被更新
|
|
|
if (!_isJumpStep)
|
|
|
{
|
|
|
_faCallback.RecipeStepEnd(PMModule.Module, PMModule.RecipeRunningInfo.RecipeName, _currentSubRecipeStepNumber + 1);
|
|
|
_dbCallback.RecipeStepEnd(PMModule.RecipeRunningInfo.InnerId.ToString(), _currentSubRecipeStepNumber + 1, _fdc.DataList, SC.GetStringValue("PM1.TempCorrection"), SC.GetStringValue("PM1.Heater.PID"));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
_fdc.Stop();
|
|
|
|
|
|
_totalElpasedTime += curSteps[_currentSubRecipeStepNumber].StepTime;
|
|
@@ -685,7 +686,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
_faCallback.RecipeStepEnd(PMModule.Module, PMModule.RecipeRunningInfo.RecipeName, _currentStepNumber);
|
|
|
_dbCallback.RecipeStepEnd(PMModule.RecipeRunningInfo.InnerId.ToString(), _currentStepNumber, _fdc.DataList, SC.GetStringValue("PM1.TempCorrection"), SC.GetStringValue("PM1.Heater.PID"));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
_fdc.Stop();
|
|
|
|
|
|
if (_currentStepNumber >= 0 && !IsSubReciep)
|
|
@@ -712,7 +713,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
RecipeLoopEndCheck(PMModule.RecipeRunningInfo.RecipeStepList);
|
|
|
}
|
|
|
|
|
|
- if(_currentStepNumber >= PMModule.RecipeRunningInfo.RecipeStepList.Count - 1)
|
|
|
+ if (_currentStepNumber >= PMModule.RecipeRunningInfo.RecipeStepList.Count - 1)
|
|
|
{
|
|
|
for (int i = 0; i < SC.GetValue<int>($"Boat.SlotCount"); i++)
|
|
|
{
|
|
@@ -741,7 +742,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if(!_isJumpStep)
|
|
|
+ if (!_isJumpStep)
|
|
|
{
|
|
|
Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeStepThicknessAndTime(stepName, thickness, stepTime);
|
|
|
var wafers = WaferManager.Instance.GetWafers(ModuleHelper.Converter(Module));
|
|
@@ -755,6 +756,11 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
|
|
|
WaferManager.Instance.UpdateWaferStatistics(ModuleHelper.Converter(Module), i, useCount, useTime, useThick);
|
|
|
}
|
|
|
+ Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeTotalThickness(PMModule.RecipeRunningInfo.RecipeName, thickness);
|
|
|
+ Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeStepFre(stepName);
|
|
|
+ Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeStepRunTime(stepName, stepTime);
|
|
|
+ Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeStepGroupThickness(stepName, thickness);
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -780,7 +786,9 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
var useThick = wafers[i].UseThick;
|
|
|
|
|
|
WaferManager.Instance.UpdateWaferStatistics(ModuleHelper.Converter(Module), i, useCount, useTime, useThick);
|
|
|
+
|
|
|
}
|
|
|
+ Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateSEDWafer();
|
|
|
|
|
|
if (PMModule.IsHeaterProfile && !PMModule.IsHeaterProfileSuccess)
|
|
|
EV.PostWarningLog(PMModule.Module, "Auto profile failed");
|
|
@@ -819,7 +827,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
|
|
|
if (IsSubReciep)
|
|
|
{
|
|
|
- if(PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps != null)
|
|
|
+ if (PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps != null)
|
|
|
{
|
|
|
if (_stepTimer.IsIdle())
|
|
|
{
|
|
@@ -868,13 +876,13 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[step].LoopStartStep].StepName : "";
|
|
|
else
|
|
|
{
|
|
|
- if(PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps.Count > step + 1)
|
|
|
+ if (PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps.Count > step + 1)
|
|
|
{
|
|
|
PMModule.RecipeRunningInfo.NextStepName = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[step + 1].StepName;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if(PMModule.RecipeRunningInfo.SubRecipeCurrentLoopCount < PMModule.RecipeRunningInfo.SubRecipeLoopCount)
|
|
|
+ if (PMModule.RecipeRunningInfo.SubRecipeCurrentLoopCount < PMModule.RecipeRunningInfo.SubRecipeLoopCount)
|
|
|
{
|
|
|
//sub 下一个循环
|
|
|
PMModule.RecipeRunningInfo.NextStepName = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[0].StepName;
|
|
@@ -899,7 +907,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
PMModule.StringProcessFlowState = PMModule.ProcessFlowState.Run.ToString();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -932,7 +940,8 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
PMModule.RecipeRunningInfo.StepTime = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].StepTime;
|
|
|
PMModule.RecipeRunningInfo.RecipeName = PMModule.RecipeRunningInfo.MainRecipeName;
|
|
|
PMModule.RecipeRunningInfo.ExecRecipeType = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].RecipeType;
|
|
|
- if (_state == RecipeRunningState.RecipeCompleted) {
|
|
|
+ if (_state == RecipeRunningState.RecipeCompleted)
|
|
|
+ {
|
|
|
PMModule.RecipeRunningInfo.HoldTime = 0;
|
|
|
}
|
|
|
|
|
@@ -954,7 +963,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
PMModule.RecipeRunningInfo.StepNumber = step + 1; //CurStepNum start from 0
|
|
|
}
|
|
|
PMModule.RecipeRunningInfo.StepName = PMModule.RecipeRunningInfo.RecipeStepList[_showStepNo].StepName;
|
|
|
- if(PMModule.RecipeRunningInfo.RecipeStepList[step].IsLoopEndStep)
|
|
|
+ if (PMModule.RecipeRunningInfo.RecipeStepList[step].IsLoopEndStep)
|
|
|
PMModule.RecipeRunningInfo.NextStepName = PMModule.RecipeRunningInfo.RecipeStepList.Count > PMModule.RecipeRunningInfo.RecipeStepList[step].LoopStartStep ? PMModule.RecipeRunningInfo.RecipeStepList[PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].LoopStartStep].StepName : "";
|
|
|
else
|
|
|
PMModule.RecipeRunningInfo.NextStepName = PMModule.RecipeRunningInfo.RecipeStepList.Count > step + 1 ? PMModule.RecipeRunningInfo.RecipeStepList[step + 1].StepName : "";
|
|
@@ -981,8 +990,8 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
if (_alarmNames.Count == 0)
|
|
|
return;
|
|
|
|
|
|
- int group = -1,temp = 0;
|
|
|
- string iAlarmConditionTable="1:";
|
|
|
+ int group = -1, temp = 0;
|
|
|
+ string iAlarmConditionTable = "1:";
|
|
|
if (IsSubReciep)
|
|
|
{
|
|
|
for (int i = 0; i < _alarmNames.Count; i++)
|
|
@@ -1099,7 +1108,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
_holdTimeElpasedTime += _holdTimer.GetElapseTime();
|
|
|
_holdTimer.Stop();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
CurrentLoopCount = 0;
|
|
|
CurrentAbortRecipeLoopCount = 0;
|
|
|
CurrentSubRecipeLoopCount = 0;
|
|
@@ -1184,7 +1193,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
_holdTimer.Stop();
|
|
|
}
|
|
|
}
|
|
|
- if(IsSubReciep)
|
|
|
+ if (IsSubReciep)
|
|
|
{
|
|
|
ResetLoop(PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps, _currentSubRecipeStepNumber);
|
|
|
}
|
|
@@ -1238,7 +1247,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
{
|
|
|
PMModule.AbortLeakCheck();
|
|
|
LOG.Write($"Jump to step stepNumber={stepNumber} stepName={stepName}, currentStepNumber={_currentStepNumber}");
|
|
|
- if (_state == RecipeRunningState.ConditionWait || _state == RecipeRunningState.TimeWait ||
|
|
|
+ if (_state == RecipeRunningState.ConditionWait || _state == RecipeRunningState.TimeWait ||
|
|
|
_state == RecipeRunningState.Paused || _state == RecipeRunningState.ExecStep)
|
|
|
{
|
|
|
_loopEnd = true;
|
|
@@ -1263,11 +1272,11 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
ResetLoop(PMModule.RecipeRunningInfo.RecipeStepList, _currentStepNumber);
|
|
|
}
|
|
|
|
|
|
- if(_callSubSteps != null)
|
|
|
+ if (_callSubSteps != null)
|
|
|
{
|
|
|
- foreach(var key in _callSubSteps.Keys)
|
|
|
+ foreach (var key in _callSubSteps.Keys)
|
|
|
{
|
|
|
- if(PMModule.RecipeRunningInfo.RecipeStepList.Count > key)
|
|
|
+ if (PMModule.RecipeRunningInfo.RecipeStepList.Count > key)
|
|
|
{
|
|
|
PMModule.RecipeRunningInfo.RecipeStepList[key].IsCallSubStep = _callSubSteps[key].Item1;
|
|
|
PMModule.RecipeRunningInfo.RecipeStepList[key].SubRecipeLoopCount = _callSubSteps[key].Item2;
|
|
@@ -1281,7 +1290,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
_currentStepNumber = stepNumber - 1;
|
|
|
if (_currentStepNumber < 0)
|
|
|
_currentStepNumber = 0;
|
|
|
-
|
|
|
+
|
|
|
_totalElpasedTime = RefreshElpasedTime();
|
|
|
_state = RecipeRunningState.StepCompleted;
|
|
|
PMModule.IsPaused = false;
|
|
@@ -1321,7 +1330,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (PMModule.RecipeRunningInfo.RecipeStepList[i].SubRecipeSteps != null &&
|
|
|
+ if (PMModule.RecipeRunningInfo.RecipeStepList[i].SubRecipeSteps != null &&
|
|
|
PMModule.RecipeRunningInfo.RecipeStepList[i].SubRecipeSteps.Count > _currentSubRecipeStepNumber)
|
|
|
{
|
|
|
total += SubRecipeCalTotalTime(i) * PMModule.RecipeRunningInfo.RecipeStepList[i].SubRecipeLoopCount;
|
|
@@ -1704,7 +1713,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
|
|
|
_infoMFCWaitCondition = "";
|
|
|
}
|
|
|
|
|
|
- private void RecipeExec(string type, List<RecipeStep> curSteps, int currentStepNumber, double curStepElpasedTimeBeforePaused, int otherRecipeStartStepNumber=0)
|
|
|
+ private void RecipeExec(string type, List<RecipeStep> curSteps, int currentStepNumber, double curStepElpasedTimeBeforePaused, int otherRecipeStartStepNumber = 0)
|
|
|
{
|
|
|
var reason = "";
|
|
|
_stepTimer.Start(curSteps[currentStepNumber].StepTime * 1000 - curStepElpasedTimeBeforePaused);
|