|
@@ -12,6 +12,7 @@ using MECF.Framework.Common.TwinCat;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
+using System.Runtime.InteropServices;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
@@ -31,6 +32,7 @@ namespace PunkHPX8_RT.Devices.Reservoir
|
|
|
/// an泵速Helper
|
|
|
/// </summary>
|
|
|
private ReservoirANPumpSpeedHelper _anPumpSpeedHelper;
|
|
|
+
|
|
|
#endregion
|
|
|
|
|
|
#region 属性
|
|
@@ -42,6 +44,10 @@ namespace PunkHPX8_RT.Devices.Reservoir
|
|
|
/// 检验阳极是否lowlevel
|
|
|
/// </summary>
|
|
|
public bool IsANLowLevel { get { return _reservoirData.AnTowerLow; } }
|
|
|
+ /// <summary>
|
|
|
+ /// 阳极是否需要补水
|
|
|
+ /// </summary>
|
|
|
+ public bool AnNeedDireplen { get { return CheckANNeedDiReplen(); } }
|
|
|
#endregion
|
|
|
|
|
|
#region Trigger
|
|
@@ -215,7 +221,6 @@ namespace PunkHPX8_RT.Devices.Reservoir
|
|
|
if (_anWaterLevelLowerTrigger.Q && !Recipe.ANDIReplenEnable)
|
|
|
{
|
|
|
LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"AN tower low is activate and recipe ANDIReplenEnable is false");
|
|
|
- //若recipe允许补水且res auto ,需要启动阳极自动补水
|
|
|
}
|
|
|
if (_anWaterLevelHighTrigger.Q && !Recipe.ANDIReplenEnable)
|
|
|
{
|
|
@@ -223,7 +228,7 @@ namespace PunkHPX8_RT.Devices.Reservoir
|
|
|
}
|
|
|
}
|
|
|
/// <summary>
|
|
|
- /// 补水监控
|
|
|
+ /// 补水监控,用于关闭自动补水
|
|
|
/// </summary>
|
|
|
protected override void AutoDireplenMonitor()
|
|
|
{
|
|
@@ -236,10 +241,9 @@ namespace PunkHPX8_RT.Devices.Reservoir
|
|
|
_currentDireplenOperation = DiReplenOperation.None;
|
|
|
}
|
|
|
}
|
|
|
- //阳极没有水位,自动补水监控逻辑待修正
|
|
|
if (_currentDireplenOperation == DiReplenOperation.AutoANDiReplen)
|
|
|
{
|
|
|
-
|
|
|
+ AutoANDiReplenMonitor(ANDiReplenOff, _resRecipe.ANDIReplenEnable, _resRecipe.ANDIReplenTimeRate, _resRecipe.ANDIReplenCurrentRate);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -317,8 +321,84 @@ namespace PunkHPX8_RT.Devices.Reservoir
|
|
|
return ManualDiReplen(ANDiReplenOnOperation, DiReplenOperation.ManualANDiReplen, args[0].ToString());
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 检验阳极是否需要补水
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ private bool CheckANNeedDiReplen()
|
|
|
+ {
|
|
|
+ if (IsAuto && _resRecipe != null)
|
|
|
+ {
|
|
|
+ if (_resRecipe.ANDIReplenEnable && _resRecipe.ANDIReplenCurrentRate == 0 && _resRecipe.ANDIReplenTimeRate == 0)
|
|
|
+ {
|
|
|
+ return _reservoirData.AnTowerLow;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 阳极自动注水
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ public bool AutoANDiReplen()
|
|
|
+ {
|
|
|
+ return AutoDireplen(ANDiReplenOn, DiReplenOperation.AutoANDiReplen);
|
|
|
+ }
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 阳极自动注水监控
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="direplenOff"></param>
|
|
|
+ /// <param name="level"></param>
|
|
|
+ /// <param name="recipeLevel"></param>
|
|
|
+ private void AutoANDiReplenMonitor(Func<string, object[], bool> direplenOff, bool replenEnable, int direplenTimeRate, int direplenCurrentRate)
|
|
|
+ {
|
|
|
+ //判断是否注水超时(包括单次和累计)
|
|
|
+ bool result = _direplenHelper.AutoDiReplenMonitorTimeOut(direplenOff, ref _isDIReplenMaxTimeOut, ref _isDIReplenPerfillTimeOut);
|
|
|
+ if (result)
|
|
|
+ {
|
|
|
+ _currentDireplenOperation = DiReplenOperation.None;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //按液位补水
|
|
|
+ result = AutoANDiReplenMonitorComplete(replenEnable, direplenTimeRate, direplenCurrentRate, direplenOff);
|
|
|
+ if (result)
|
|
|
+ {
|
|
|
+ _currentDireplenOperation = DiReplenOperation.None;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 阳极自动注水是否结束
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="replenEnable"></param>
|
|
|
+ /// <param name="direplenTimeRate"></param>
|
|
|
+ /// <param name="direplenCurrentRate"></param>
|
|
|
+ /// <param name="direplenOffAction"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private bool AutoANDiReplenMonitorComplete(bool replenEnable, int direplenTimeRate, int direplenCurrentRate, Func<string, object[], bool> direplenOffAction)
|
|
|
+ {
|
|
|
+ if (replenEnable && direplenTimeRate == 0 && direplenCurrentRate == 0 && ReservoirData.AnTowerHigh)
|
|
|
+ {
|
|
|
+ LOG.WriteLog(eEvent.INFO_RESERVOIR, Module, "Auto AN DiReplen complete");
|
|
|
+ bool result = direplenOffAction("", null);
|
|
|
+ if (result)
|
|
|
+ {
|
|
|
+ _persistentValue.LastTotalReplen = _persistentValue.TotalReplen;
|
|
|
+ _persistentValue.IsDiReplenOn = false;
|
|
|
+ ReservoirsPersistentManager.Instance.UpdatePersistentValue(Module);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
}
|