|
@@ -5,21 +5,28 @@ using Aitex.Core.Util;
|
|
|
using Aitex.Core.Utilities;
|
|
|
using MECF.Framework.Common.Equipment;
|
|
|
using MECF.Framework.Common.WaferHolder;
|
|
|
-using CyberX8_Core;
|
|
|
+
|
|
|
using System;
|
|
|
using MECF.Framework.Common.ToolLayout;
|
|
|
using MECF.Framework.Common.Persistent.Reservoirs;
|
|
|
-using CyberX8_RT.Modules.Reservoir;
|
|
|
+
|
|
|
using Aitex.Core.RT.OperationCenter;
|
|
|
using MECF.Framework.Common.RecipeCenter;
|
|
|
using Aitex.Core.RT.RecipeCenter;
|
|
|
using MECF.Framework.Common.SubstrateTrackings;
|
|
|
-using CyberX8_RT.Devices.Metal;
|
|
|
+
|
|
|
using Aitex.Core.RT.Device;
|
|
|
-using CyberX8_RT.Devices.Reservoir;
|
|
|
+
|
|
|
using MECF.Framework.Common.Routine;
|
|
|
using MECF.Framework.Common.ProcessCell;
|
|
|
using Aitex.Core.RT.SCCore;
|
|
|
+using MECF.Framework.Common.Alarm;
|
|
|
+using CyberX8_Core;
|
|
|
+using CyberX8_RT.Devices.Metal;
|
|
|
+using CyberX8_RT.Devices.Reservoir;
|
|
|
+using CyberX8_RT.Modules.Metal;
|
|
|
+using CyberX8_RT.Modules.Reservoir;
|
|
|
+using CyberX8_RT.Modules;
|
|
|
|
|
|
namespace CyberX8_RT.Modules.Metal
|
|
|
{
|
|
@@ -29,7 +36,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
private const string STRATUS = "Stratus";
|
|
|
private const string AUTO = "Auto";
|
|
|
private const string MANUAL = "Manual";
|
|
|
- private const string DISABLED= "Disabled";
|
|
|
+ private const string DISABLED = "Disabled";
|
|
|
private const string ENGINEERING = "Engineering";
|
|
|
private const string PRODUCTION = "Production";
|
|
|
#endregion
|
|
@@ -109,11 +116,11 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
|
|
|
|
|
|
|
|
|
- public bool IsInit { get { return fsm.State == (int)MetalState.Init; } }
|
|
|
+ public bool IsInit { get { return fsm.State == (int)MetalState.Init; } }
|
|
|
|
|
|
|
|
|
|
|
|
- public bool IsIdle { get { return fsm.State == (int)MetalState.Idle; } }
|
|
|
+ public bool IsIdle { get { return fsm.State == (int)MetalState.Idle; } }
|
|
|
|
|
|
|
|
|
|
|
@@ -121,7 +128,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
|
|
|
|
|
|
|
|
|
- public bool IsBusy { get { return fsm.State > (int)MetalState.Idle; } }
|
|
|
+ public bool IsBusy { get { return fsm.State > (int)MetalState.Idle; } }
|
|
|
|
|
|
|
|
|
|
|
@@ -133,7 +140,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
|
|
|
|
|
|
|
|
|
- public bool IsAuto { get { return _persistentValue!=null&&_persistentValue.OperatingMode == AUTO; } }
|
|
|
+ public bool IsAuto { get { return _persistentValue != null && _persistentValue.OperatingMode == AUTO; } }
|
|
|
|
|
|
|
|
|
|
|
@@ -177,12 +184,12 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
|
- switch(fsm.State)
|
|
|
+ switch (fsm.State)
|
|
|
{
|
|
|
- case (int)MetalState.RunReciping:
|
|
|
- return Math.Max(_recipeTime - fsm.ElapsedTime/1000, 0);
|
|
|
+ case (int)MetalState.RunReciping:
|
|
|
+ return Math.Max(_recipeTime - fsm.ElapsedTime / 1000, 0);
|
|
|
default:
|
|
|
- return 0 ;
|
|
|
+ return 0;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -226,7 +233,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
{
|
|
|
LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), "Persistent Value Object is not exist");
|
|
|
}
|
|
|
- _metalItem=MetalItemManager.Instance.GetMetalItem(Module.ToString());
|
|
|
+ _metalItem = MetalItemManager.Instance.GetMetalItem(Module.ToString());
|
|
|
}
|
|
|
|
|
|
|
|
@@ -234,10 +241,10 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
private void InitializeRoutine()
|
|
|
{
|
|
|
_compactEmbranceInitializeRoutine = new CompactEmbranceInitializeRoutine(Module.ToString());
|
|
|
- _standardHotInitializeRoutine=new StandardHotInitializeRoutine(Module.ToString());
|
|
|
- _compactEmbranceRunRecipeRoutine=new CompactEmbranceRunRecipeRoutine(Module.ToString());
|
|
|
- _standardHotRunRecipeRoutine=new StandardHotRunRecipeRoutine(Module.ToString());
|
|
|
- _currentShortTestRoutine=new CurrentShortTestRoutine(Module.ToString());
|
|
|
+ _standardHotInitializeRoutine = new StandardHotInitializeRoutine(Module.ToString());
|
|
|
+ _compactEmbranceRunRecipeRoutine = new CompactEmbranceRunRecipeRoutine(Module.ToString());
|
|
|
+ _standardHotRunRecipeRoutine = new StandardHotRunRecipeRoutine(Module.ToString());
|
|
|
+ _currentShortTestRoutine = new CurrentShortTestRoutine(Module.ToString());
|
|
|
}
|
|
|
|
|
|
|
|
@@ -245,7 +252,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
private void InitializeOperation()
|
|
|
{
|
|
|
OP.Subscribe($"{Module}.InitializeAll", (cmd, args) => { return CheckToPostMessage<MetalState, MetalMsg>(eEvent.ERR_METAL, Module.ToString(), (int)MetalMsg.Initialize); });
|
|
|
- OP.Subscribe($"{Module}.CycleManualProcessRecipe", (cmd, args) =>
|
|
|
+ OP.Subscribe($"{Module}.CycleManualProcessRecipe", (cmd, args) =>
|
|
|
{
|
|
|
DepRecipe recipe = RecipeFileManager.Instance.LoadGenericityRecipe<DepRecipe>(args[0].ToString());
|
|
|
if (recipe == null)
|
|
@@ -255,11 +262,11 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
}
|
|
|
object[] objects = new object[args.Length];
|
|
|
objects[0] = recipe;
|
|
|
- for(int i = 1; i < args.Length; i++)
|
|
|
+ for (int i = 1; i < args.Length; i++)
|
|
|
{
|
|
|
objects[i] = args[i];
|
|
|
}
|
|
|
- return CheckToPostMessage<MetalState, MetalMsg>(eEvent.ERR_METAL, Module.ToString(), (int)MetalMsg.RunRecipe,objects);
|
|
|
+ return CheckToPostMessage<MetalState, MetalMsg>(eEvent.ERR_METAL, Module.ToString(), (int)MetalMsg.RunRecipe, objects);
|
|
|
});
|
|
|
OP.Subscribe($"{Module}.CurrentShortTest", (cmd, args) => { return CheckToPostMessage<MetalState, MetalMsg>(eEvent.ERR_METAL, Module.ToString(), (int)MetalMsg.CurrentShortTest); });
|
|
|
OP.Subscribe($"{Module}.UpdateMetalUsage", UpdateMetalUsageAction);
|
|
@@ -286,7 +293,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
AnyStateTransition(MetalMsg.Error, EnterError, MetalState.Error);
|
|
|
|
|
|
AnyStateTransition(MetalMsg.Initialize, InitializeAll, MetalState.Initializing);
|
|
|
- Transition(MetalState.Initializing,FSM_MSG.TIMER,InitializeAllMonitor, MetalState.Initialized);
|
|
|
+ Transition(MetalState.Initializing, FSM_MSG.TIMER, InitializeAllMonitor, MetalState.Initialized);
|
|
|
|
|
|
|
|
|
Transition(MetalState.Initialized, FSM_MSG.TIMER, NullFunc, MetalState.Idle);
|
|
@@ -319,7 +326,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
DATA.Subscribe($"{Module}.FsmState", () => ((MetalState)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
DATA.Subscribe($"{Module}.WaferHolder", () => WaferHolderInfo, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
DATA.Subscribe($"{Module}.AchievedCycle", () => AchievedCycle, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.IsInit", () => IsInit, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.IsInit", () => IsInit, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
DATA.Subscribe($"{Module}.IsIdle", () => IsIdle, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
DATA.Subscribe($"{Module}.IsError", () => IsError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
DATA.Subscribe($"{Module}.IsBusy", () => IsBusy, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
@@ -344,31 +351,31 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
DATA.Subscribe($"{Module}.TotalTime", () => _recipeTime, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
DATA.Subscribe($"{Module}.TimeRemain", () => _recipeTime != 0 && _currentRunRecipeRoutine != null ? (_recipeTime - Math.Round((double)_currentRunRecipeRoutine.ElapsedMilliseconds / 1000, 0)) : 0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo != null ? WaferHolderInfo.CurrentControlJobId : "", SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.OperatingMode", () => _persistentValue != null ? _persistentValue.OperatingMode : "None", SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.OperatingMode", () => _persistentValue != null ? _persistentValue.OperatingMode : "None", SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
DATA.Subscribe($"{Module}.TotalUsage", () => MetalUsage != null ? MetalUsage.TotalUsage : 0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.TotalUsage.WarningLimit", () => SC.GetValue<double>("Metal.MetalTotalAmpHoursWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.TotalUsage.FaultLimit", () => SC.GetValue<double>("Metal.MetalTotalAmpHoursFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeAUsage",()=> MetalUsage!=null?MetalUsage.AnodeAUsage:0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeAUsage.WarningLimit", () => SC.GetValue<double>("Metal.AnodeATotalAmpHoursWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeAUsage.FaultLimit", () => SC.GetValue<double>("Metal.AnodeATotalAmpHoursFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeBUsage", () => MetalUsage != null ? MetalUsage.AnodeBUsage:0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeBUsage.WarningLimit", () => SC.GetValue<double>("Metal.AnodeBTotalAmpHoursWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeBUsage.FaultLimit", () => SC.GetValue<double>("Metal.AnodeBTotalAmpHoursFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.MembranceAUsage",()=> MetalUsage != null ? MetalUsage.MembranceAUsage:0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.MembranceAUsage.WarningLimit", () => SC.GetValue<double>("Metal.MembraneATotalAmpHoursWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.MembranceAUsage.FaultLimit", () => SC.GetValue<double>("Metal.MembraneATotalAmpHoursFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.MembranceBUsage", () => MetalUsage != null ? MetalUsage.MembranceBUsage:0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.MembranceBUsage.WarningLimit", () => SC.GetValue<double>("Metal.MembraneBTotalAmpHoursWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.MembranceBUsage.FaultLimit", () => SC.GetValue<double>("Metal.MembraneBTotalAmpHoursFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.TotalWafers", () => MetalUsage != null ? MetalUsage.TotalWafers:0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.TotalWafers.WarningLimit", () => SC.GetValue<int>("Metal.MetalTotalWafersWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.TotalWafers.FaultLimit", () => SC.GetValue<int>("Metal.MetalTotalWafersFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeAWafers",()=> MetalUsage != null ? MetalUsage.AnodeAWafers:0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeAWafers.WarningLimit", () => SC.GetValue<int>("Metal.AnodeATotalWafersWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeAWafers.FaultLimit", () => SC.GetValue<int>("Metal.AnodeATotalWafersFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeBWafers", () => MetalUsage != null ? MetalUsage.AnodeBWafers:0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeBWafers.WarningLimit", () => SC.GetValue<int>("Metal.AnodeBTotalWafersWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
- DATA.Subscribe($"{Module}.AnodeBWafers.FaultLimit", () => SC.GetValue<int>("Metal.AnodeBTotalWafersFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.TotalUsage.WarningLimit", () => SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.TotalUsage.FaultLimit", () => SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeAUsage", () => MetalUsage != null ? MetalUsage.AnodeAUsage : 0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeAUsage.WarningLimit", () => SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeAUsage.FaultLimit", () => SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeBUsage", () => MetalUsage != null ? MetalUsage.AnodeBUsage : 0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeBUsage.WarningLimit", () => SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeBUsage.FaultLimit", () => SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.MembranceAUsage", () => MetalUsage != null ? MetalUsage.MembranceAUsage : 0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.MembranceAUsage.WarningLimit", () => SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.MembranceAUsage.FaultLimit", () => SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.MembranceBUsage", () => MetalUsage != null ? MetalUsage.MembranceBUsage : 0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.MembranceBUsage.WarningLimit", () => SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.MembranceBUsage.FaultLimit", () => SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.TotalWafers", () => MetalUsage != null ? MetalUsage.TotalWafers : 0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.TotalWafers.WarningLimit", () => SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.TotalWafers.FaultLimit", () => SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeAWafers", () => MetalUsage != null ? MetalUsage.AnodeAWafers : 0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeAWafers.WarningLimit", () => SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeAWafers.FaultLimit", () => SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeBWafers", () => MetalUsage != null ? MetalUsage.AnodeBWafers : 0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeBWafers.WarningLimit", () => SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe($"{Module}.AnodeBWafers.FaultLimit", () => SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersFaultLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -414,12 +421,12 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
|
|
|
private bool InitializeAll(object[] param)
|
|
|
{
|
|
|
- if (fsm.State ==(int)MetalState.Initializing)
|
|
|
+ if (fsm.State == (int)MetalState.Initializing)
|
|
|
{
|
|
|
LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), "state is Initializing,cannot do initialize");
|
|
|
return false;
|
|
|
}
|
|
|
- if(!CheckReservoirInitialized())
|
|
|
+ if (!CheckReservoirInitialized())
|
|
|
{
|
|
|
LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), "Reservoir is not initialized");
|
|
|
return false;
|
|
@@ -432,7 +439,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
- if (_metalItem.SubType==STRATUS)
|
|
|
+ if (_metalItem.SubType == STRATUS)
|
|
|
{
|
|
|
return _standardHotInitializeRoutine.Start(_persistentValue) == RState.Running;
|
|
|
}
|
|
@@ -476,25 +483,25 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
|
|
|
private bool InitializeAllMonitor(object[] param)
|
|
|
{
|
|
|
- RState rsstate= RState.Running;
|
|
|
+ RState rsstate = RState.Running;
|
|
|
if (_metalItem.SubType == STRATUS)
|
|
|
{
|
|
|
rsstate = _standardHotInitializeRoutine.Monitor();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- rsstate = _compactEmbranceInitializeRoutine.Monitor() ;
|
|
|
+ rsstate = _compactEmbranceInitializeRoutine.Monitor();
|
|
|
}
|
|
|
- if(rsstate==RState.End)
|
|
|
+ if (rsstate == RState.End)
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
- else if(rsstate==RState.Failed||rsstate==RState.Timeout)
|
|
|
+ else if (rsstate == RState.Failed || rsstate == RState.Timeout)
|
|
|
{
|
|
|
PostMsg(MetalMsg.Error);
|
|
|
return false;
|
|
|
}
|
|
|
- return false;
|
|
|
+ return false;
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
@@ -506,6 +513,13 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
|
|
|
private bool RunRecipe(object[] param)
|
|
|
{
|
|
|
+ MetalUsageMointor();
|
|
|
+ string reservoirName = ReservoirItemManager.Instance.GetReservoirByMetal(Module.ToString());
|
|
|
+ if (_metalItem.SubType == STRATUS)
|
|
|
+ {
|
|
|
+ StandardHotReservoirDevice resDevice = DEVICE.GetDevice<StandardHotReservoirDevice>(reservoirName);
|
|
|
+ resDevice.ReservoirUsageMonitor();
|
|
|
+ }
|
|
|
DepRecipe recipe = param[0] as DepRecipe;
|
|
|
_recipeSide = param[1].ToString();
|
|
|
_cycle = (int)param[2];
|
|
@@ -514,14 +528,14 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
if (_metalItem.SubType == STRATUS)
|
|
|
{
|
|
|
_currentRunRecipeRoutine = _standardHotRunRecipeRoutine;
|
|
|
- result= _standardHotRunRecipeRoutine.Start(recipe,_recipeSide) == RState.Running;
|
|
|
+ result = _standardHotRunRecipeRoutine.Start(recipe, _recipeSide) == RState.Running;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
_currentRunRecipeRoutine = _compactEmbranceRunRecipeRoutine;
|
|
|
- result= _compactEmbranceRunRecipeRoutine.Start(recipe,_recipeSide) == RState.Running;
|
|
|
+ result = _compactEmbranceRunRecipeRoutine.Start(recipe, _recipeSide) == RState.Running;
|
|
|
}
|
|
|
- if(result)
|
|
|
+ if (result)
|
|
|
{
|
|
|
if (WaferHolderInfo != null)
|
|
|
{
|
|
@@ -529,7 +543,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
}
|
|
|
_recipeTime = recipe.CalculateRecipeTotalTime();
|
|
|
_currentRecipe = recipe;
|
|
|
- if (WaferHolderInfo != null)
|
|
|
+ if (WaferHolderInfo != null && WaferHolderInfo.SchedulerModules != null && WaferHolderInfo.SchedulerModules.Count != 0)
|
|
|
{
|
|
|
LOG.WriteLog(eEvent.INFO_METAL, Module.ToString(), $"{WaferHolderInfo?.Id} {string.Join(",", WaferHolderInfo.SchedulerModules)}");
|
|
|
}
|
|
@@ -552,15 +566,43 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
if (_metalItem.SubType == STRATUS)
|
|
|
{
|
|
|
rsstate = _standardHotRunRecipeRoutine.Monitor();
|
|
|
+ if (rsstate == RState.Running)
|
|
|
+ {
|
|
|
+ StandardHotMetalDevice _standardHotMetalDevice = DEVICE.GetDevice<StandardHotMetalDevice>(Module.ToString());
|
|
|
+ if (_standardHotMetalDevice.MetalDeviceData.CellFlow <= 0)
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"reservoir metal cell flow is 0");
|
|
|
+ rsstate = RState.Failed;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
rsstate = _compactEmbranceRunRecipeRoutine.Monitor();
|
|
|
+ if (rsstate == RState.Running)
|
|
|
+ {
|
|
|
+ CompactMembranMetalDevice _compactMembranMetalDevice = DEVICE.GetDevice<CompactMembranMetalDevice>(Module.ToString());
|
|
|
+ if (_compactMembranMetalDevice.MetalDeviceData.CellFlow <= 0)
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"reservoir metal cell flow is 0");
|
|
|
+ rsstate = RState.Failed;
|
|
|
+ }
|
|
|
+ if (_compactMembranMetalDevice.ANACellFlow.CounterValue <= 0)
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"reservoir AnodeA flow is 0");
|
|
|
+ rsstate = RState.Failed;
|
|
|
+ }
|
|
|
+ if (_compactMembranMetalDevice.ANBCellFlow.CounterValue <= 0)
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"reservoir AnodeB flow is 0");
|
|
|
+ rsstate = RState.Failed;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- if (Singleton<RouteManager>.Instance.IsAutoRunning&&_runrecipeElapsedTime!=TimeToReady)
|
|
|
+ if (Singleton<RouteManager>.Instance.IsAutoRunning && _runrecipeElapsedTime != TimeToReady)
|
|
|
{
|
|
|
_runrecipeElapsedTime = TimeToReady;
|
|
|
- LOG.WriteLog(eEvent.INFO_METAL, Module.ToString(), $"{WaferHolderInfo?.Id} {Module} RunRecipe TimeToReady {TimeToReady}s.");
|
|
|
+ LOG.WriteLog(eEvent.INFO_METAL, Module.ToString(), $"{WaferHolderInfo?.Id} {Module} RunRecipe TimeToReady {TimeToReady}s.");
|
|
|
}
|
|
|
if (rsstate == RState.End)
|
|
|
{
|
|
@@ -570,17 +612,19 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
double anodeAUsage = GetAnodeAUsage();
|
|
|
double anodeBUsage = GetAnodeBUsage();
|
|
|
MetalUsageManager.Instance.UpdateMetalUsage(Module.ToString(), _recipeSide, anodeAUsage, anodeBUsage);
|
|
|
+ MetalUsageMointor();
|
|
|
|
|
|
- if(_metalItem.SubType == STRATUS)
|
|
|
+ string reservoirName = ReservoirItemManager.Instance.GetReservoirByMetal(Module.ToString());
|
|
|
+ if (_metalItem.SubType == STRATUS)
|
|
|
{
|
|
|
- string reservoirName = ReservoirItemManager.Instance.GetReservoirByMetal(Module.ToString());
|
|
|
StandardHotReservoirDevice resDevice = DEVICE.GetDevice<StandardHotReservoirDevice>(reservoirName);
|
|
|
+ resDevice.ReservoirUsageMonitor();
|
|
|
resDevice.SetExportCMMUsage();
|
|
|
- }
|
|
|
+ }
|
|
|
WaferHolderInfo.LastMetalRecipeCompleteTime = DateTime.Now;
|
|
|
}
|
|
|
_runrecipeElapsedTime = 0;
|
|
|
-
|
|
|
+
|
|
|
|
|
|
_runRecipeCompleteTime = DateTime.Now;
|
|
|
int timeLength = (int)(_runRecipeCompleteTime - _runRecipeStartTime).TotalSeconds;
|
|
@@ -600,7 +644,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
{
|
|
|
FaModuleNotifier.Instance.NotifyWaferShuttleRecipeEnd(WaferHolderInfo, _currentRecipe.Ppid, timeLength);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
else if (rsstate == RState.Failed || rsstate == RState.Timeout)
|
|
@@ -611,11 +655,13 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
double anodeAUsage = GetAnodeAUsage();
|
|
|
double anodeBUsage = GetAnodeBUsage();
|
|
|
MetalUsageManager.Instance.UpdateMetalUsage(Module.ToString(), _recipeSide, anodeAUsage, anodeBUsage);
|
|
|
+ MetalUsageMointor();
|
|
|
|
|
|
+ string reservoirName = ReservoirItemManager.Instance.GetReservoirByMetal(Module.ToString());
|
|
|
if (_metalItem.SubType == STRATUS)
|
|
|
{
|
|
|
- string reservoirName = ReservoirItemManager.Instance.GetReservoirByMetal(Module.ToString());
|
|
|
StandardHotReservoirDevice resDevice = DEVICE.GetDevice<StandardHotReservoirDevice>(reservoirName);
|
|
|
+ resDevice.ReservoirUsageMonitor();
|
|
|
resDevice.SetExportCMMUsage();
|
|
|
}
|
|
|
}
|
|
@@ -649,18 +695,228 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ private void MetalUsageMointor()
|
|
|
+ {
|
|
|
+ MetalUsage metalUsage = MetalUsageManager.Instance.GetMetalUsage(Module.ToString());
|
|
|
+ if (metalUsage != null)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (metalUsage.TotalUsage > SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursFaultLimit") != 0)
|
|
|
+ {
|
|
|
+ if (metalUsage.TotalUsage > SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursFaultLimit"))
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.TotalUsage} is exceed MetalTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursFaultLimit")}");
|
|
|
+ PostMsg(MetalMsg.Error);
|
|
|
+ AlarmListManager.Instance.AddDataError(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.TotalUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.TotalUsage} is exceed MetalTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursFaultLimit")}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.TotalUsage} is exceed MetalTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit")}");
|
|
|
+ AlarmListManager.Instance.AddWarn(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.TotalUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.TotalUsage} is exceed MetalTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit")}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (metalUsage.AnodeAUsage > SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursFaultLimit") != 0)
|
|
|
+ {
|
|
|
+ if (metalUsage.AnodeAUsage > SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursFaultLimit"))
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeAUsage} is exceed AnodeATotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursFaultLimit")}");
|
|
|
+ PostMsg(MetalMsg.Error);
|
|
|
+ AlarmListManager.Instance.AddDataError(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeAUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeAUsage} is exceed AnodeATotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursFaultLimit")}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeAUsage} is exceed AnodeATotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursWarningLimit")}");
|
|
|
+ AlarmListManager.Instance.AddWarn(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeAUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeAUsage} is exceed AnodeATotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeATotalAmpHoursWarningLimit")}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (metalUsage.AnodeBUsage > SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursFaultLimit") != 0)
|
|
|
+ {
|
|
|
+ if (metalUsage.AnodeBUsage > SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursFaultLimit"))
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeBUsage} is exceed AnodeBTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursFaultLimit")}");
|
|
|
+ PostMsg(MetalMsg.Error);
|
|
|
+ AlarmListManager.Instance.AddDataError(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeBUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeBUsage} is exceed AnodeBTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursFaultLimit")}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeBUsage} is exceed AnodeBTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursWarningLimit")}");
|
|
|
+ AlarmListManager.Instance.AddWarn(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeBUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeBUsage} is exceed AnodeBTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.AnodeBTotalAmpHoursWarningLimit")}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (metalUsage.MembranceAUsage > SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursFaultLimit") != 0)
|
|
|
+ {
|
|
|
+ if (metalUsage.MembranceAUsage > SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursFaultLimit"))
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.MembranceAUsage} is exceed MembraneATotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursFaultLimit")}");
|
|
|
+ PostMsg(MetalMsg.Error);
|
|
|
+ AlarmListManager.Instance.AddDataError(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.MembraneAUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.MembranceAUsage} is exceed MembraneATotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursFaultLimit")}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.MembranceAUsage} is exceed MembraneATotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursWarningLimit")}");
|
|
|
+ AlarmListManager.Instance.AddWarn(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.MembraneAUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.MembranceAUsage} is exceed MembraneATotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneATotalAmpHoursWarningLimit")}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (metalUsage.MembranceBUsage > SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursWarningLimit") && SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursWarningLimit") != 0 && SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursFaultLimit") != 0)
|
|
|
+ {
|
|
|
+ if (metalUsage.MembranceBUsage > SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursFaultLimit"))
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.MembranceBUsage} is exceed MembraneBTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursFaultLimit")}");
|
|
|
+ PostMsg(MetalMsg.Error);
|
|
|
+ AlarmListManager.Instance.AddDataError(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.MembraneBUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.MembranceBUsage} is exceed MembraneBTotalAmpHoursFaultLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursFaultLimit")}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.MembranceBUsage} is exceed MembraneBTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursWarningLimit")}");
|
|
|
+ AlarmListManager.Instance.AddWarn(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.MembraneBUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.MembranceBUsage} is exceed MembraneBTotalAmpHoursWarningLimit:{SC.GetValue<double>($"Metal.{Module}.MembraneBTotalAmpHoursWarningLimit")}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (metalUsage.TotalWafers > SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersWarningLimit") && SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersFaultLimit") != 0)
|
|
|
+ {
|
|
|
+ if (metalUsage.TotalWafers > SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersFaultLimit"))
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.TotalWafers} is exceed MetalTotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersFaultLimit")}");
|
|
|
+ PostMsg(MetalMsg.Error);
|
|
|
+ AlarmListManager.Instance.AddDataError(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.TotalWafers",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.TotalWafers} is exceed MetalTotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersFaultLimit")}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.TotalWafers} is exceed MetalTotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersWarningLimit")}");
|
|
|
+ AlarmListManager.Instance.AddWarn(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.TotalWafers",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.TotalWafers} is exceed MetalTotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.MetalTotalWafersWarningLimit")}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (metalUsage.AnodeAWafers > SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersFaultLimit") != 0)
|
|
|
+ {
|
|
|
+ if (metalUsage.AnodeAWafers > SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersFaultLimit"))
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeAWafers} is exceed AnodeATotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersFaultLimit")}");
|
|
|
+ PostMsg(MetalMsg.Error);
|
|
|
+ AlarmListManager.Instance.AddDataError(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeAWafers",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeAWafers} is exceed AnodeATotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersFaultLimit")}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeAWafers} is exceed AnodeATotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersWarningLimit")}");
|
|
|
+ AlarmListManager.Instance.AddWarn(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeAWafers",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeAWafers} is exceed AnodeATotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeATotalWafersWarningLimit")}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (metalUsage.AnodeBWafers > SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersFaultLimit") != 0)
|
|
|
+ {
|
|
|
+ if (metalUsage.AnodeBWafers > SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersFaultLimit"))
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeBWafers} is exceed AnodeBTotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersFaultLimit")}");
|
|
|
+ PostMsg(MetalMsg.Error);
|
|
|
+ AlarmListManager.Instance.AddDataError(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeBWafers",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeBWafers} is exceed AnodeBTotalWafersFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersFaultLimit")}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeBWafers} is exceed AnodeBTotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersWarningLimit")}");
|
|
|
+ AlarmListManager.Instance.AddWarn(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeBWafers",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeBWafers} is exceed AnodeBTotalWafersWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBTotalWafersWarningLimit")}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (metalUsage.AnodeABathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysFaultLimit") != 0)
|
|
|
+ {
|
|
|
+ if (metalUsage.AnodeABathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysFaultLimit"))
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeABathUsage} is exceed AnodeABathTotalUsageDaysFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysFaultLimit")}");
|
|
|
+ PostMsg(MetalMsg.Error);
|
|
|
+ AlarmListManager.Instance.AddDataError(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeABathUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeABathUsage} is exceed AnodeABathTotalUsageDaysFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysFaultLimit")}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeABathUsage} is exceed AnodeABathTotalUsageDaysWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysWarningLimit")}");
|
|
|
+ AlarmListManager.Instance.AddWarn(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeABathUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeABathUsage} is exceed AnodeABathTotalUsageDaysWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeABathTotalUsageDaysWarningLimit")}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (metalUsage.AnodeBBathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysWarningLimit") && SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysWarningLimit") != 0 && SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysFaultLimit") != 0)
|
|
|
+ {
|
|
|
+ if (metalUsage.AnodeBBathUsage > SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysFaultLimit"))
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.ERR_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeBBathUsage} is exceed AnodeBBathTotalUsageDaysFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysFaultLimit")}");
|
|
|
+ PostMsg(MetalMsg.Error);
|
|
|
+ AlarmListManager.Instance.AddDataError(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeBBathUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeBBathUsage} is exceed AnodeBBathTotalUsageDaysFaultLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysFaultLimit")}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_METAL, Module.ToString(), $"{Module.ToString()} usage:{metalUsage.AnodeBBathUsage} is exceed AnodeBBathTotalUsageDaysWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysWarningLimit")}");
|
|
|
+ AlarmListManager.Instance.AddWarn(Module.ToString(),
|
|
|
+ $"{Module.ToString()}.metalUsage.AnodeBBathUsage",
|
|
|
+ $"{Module.ToString()} usage:{metalUsage.AnodeBBathUsage} is exceed AnodeBBathTotalUsageDaysWarningLimit:{SC.GetValue<int>($"Metal.{Module}.AnodeBBathTotalUsageDaysWarningLimit")}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
private double GetAnodeAUsage()
|
|
|
{
|
|
|
- if(_metalItem.SubType == STRATUS)
|
|
|
+ if (_metalItem.SubType == STRATUS)
|
|
|
{
|
|
|
- return Math.Round(_standardHotRunRecipeRoutine.AnodeAUsage,3);
|
|
|
+ return Math.Round(_standardHotRunRecipeRoutine.AnodeAUsage, 3);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- return Math.Round(_compactEmbranceRunRecipeRoutine.AnodeAUsage,3);
|
|
|
+ return Math.Round(_compactEmbranceRunRecipeRoutine.AnodeAUsage, 3);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -700,7 +956,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
MetalLotTrackUtil.ExportMetalLotTrack(Module.ToString(), _compactEmbranceRunRecipeRoutine.MetalLotTrackDatas,
|
|
|
_compactEmbranceRunRecipeRoutine.MetalLotTrackHeaderDatas, IsAuto, _currentRecipe, _metalItem.SubType);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
#endregion
|
|
@@ -744,10 +1000,10 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
|
|
|
private bool CloseFlowValve(object[] param)
|
|
|
{
|
|
|
- if(_metalItem.SubType==STRATUS)
|
|
|
+ if (_metalItem.SubType == STRATUS)
|
|
|
{
|
|
|
StandardHotMetalDevice device = DEVICE.GetDevice<StandardHotMetalDevice>(Module.ToString());
|
|
|
- if (device!=null)
|
|
|
+ if (device != null)
|
|
|
{
|
|
|
return device.SwitchToBypass("", null);
|
|
|
}
|
|
@@ -755,15 +1011,15 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- CompactMembranMetalDevice device=DEVICE.GetDevice<CompactMembranMetalDevice>(Module.ToString());
|
|
|
- if(device!=null)
|
|
|
+ CompactMembranMetalDevice device = DEVICE.GetDevice<CompactMembranMetalDevice>(Module.ToString());
|
|
|
+ if (device != null)
|
|
|
{
|
|
|
- string reservoir= ReservoirItemManager.Instance.GetReservoirByMetal(Module.ToString());
|
|
|
+ string reservoir = ReservoirItemManager.Instance.GetReservoirByMetal(Module.ToString());
|
|
|
CompactMembranReservoirDevice reservoirDevice = DEVICE.GetDevice<CompactMembranReservoirDevice>(reservoir);
|
|
|
if (reservoirDevice != null)
|
|
|
{
|
|
|
bool result = reservoirDevice.CAByPassOn("", null);
|
|
|
- if(result)
|
|
|
+ if (result)
|
|
|
{
|
|
|
return device.CellFlowValveOff("", null);
|
|
|
}
|
|
@@ -790,7 +1046,7 @@ namespace CyberX8_RT.Modules.Metal
|
|
|
bool result = device.SwitchToFlow("", null);
|
|
|
if (result)
|
|
|
{
|
|
|
- return device.PumpOnOperation("",null);
|
|
|
+ return device.PumpOnOperation("", null);
|
|
|
}
|
|
|
}
|
|
|
return false;
|