using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace IStation.Calculation.DispatchAna.Common
|
{
|
/// <summary>
|
/// 调度分析(核心算法)
|
/// </summary>
|
public class DispatchAnaGeneralHelper扬程
|
{
|
/// <summary>
|
///
|
/// </summary>
|
static public double MinFlowIngore = 50;//流量低于多少就不考虑了
|
/// <summary>
|
///
|
/// </summary>
|
static public double ExtendMaxRatio = 1.25;//最大延长率 25%
|
/// <summary>
|
///
|
/// </summary>
|
static public double MinChangeFrequence = 15;//最小变化的频率
|
/// <summary>
|
///
|
/// </summary>
|
static public double ChangeFrequenceSpaece = 0.5;//频率变化值
|
|
|
|
private double _targetQ;
|
private double _targetH;
|
private double _targetQmax, _targetQmin;
|
|
private List<IStation.Calculation.DispatchAna.Model.MachineRunFilter> _machineRunFilterList = null;
|
private List<long> _must_open_machine_array = null;
|
private List<long> _must_close_machine_array = null;
|
private Dictionary<long, double> _machine_flow_limit_max_dict = null;
|
private Dictionary<long, double> _machine_flow_limit_min_dict = null;
|
private int _max_open_machine_number = 0;//最多开机数量
|
private List<IStation.Calculation.DispatchAna.Model.AnaScheme> _anaSchemeList = null;
|
private List<IStation.Calculation.DispatchAna.Model.MachineDetail> _allMachineList = null;
|
//组合运行约束(禁止判断)
|
private List<IStation.Calculation.DispatchAna.Model.CombineRunJudge> _allCombineRunJudgeList4Forbid = null;
|
//组合运行约束(必须判断)
|
private List<List<long>> _allCombineRunJudgeList4Must = null;
|
/// <summary>
|
/// 初始化参数
|
/// </summary>
|
/// <param name="targetQ"></param>
|
/// <param name="targetH"></param>
|
/// <param name="MinQ"></param>
|
/// <param name="MaxQ"></param>
|
/// <param name="allEnginePumpList"></param>
|
/// <param name="MachineRunFilterList"></param>
|
/// <returns></returns>
|
public bool InitialParas(
|
double targetQ, double targetH, string MinQ, string MaxQ,
|
List<IStation.Calculation.DispatchAna.Model.MachineDetail> allEnginePumpList,
|
List<IStation.Calculation.DispatchAna.Model.MachineRunFilter> MachineRunFilterList)
|
{
|
this._targetH = targetH;
|
this._targetQ = targetQ;
|
|
this._allMachineList = allEnginePumpList;
|
|
|
this._targetQmax = targetQ * 1.25;
|
this._targetQmin = targetQ * 0.85;
|
if (!string.IsNullOrEmpty(MinQ))
|
{
|
double minq = targetQ;
|
if (MinQ.Contains("%"))
|
{
|
double ratio;
|
if (double.TryParse(MinQ.Replace("%", ""), out ratio))
|
{
|
minq = targetQ * (1 - Math.Abs(ratio));
|
}
|
}
|
else
|
{
|
double.TryParse(MinQ, out minq);
|
}
|
if (minq < targetQ)
|
{
|
_targetQmin = minq;
|
}
|
}
|
//IStation.LogHelper.Info("min_q:" + _targetQmin);
|
|
if (!string.IsNullOrEmpty(MaxQ))
|
{
|
double maxq = targetQ;
|
if (MaxQ.Contains("%"))
|
{
|
double ratio;
|
if (double.TryParse(MaxQ.Replace("%", ""), out ratio))
|
{
|
maxq = targetQ * (1 + Math.Abs(ratio));
|
}
|
}
|
else
|
{
|
double.TryParse(MaxQ, out maxq);
|
}
|
if (maxq > targetQ)
|
{
|
_targetQmax = maxq;
|
}
|
}
|
|
|
InitialFilter(MachineRunFilterList);
|
|
|
return true;
|
}
|
|
#region 过滤
|
private void InitialFilter(List<IStation.Calculation.DispatchAna.Model.MachineRunFilter> MachineRunFilterList)
|
{
|
this._machineRunFilterList = MachineRunFilterList;
|
|
if (_machineRunFilterList != null)
|
{
|
_must_open_machine_array = null;
|
_must_close_machine_array = null;
|
_machine_flow_limit_max_dict = null;
|
_machine_flow_limit_min_dict = null;
|
foreach (var m in _machineRunFilterList)
|
{
|
if (m.RunStatus == 1)
|
{
|
if (_must_open_machine_array == null)
|
_must_open_machine_array = new List<long>();
|
|
_must_open_machine_array.Add(m.MachineID);
|
}
|
|
if (m.RunStatus == 0)
|
{
|
if (_must_close_machine_array == null)
|
_must_close_machine_array = new List<long>();
|
|
_must_close_machine_array.Add(m.MachineID);
|
}
|
|
if (m.MaxFlow > 10)
|
{
|
if (this._machine_flow_limit_max_dict == null)
|
_machine_flow_limit_max_dict = new Dictionary<long, double>();
|
_machine_flow_limit_max_dict[m.MachineID] = m.MaxFlow;
|
}
|
|
}
|
|
}
|
}
|
|
//是否符合过滤
|
private bool IsAccordMachineRunFilter(List<long> current_open_machine_id_array)
|
{
|
if (current_open_machine_id_array == null || current_open_machine_id_array.Count() == 0)
|
return false;
|
|
//必须开机
|
if (_must_open_machine_array != null && _must_open_machine_array.Count > 0)
|
{
|
foreach (var machine_id in _must_open_machine_array)
|
{
|
if (!current_open_machine_id_array.Contains(machine_id))
|
return false;
|
}
|
}
|
|
//不能开机
|
if (_must_close_machine_array != null && _must_close_machine_array.Count > 0)
|
{
|
foreach (var machine_id in current_open_machine_id_array)
|
{
|
if (_must_close_machine_array.Contains(machine_id))
|
return false;
|
}
|
}
|
|
|
//开机组合 约束(禁止)
|
if (_allCombineRunJudgeList4Forbid != null && _allCombineRunJudgeList4Forbid.Count() > 0)
|
{
|
foreach (var combineRunJudge in _allCombineRunJudgeList4Forbid)
|
{//符合禁止约束就不行
|
if (combineRunJudge.Judgement(current_open_machine_id_array))
|
return false;
|
}
|
}
|
|
|
//开机组合 约束(必须)
|
if (this._allCombineRunJudgeList4Must != null)
|
{
|
foreach( var item_arr in this._allCombineRunJudgeList4Must)
|
{
|
var q = from a in item_arr join b in current_open_machine_id_array on a equals b select a;
|
|
bool flag = item_arr.Count == current_open_machine_id_array.Count && q.Count() == item_arr.Count;
|
|
if (!flag)
|
return false;
|
}
|
}
|
return true;
|
}
|
#endregion
|
|
|
/// <summary>
|
/// 计算(最优)
|
/// </summary>
|
/// <param name="SchemeSortType"></param>
|
/// <param name="ReturnSchemeNumber"></param>
|
/// <returns></returns>
|
public List<IStation.Calculation.DispatchAna.Model.AnaScheme> CalcOptList (
|
IStation.Calculation.DispatchAna.Model.eAnaSchemeSortType SchemeSortType,
|
int ReturnSchemeNumber)
|
{
|
if (_allMachineList == null || _allMachineList.Count() == 0)
|
{
|
return null;
|
}
|
|
|
#region 获取并预算一下
|
|
List<IStation.Calculation.DispatchAna.Model.FixPumpAnaData> fixPumpAnaDataList = new List<IStation.Calculation.DispatchAna.Model.FixPumpAnaData>();//固频泵
|
List<IStation.Calculation.DispatchAna.Model.FrePumpAnaData> frePumpAnaDataList = new List<IStation.Calculation.DispatchAna.Model.FrePumpAnaData>();//变频泵
|
|
foreach (var machine in _allMachineList)
|
{
|
if (_must_close_machine_array != null)
|
{
|
if (_must_close_machine_array.Contains(machine.MachineID))
|
continue;//必须关闭
|
}
|
|
|
if (machine.IsFrequency)
|
{//变频泵
|
var anaData = GetFrePumpAnaData(machine);
|
if (anaData != null)
|
frePumpAnaDataList.Add(anaData);
|
}
|
else
|
{//固频泵
|
var anaData = GetFixPumpAnaData(machine);
|
if (anaData != null)
|
fixPumpAnaDataList.Add(anaData);
|
}
|
}
|
#endregion
|
|
#region 开始分析
|
|
|
_anaSchemeList = new List<IStation.Calculation.DispatchAna.Model.AnaScheme>();
|
|
if (fixPumpAnaDataList == null || fixPumpAnaDataList.Count() == 0)
|
{//没有合适的固频泵
|
AddOnlyFrePumpPrj(frePumpAnaDataList.ToArray());
|
}
|
else
|
{
|
//分析没有变频泵开启的情况
|
AddOnlyFrePumpPrj(frePumpAnaDataList.ToArray());
|
|
//分析有固频泵开启的情况
|
for (int fixPumpNum = 1; fixPumpNum <= fixPumpAnaDataList.Count(); fixPumpNum++)
|
{
|
//得到所有排列组合(工频)
|
List<IStation.Calculation.DispatchAna.Model.FixPumpAnaData[]> fixPumpAnaCombineList = IStation.Model.PermutationAndCombination<IStation.Calculation.DispatchAna.Model.FixPumpAnaData>.GetCombination(
|
fixPumpAnaDataList.ToArray(), fixPumpNum);
|
|
#region 分析每种组合
|
foreach (IStation.Calculation.DispatchAna.Model.FixPumpAnaData[] fixPumpAnaCombine in fixPumpAnaCombineList)
|
{//遍历各种工频组合
|
#region 检查是否符合开机约束
|
List<long> machine_ids = new List<long>();
|
if (fixPumpAnaCombine != null)
|
{
|
foreach (var item in fixPumpAnaCombine)
|
machine_ids.Add(item.MachineDetail.MachineID);
|
}
|
if (!IsAccordMachineRunFilter(machine_ids))
|
{
|
continue;
|
}
|
#endregion
|
|
var fix_pump_total_flow = (from x in fixPumpAnaCombine select x.AnaItem.WorkPointQ).Sum();
|
if (fix_pump_total_flow > _targetQmax)
|
{
|
continue;
|
}
|
if (fix_pump_total_flow > _targetQmin)
|
{//只用固频泵即可
|
AddOnlyFixPumpPrj(fixPumpAnaCombine, fix_pump_total_flow);
|
}
|
else if (frePumpAnaDataList.Count() > 0)
|
{
|
//只有一台变频泵
|
AddSingleFreqPumpPrj1(fixPumpAnaCombine, frePumpAnaDataList.ToArray());
|
//有2台变频泵
|
if (fixPumpAnaCombine.Count() >= 2)
|
{
|
AddMultiFreqPumpPrj2(fixPumpAnaCombine, frePumpAnaDataList.ToArray());
|
}
|
//有3台变频泵
|
if (fixPumpAnaCombine.Count() >= 3)
|
{
|
AddMultiFreqPumpPrj3(fixPumpAnaCombine, frePumpAnaDataList.ToArray());
|
}
|
//有4台变频泵
|
if (fixPumpAnaCombine.Count() >= 4)
|
{
|
AddMultiFreqPumpPrj4(fixPumpAnaCombine, frePumpAnaDataList.ToArray(), fix_pump_total_flow);
|
}
|
//有5台变频泵
|
if (fixPumpAnaCombine.Count() >= 5)
|
{
|
AddMultiFreqPumpPrj5(fixPumpAnaCombine, frePumpAnaDataList.ToArray(), fix_pump_total_flow);
|
}
|
}
|
}
|
#endregion
|
}
|
}
|
#endregion
|
|
//计算
|
var ds_disp_project_list = new List<IStation.Calculation.DispatchAna.Model.AnaScheme>();
|
foreach (var project in _anaSchemeList)
|
{
|
//计算流量
|
//project.TotalWrkQ = (from x in project.Items where x.WorkPointQ > 0 select x.WorkPointQ).Sum();
|
if (project.TotalWrkQ <= _targetQmax && project.TotalWrkQ >= this._targetQmin)
|
ds_disp_project_list.Add(project);
|
|
project.UWP = Math.Round(project.UWP, 3);
|
project.WP = Math.Round(project.WP, 3);
|
project.SpanQ = Math.Round(project.TotalWrkQ - _targetQ, 0);
|
project.CalcItemParas();
|
}
|
|
// 0 功率 1 流量间隔
|
if (SchemeSortType == IStation.Calculation.DispatchAna.Model.eAnaSchemeSortType.功率)
|
ds_disp_project_list = (from x in ds_disp_project_list orderby x.TotalWrkP select x).ToList();
|
else if (SchemeSortType == IStation.Calculation.DispatchAna.Model.eAnaSchemeSortType.流量差值)
|
ds_disp_project_list = (from x in ds_disp_project_list orderby Math.Abs(x.SpanQ) select x).ToList();
|
|
//重新编号ID
|
for (int i = 0; i < ds_disp_project_list.Count; i++)
|
{
|
ds_disp_project_list[i].ID = i + 1;
|
}
|
|
if (ReturnSchemeNumber <= 0)
|
return ds_disp_project_list;
|
else
|
return ds_disp_project_list.Take(ReturnSchemeNumber).ToList();
|
}
|
|
/// <summary>
|
/// 计算(保持当前开泵状态)
|
/// </summary>
|
/// <param name="openMachineIdList"></param>
|
/// <returns></returns>
|
public IStation.Calculation.DispatchAna.Model.AnaScheme CalcKeepStatus(List<long> openMachineIdList)
|
{
|
if (_allMachineList == null || _allMachineList.Count() == 0)
|
{
|
return null;
|
}
|
if (openMachineIdList == null || openMachineIdList.Count() == 0)
|
{
|
return null;
|
}
|
this._allCombineRunJudgeList4Must = new List<List<long>>();
|
_allCombineRunJudgeList4Must.Add(openMachineIdList);
|
|
#region 获取并预算一下
|
|
List<IStation.Calculation.DispatchAna.Model.FixPumpAnaData> fixPumpAnaDataList = new List<IStation.Calculation.DispatchAna.Model.FixPumpAnaData>();//固频泵
|
List<IStation.Calculation.DispatchAna.Model.FrePumpAnaData> frePumpAnaDataList = new List<IStation.Calculation.DispatchAna.Model.FrePumpAnaData>();//变频泵
|
|
foreach (var machine_id in openMachineIdList)
|
{
|
var machine = this._allMachineList.Find(x => x.MachineID == machine_id);
|
if (machine == null)
|
continue;
|
|
if (machine.IsFrequency)
|
{//变频泵
|
var anaData = GetFrePumpAnaData(machine);
|
if (anaData != null)
|
frePumpAnaDataList.Add(anaData);
|
}
|
else
|
{//固频泵
|
var anaData = GetFixPumpAnaData(machine);
|
if (anaData != null)
|
fixPumpAnaDataList.Add(anaData);
|
}
|
}
|
#endregion
|
|
#region 开始分析
|
_anaSchemeList = new List<IStation.Calculation.DispatchAna.Model.AnaScheme>();
|
|
if (fixPumpAnaDataList == null || fixPumpAnaDataList.Count() == 0)
|
{//没有合适的固频泵
|
AddOnlyFrePumpPrj(frePumpAnaDataList.ToArray());
|
}
|
else
|
{
|
var fix_pump_total_flow = (from x in fixPumpAnaDataList select x.AnaItem.WorkPointQ).Sum();
|
|
if (fix_pump_total_flow > _targetQmin)
|
{//只用固频泵即可
|
AddOnlyFixPumpPrj(fixPumpAnaDataList.ToArray(), fix_pump_total_flow);
|
}
|
else
|
{
|
int iFrePumpCount = frePumpAnaDataList.Count();
|
if (iFrePumpCount == 0)
|
{//只用固频泵即可
|
AddOnlyFixPumpPrj(fixPumpAnaDataList.ToArray(), fix_pump_total_flow);
|
}
|
else if (iFrePumpCount == 1)
|
{//只有一台变频泵
|
AddSingleFreqPumpPrj1(fixPumpAnaDataList.ToArray(), frePumpAnaDataList.ToArray());
|
}
|
else if (iFrePumpCount == 2)
|
{//有2台变频泵
|
AddMultiFreqPumpPrj2(fixPumpAnaDataList.ToArray(), frePumpAnaDataList.ToArray());
|
}
|
else if (iFrePumpCount == 3)
|
{//有3台变频泵
|
AddMultiFreqPumpPrj3(fixPumpAnaDataList.ToArray(), frePumpAnaDataList.ToArray());
|
}
|
else if (iFrePumpCount == 4)
|
{//有4台变频泵
|
AddMultiFreqPumpPrj4(fixPumpAnaDataList.ToArray(), frePumpAnaDataList.ToArray(), fix_pump_total_flow);
|
}
|
else if (iFrePumpCount == 5)
|
{ //有5台变频泵
|
AddMultiFreqPumpPrj5(fixPumpAnaDataList.ToArray(), frePumpAnaDataList.ToArray(), fix_pump_total_flow);
|
}
|
else
|
{ //有6台变频泵
|
AddMultiFreqPumpPrj6(fixPumpAnaDataList.ToArray(), frePumpAnaDataList.ToArray(), fix_pump_total_flow);
|
}
|
}
|
}
|
#endregion
|
|
if (_anaSchemeList.Count() == 0)
|
return null;
|
|
//计算
|
var ds_disp_project_list = new List<IStation.Calculation.DispatchAna.Model.AnaScheme>();
|
foreach (var project in _anaSchemeList)
|
{
|
project.UWP = Math.Round(project.UWP, 3);
|
project.WP = Math.Round(project.WP, 3);
|
project.SpanQ = Math.Round(project.TotalWrkQ - _targetQ, 0);
|
project.CalcItemParas();
|
|
ds_disp_project_list.Add(project);
|
}
|
|
return (from x in ds_disp_project_list orderby x.TotalWrkP select x).FirstOrDefault();
|
}
|
|
#region 算出是否符合的固频泵:GetFixPumpAnaData
|
private IStation.Calculation.DispatchAna.Model.FixPumpAnaData GetFixPumpAnaData(IStation.Calculation.DispatchAna.Model.MachineDetail Machine)
|
{
|
if (Machine == null)
|
return null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem anaData = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
|
if (CalcAnaCurve(Machine.MaxCurveInfoQH, Machine.MaxCurveInfoQP,
|
this._targetH, 50, ref anaData) <= 0)
|
return null;
|
|
anaData.CurveInfoQH = Machine.MaxCurveInfoQH;
|
anaData.CurveInfoQP = Machine.MaxCurveInfoQP;
|
anaData.Frequence = 50;
|
anaData.Speed = Machine.Ratedn;
|
|
return new IStation.Calculation.DispatchAna.Model.FixPumpAnaData() { MachineDetail = Machine, AnaItem = anaData };
|
}
|
#endregion
|
|
|
#region 算出是否符合的变频泵:GetFrePumpAnaData
|
|
private IStation.Calculation.DispatchAna.Model.FrePumpAnaData GetFrePumpAnaData(
|
IStation.Calculation.DispatchAna.Model.MachineDetail Machine)
|
{
|
if (Machine == null)
|
return null;
|
|
IStation.Calculation.DispatchAna.Model.FrePumpAnaData anaData = new IStation.Calculation.DispatchAna.Model.FrePumpAnaData();
|
anaData.MachineDetail = Machine;
|
anaData.AnaItemList = new List<IStation.Calculation.DispatchAna.Model.AnaCurveItem>();
|
|
double targetH = this._targetH ;
|
|
|
|
|
|
double maxH;
|
double minH;
|
var points50 = IStation.Model.FitCurveHelper.GetFitPoints(Machine.MaxCurveInfoQH, 50);
|
IStation.Model.FitCurveHelper.GetMinMaxPointY(points50, out maxH, out minH);
|
if (maxH < targetH)
|
{
|
return null;
|
}
|
|
|
var pointsMin = IStation.Common.SpeedSimuCalculer.GetSimuPointQH(Machine.MaxCurveInfoQH, 50, MinChangeFrequence);
|
IStation.Model.FitCurveHelper.GetMinMaxPointY(pointsMin, out maxH, out minH);
|
if (minH > targetH)
|
{
|
return null;
|
}
|
|
//获取每个频率的值(粗算)
|
for (double freqCurrentFrequ = 50; freqCurrentFrequ > MinChangeFrequence;
|
freqCurrentFrequ = freqCurrentFrequ - ChangeFrequenceSpaece)
|
{
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curve = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
|
int ret = CalcAnaCurve(Machine.MaxCurveInfoQH, Machine.MaxCurveInfoQP,
|
this._targetH, freqCurrentFrequ, ref curve);
|
if (ret == -1)
|
break;//-1 表示最大扬程都已经低于目标扬程了, 没必要再迭代了
|
if (ret == 0)
|
continue;
|
curve.Speed = Machine.CalcSpeedByFrequence(curve.Frequence);
|
|
anaData.AnaItemList.Add(curve);
|
}
|
|
|
|
return anaData;
|
}
|
#endregion
|
|
|
#region 精算
|
private void CalcDetailAccurate(ref IStation.Calculation.DispatchAna.Model.AnaScheme project)
|
{
|
//没有变频泵, 就没有必要精算
|
var frequecePumps = (from x in project.Items where x.IsFrequency select x);
|
if (frequecePumps == null || frequecePumps.Count() == 0)
|
return;
|
|
|
if (frequecePumps.Count() == 1)
|
{//只有一台,比较简单
|
#region 只有一台,比较简单
|
IStation.Calculation.DispatchAna.Model.AnaSchemeItem current_adjust_item = frequecePumps.FirstOrDefault();
|
var current_machine = (from x in this._allMachineList where x.MachineID == current_adjust_item.MachineID select x).FirstOrDefault();
|
if (current_machine == null)
|
return;
|
|
var totalWrkQ_other = (from x in project.Items where x.WorkPointQ > 0 && x.MachineID != current_adjust_item.MachineID select x.WorkPointQ).Sum();
|
// var target_pump_flow = this._targetQ - totalWrkQ_other;
|
|
var max_fr = Math.Min(50, current_adjust_item.Frequence + ChangeFrequenceSpaece * 2);
|
var min_fr = current_adjust_item.Frequence - ChangeFrequenceSpaece * 2;
|
|
double flow_chajiu = Math.Abs(project.TotalWrkQ - this._targetQ);
|
|
for (double fre = max_fr; fre > min_fr; fre = fre - 0.1)
|
{
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem ana_item = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
|
int ret = CalcAnaCurve(current_machine.MaxCurveInfoQH, current_machine.MaxCurveInfoQP,
|
this._targetH,
|
fre, ref ana_item);
|
if (ret == -1)
|
return;//-1 表示最大扬程都已经低于目标扬程了, 没必要再迭代了
|
|
if (ret == 0)
|
continue;
|
var total_q = totalWrkQ_other + ana_item.WorkPointQ;
|
if (total_q < this._targetQmin)
|
break;//如果已经低于最小,不用再变频了
|
if (Math.Abs(total_q - this._targetQ) < flow_chajiu)
|
{
|
flow_chajiu = Math.Abs(total_q - this._targetQ);
|
current_adjust_item.Frequence = Math.Round(fre, 1);
|
current_adjust_item.WorkPointQ = Math.Round(ana_item.WorkPointQ, 1);
|
current_adjust_item.WorkPointP = Math.Round(ana_item.WorkPointP, 1);
|
|
|
// 再汇总一下
|
project.TotalWrkQ = (from x in project.Items where x.WorkPointQ > 0 select x.WorkPointQ).Sum();
|
project.TotalWrkP = (from x in project.Items where x.WorkPointP > 0 select x.WorkPointP).Sum();
|
|
project.UWP = Calcu_UWP(project.TotalWrkP, project.TotalWrkQ, this._targetH);
|
project.WP = Calcu_WP(project.TotalWrkP, project.TotalWrkQ);
|
}
|
|
if (total_q < this._targetQ)
|
{
|
break;
|
}
|
}
|
#endregion
|
|
}
|
else if (frequecePumps.Count() == 2)
|
{
|
IStation.Calculation.DispatchAna.Model.AnaSchemeItem adjust_item_1 = frequecePumps.ElementAt(0);
|
IStation.Calculation.DispatchAna.Model.AnaSchemeItem adjust_item_2 = frequecePumps.ElementAt(1);
|
var adjust_machine_1 = (from x in this._allMachineList where x.MachineID == adjust_item_1.MachineID select x).FirstOrDefault();
|
if (adjust_machine_1 == null)
|
return;
|
var adjust_machine_2 = (from x in this._allMachineList where x.MachineID == adjust_item_2.MachineID select x).FirstOrDefault();
|
if (adjust_machine_2 == null)
|
return;
|
//除了调解泵的其他泵流量
|
var total_flow_other = (from x in project.Items where x.WorkPointQ > 0 && x.MachineID != adjust_machine_1.MachineID && x.MachineID != adjust_machine_2.MachineID select x.WorkPointQ).Sum();
|
|
var total_power_other = (from x in project.Items where x.WorkPointP > 0 && x.MachineID != adjust_machine_1.MachineID && x.MachineID != adjust_machine_2.MachineID select x.WorkPointP).Sum();
|
|
List<IStation.Calculation.DispatchAna.Model.AnaCurveItem> item_js_1 = new List<IStation.Calculation.DispatchAna.Model.AnaCurveItem>();
|
for (double fre = Math.Min(50, adjust_item_1.Frequence + ChangeFrequenceSpaece * 2);
|
fre > adjust_item_1.Frequence - ChangeFrequenceSpaece * 2;
|
fre = fre - 0.1)
|
{
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem ana_item = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
|
int ret = CalcAnaCurve(adjust_machine_1.MaxCurveInfoQH,
|
adjust_machine_1.MaxCurveInfoQP,
|
this._targetH,
|
fre, ref ana_item);
|
if (ret == -1)
|
break;
|
item_js_1.Add(ana_item);
|
}
|
|
List<IStation.Calculation.DispatchAna.Model.AnaCurveItem> item_js_2 = new List<IStation.Calculation.DispatchAna.Model.AnaCurveItem>();
|
for (double fre = Math.Min(50, adjust_item_2.Frequence + ChangeFrequenceSpaece * 2);
|
fre > adjust_item_2.Frequence - ChangeFrequenceSpaece * 2;
|
fre = fre - 0.1)
|
{
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem ana_item = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
|
int ret = CalcAnaCurve(adjust_machine_2.MaxCurveInfoQH, adjust_machine_2.MaxCurveInfoQP,
|
this._targetH, fre, ref ana_item);
|
if (ret == -1)
|
break;
|
item_js_2.Add(ana_item);
|
}
|
|
double ump_chajiu = project.UWP;
|
|
foreach (var item1 in item_js_1)
|
{
|
foreach (var item2 in item_js_2)
|
{
|
var total_flow = item1.WorkPointQ + item2.WorkPointQ + total_flow_other;
|
if (Math.Abs(total_flow - this._targetQ) < this._targetQ * 0.01)
|
{
|
var total_power = item1.WorkPointP + item2.WorkPointP + total_power_other;
|
var uwp = Calcu_UWP(total_power, total_flow, this._targetH);
|
|
if (uwp < ump_chajiu)
|
{
|
adjust_item_1.ResetItem(item1);
|
adjust_item_2.ResetItem(item2);
|
adjust_item_1.Frequence = Math.Round(item1.Frequence, 1);
|
adjust_item_2.Frequence = Math.Round(item2.Frequence, 1);
|
|
// 再汇总一下
|
project.TotalWrkQ = (from x in project.Items where x.WorkPointQ > 0 select x.WorkPointQ).Sum();
|
project.TotalWrkP = (from x in project.Items where x.WorkPointP > 0 select x.WorkPointP).Sum();
|
|
project.UWP = Calcu_UWP(project.TotalWrkP, project.TotalWrkQ, this._targetH);
|
project.WP = Calcu_WP(project.TotalWrkP, project.TotalWrkQ);
|
}
|
|
}
|
}
|
}
|
|
|
|
}
|
else
|
{
|
//哪个泵流量大,就调整哪个泵
|
IStation.Calculation.DispatchAna.Model.AnaSchemeItem aj_pump = frequecePumps.FirstOrDefault();
|
foreach (var p in project.Items)
|
{
|
if (!p.IsFrequency)
|
continue;
|
if (p.WorkPointQ > aj_pump.WorkPointQ)
|
{
|
aj_pump = p;
|
}
|
}
|
//除了调解泵的其他泵流量
|
var total_flow_other = (from x in project.Items where x.WorkPointQ > 0 && x.MachineID != aj_pump.MachineID select x.WorkPointQ).Sum();
|
//
|
double flow_chajiu = Math.Abs(project.TotalWrkQ - this._targetQ);
|
//
|
var pump_curve = (from x in this._allMachineList where x.MachineID == aj_pump.MachineID select x).FirstOrDefault();
|
if (pump_curve != null)
|
{
|
var max_fr = Math.Min(50, aj_pump.Frequence + ChangeFrequenceSpaece * 2);
|
var min_fr = aj_pump.Frequence - ChangeFrequenceSpaece * 2;
|
for (double fre = max_fr; fre > min_fr; fre = fre - 0.1)
|
{
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curve = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
|
int ret = CalcAnaCurve(pump_curve.MaxCurveInfoQH, pump_curve.MaxCurveInfoQP,
|
this._targetH, fre, ref curve);
|
if (ret == -1)
|
break;//-1 表示最大扬程都已经低于目标扬程了, 没必要再迭代了
|
if (ret == 0)
|
continue;
|
var total_q = total_flow_other + curve.WorkPointQ;
|
if (total_q < this._targetQmin)
|
break;//如果已经低于最小,不用再变频了
|
if (Math.Abs(total_q - this._targetQ) < flow_chajiu)
|
{
|
flow_chajiu = Math.Abs(total_q - this._targetQ);
|
aj_pump.Frequence = Math.Round(fre, 1);
|
aj_pump.WorkPointQ = Math.Round(curve.WorkPointQ, 1);
|
aj_pump.WorkPointP = Math.Round(curve.WorkPointP, 1);
|
|
//再汇总一下
|
project.TotalWrkQ = (from x in project.Items where x.WorkPointQ > 0 select x.WorkPointQ).Sum();
|
project.TotalWrkP = (from x in project.Items where x.WorkPointP > 0 select x.WorkPointP).Sum();
|
|
project.UWP = Calcu_UWP(project.TotalWrkP, project.TotalWrkQ, this._targetH);
|
project.WP = Calcu_WP(project.TotalWrkP, project.TotalWrkQ);
|
}
|
|
if (total_q < this._targetQ)
|
{
|
break;
|
}
|
}
|
}
|
}
|
|
|
}
|
#endregion
|
|
|
#region 根据频率值,计算变频曲线
|
/// <summary>
|
/// 根据频率值,计算变频曲线(外部也会调用)
|
/// </summary>
|
/// <param name="MaxCurveInfoQH"></param>
|
/// <param name="MaxCurveInfoQP"></param>
|
/// <param name="targetH"></param>
|
/// <param name="freqCurrentFrequ"></param>
|
/// <param name="ana_data"></param>
|
/// <returns></returns>
|
public static int CalcAnaCurve(
|
IStation.Model.CurveExpress MaxCurveInfoQH,
|
IStation.Model.CurveExpress MaxCurveInfoQP,
|
double targetH ,
|
double freqCurrentFrequ,//频率值
|
ref IStation.Calculation.DispatchAna.Model.AnaCurveItem ana_data)
|
{
|
if (ana_data == null)
|
ana_data = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
|
|
if (Math.Abs(freqCurrentFrequ - 50) < 0.1)
|
{
|
ana_data.Frequence = freqCurrentFrequ;
|
ana_data.CurveInfoQH = MaxCurveInfoQH;
|
ana_data.CurveInfoQP = MaxCurveInfoQP;
|
|
double flow = 0;
|
var pointsQH = IStation.Model.FitCurveHelper.GetFitPointsByExtend(ana_data.CurveInfoQH, ExtendMaxRatio, 50);
|
if (!GetFolwByHead(pointsQH, targetH, ref flow))
|
{
|
ana_data.IsOverMaxH = true;
|
ana_data.Note = "已超出最大可行的流量";
|
return 0;
|
}
|
flow = Math.Round(flow, 1);
|
|
var head = IStation.Model.FitCurveHelper.GetFitPointY(ana_data.CurveInfoQH, Math.Round(flow, 1));
|
head = Math.Round(head, 1);
|
ana_data.WorkPointQ = flow;
|
ana_data.WorkPointH = head;
|
ana_data.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(ana_data.CurveInfoQP, ana_data.WorkPointQ), 1);
|
ana_data.WorkPointE = Math.Round(IStation.Common.PumpParaHelper.CalculateE(ana_data.WorkPointQ, ana_data.WorkPointH, ana_data.WorkPointP), 1);
|
|
ana_data.IsExtendCurve = false;
|
if (flow > ana_data.CurveInfoQH.Max)
|
{//在延长线上
|
ana_data.IsExtendCurve = true;
|
|
//延长率
|
double extRatioQ = Math.Round(flow * 100 / ana_data.CurveInfoQH.Max, 1);
|
ana_data.Note = string.Format("在延长曲线部分,参数可能不准确,延长率为:{0:0.0}", extRatioQ);
|
}
|
|
return 1;
|
}
|
else
|
{
|
#region 变频
|
|
ana_data.Frequence = Math.Round(freqCurrentFrequ, 1);
|
|
|
ana_data.CurveInfoQH = IStation.Common.SpeedSimuCalculer.GetSimuPointQH(MaxCurveInfoQH, 50, ana_data.Frequence);
|
ana_data.CurveInfoQP = IStation.Common.SpeedSimuCalculer.GetSimuPointQP(MaxCurveInfoQP, 50, ana_data.Frequence);
|
|
double flow = 0;
|
var pointsQH = IStation.Model.FitCurveHelper.GetFitPointsByExtend(ana_data.CurveInfoQH, ExtendMaxRatio, 50);
|
if (!GetFolwByHead(pointsQH, targetH, ref flow))
|
{
|
ana_data.IsOverMaxH = true;
|
ana_data.Note = "已超出最大可行的流量";
|
return 0;
|
}
|
flow = Math.Round(flow, 1);
|
|
var head = IStation.Model.FitCurveHelper.GetFitPointY(ana_data.CurveInfoQH, Math.Round(flow, 1));
|
head = Math.Round(head, 1);
|
ana_data.WorkPointQ = flow;
|
ana_data.WorkPointH = head;
|
ana_data.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(ana_data.CurveInfoQP, ana_data.WorkPointQ), 1);
|
ana_data.WorkPointE = Math.Round(IStation.Common.PumpParaHelper.CalculateE(ana_data.WorkPointQ, ana_data.WorkPointH, ana_data.WorkPointP), 1);
|
|
ana_data.IsExtendCurve = false;
|
if (flow > ana_data.CurveInfoQH.Max)
|
{//在延长线上
|
ana_data.IsExtendCurve = true;
|
|
//延长率
|
double extRatioQ = Math.Round(flow * 100 / ana_data.CurveInfoQH.Max, 1);
|
ana_data.Note = string.Format("在延长曲线部分,参数可能不准确,延长率为:{0:0.0}", extRatioQ);
|
}
|
|
|
|
#endregion
|
|
return 1;
|
}
|
|
}
|
|
//根据压差计算流量
|
//private static double OtherPressCoeff = 4 * 1000 / Math.PI / 3.6;
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="curveInfoQH"></param>
|
/// <param name="h"></param>
|
/// <param name="q"></param>
|
/// <returns></returns>
|
public static bool GetFolwByHead(List<IStation.Model.CurvePoint> curveInfoQH, double h, ref double q)
|
{
|
List<IStation.Model.CurvePoint> listQ = IStation.Model.FitCurveHelper.GetInterPointX(curveInfoQH, h);
|
if (listQ == null || listQ.Count == 0)
|
{
|
return false;
|
}
|
|
q = listQ.Last().X;
|
|
return true;
|
}
|
/// <summary>
|
/// 根据频率值,计算变频曲线
|
/// </summary>
|
/// <param name="MaxCurveInfoQH"></param>
|
/// <param name="targetH"></param>
|
/// <param name="freqCurrentFrequ"></param>
|
/// <param name="curve"></param>
|
/// <returns></returns>
|
public static int CalcAnaCurveDDD(
|
IStation.Model.CurveExpress MaxCurveInfoQH,
|
double targetH,
|
double freqCurrentFrequ,//频率值
|
ref IStation.Calculation.DispatchAna.Model.AnaCurveItem curve)
|
{
|
if (curve == null)
|
curve = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
|
if (Math.Abs(freqCurrentFrequ - 50) < 0.1)
|
{
|
curve.Frequence = freqCurrentFrequ;
|
curve.CurveInfoQH = MaxCurveInfoQH;
|
double maxH;
|
double minH;
|
var points = IStation.Model.FitCurveHelper.GetFitPointsByExtend(curve.CurveInfoQH, ExtendMaxRatio, 50);
|
IStation.Model.FitCurveHelper.GetMinMaxPointY(points, out maxH, out minH);
|
if (maxH < targetH)
|
{
|
curve.IsOverMaxH = true;
|
curve.Note = "已超出最大运行扬程";
|
return -1;//-1 表示最大扬程都已经低于目标扬程了, 没必要再迭代了
|
}
|
|
List<IStation.Model.CurvePoint> interPts = IStation.Model.FitCurveHelper.GetInterPointX(points, targetH);
|
if (interPts == null || interPts.Count == 0)
|
{
|
curve.IsOverMaxH = true;
|
curve.Note = "已超出最大可行的流量";
|
return 0;
|
}
|
IStation.Model.CurvePoint pt = interPts.Last();
|
if (pt.X < MinFlowIngore)
|
{
|
curve.IsOverMaxH = true;
|
curve.Note = "已超出最大可行的流量";
|
return -1;
|
}
|
|
curve.IsExtendCurve = false;
|
curve.WorkPointQ = Math.Round(pt.X, 1);
|
curve.WorkPointH = Math.Round(pt.Y, 1);
|
|
if (pt.X > curve.CurveInfoQH.Max)
|
{//在延长线上
|
curve.IsExtendCurve = true;
|
|
//延长率
|
double extRatioQ = Math.Round(pt.X * 100 / curve.CurveInfoQH.Max, 1);
|
curve.Note = string.Format("在延长曲线部分,参数可能不准确,延长率为:{0:0.0}", extRatioQ);
|
|
//效率延长不稳定
|
//if (anaData.CurveInfoQP != null)
|
//{
|
// var exPointsQP = IStation.Model.FitCurveHelper.GetFitPointsByExtend(anaData.CurveInfoQP, ExtendMaxRatio, 50);//延长
|
// anaData.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(exPointsQP, anaData.WorkPointQ), 1);
|
// anaData.WorkPointE = IStation.Common.PumpParaHelper.CalculateE(anaData.WorkPointQ, anaData.WorkPointH, anaData.WorkPointP);
|
//}
|
}
|
else
|
{
|
curve.IsExtendCurve = false;
|
}
|
return 1;
|
}
|
else
|
{
|
#region 变频
|
|
curve.Frequence = freqCurrentFrequ;
|
|
|
curve.CurveInfoQH = IStation.Common.SpeedSimuCalculer.GetSimuPointQH(MaxCurveInfoQH, 50, freqCurrentFrequ);
|
|
var points = IStation.Model.FitCurveHelper.GetFitPointsByExtend(curve.CurveInfoQH, ExtendMaxRatio, 50);//延长
|
|
//IStation.Model.FitCurveHelper.GetMinMaxPointY(points, out maxH, out minH);
|
List<IStation.Model.CurvePoint> extPtsQH = IStation.Model.FitCurveHelper.GetInterPointX(points, targetH);
|
if (extPtsQH == null || extPtsQH.Count == 0)
|
{//在延长线都没有交点,就不要再迭代了.
|
if (targetH > curve.CurveInfoQH.Index0)
|
return -1;//-1 表示最大扬程都已经低于目标扬程了, 没必要再迭代了
|
|
return 0;
|
}
|
|
IStation.Model.CurvePoint pt = extPtsQH.Last();
|
if (pt.X < MinFlowIngore)
|
{
|
return -1;
|
}
|
|
|
curve.IsExtendCurve = false;
|
curve.WorkPointQ = Math.Round(pt.X, 1);
|
curve.WorkPointH = Math.Round(pt.Y, 1);
|
|
if (pt.X > curve.CurveInfoQH.Max)
|
{//在延长线上
|
curve.IsExtendCurve = true;
|
//延长率
|
double extRatioQ = Math.Round(pt.X * 100 / curve.CurveInfoQH.Max, 1);
|
curve.Note = string.Format("在延长曲线部分,参数可能不准确,延长率为:{0:0.0}", extRatioQ);
|
//if (MaxCurveInfoQP != null)
|
//{
|
// curve.CurveInfoQP = IStation.Common.SpeedSimuCalculer.GetSimuPointQP(MaxCurveInfoQP, 50, freqCurrentFrequ);
|
// var exPointsQP = IStation.Model.FitCurveHelper.GetFitPointsByExtend(curve.CurveInfoQP, ExtendMaxRatio, 50);//延长
|
// curve.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(exPointsQP, curve.WorkPointQ), 1);
|
// curve.WorkPointE = IStation.Common.PumpParaHelper.CalculateE(curve.WorkPointQ, curve.WorkPointH, curve.WorkPointP);
|
//}
|
}
|
else
|
{
|
curve.IsExtendCurve = false;
|
//if (MaxCurveInfoQP != null)
|
//{
|
// curve.CurveInfoQP = IStation.Common.SpeedSimuCalculer.GetSimuPointQP(MaxCurveInfoQP, 50, freqCurrentFrequ);
|
// curve.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(curve.CurveInfoQP, curve.WorkPointQ), 1);
|
// curve.WorkPointE = IStation.Common.PumpParaHelper.CalculateE(curve.WorkPointQ, curve.WorkPointH, curve.WorkPointP);
|
//}
|
}
|
#endregion
|
|
return 1;
|
}
|
|
}
|
|
|
#endregion
|
|
|
#region 添加项目 (只有用固频泵)
|
private IStation.Calculation.DispatchAna.Model.AnaScheme AddOnlyFixPumpPrj(
|
IStation.Calculation.DispatchAna.Model.FixPumpAnaData[] fixPumpAnaDataList,
|
double totalQ)
|
{
|
//
|
var rowPrj = new IStation.Calculation.DispatchAna.Model.AnaScheme();
|
|
rowPrj.TotalWrkQ = totalQ;
|
rowPrj.TotalWrkH = Math.Round(this._targetH, 2);
|
rowPrj.Items = new List<IStation.Calculation.DispatchAna.Model.AnaSchemeItem>();
|
|
foreach (var fixPump in fixPumpAnaDataList)
|
{
|
if (fixPump.AnaItem.WorkPointQ < 1)
|
continue;
|
|
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem);
|
|
rowPrj.Items.Add(itemRow);
|
}
|
AddScheme(rowPrj, false);
|
|
return rowPrj;
|
}
|
#endregion
|
|
|
#region 添加项目 只有用变频频泵即可
|
private void AddOnlyFrePumpPrj(
|
IStation.Calculation.DispatchAna.Model.FrePumpAnaData[] freqPumpAnaList)
|
{
|
AddSingleFreqPumpPrj1(null, freqPumpAnaList);
|
|
//有2台变频泵
|
if (freqPumpAnaList.Count() >= 2)
|
{
|
AddMultiFreqPumpPrj2(null, freqPumpAnaList);
|
}
|
|
//有3台变频泵
|
if (freqPumpAnaList.Count() >= 3)
|
{
|
AddMultiFreqPumpPrj3(null, freqPumpAnaList);
|
}
|
|
//有4台变频泵
|
if (freqPumpAnaList.Count() >= 4)
|
{
|
AddMultiFreqPumpPrj4(null, freqPumpAnaList, 0);
|
}
|
|
//有5台变频泵
|
if (freqPumpAnaList.Count() >= 5)
|
{
|
AddMultiFreqPumpPrj5(null, freqPumpAnaList, 0);
|
}
|
|
//有6台变频泵
|
//if (freqPumpAnaList.Count >= 6)
|
//{
|
// AddMultiFreqPumpPrj6(null, freqPumpAnaList, 0);
|
//}
|
}
|
#endregion
|
|
|
#region 添加项目 只有1台变频泵:AddOneFreqPumpPrj
|
private int AddSingleFreqPumpPrj1(
|
IStation.Calculation.DispatchAna.Model.FixPumpAnaData[] allFixPumpAnaList,
|
IStation.Calculation.DispatchAna.Model.FrePumpAnaData[] allFreqPumpAnaList)
|
{
|
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() == 0)
|
return 0;
|
|
//判断最大开机数
|
if (_max_open_machine_number > 0)
|
{
|
int macine_number = 1;
|
if (allFixPumpAnaList != null)
|
{
|
macine_number = macine_number + allFixPumpAnaList.Count();
|
}
|
if (macine_number > _max_open_machine_number)
|
return 0;
|
}
|
|
double fix_pump_total_flow = 0;
|
if (allFixPumpAnaList != null)
|
{
|
fix_pump_total_flow = (from x in allFixPumpAnaList select x.AnaItem.WorkPointQ).Sum();
|
}
|
if (fix_pump_total_flow >= this._targetQ * 0.99)
|
return 0;
|
|
int addPrjNum = 0;
|
foreach (var freqPump in allFreqPumpAnaList)
|
{
|
#region 检查是否符合开机约束
|
List<long> machine_ids = new List<long>();
|
machine_ids.Add(freqPump.MachineDetail.MachineID);
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var item in allFixPumpAnaList)
|
machine_ids.Add(item.MachineDetail.MachineID);
|
}
|
if (!IsAccordMachineRunFilter(machine_ids))
|
{
|
continue;
|
}
|
#endregion
|
|
|
double h = Math.Round(this._targetH, 2);
|
|
var wrkSpeed = IStation.Common.SpeedSimuCalculer.GetSimuValue(
|
freqPump.MachineDetail.MaxCurveInfoQH,
|
new IStation.Model.CurvePoint(_targetQ - fix_pump_total_flow, h), 2900);
|
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem currentAna = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
|
|
double fre = Math.Round(50 * wrkSpeed / 2900, 1);
|
int ret = CalcAnaCurve(freqPump.MachineDetail.MaxCurveInfoQH,
|
freqPump.MachineDetail.MaxCurveInfoQP, this._targetH, fre, ref currentAna);
|
if (ret == -1)
|
continue;
|
if (ret == 0)
|
continue;
|
currentAna.Speed = freqPump.MachineDetail.CalcSpeedByFrequence(fre);
|
|
|
var rowPrj = new IStation.Calculation.DispatchAna.Model.AnaScheme();
|
rowPrj.Items = new List<IStation.Calculation.DispatchAna.Model.AnaSchemeItem>();
|
|
#region 加入固频泵开启信息
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var fixPump in allFixPumpAnaList)
|
{
|
if (fixPump.AnaItem.WorkPointQ < 1)
|
continue;
|
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem);
|
rowPrj.Items.Add(itemRow);
|
}
|
}
|
#endregion
|
|
|
var itemRowF = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump.MachineDetail, currentAna);
|
rowPrj.Items.Add(itemRowF);
|
|
AddScheme(rowPrj, false);
|
addPrjNum++;
|
}
|
|
return addPrjNum;
|
}
|
#endregion
|
|
|
#region 添加项目 只有2台变频泵:AddTwoFreqPumpPrj
|
private int AddMultiFreqPumpPrj2(
|
IStation.Calculation.DispatchAna.Model.FixPumpAnaData[] allFixPumpAnaList,
|
IStation.Calculation.DispatchAna.Model.FrePumpAnaData[] allFreqPumpAnaList)
|
{
|
int addPrjNum = 0;
|
int frePumpNum = 2;
|
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() < frePumpNum)
|
return addPrjNum;
|
|
//判断最大开机数
|
if (_max_open_machine_number > 0)
|
{
|
int macine_number = 2;
|
if (allFixPumpAnaList != null)
|
{
|
macine_number = macine_number + allFixPumpAnaList.Count();
|
}
|
if (macine_number > _max_open_machine_number)
|
return 0;
|
}
|
|
double fix_pump_total_flow = 0;
|
if (allFixPumpAnaList != null)
|
{
|
fix_pump_total_flow = (from x in allFixPumpAnaList select x.AnaItem.WorkPointQ).Sum();
|
}
|
|
List<IStation.Calculation.DispatchAna.Model.FrePumpAnaData[]> freqPumpAnaCombineList = IStation.Model.PermutationAndCombination<IStation.Calculation.DispatchAna.Model.FrePumpAnaData>.GetCombination(
|
allFreqPumpAnaList, frePumpNum);
|
foreach (var freqPumpAnaCombine in freqPumpAnaCombineList)
|
{
|
var freqPump1 = freqPumpAnaCombine[0];
|
var freqPump2 = freqPumpAnaCombine[1];
|
|
#region 检查是否符合开机约束
|
List<long> machine_ids = new List<long>();
|
machine_ids.Add(freqPump1.MachineDetail.MachineID);
|
machine_ids.Add(freqPump2.MachineDetail.MachineID);
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var item in allFixPumpAnaList)
|
machine_ids.Add(item.MachineDetail.MachineID);
|
}
|
if (!IsAccordMachineRunFilter(machine_ids))
|
{
|
continue;
|
}
|
#endregion
|
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData1 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData2 = null;
|
|
|
var rowPrj = new IStation.Calculation.DispatchAna.Model.AnaScheme();
|
rowPrj.Items = new List<IStation.Calculation.DispatchAna.Model.AnaSchemeItem>();
|
|
#region 加入固频泵开启信息
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var fixPump in allFixPumpAnaList)
|
{
|
if (fixPump.AnaItem.WorkPointQ < 1)
|
continue;
|
|
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem);
|
rowPrj.Items.Add(itemRow);
|
}
|
}
|
#endregion
|
|
bool isActCalc = true;
|
if (freqPump1.MachineDetail.PumpCode == freqPump2.MachineDetail.PumpCode)
|
{//同型号
|
#region 流量对半分
|
var fre_pump_total_flow = this._targetQ - fix_pump_total_flow;
|
isActCalc = false;
|
|
double h = Math.Round( this._targetH,2);
|
|
//流量对半分
|
var wrkSpeed1 = IStation.Common.SpeedSimuCalculer.GetSimuValue(freqPump1.MachineDetail.MaxCurveInfoQH,
|
new IStation.Model.CurvePoint((_targetQ - fix_pump_total_flow) * 0.5, h), 2900);
|
curveData1 = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
|
double fre1 = Math.Round(50 * wrkSpeed1 / 2900, 1);
|
int ret1 = CalcAnaCurve(freqPump1.MachineDetail.MaxCurveInfoQH,
|
freqPump1.MachineDetail.MaxCurveInfoQP, this._targetH, fre1, ref curveData1);
|
if (ret1 == -1)
|
continue;
|
if (ret1 == 0)
|
continue;
|
curveData1.Speed = freqPump1.MachineDetail.CalcSpeedByFrequence(fre1);
|
|
|
|
var wrkSpeed2 = IStation.Common.SpeedSimuCalculer.GetSimuValue(freqPump2.MachineDetail.MaxCurveInfoQH,
|
new IStation.Model.CurvePoint((_targetQ - fix_pump_total_flow) * 0.5, h), 2900);
|
curveData2 = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
|
double fre2 = Math.Round(50 * wrkSpeed2 / 2900, 1);
|
int ret2 = CalcAnaCurve(freqPump2.MachineDetail.MaxCurveInfoQH,
|
freqPump2.MachineDetail.MaxCurveInfoQP,
|
this._targetH, fre2, ref curveData2);
|
if (ret2 == -1)
|
continue;
|
if (ret2 == 0)
|
continue;
|
curveData2.Speed = freqPump2.MachineDetail.CalcSpeedByFrequence(fre2);
|
#endregion
|
}
|
else
|
{
|
#region MyRegion
|
isActCalc = true;
|
|
double minSpanQ = _targetQ;
|
|
|
//找到离_targetQ最接近的频率点
|
for (int index1 = 0; index1 < freqPump1.AnaItemList.Count; index1++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index2 = 0; index2 < freqPump2.AnaItemList.Count; index2++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
double freTotalQ = freqPump1.AnaItemList[index1].WorkPointQ +
|
freqPump2.AnaItemList[index2].WorkPointQ;
|
if (Math.Abs(fix_pump_total_flow + freTotalQ - _targetQ) < minSpanQ)
|
{
|
minSpanQ = Math.Abs(fix_pump_total_flow + freTotalQ - _targetQ);
|
curveData1 = freqPump1.AnaItemList[index1];
|
curveData2 = freqPump2.AnaItemList[index2];
|
}
|
}
|
}
|
#endregion
|
}
|
|
|
|
|
if (curveData1.WorkPointQ > 10)
|
{
|
var itemRowF1 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump1.MachineDetail, curveData1);
|
rowPrj.Items.Add(itemRowF1);
|
}
|
|
|
if (curveData2.WorkPointQ > 10)
|
{
|
var itemRowF2 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump2.MachineDetail, curveData2);
|
rowPrj.Items.Add(itemRowF2);
|
}
|
|
if (AddScheme(rowPrj, isActCalc))
|
addPrjNum++;
|
|
}
|
|
return addPrjNum;
|
}
|
#endregion
|
|
|
#region 添加项目 只有3台变频泵:AddThreeFreqPumpPrj
|
private int AddMultiFreqPumpPrj3(
|
IStation.Calculation.DispatchAna.Model.FixPumpAnaData[] allFixPumpAnaList,
|
IStation.Calculation.DispatchAna.Model.FrePumpAnaData[] allFreqPumpAnaList)
|
{
|
int addPrjNum = 0;
|
int frePumpNum = 3;
|
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() < frePumpNum)
|
return addPrjNum;
|
|
//判断最大开机数
|
if (_max_open_machine_number > 0)
|
{
|
int macine_number = 3;
|
if (allFixPumpAnaList != null)
|
{
|
macine_number = macine_number + allFixPumpAnaList.Count();
|
}
|
if (macine_number > _max_open_machine_number)
|
return 0;
|
}
|
|
double fix_pump_total_flow = 0;
|
if (allFixPumpAnaList != null)
|
{
|
fix_pump_total_flow = (from x in allFixPumpAnaList select x.AnaItem.WorkPointQ).Sum();
|
}
|
|
List<IStation.Calculation.DispatchAna.Model.FrePumpAnaData[]> freqPumpAnaCombineList = IStation.Model.PermutationAndCombination<IStation.Calculation.DispatchAna.Model.FrePumpAnaData>.GetCombination(
|
allFreqPumpAnaList.ToArray(), frePumpNum);
|
foreach (var freqPumpAnaCombine in freqPumpAnaCombineList)
|
{
|
var freqPump1 = freqPumpAnaCombine[0];
|
var freqPump2 = freqPumpAnaCombine[1];
|
var freqPump3 = freqPumpAnaCombine[2];
|
|
#region 检查是否符合开机约束
|
List<long> machine_ids = new List<long>();
|
machine_ids.Add(freqPump1.MachineDetail.MachineID);
|
machine_ids.Add(freqPump2.MachineDetail.MachineID);
|
machine_ids.Add(freqPump3.MachineDetail.MachineID);
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var item in allFixPumpAnaList)
|
machine_ids.Add(item.MachineDetail.MachineID);
|
}
|
if (!IsAccordMachineRunFilter(machine_ids))
|
{
|
continue;
|
}
|
#endregion
|
|
double freTotalQ = fix_pump_total_flow;
|
double minSpanQ = _targetQmax;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData1 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData2 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData3 = null;
|
|
//
|
var rowPrj = new IStation.Calculation.DispatchAna.Model.AnaScheme();
|
|
rowPrj.TotalWrkQ = freTotalQ;
|
rowPrj.TotalWrkH = Math.Round(this._targetH, 2);
|
rowPrj.Items = new List<IStation.Calculation.DispatchAna.Model.AnaSchemeItem>();
|
|
//找到离_targetQ最接近的频率点
|
for (int index1 = 0; index1 < freqPump1.AnaItemList.Count; index1++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index2 = 0; index2 < freqPump2.AnaItemList.Count; index2++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index3 = 0; index3 < freqPump3.AnaItemList.Count; index3++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
double wrkQ = freqPump1.AnaItemList[index1].WorkPointQ +
|
freqPump2.AnaItemList[index2].WorkPointQ +
|
freqPump3.AnaItemList[index3].WorkPointQ;
|
|
if (Math.Abs(fix_pump_total_flow + wrkQ - _targetQ) < minSpanQ)
|
{
|
freTotalQ = fix_pump_total_flow + wrkQ;
|
rowPrj.TotalWrkQ = freTotalQ;
|
minSpanQ = Math.Abs(freTotalQ - _targetQ);
|
curveData1 = freqPump1.AnaItemList[index1];
|
curveData2 = freqPump2.AnaItemList[index2];
|
curveData3 = freqPump3.AnaItemList[index3];
|
}
|
}
|
}
|
}
|
|
//
|
if (freTotalQ < _targetQmax && freTotalQ > _targetQmin && curveData1 != null)
|
{
|
#region 加入固频泵开启信息
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var fixPump in allFixPumpAnaList)
|
{
|
if (fixPump.AnaItem.WorkPointQ < 1)
|
continue;
|
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem);
|
rowPrj.Items.Add(itemRow);
|
}
|
}
|
#endregion
|
|
|
if (curveData1.WorkPointQ > 10)
|
{
|
var itemRowF1 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump1.MachineDetail, curveData1);
|
rowPrj.Items.Add(itemRowF1);
|
}
|
|
if (curveData2.WorkPointQ > 10)
|
{
|
var itemRowF2 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump2.MachineDetail, curveData2);
|
rowPrj.Items.Add(itemRowF2);
|
}
|
|
if (curveData3.WorkPointQ > 10)
|
{
|
var itemRowF3 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump3.MachineDetail, curveData3);
|
rowPrj.Items.Add(itemRowF3);
|
}
|
|
AddScheme(rowPrj, true);
|
addPrjNum++;
|
}
|
}
|
|
return addPrjNum;
|
}
|
#endregion
|
|
|
#region 添加项目 只有4台变频泵:AddFourFreqPumpPrj
|
private int AddMultiFreqPumpPrj4(
|
IStation.Calculation.DispatchAna.Model.FixPumpAnaData[] allFixPumpAnaList,
|
IStation.Calculation.DispatchAna.Model.FrePumpAnaData[] allFreqPumpAnaList,
|
double fix_pump_total_flow)
|
{
|
int addPrjNum = 0;
|
int frePumpNum = 4;
|
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() < frePumpNum)
|
return addPrjNum;
|
|
//判断最大开机数
|
if (_max_open_machine_number > 0)
|
{
|
int macine_number = 4;
|
if (allFixPumpAnaList != null)
|
{
|
macine_number = macine_number + allFixPumpAnaList.Count();
|
}
|
if (macine_number > _max_open_machine_number)
|
return 0;
|
}
|
|
List<IStation.Calculation.DispatchAna.Model.FrePumpAnaData[]> freqPumpAnaCombineList = IStation.Model.PermutationAndCombination<IStation.Calculation.DispatchAna.Model.FrePumpAnaData>.GetCombination(
|
allFreqPumpAnaList, frePumpNum);
|
foreach (var freqPumpAnaCombine in freqPumpAnaCombineList)
|
{
|
var freqPump1 = freqPumpAnaCombine[0];
|
var freqPump2 = freqPumpAnaCombine[1];
|
var freqPump3 = freqPumpAnaCombine[2];
|
var freqPump4 = freqPumpAnaCombine[3];
|
|
#region 检查是否符合开机约束
|
List<long> machine_ids = new List<long>();
|
machine_ids.Add(freqPump1.MachineDetail.MachineID);
|
machine_ids.Add(freqPump2.MachineDetail.MachineID);
|
machine_ids.Add(freqPump3.MachineDetail.MachineID);
|
machine_ids.Add(freqPump4.MachineDetail.MachineID);
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var item in allFixPumpAnaList)
|
machine_ids.Add(item.MachineDetail.MachineID);
|
}
|
if (!IsAccordMachineRunFilter(machine_ids))
|
{
|
continue;
|
}
|
#endregion
|
|
double freTotalQ = fix_pump_total_flow;
|
double minSpanQ = _targetQmax;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData1 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData2 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData3 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData4 = null;
|
|
var rowPrj = new IStation.Calculation.DispatchAna.Model.AnaScheme();
|
rowPrj.TotalWrkQ = freTotalQ;
|
rowPrj.TotalWrkH = Math.Round(_targetH, 2);
|
rowPrj.Items = new List<IStation.Calculation.DispatchAna.Model.AnaSchemeItem>();
|
|
|
|
//找到离_targetQ最接近的频率点
|
for (int index1 = 0; index1 < freqPump1.AnaItemList.Count; index1++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index2 = 0; index2 < freqPump2.AnaItemList.Count; index2++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index3 = 0; index3 < freqPump3.AnaItemList.Count; index3++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index4 = 0; index4 < freqPump4.AnaItemList.Count; index4++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
double wrkQ = freqPump1.AnaItemList[index1].WorkPointQ +
|
freqPump2.AnaItemList[index2].WorkPointQ +
|
freqPump3.AnaItemList[index3].WorkPointQ +
|
freqPump4.AnaItemList[index4].WorkPointQ;
|
if (Math.Abs(fix_pump_total_flow + wrkQ - _targetQ) < minSpanQ)
|
{
|
freTotalQ = fix_pump_total_flow + wrkQ;
|
rowPrj.TotalWrkQ = freTotalQ;
|
minSpanQ = Math.Abs(freTotalQ - _targetQ);
|
curveData1 = freqPump1.AnaItemList[index1];
|
curveData2 = freqPump2.AnaItemList[index2];
|
curveData3 = freqPump3.AnaItemList[index3];
|
curveData4 = freqPump4.AnaItemList[index4];
|
}
|
}
|
}
|
}
|
}
|
|
//
|
if (freTotalQ < _targetQmax && freTotalQ > _targetQmin && curveData1 != null)
|
{
|
#region 加入固频泵开启信息
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var fixPump in allFixPumpAnaList)
|
{
|
if (fixPump.AnaItem.WorkPointQ < 1)
|
continue;
|
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem);
|
rowPrj.Items.Add(itemRow);
|
}
|
}
|
#endregion
|
|
|
var itemRowF1 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump1.MachineDetail, curveData1);
|
rowPrj.Items.Add(itemRowF1);
|
|
var itemRowF2 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump2.MachineDetail, curveData2);
|
rowPrj.Items.Add(itemRowF2);
|
|
var itemRowF3 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump3.MachineDetail, curveData3);
|
rowPrj.Items.Add(itemRowF3);
|
|
var itemRowF4 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump4.MachineDetail, curveData4);
|
rowPrj.Items.Add(itemRowF4);
|
|
|
AddScheme(rowPrj, true);
|
addPrjNum++;
|
}
|
}
|
|
return addPrjNum;
|
}
|
#endregion
|
|
|
#region 添加项目 只有5台变频泵:AddMultiFreqPumpPrj5
|
private int AddMultiFreqPumpPrj5(
|
IStation.Calculation.DispatchAna.Model.FixPumpAnaData[] allFixPumpAnaList,
|
IStation.Calculation.DispatchAna.Model.FrePumpAnaData[] allFreqPumpAnaList,
|
double fix_pump_total_flow)
|
{
|
int addPrjNum = 0;
|
int frePumpNum = 5;
|
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() < frePumpNum)
|
return addPrjNum;
|
|
//判断最大开机数
|
if (_max_open_machine_number > 0)
|
{
|
int macine_number = 5;
|
if (allFixPumpAnaList != null)
|
{
|
macine_number = macine_number + allFixPumpAnaList.Count();
|
}
|
if (macine_number > _max_open_machine_number)
|
return 0;
|
}
|
|
List<IStation.Calculation.DispatchAna.Model.FrePumpAnaData[]> freqPumpAnaCombineList = IStation.Model.PermutationAndCombination<IStation.Calculation.DispatchAna.Model.FrePumpAnaData>.GetCombination(
|
allFreqPumpAnaList, frePumpNum);
|
foreach (var freqPumpAnaCombine in freqPumpAnaCombineList)
|
{
|
var freqPump1 = freqPumpAnaCombine[0];
|
var freqPump2 = freqPumpAnaCombine[1];
|
var freqPump3 = freqPumpAnaCombine[2];
|
var freqPump4 = freqPumpAnaCombine[3];
|
var freqPump5 = freqPumpAnaCombine[4];
|
|
#region 检查是否符合开机约束
|
List<long> machine_ids = new List<long>();
|
machine_ids.Add(freqPump1.MachineDetail.MachineID);
|
machine_ids.Add(freqPump2.MachineDetail.MachineID);
|
machine_ids.Add(freqPump3.MachineDetail.MachineID);
|
machine_ids.Add(freqPump4.MachineDetail.MachineID);
|
machine_ids.Add(freqPump5.MachineDetail.MachineID);
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var item in allFixPumpAnaList)
|
machine_ids.Add(item.MachineDetail.MachineID);
|
}
|
if (!IsAccordMachineRunFilter(machine_ids))
|
{
|
continue;
|
}
|
#endregion
|
|
double freTotalQ = fix_pump_total_flow;
|
double minSpanQ = _targetQmax;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData1 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData2 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData3 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData4 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData5 = null;
|
|
var rowPrj = new IStation.Calculation.DispatchAna.Model.AnaScheme();
|
rowPrj.TotalWrkQ = freTotalQ;
|
rowPrj.TotalWrkH = Math.Round(_targetH, 2);
|
rowPrj.Items = new List<IStation.Calculation.DispatchAna.Model.AnaSchemeItem>();
|
|
//double TotalWrkP = 0;
|
|
|
//找到离_targetQ最接近的频率点
|
for (int index1 = 0; index1 < freqPump1.AnaItemList.Count; index1++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index2 = 0; index2 < freqPump2.AnaItemList.Count; index2++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index3 = 0; index3 < freqPump3.AnaItemList.Count; index3++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index4 = 0; index4 < freqPump4.AnaItemList.Count; index4++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index5 = 0; index5 < freqPump5.AnaItemList.Count; index5++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
double wrkQ =
|
freqPump1.AnaItemList[index1].WorkPointQ +
|
freqPump2.AnaItemList[index2].WorkPointQ +
|
freqPump3.AnaItemList[index3].WorkPointQ +
|
freqPump4.AnaItemList[index4].WorkPointQ +
|
freqPump5.AnaItemList[index5].WorkPointQ;
|
if (Math.Abs(fix_pump_total_flow + wrkQ - _targetQ) < minSpanQ)
|
{
|
freTotalQ = fix_pump_total_flow + wrkQ;
|
rowPrj.TotalWrkQ = freTotalQ;
|
minSpanQ = Math.Abs(freTotalQ - _targetQ);
|
curveData1 = freqPump1.AnaItemList[index1];
|
curveData2 = freqPump2.AnaItemList[index2];
|
curveData3 = freqPump3.AnaItemList[index3];
|
curveData4 = freqPump4.AnaItemList[index4];
|
curveData5 = freqPump5.AnaItemList[index5];
|
}
|
}
|
}
|
}
|
}
|
}
|
|
//
|
if (freTotalQ < _targetQmax && freTotalQ > _targetQmin && curveData1 != null)
|
{
|
#region 加入固频泵开启信息
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var fixPump in allFixPumpAnaList)
|
{
|
if (fixPump.AnaItem.WorkPointQ < 1)
|
continue;
|
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem);
|
rowPrj.Items.Add(itemRow);
|
}
|
}
|
#endregion
|
|
|
var itemRowF1 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump1.MachineDetail, curveData1);
|
rowPrj.Items.Add(itemRowF1);
|
|
var itemRowF2 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump2.MachineDetail, curveData2);
|
rowPrj.Items.Add(itemRowF2);
|
|
var itemRowF3 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump3.MachineDetail, curveData3);
|
rowPrj.Items.Add(itemRowF3);
|
|
var itemRowF4 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump4.MachineDetail, curveData4);
|
rowPrj.Items.Add(itemRowF4);
|
|
var itemRowF5 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump5.MachineDetail, curveData5);
|
rowPrj.Items.Add(itemRowF5);
|
|
|
AddScheme(rowPrj, true);
|
addPrjNum++;
|
}
|
}
|
|
return addPrjNum;
|
}
|
#endregion
|
|
|
#region 添加项目 只有6台变频泵:AddMultiFreqPumpPrj6
|
private int AddMultiFreqPumpPrj6(
|
IStation.Calculation.DispatchAna.Model.FixPumpAnaData[] allFixPumpAnaList,
|
IStation.Calculation.DispatchAna.Model.FrePumpAnaData[] allFreqPumpAnaList,
|
double fix_pump_total_flow)
|
{
|
int addPrjNum = 0;
|
int frePumpNum = 6;
|
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() < frePumpNum)
|
return addPrjNum;
|
|
//判断最大开机数
|
if (_max_open_machine_number > 0)
|
{
|
int macine_number = 6;
|
if (allFixPumpAnaList != null)
|
{
|
macine_number = macine_number + allFixPumpAnaList.Count();
|
}
|
if (macine_number > _max_open_machine_number)
|
return 0;
|
}
|
|
List<IStation.Calculation.DispatchAna.Model.FrePumpAnaData[]> freqPumpAnaCombineList = IStation.Model.PermutationAndCombination<IStation.Calculation.DispatchAna.Model.FrePumpAnaData>.GetCombination(
|
allFreqPumpAnaList, frePumpNum);
|
foreach (var freqPumpAnaList in freqPumpAnaCombineList)
|
{
|
var freqPump1 = freqPumpAnaList[0];
|
var freqPump2 = freqPumpAnaList[1];
|
var freqPump3 = freqPumpAnaList[2];
|
var freqPump4 = freqPumpAnaList[3];
|
var freqPump5 = freqPumpAnaList[4];
|
var freqPump6 = freqPumpAnaList[5];
|
|
#region 检查是否符合开机约束
|
List<long> machine_ids = new List<long>();
|
machine_ids.Add(freqPump1.MachineDetail.MachineID);
|
machine_ids.Add(freqPump2.MachineDetail.MachineID);
|
machine_ids.Add(freqPump3.MachineDetail.MachineID);
|
machine_ids.Add(freqPump4.MachineDetail.MachineID);
|
machine_ids.Add(freqPump5.MachineDetail.MachineID);
|
machine_ids.Add(freqPump6.MachineDetail.MachineID);
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var item in allFixPumpAnaList)
|
machine_ids.Add(item.MachineDetail.MachineID);
|
}
|
if (!IsAccordMachineRunFilter(machine_ids))
|
{
|
continue;
|
}
|
#endregion
|
|
|
double freTotalQ = fix_pump_total_flow;
|
double minSpanQ = _targetQmax;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData1 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData2 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData3 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData4 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData5 = null;
|
IStation.Calculation.DispatchAna.Model.AnaCurveItem curveData6 = null;
|
|
var rowPrj = new IStation.Calculation.DispatchAna.Model.AnaScheme();
|
rowPrj.TotalWrkQ = freTotalQ;
|
rowPrj.TotalWrkH = Math.Round(this._targetH, 2);
|
rowPrj.Items = new List<IStation.Calculation.DispatchAna.Model.AnaSchemeItem>();
|
|
|
//找到离_targetQ最接近的频率点
|
for (int index1 = 0; index1 < freqPump1.AnaItemList.Count; index1++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index2 = 0; index2 < freqPump2.AnaItemList.Count; index2++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index3 = 0; index3 < freqPump3.AnaItemList.Count; index3++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index4 = 0; index4 < freqPump4.AnaItemList.Count; index4++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index5 = 0; index5 < freqPump5.AnaItemList.Count; index5++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
for (int index6 = 0; index6 < freqPump6.AnaItemList.Count; index6++)
|
{//频率越来越小,c.WorkPointQ也越来越小
|
double wrkQ =
|
freqPump1.AnaItemList[index1].WorkPointQ +
|
freqPump2.AnaItemList[index2].WorkPointQ +
|
freqPump3.AnaItemList[index3].WorkPointQ +
|
freqPump4.AnaItemList[index4].WorkPointQ +
|
freqPump5.AnaItemList[index5].WorkPointQ +
|
freqPump6.AnaItemList[index6].WorkPointQ;
|
if (Math.Abs(fix_pump_total_flow + wrkQ - _targetQ) < minSpanQ)
|
{
|
freTotalQ = fix_pump_total_flow + wrkQ;
|
rowPrj.TotalWrkQ = freTotalQ;
|
minSpanQ = Math.Abs(freTotalQ - _targetQ);
|
curveData1 = freqPump1.AnaItemList[index1];
|
curveData2 = freqPump2.AnaItemList[index2];
|
curveData3 = freqPump3.AnaItemList[index3];
|
curveData4 = freqPump4.AnaItemList[index4];
|
curveData5 = freqPump5.AnaItemList[index5];
|
curveData6 = freqPump6.AnaItemList[index6];
|
}
|
}
|
}
|
}
|
}
|
}
|
}
|
|
//
|
if (freTotalQ < _targetQmax && freTotalQ > _targetQmin && curveData1 != null)
|
{
|
#region 加入固频泵开启信息
|
if (allFixPumpAnaList != null)
|
{
|
foreach (var fixPump in allFixPumpAnaList)
|
{
|
if (fixPump.AnaItem.WorkPointQ < 1)
|
continue;
|
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem);
|
|
rowPrj.Items.Add(itemRow);
|
}
|
}
|
#endregion
|
|
|
var itemRowF1 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump1.MachineDetail, curveData1);
|
rowPrj.Items.Add(itemRowF1);
|
|
var itemRowF2 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump2.MachineDetail, curveData2);
|
rowPrj.Items.Add(itemRowF2);
|
|
var itemRowF3 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump3.MachineDetail, curveData3);
|
rowPrj.Items.Add(itemRowF3);
|
|
var itemRowF4 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump4.MachineDetail, curveData4);
|
rowPrj.Items.Add(itemRowF4);
|
|
var itemRowF5 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump5.MachineDetail, curveData5);
|
rowPrj.Items.Add(itemRowF5);
|
|
var itemRowF6 = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump6.MachineDetail, curveData6);
|
rowPrj.Items.Add(itemRowF6);
|
|
AddScheme(rowPrj, true);
|
addPrjNum++;
|
}
|
}
|
|
return addPrjNum;
|
}
|
#endregion
|
|
|
|
private int _schemeID = 1;
|
private bool AddScheme(IStation.Calculation.DispatchAna.Model.AnaScheme project, bool IsAccurateCalc)
|
{
|
//
|
project.TotalWrkQ = (from x in project.Items where x.WorkPointQ > 0 select x.WorkPointQ).Sum();
|
project.TotalWrkH = Math.Round((from x in project.Items where x.WorkPointH > 0 select x.WorkPointH).Average(), 2);
|
|
project.TotalWrkP = Math.Round((from x in project.Items where x.WorkPointP > 0 select x.WorkPointP).Sum(), 2);
|
project.TotalWrkE = IStation.Common.PumpParaHelper.CalculateE(project.TotalWrkQ, project.TotalWrkH, project.TotalWrkP);
|
project.UWP = Calcu_UWP(project.TotalWrkP, project.TotalWrkQ, this._targetH);
|
project.WP = Calcu_WP(project.TotalWrkP, project.TotalWrkQ);
|
|
if (project.TotalWrkQ > _targetQmax || project.TotalWrkQ < _targetQmin)
|
{
|
return false;
|
}
|
//计算流量
|
//rowPrj.TotalWrkQ = (from x in rowPrj.Items where x.WorkPointQ > 0 select x.WorkPointQ).Sum();
|
//if (rowPrj.TotalWrkQ <= _targetQmax && rowPrj.TotalWrkQ >= this._targetQmin)
|
// ds_disp_project_list.Add(project);
|
|
if (_machine_flow_limit_max_dict != null)
|
{
|
foreach (var item in project.Items)
|
{
|
if (_machine_flow_limit_max_dict.ContainsKey(item.MachineID))
|
{//操作开机限制
|
if (item.WorkPointQ > _machine_flow_limit_max_dict[item.MachineID])
|
return false;
|
}
|
}
|
}
|
|
if (_machine_flow_limit_min_dict != null)
|
{
|
foreach (var item in project.Items)
|
{
|
if (_machine_flow_limit_min_dict.ContainsKey(item.MachineID))
|
{//操作开机限制
|
if (item.WorkPointQ < _machine_flow_limit_min_dict[item.MachineID])
|
return false;
|
}
|
}
|
}
|
|
|
|
|
if (_anaSchemeList == null)
|
_anaSchemeList = new List<IStation.Calculation.DispatchAna.Model.AnaScheme>();
|
|
|
|
//再精算一下
|
if (IsAccurateCalc)
|
CalcDetailAccurate(ref project);
|
|
|
project.ID = _schemeID;
|
_anaSchemeList.Add(project);
|
_schemeID++;
|
|
return true;
|
}
|
/// <summary>
|
/// 单位水耗 千吨水
|
/// </summary>
|
public static double Calcu_UWP(double P, double Q, double H)
|
{
|
if (Q <= 0.001)
|
return 0;
|
if (H <= 0.00001)
|
return 0;
|
if (P <= 0.001)
|
return 0;
|
return P * 1000f / Q / H;
|
}
|
/// <summary>
|
/// 单位水耗 千吨水
|
/// </summary>
|
public static double Calcu_UWP(double P, double Q, double inletPress, double outletPress)
|
{
|
double H = (outletPress - inletPress) * 102;
|
if (Q <= 0.001)
|
return 0;
|
if (H <= 0.00001)
|
return 0;
|
if (P <= 0.001)
|
return 0;
|
return P * 1000f / Q / H;
|
}
|
/// <summary>
|
/// 单位水耗
|
/// </summary>
|
public static double Calcu_WP(double P, double Q)
|
{
|
if (Q <= 0.001)
|
return 0;
|
|
if (P <= 0.001)
|
return 0;
|
return P * 1000f / Q;
|
}
|
}
|
|
|
|
|
|
|
|
}
|