using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.SCCore; using CyberX8_RT.Devices.Metal; using MECF.Framework.Common.CommonData.Reservoir; using MECF.Framework.Common.RecipeCenter; using MECF.Framework.Common.ToolLayout; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Devices.Reservoir { public class ReservoirPumpSpeedHelper { #region 内部变量 /// /// 时间 /// private DateTime _updateTime=DateTime.Now; /// /// 模块名称 /// private string _moduleName; /// /// AN流量总和 /// private double _anTotalFlow = 0; /// /// CA流量总和 /// private double _caTotalFlow = 0; /// /// 设备对象 /// CompactMembranReservoirDevice _device; #endregion /// /// 构造函数 /// /// public ReservoirPumpSpeedHelper(string moduleName,CompactMembranReservoirDevice reservoirDevice) { _moduleName = moduleName; _device = reservoirDevice; } /// /// 监控 /// public void Monitor(ResRecipe resRecipe) { int cellFlowUpdatePeriod = SC.GetValue("Reservoir.CellFlowUpdatePeriod"); if(DateTime.Now.Subtract(_updateTime).TotalSeconds > cellFlowUpdatePeriod) { _updateTime = DateTime.Now; AdjustANPumpSpeed(resRecipe); AdjustCAPumpSpeed(resRecipe); } } /// /// 调节阳极泵速 /// private void AdjustANPumpSpeed(ResRecipe resRecipe) { double anPumpSpeed = _device.ReservoirData.ANPump; if (anPumpSpeed != 0) { double averageANFlow = GetAverageANFlow(); if (averageANFlow == 0) { return; } double anFlowDelta = resRecipe.ANFlowSetPoint - averageANFlow; double newANPumpSpeed = 1.8 * anFlowDelta + anPumpSpeed; if (newANPumpSpeed <= 0) { return; } if (Math.Abs(newANPumpSpeed - anPumpSpeed) >= 0.01) { _device.AnPump(newANPumpSpeed); } } } /// /// 调节阳极泵速 /// private void AdjustCAPumpSpeed(ResRecipe resRecipe) { if (_device.ReservoirData.CAPumpEnable) { double caPumpSpeed = _device.ReservoirData.CAPumpSpeed; double averageCAFlow = GetAverageCAFlow(); if (averageCAFlow == 0) { return; } double caPumpMaxSpeed = SC.GetValue("Reservoir.CAMaxPumpSpeed"); double caFlowDelta = resRecipe.CAFlowSetPoint - averageCAFlow; double newCAPumpSpeed = 330 * caFlowDelta + caPumpSpeed; if (newCAPumpSpeed <= 0 || newCAPumpSpeed > caPumpMaxSpeed) { return; } if (Math.Abs(newCAPumpSpeed - caPumpSpeed) >= 10) { _device.CAPumpSpeed(newCAPumpSpeed); } } } /// /// 获取平均阳极流量 /// /// private double GetAverageANFlow() { int count = 0; _anTotalFlow = 0; double ANOverFlow = SC.GetValue("Reservoir.ANOverFlow"); ReservoirItem reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(_moduleName); if (reservoirItem == null) { return 0; } List metalItems = reservoirItem.MetalCells; if (metalItems == null || metalItems.Count == 0) { return 0; } foreach (MetalItem metalItem in metalItems) { CompactMembranMetalDevice metalDevice = DEVICE.GetDevice(metalItem.ModuleName); if (metalDevice == null || metalDevice.IsManual || metalDevice.IsDisable) { continue; } if (metalDevice.MetalDeviceData.ANAPinEnable&&metalDevice.ANACellFlow.CounterValue < ANOverFlow) { _anTotalFlow += metalDevice.ANACellFlow.CounterValue; count++; } if (metalDevice.MetalDeviceData.ANBPinEnable&&metalDevice.ANBCellFlow.CounterValue /// 获取平均阳极流量 /// /// private double GetAverageCAFlow() { int count = 0; _caTotalFlow = 0; ReservoirItem reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(_moduleName); if (reservoirItem != null) { List metalItems = reservoirItem.MetalCells; if (metalItems != null && metalItems.Count > 0) { foreach (MetalItem metalItem in metalItems) { CompactMembranMetalDevice metalDevice = DEVICE.GetDevice(metalItem.ModuleName); if (metalDevice != null&&metalDevice.IsAuto) { if (metalDevice.MetalDeviceData.CellFlowValve) { count++; _caTotalFlow += metalDevice.MetalDeviceData.CellFlow; } } } } if (count != 0) { return _caTotalFlow / count; } } return 0; } } }