using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.Beckhoff.ModuleIO; using MECF.Framework.Common.Routine; using MECF.Framework.Common.ToolLayout; using MECF.Framework.Common.TwinCat; using CyberX8_Core; using CyberX8_RT.Devices.Metal; using CyberX8_RT.Devices.Reservoir; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CyberX8_RT.Devices.Safety; using MECF.Framework.Common.IOCore; namespace CyberX8_RT.Modules.Reservoir { public class ANPumpOnRoutine : RoutineBase, IRoutine { private enum ANPumpStep { PumpSpeed, Delay, ANByPass, CellsFillValve, FlowDelay, CheckFlow, CheckByPass, End } #region 常量 private const string AN_A_PINENABLE = "ANAPinEnable"; private const string AN_B_PINENABLE = "ANBPinEnable"; private const string AN_PUMP = "ANPump"; private const string AN_BY_PASS = "ANByPass"; #endregion #region 内部变量 /// /// 默认泵速 /// private double _anPumpSpeed = 5000; /// /// flow fault hold off时长 /// private int _flowFaultHoldOffTime = 10000; /// /// 阳极最小流量 /// private double _anMinFlow = 0.2; /// /// 最小Bypass数值 /// private int _anBypassMinCellCount; /// /// AN流量总和 /// private double _anTotalFlow = 0; /// /// Reservoir设备 /// private CompactMembranReservoirDevice _device; /// /// 阳极打开阀Cell总数 /// private int _anOpenValveCount; #endregion /// /// 构造函数 /// /// public ANPumpOnRoutine(string module) : base(module) { } /// /// 中止 /// public void Abort() { Runner.Stop("Manual abort"); } /// /// 监控 /// /// public RState Monitor() { Runner.Run(ANPumpStep.PumpSpeed, () => { return ANPumpSpeed(_anPumpSpeed); }, _delay_1ms) .Run(ANPumpStep.ANByPass,ANByPassOn,_delay_1ms) .Run(ANPumpStep.CellsFillValve, OpenAllCellsFillValve,_delay_1ms) .Delay(ANPumpStep.Delay, _flowFaultHoldOffTime) .Run(ANPumpStep.CheckFlow,CheckAllFlow,_delay_1ms) .RunIf(ANPumpStep.CheckByPass, CheckTotalFlowBypass(),ANByPassOff,NullFun,_delay_1ms) .End(ANPumpStep.End, NullFun, _delay_1ms); return Runner.Status; } /// /// Pump Speed /// /// /// private bool ANPumpSpeed(double speed) { SafetyDevice safetyDevice = DEVICE.GetDevice("Safety"); if (safetyDevice != null && !safetyDevice.SafetyData.PumpEdm) { LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"Safety PumpEdm is Activate"); return false; } string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{AN_PUMP}"); return IOModuleManager.Instance.WriteIoValue(ioName, speed); } /// /// Pump Bypass /// /// /// private bool ANByPassOn() { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{AN_BY_PASS}"); return IOModuleManager.Instance.WriteIoValue(ioName, true); } /// /// Pump Bypass /// /// /// private bool ANByPassOff() { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{AN_BY_PASS}"); return IOModuleManager.Instance.WriteIoValue(ioName, false); } /// /// 检验所有流量 /// /// private bool OpenAllCellsFillValve() { bool result = false; ReservoirItem reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(Module.ToString()); if (reservoirItem != null) { List metalItems = reservoirItem.MetalCells; if (metalItems != null && metalItems.Count > 0) { foreach (MetalItem metalItem in metalItems) { if (metalItem.Installed) { CompactMembranMetalDevice metalDevice = DEVICE.GetDevice(metalItem.ModuleName); if (metalDevice != null && metalDevice.IsAuto) { _anOpenValveCount++; result = metalDevice.AnSideAFillOn("", null); if(!result) { return false; } result = metalDevice.AnSideBFillOn("", null); if (!result) { return false; } } } } } } return true; } /// /// 关闭所有Cell的Flow Valve /// /// private bool CloseAllCellsFlowValve() { ReservoirItem reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(Module.ToString()); if (reservoirItem != null) { List metalItems = reservoirItem.MetalCells; if (metalItems != null && metalItems.Count > 0) { foreach (MetalItem metalItem in metalItems) { if (metalItem.Installed) { CompactMembranMetalDevice metalDevice = DEVICE.GetDevice(metalItem.ModuleName); if (metalDevice != null && metalDevice.IsAuto) { metalDevice.AnSideAFillOff("", null); metalDevice.AnSideBFillOff("", null); } } } } } return true; } /// /// 检验所有流量 /// /// private bool CheckAllFlow() { if (_anOpenValveCount == 0) { return true; } _anTotalFlow = 0.0; ReservoirItem reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(Module.ToString()); if (reservoirItem != null) { List metalItems = reservoirItem.MetalCells; if (metalItems != null && metalItems.Count > 0) { foreach (MetalItem metalItem in metalItems) { if (metalItem.Installed) { CompactMembranMetalDevice metalDevice = DEVICE.GetDevice(metalItem.ModuleName); if (metalDevice != null&&metalDevice.IsAuto) { _anTotalFlow += metalDevice.ANACellFlow.CounterValue; _anTotalFlow += metalDevice.ANBCellFlow.CounterValue; } } } } } if(_anTotalFlow<=_anMinFlow) { CloseAllCellsFlowValve(); ANPumpSpeed(0); LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"total flow {_anTotalFlow} is not over {_anMinFlow}"); return false; } else { LOG.WriteLog(eEvent.INFO_RESERVOIR, Module, $"total flow {_anTotalFlow} is over {_anMinFlow}"); return true; } } /// /// 检验总流量Bypass情况 /// /// private bool CheckTotalFlowBypass() { return _anTotalFlow > _anBypassMinCellCount; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _device = DEVICE.GetDevice(Module); _anPumpSpeed = SC.GetValue("Reservoir.ANDefaultPumpSpeed"); _flowFaultHoldOffTime = SC.GetValue($"Reservoir.{Module}.FlowFaultHoldOffTime"); _anBypassMinCellCount = SC.GetValue($"Reservoir.{Module}.ANBypassMinCellCount"); _anTotalFlow = 0; return Runner.Start(Module, "AN Pump On"); } } }