|
@@ -89,6 +89,16 @@ namespace CyberX8_RT.Devices.Reservoir
|
|
|
private const string COUNTER_STOP = "Stop";
|
|
|
private const string COUNTER_RESET = "Reset";
|
|
|
private const int ENABLE = 5;
|
|
|
+
|
|
|
+ private const string CA_FLOW_START_LOW_LIMIT_ERROR = "CaFlowStartLowLimitError";
|
|
|
+ private const string CA_FLOW_RECIPE_ERROR = "CaFlowRecipeError";
|
|
|
+ private const string CA_FLOW_RECIPE_WARN = "CaFlowRecipeWarn";
|
|
|
+ private const string AN_A_FLOW_ZERO_ERROR = "AnAFlowZeroError";
|
|
|
+ private const string AN_A_FLOW_RECIPE_ERROR = "AnAFlowRecipeError";
|
|
|
+ private const string AN_A_FLOW_RECIPE_WARN = "AnAFlowRecipeWarn";
|
|
|
+ private const string AN_B_FLOW_ZERO_ERROR = "AnBFlowZeroError";
|
|
|
+ private const string AN_B_FLOW_RECIPE_ERROR = "AnBFlowRecipeError";
|
|
|
+ private const string AN_B_FLOW_RECIPE_WARN = "AnBFlowRecipeWarn";
|
|
|
#endregion
|
|
|
|
|
|
#region 内部变量
|
|
@@ -121,6 +131,10 @@ namespace CyberX8_RT.Devices.Reservoir
|
|
|
/// </summary>
|
|
|
private Dictionary<string, bool> _variableInitializeDic = new Dictionary<string, bool>();
|
|
|
/// <summary>
|
|
|
+ /// 错误字典
|
|
|
+ /// </summary>
|
|
|
+ private Dictionary<string, bool> _errorDic = new Dictionary<string, bool>();
|
|
|
+ /// <summary>
|
|
|
/// 数据
|
|
|
/// </summary>
|
|
|
private CompactMembranReservoirData _reservoirData = new CompactMembranReservoirData();
|
|
@@ -240,12 +254,6 @@ namespace CyberX8_RT.Devices.Reservoir
|
|
|
/// CrossDose是否初始化
|
|
|
/// </summary>
|
|
|
private bool _isCrossDoseInitialized;
|
|
|
- /// <summary>
|
|
|
- /// WarningFlag
|
|
|
- /// </summary>
|
|
|
- private List<bool> _isCAFlowRateWARN;
|
|
|
- private List<bool> _isANAFlowRateWARN;
|
|
|
- private List<bool> _isANBFlowRateWARN;
|
|
|
private bool _isTCControlWARN = false;
|
|
|
/// <summary>
|
|
|
/// flow fault hold off时长
|
|
@@ -445,6 +453,15 @@ namespace CyberX8_RT.Devices.Reservoir
|
|
|
if (metalDevice != null)
|
|
|
{
|
|
|
_metalDevices.Add(metalDevice);
|
|
|
+ _errorDic[$"{metalDevice.Module}_{CA_FLOW_START_LOW_LIMIT_ERROR}"] = false;
|
|
|
+ _errorDic[$"{metalDevice.Module}_{CA_FLOW_RECIPE_ERROR}"] = false;
|
|
|
+ _errorDic[$"{metalDevice.Module}_{CA_FLOW_RECIPE_WARN}"] = false;
|
|
|
+ _errorDic[$"{metalDevice.Module}_{AN_A_FLOW_ZERO_ERROR}"] = false;
|
|
|
+ _errorDic[$"{metalDevice.Module}_{AN_A_FLOW_RECIPE_ERROR}"] = false;
|
|
|
+ _errorDic[$"{metalDevice.Module}_{AN_A_FLOW_RECIPE_WARN}"] = false;
|
|
|
+ _errorDic[$"{metalDevice.Module}_{AN_B_FLOW_RECIPE_ERROR}"] = false;
|
|
|
+ _errorDic[$"{metalDevice.Module}_{AN_B_FLOW_RECIPE_WARN}"] = false;
|
|
|
+ _errorDic[$"{metalDevice.Module}_{AN_B_FLOW_ZERO_ERROR}"] = false;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -454,9 +471,6 @@ namespace CyberX8_RT.Devices.Reservoir
|
|
|
_crossDoseHelper = new CrossDoseHelper(Module);
|
|
|
_isCrossDoseInitialized = false;
|
|
|
}
|
|
|
- _isCAFlowRateWARN = new List<bool>(new bool[_metalDevices.Count]);
|
|
|
- _isANAFlowRateWARN = new List<bool>(new bool[_metalDevices.Count]);
|
|
|
- _isANBFlowRateWARN = new List<bool>(new bool[_metalDevices.Count]);
|
|
|
}
|
|
|
}
|
|
|
/// <summary>
|
|
@@ -2024,25 +2038,50 @@ namespace CyberX8_RT.Devices.Reservoir
|
|
|
if (!hotMetalDevice.FlowValveStable) continue;
|
|
|
MetalEntity metalEntity = Singleton<RouteManager>.Instance.GetModule<MetalEntity>(hotMetalDevice.Name);
|
|
|
double cellFlow = hotMetalDevice.MetalDeviceData.CellFlow;
|
|
|
- if (cellFlow < _resRecipe.CAFlowRateErrorLow)
|
|
|
+ //double cellFlowStartLowLimit = SC.GetValue<double>("Metal.CellFlowStartLowLimit");
|
|
|
+ if (cellFlow <= 0)
|
|
|
{
|
|
|
- if (!metalEntity.IsError)
|
|
|
+ if (!_errorDic[$"{hotMetalDevice.Module}_{CA_FLOW_START_LOW_LIMIT_ERROR}"])
|
|
|
{
|
|
|
- LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{hotMetalDevice.Name} cellflow:{cellFlow} is less than recipe's CAFlowRateErrorLow parameter:{_resRecipe.CAFlowRateErrorLow}");
|
|
|
+ _errorDic[$"{hotMetalDevice.Module}_{CA_FLOW_START_LOW_LIMIT_ERROR}"] = true;
|
|
|
+ string reason = $"{hotMetalDevice.Name} cellflow:{cellFlow} is less or equal 0";
|
|
|
+ LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, reason);
|
|
|
metalEntity.PostMsg(MetalMsg.Error);
|
|
|
+ metalEntity.WriteErrorReason(reason);
|
|
|
}
|
|
|
+ continue;
|
|
|
}
|
|
|
- else if (cellFlow < _resRecipe.CAFlowRateWarningLow)
|
|
|
+ else
|
|
|
{
|
|
|
- if (!_isCAFlowRateWARN[i])
|
|
|
+ _errorDic[$"{hotMetalDevice.Module}_{CA_FLOW_START_LOW_LIMIT_ERROR}"] = false;
|
|
|
+ }
|
|
|
+ if (cellFlow < _resRecipe.CAFlowRateErrorLow)
|
|
|
+ {
|
|
|
+ if (!_errorDic[$"{hotMetalDevice.Module}_{CA_FLOW_RECIPE_ERROR}"])
|
|
|
{
|
|
|
- LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{hotMetalDevice.Name} cellflow:{cellFlow} is less than recipe's CAFlowRateWarningLow parameter:{_resRecipe.CAFlowRateWarningLow}");
|
|
|
- _isCAFlowRateWARN[i] = true;
|
|
|
+ _errorDic[$"{hotMetalDevice.Module}_{CA_FLOW_RECIPE_ERROR}"] = true;
|
|
|
+ string reason = $"{hotMetalDevice.Name} cellflow:{cellFlow} is less than recipe CAFlowRateErrorLow parameter:{_resRecipe.CAFlowRateErrorLow}";
|
|
|
+ LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, reason);
|
|
|
+ metalEntity.SetFlowErrorFlag(reason);
|
|
|
}
|
|
|
+ continue;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- _isCAFlowRateWARN[i] = false;
|
|
|
+ _errorDic[$"{hotMetalDevice.Module}_{CA_FLOW_RECIPE_ERROR}"] = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cellFlow < _resRecipe.CAFlowRateWarningLow)
|
|
|
+ {
|
|
|
+ if (!_errorDic[$"{hotMetalDevice.Module}_{CA_FLOW_RECIPE_WARN}"])
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{hotMetalDevice.Name} cellflow:{cellFlow} is less than recipe CAFlowRateWarningLow parameter:{_resRecipe.CAFlowRateWarningLow}");
|
|
|
+ _errorDic[$"{hotMetalDevice.Module}_{CA_FLOW_RECIPE_WARN}"] = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _errorDic[$"{hotMetalDevice.Module}_{CA_FLOW_RECIPE_WARN}"] = false;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -2064,57 +2103,78 @@ namespace CyberX8_RT.Devices.Reservoir
|
|
|
if (hotMetalDevice.MetalDeviceData.ANAPinEnable && hotMetalDevice.ANAFlowValveStable)
|
|
|
{
|
|
|
double ANAcellFlow = hotMetalDevice.ANACellFlow.CounterValue;
|
|
|
- if (ANAcellFlow < _resRecipe.ANFlowRateErrorLow)
|
|
|
- {
|
|
|
- if (!metalEntity.IsError)
|
|
|
- {
|
|
|
- LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{hotMetalDevice.Name} ANASideflow:{ANAcellFlow} is less than recipe's ANFlowRateErrorLow parameter:{_resRecipe.ANFlowRateErrorLow}");
|
|
|
- metalEntity.PostMsg(MetalMsg.Error);
|
|
|
- }
|
|
|
- }
|
|
|
- else if (ANAcellFlow < _resRecipe.ANFlowRateWarningLow)
|
|
|
- {
|
|
|
- if (!_isANAFlowRateWARN[i])
|
|
|
- {
|
|
|
- LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{hotMetalDevice.Name} ANASideflow:{ANAcellFlow} is less than recipe's ANFlowRateWarningLow parameter:{_resRecipe.ANFlowRateWarningLow}");
|
|
|
- _isANAFlowRateWARN[i] = true;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _isANAFlowRateWARN[i] = false;
|
|
|
- }
|
|
|
+ AnSideFlowCheck(ANAcellFlow, metalEntity, "A", AN_A_FLOW_ZERO_ERROR, AN_A_FLOW_RECIPE_ERROR,
|
|
|
+ AN_A_FLOW_RECIPE_WARN, _resRecipe.ANFlowRateErrorLow, _resRecipe.ANFlowRateWarningLow);
|
|
|
}
|
|
|
//ANBCellFlow
|
|
|
if (hotMetalDevice.MetalDeviceData.ANBPinEnable && hotMetalDevice.ANBFlowValveStable)
|
|
|
{
|
|
|
double ANBcellFlow = hotMetalDevice.ANBCellFlow.CounterValue;
|
|
|
- if (ANBcellFlow < _resRecipe.ANFlowRateErrorLow)
|
|
|
- {
|
|
|
- if (!metalEntity.IsError)
|
|
|
- {
|
|
|
- LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{hotMetalDevice.Name} ANBSideflow:{ANBcellFlow} is less than recipe's ANFlowRateErrorLow parameter:{_resRecipe.ANFlowRateErrorLow}");
|
|
|
- metalEntity.PostMsg(MetalMsg.Error);
|
|
|
- }
|
|
|
- }
|
|
|
- else if (ANBcellFlow < _resRecipe.ANFlowRateWarningLow)
|
|
|
- {
|
|
|
- if (!_isANBFlowRateWARN[i])
|
|
|
- {
|
|
|
- LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{hotMetalDevice.Name} ANBSideflow:{ANBcellFlow} is less than recipe's ANFlowRateWarningLow parameter:{_resRecipe.ANFlowRateWarningLow}");
|
|
|
- _isANBFlowRateWARN[i] = true;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _isANBFlowRateWARN[i] = false;
|
|
|
- }
|
|
|
+ AnSideFlowCheck(ANBcellFlow, metalEntity, "B", AN_B_FLOW_ZERO_ERROR, AN_B_FLOW_RECIPE_ERROR,
|
|
|
+ AN_B_FLOW_RECIPE_WARN, _resRecipe.ANFlowRateErrorLow, _resRecipe.ANFlowRateWarningLow);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
/// <summary>
|
|
|
+ /// 阳极单面Flow检验
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="anCellFlow"></param>
|
|
|
+ /// <param name="metalEntity"></param>
|
|
|
+ /// <param name="side"></param>
|
|
|
+ /// <param name="flowZeroError"></param>
|
|
|
+ /// <param name="anFlowRecipeError"></param>
|
|
|
+ /// <param name="anFlowRecipeWarn"></param>
|
|
|
+ /// <param name="anFlowRecipeErrorLow"></param>
|
|
|
+ /// <param name="anFlowRecipeWarnLow"></param>
|
|
|
+ private void AnSideFlowCheck(double anCellFlow, MetalEntity metalEntity, string side, string flowZeroError,
|
|
|
+ string anFlowRecipeError, string anFlowRecipeWarn, double anFlowRecipeErrorLow, double anFlowRecipeWarnLow)
|
|
|
+ {
|
|
|
+ if (anCellFlow <= 0)
|
|
|
+ {
|
|
|
+ if (!_errorDic[$"{metalEntity.Module}_{flowZeroError}"])
|
|
|
+ {
|
|
|
+ _errorDic[$"{metalEntity.Module}_{flowZeroError}"] = true;
|
|
|
+ string reason = $"{metalEntity.Module} AN{side}Sideflow:{anCellFlow} is less or equal 0";
|
|
|
+ LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, reason);
|
|
|
+ metalEntity.PostMsg(MetalMsg.Error);
|
|
|
+ metalEntity.WriteErrorReason(reason);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _errorDic[$"{metalEntity.Module}_{flowZeroError}"] = false;
|
|
|
+ }
|
|
|
+ if (anCellFlow < anFlowRecipeErrorLow)
|
|
|
+ {
|
|
|
+ if (!_errorDic[$"{metalEntity.Module}_{anFlowRecipeError}"])
|
|
|
+ {
|
|
|
+ _errorDic[$"{metalEntity.Module}_{anFlowRecipeError}"] = true;
|
|
|
+ string reason = $"{metalEntity.Module} AN{side}Sideflow:{anCellFlow} is less than recipe ANFlowRateErrorLow parameter:{anFlowRecipeErrorLow}";
|
|
|
+ LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, reason);
|
|
|
+ metalEntity.SetFlowErrorFlag(reason);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _errorDic[$"{metalEntity.Module}_{anFlowRecipeError}"] = false;
|
|
|
+ }
|
|
|
+ if (anCellFlow < anFlowRecipeWarnLow)
|
|
|
+ {
|
|
|
+ if (!_errorDic[$"{metalEntity.Module}_{anFlowRecipeWarn}"])
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"{metalEntity.Module} AN{side}Sideflow:{anCellFlow} is less than recipe ANFlowRateWarningLow parameter:{anFlowRecipeWarnLow}");
|
|
|
+ _errorDic[$"{metalEntity.Module}_{anFlowRecipeWarn}"] = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _errorDic[$"{metalEntity.Module}_{anFlowRecipeWarn}"] = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
/// Temperature Check
|
|
|
/// </summary>
|
|
|
private void TemperatureCheck()
|