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;
}
}
}