123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- using Aitex.Core.RT.DataCenter;
- using Aitex.Core.RT.Log;
- using Aitex.Core.RT.OperationCenter;
- using Aitex.Core.RT.SCCore;
- using Aitex.Core.Util;
- using MECF.Framework.Common.Beckhoff.ModuleIO;
- using MECF.Framework.Common.CommonData.Reservoir;
- using MECF.Framework.Common.Equipment;
- using MECF.Framework.Common.Persistent.Reservoirs;
- using MECF.Framework.Common.Persistent.Temperature;
- using MECF.Framework.Common.TwinCat;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace PunkHPX8_RT.Devices.Reservoir
- {
- public class DMReservoirDevice : ReservoirDevice
- {
- #region 常量
- private const string AN_PUMP = "ANPump";
- #endregion
- #region 内部变量
- /// <summary>
- /// 默认泵速
- /// </summary>
- private double _anPumpSpeed = 5000;
- /// <summary>
- /// an泵速Helper
- /// </summary>
- private ReservoirANPumpSpeedHelper _anPumpSpeedHelper;
- #endregion
- #region 属性
- /// <summary>
- /// 检验阳极是否highlevel
- /// </summary>
- public bool IsANHighLevel { get { return _reservoirData.AnTowerHigh; } }
- /// <summary>
- /// 检验阳极是否lowlevel
- /// </summary>
- public bool IsANLowLevel { get { return _reservoirData.AnTowerLow; } }
- #endregion
- #region Trigger
- /// <summary>
- /// low WaterLevel trigger
- /// </summary>
- private R_TRIG _anWaterLevelLowerTrigger = new R_TRIG();
- /// <summary>
- /// low WaterLevel trigger
- /// </summary>
- private R_TRIG _anWaterLevelHighTrigger = new R_TRIG();
- #endregion
- /// <summary>
- /// 构造函数
- /// </summary>
- /// <param name="moduleName"></param>
- public DMReservoirDevice(string moduleName) : base(moduleName)
- {
- _anPumpSpeedHelper = new ReservoirANPumpSpeedHelper(Module, this);
- }
- /// <summary>
- /// 订阅变量
- /// </summary>
- protected override void SubscribeValueAction()
- {
- base.SubscribeValueAction();
- IoSubscribeUpdateVariable(AN_DI_REPLEN);
- IoSubscribeUpdateVariable(AN_FLOW);
- IoSubscribeUpdateVariable(AN_PUMP_ENABLE);
- IoSubscribeUpdateVariable(AN_PUMP_SPEED);
- IoSubscribeUpdateVariable(DEGAS_ENABLE);
- }
- /// <summary>
- /// 订阅Data
- /// </summary>
- protected override void SubscribeData()
- {
- base.SubscribeData();
- DATA.Subscribe($"{Module}.IsManualANReplen", () => { return _currentDireplenOperation == DiReplenOperation.ManualANDiReplen; }, SubscriptionAttribute.FLAG.IgnoreSaveDB);
- }
- /// <summary>
- /// 订阅Operation
- /// </summary>
- protected override void InitializeOperation()
- {
- base.InitializeOperation();
- OP.Subscribe($"{Module}.ANPumpEnable", AnPumpOnOperation);
- OP.Subscribe($"{Module}.ANPumpSpeed", ANPumpSpeedOperation);
- OP.Subscribe($"{Module}.ANPumpDisable", AnPumpOffOperation);
- OP.Subscribe($"{Module}.ANIsolationOn", (cmd, para) => { return ANIsolationOn(); });
- OP.Subscribe($"{Module}.ANIsolationOff", (cmd, para) => { return ANIsolationOff(); });
- OP.Subscribe($"{Module}.ManualANDiReplen", ManualANDiReplen);
- }
- #region AnPump
- /// <summary>
- /// AN Pump调速
- /// </summary>
- /// <param name="cmd"></param>
- /// <param name="args"></param>
- /// <returns></returns>
- private bool ANPumpSpeedOperation(string cmd, object[] args)
- {
- double anMaxPumpSpeed = 0;
- if (SC.ContainsItem("Reservoir.ANMaxPumpSpeed"))
- {
- anMaxPumpSpeed = SC.GetValue<double>("Reservoir.ANMaxPumpSpeed");
- }
- if (double.TryParse(args[0].ToString(), out double speed))
- {
- _anPumpSpeed = speed;
- if (_anPumpSpeed > anMaxPumpSpeed)
- {
- LOG.WriteLog(eEvent.WARN_RESERVOIR, Module, $"AN pump speed:{_anPumpSpeed} is over AN max pump speed {anMaxPumpSpeed}!");
- return false;
- }
- return AnPumpSpeed(_anPumpSpeed);
- }
- else
- {
- LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{args[0]} is nor invalid speed");
- return false;
- }
- }
- /// <summary>
- /// 设置AN泵速
- /// </summary>
- /// <param name="caPumpSpeed"></param>
- /// <returns></returns>
- public bool AnPumpSpeed(double anPumpSpeed)
- {
- string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{AN_PUMP_SPEED}");
- return BeckhoffIOManager.Instance.WriteIoValue(ioName, anPumpSpeed);
- }
- /// <summary>
- /// 阳极Pump On
- /// </summary>
- /// <param name="cmd"></param>
- /// <param name="args"></param>
- /// <returns></returns>
- public bool AnPumpOnOperation(string cmd, object[] args)
- {
- double caPumpSpeed = SC.GetValue<double>("Reservoir.ANDefaultPumpSpeed");
- bool result = AnPumpSpeed(caPumpSpeed);
- if (result)
- {
- string enableIOName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{AN_PUMP_ENABLE}");
- return BeckhoffIOManager.Instance.WriteIoValue(enableIOName, true);
- }
- else
- {
- return false;
- }
- }
- /// <summary>
- /// 阳极Pump Off
- /// </summary>
- /// <param name="cmd"></param>
- /// <param name="args"></param>
- /// <returns></returns>
- private bool AnPumpOffOperation(string cmd, object[] args)
- {
- return AnPumpOff();
- }
- /// <summary>
- /// 关闭阳极Pump
- /// </summary>
- /// <returns></returns>
- public bool AnPumpOff()
- {
- string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{AN_PUMP_ENABLE}");
- return BeckhoffIOManager.Instance.WriteIoValue(ioName, false);
- }
- /// <summary>
- /// ANIsolationOn
- /// </summary>
- /// <returns></returns>
- public bool ANIsolationOn()
- {
- return WriteVariableValue(AN_ISOLATION, true);
- }
- /// <summary>
- /// ANIsolationOff
- /// </summary>
- /// <returns></returns>
- public bool ANIsolationOff()
- {
- return WriteVariableValue(AN_ISOLATION, false);
- }
- #endregion
- protected override void AutoMonitor()
- {
- base.AutoMonitor();
- if (_persistentValue.OperatingMode == AUTO)
- {
- _anPumpSpeedHelper.Monitor(_resRecipe);
- }
- }
- /// <summary>
- /// 水位监控
- /// </summary>
- protected override void WaterLevelMonitor()
- {
- base.WaterLevelMonitor();
- //增加AN tower监控逻辑
- _anWaterLevelLowerTrigger.CLK = _reservoirData.AnTowerLow;
- _anWaterLevelHighTrigger.CLK = _reservoirData.AnTowerHigh;
- 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)
- {
- LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"AN tower high is activate and recipe ANDIReplenEnable is false");
- }
- }
- /// <summary>
- /// 补水监控
- /// </summary>
- protected override void AutoDireplenMonitor()
- {
- base.AutoDireplenMonitor();
- if (_currentDireplenOperation == DiReplenOperation.ManualANDiReplen)
- {
- bool result = _direplenHelper.MonitorManualDiReplenComplete(_manualReplenSecond, ANDiReplenOff, ref _isDIReplenMaxTimeOut);
- if (result)
- {
- _currentDireplenOperation = DiReplenOperation.None;
- }
- }
- //阳极没有水位,自动补水监控逻辑待修正
- if (_currentDireplenOperation == DiReplenOperation.AutoANDiReplen)
- {
- }
- }
- /// <summary>
- /// 阳极DI Replen On
- /// </summary>
- /// <param name="cmd"></param>
- /// <param name="args"></param>
- /// <returns></returns>
- private bool ANDiReplenOnOperation(string cmd, object[] args)
- {
- return ANDiReplenOn();
- }
- /// <summary>
- /// 阳极DI Replen On
- /// </summary>
- /// <param name="showError"></param>
- /// <returns></returns>
- private bool ANDiReplenOn()
- {
- bool preCondition = CheckPreDiReplenCondition();
- if (!preCondition)
- {
- return false;
- }
- if (IsANHighLevel)
- {
- LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"ANHighLevel is activate,Can't do AN_DIReple");
- return false;
- }
- if (IsANLowLevel)
- {
- LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"ANLowLevel is activate,Can't do AN_DIReple");
- return false;
- }
- if (ReservoirData.CaDiReplen)
- {
- LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, "CADiReplen is on");
- return false;
- }
- string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{AN_DI_REPLEN}");
- return BeckhoffIOManager.Instance.WriteIoValue(ioName, true);
- }
- /// <summary>
- /// 阳极DI Replen Off
- /// </summary>
- /// <param name="cmd"></param>
- /// <param name="args"></param>
- /// <returns></returns>
- private bool ANDiReplenOff(string cmd, object[] args)
- {
- string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{AN_DI_REPLEN}");
- bool result = BeckhoffIOManager.Instance.WriteIoValue(ioName, false);
- if (result)
- {
- _persistentValue.IsDiReplenOn = false;
- if (_currentDireplenOperation == DiReplenOperation.ManualANDiReplen || _currentDireplenOperation == DiReplenOperation.AutoANDiReplen)
- {
- _currentDireplenOperation = DiReplenOperation.None;
- _persistentValue.LastTotalReplen = _persistentValue.TotalReplen;
- ReservoirsPersistentManager.Instance.UpdatePersistentValue(Module);
- }
- }
- return result;
- }
- /// <summary>
- /// 手动阳极注水
- /// </summary>
- /// <param name="cmd"></param>
- /// <param name="args"></param>
- /// <returns></returns>
- private bool ManualANDiReplen(string cmd, object[] args)
- {
- return ManualDiReplen(ANDiReplenOnOperation, DiReplenOperation.ManualANDiReplen, args[0].ToString());
- }
- }
- }
|