|
@@ -89,6 +89,18 @@ namespace CyberX8_RT.Modules.Rinse
|
|
|
/// 是否Retry
|
|
|
/// </summary>
|
|
|
private bool _isRetry = false;
|
|
|
+ /// <summary>
|
|
|
+ /// 当前recipe是否完成
|
|
|
+ /// </summary>
|
|
|
+ private bool _isCurrentReceipeComplete;
|
|
|
+ /// <summary>
|
|
|
+ /// 当前wafershuttle开始浸泡时间
|
|
|
+ /// </summary>
|
|
|
+ private DateTime _currentWaferShuttleStartSoakTime;
|
|
|
+ /// <summary>
|
|
|
+ /// Wafershuttle最浸泡超时waring时长
|
|
|
+ /// </summary>
|
|
|
+ private int _waferShuttleSoakMaxTime;
|
|
|
|
|
|
#region 计算recipe运行时间相关的配置文件参数
|
|
|
/// <summary>
|
|
@@ -289,6 +301,7 @@ namespace CyberX8_RT.Modules.Rinse
|
|
|
Transition(RinseState.RunReciping, FSM_MSG.TIMER, RunRecipeMonitor, RinseState.RunRecipeComplete);
|
|
|
Transition(RinseState.RunRecipeComplete, RinseMsg.RecipeComplete, NullFunc, RinseState.Idle);
|
|
|
Transition(RinseState.RunReciping, RinseMsg.Abort, RunRecipeAbort, RinseState.Abort);
|
|
|
+ Transition(RinseState.Idle, FSM_MSG.TIMER, RinseCompleteSoakTimeMonitor, RinseState.Idle);
|
|
|
//KeepWet
|
|
|
Transition(RinseState.RunRecipeComplete, RinseMsg.Keepwet, Keepwet, RinseState.KeepWeting);
|
|
|
Transition(RinseState.KeepWetComplete, RinseMsg.Keepwet, Keepwet, RinseState.KeepWeting);
|
|
@@ -316,6 +329,8 @@ namespace CyberX8_RT.Modules.Rinse
|
|
|
{
|
|
|
LOG.WriteLog(eEvent.ERR_RESERVOIR, Module.ToString(), "Persistent Value Object is not exist");
|
|
|
}
|
|
|
+ _isCurrentReceipeComplete = false;
|
|
|
+ _waferShuttleSoakMaxTime = SC.GetValue<int>($"QDR.PickupDelayWarningSeconds");
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 初始化DATA
|
|
@@ -588,6 +603,11 @@ namespace CyberX8_RT.Modules.Rinse
|
|
|
if (WaferHolderInfo != null && _currentRecipe != null)
|
|
|
{
|
|
|
FaModuleNotifier.Instance.NotifyWaferShuttleRecipeEnd(WaferHolderInfo, _currentRecipe.Ppid, timeLength);
|
|
|
+ if (_persistentValue.OperatingMode == "Auto")
|
|
|
+ {
|
|
|
+ _isCurrentReceipeComplete = true;
|
|
|
+ _currentWaferShuttleStartSoakTime = DateTime.Now;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
@@ -620,6 +640,32 @@ namespace CyberX8_RT.Modules.Rinse
|
|
|
_cycleManualProcessRoutine.RinseLotTrackHeaderDatas, IsAuto, _isRetry);
|
|
|
return true;
|
|
|
}
|
|
|
+ /// <summary>
|
|
|
+ /// Rinse完成recipe后监控wafershuttle浸泡时间
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="param"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private bool RinseCompleteSoakTimeMonitor(object[] param)
|
|
|
+ {
|
|
|
+ if (WaferHolderInfo != null && _persistentValue.OperatingMode == "Auto")
|
|
|
+ {
|
|
|
+ double sockSeconds = (DateTime.Now - _currentWaferShuttleStartSoakTime).TotalSeconds;
|
|
|
+ if (_isCurrentReceipeComplete && sockSeconds > _waferShuttleSoakMaxTime)
|
|
|
+ {
|
|
|
+ if (!AlarmListManager.Instance.IsContainDataWarn(Module.ToString(), "RinseSockTime"))
|
|
|
+ {
|
|
|
+ AlarmListManager.Instance.AddWarn(Module.ToString(),
|
|
|
+ $"RinseSockTime", $"Current waferShuttle:{WaferHolderInfo.Id} sock time is over PickupDelayWarningSeconds:{_waferShuttleSoakMaxTime} seconds");
|
|
|
+ LOG.WriteLog(eEvent.WARN_RINSE, Module.ToString(), $"Current waferShuttle:{WaferHolderInfo.Id} sock time is over PickupDelayWarningSeconds:{_waferShuttleSoakMaxTime} seconds");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _isCurrentReceipeComplete = false; //wafershuttle拿走后重置当前recipe是否完成变量
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
#endregion
|
|
|
|
|
|
#region Keepwet
|