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.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 内部变量 /// /// 默认泵速 /// private double _anPumpSpeed = 5000; #endregion #region Trigger /// /// low WaterLevel trigger /// private R_TRIG _anWaterLevelLowerTrigger = new R_TRIG(); /// /// low WaterLevel trigger /// private R_TRIG _anWaterLevelHighTrigger = new R_TRIG(); #endregion /// /// 构造函数 /// /// public DMReservoirDevice(string moduleName) : base(moduleName) { } /// /// 订阅变量 /// protected override void SubscribeValueAction() { base.SubscribeValueAction(); IoSubscribeUpdateVariable(AN_DI_REPLEN); IoSubscribeUpdateVariable(AN_FLOW); IoSubscribeUpdateVariable(AN_PUMP_ENABLE); IoSubscribeUpdateVariable(AN_PUMP_SPEED); IoSubscribeUpdateVariable(DEGAS_ENABLE); } /// /// 订阅Operation /// protected override void InitializeOperation() { base.InitializeOperation(); OP.Subscribe($"{Module}.ANPumpEnable", AnPumpOnOperation); OP.Subscribe($"{Module}.ANPumpSpeed", ANPumpSpeedOperation); OP.Subscribe($"{Module}.ANPumpDisable", AnPumpOffOperation); } #region AnPump /// /// AN Pump调速 /// /// /// /// private bool ANPumpSpeedOperation(string cmd, object[] args) { double anMaxPumpSpeed = 0; if (SC.ContainsItem("Reservoir.ANMaxPumpSpeed")) { anMaxPumpSpeed = SC.GetValue("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; } } /// /// 设置AN泵速 /// /// /// public bool AnPumpSpeed(double anPumpSpeed) { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{AN_PUMP_SPEED}"); return BeckhoffIOManager.Instance.WriteIoValue(ioName, anPumpSpeed); } /// /// 阳极Pump On /// /// /// /// private bool AnPumpOnOperation(string cmd, object[] args) { double caPumpSpeed = SC.GetValue("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; } } /// /// 阳极Pump Off /// /// /// /// private bool AnPumpOffOperation(string cmd, object[] args) { return AnPumpOff(); } /// /// 关闭阳极Pump /// /// public bool AnPumpOff() { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{AN_PUMP_ENABLE}"); return BeckhoffIOManager.Instance.WriteIoValue(ioName, false); } #endregion /// /// 水位监控 /// protected override void WaterLevelMonitor() { base.WaterLevelMonitor(); } /// /// 补水监控 /// protected override void AutoDireplenMonitor() { base.AutoDireplenMonitor(); } /// /// 阳极补水 /// private void AnDireplenMonitor() { } } }