using IStation.Calculation.DispatchAna.Model;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Crypto.IO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.PortableExecutable;
using System.Text;
using System.Threading.Tasks;
namespace IStation.Calculation.DispatchAna.Common
{
///
/// 调度分析(核心算法)
///
public class DispatchAnaGeneralHelper压力
{
///
///
///
static public double MinFlowIngore = 50;//流量低于多少就不考虑了
///
///
///
static public double ExtendMaxRatio = 1.25;//曲线最大延长率 25%
///
///
///
static public double MinChangeFrequence = 15;//最小变化的频率
///
///
///
static public double ChangeFrequenceSpaece = 0.5;//频率变化值(粗算)
private double _targetQmaxDefaultPercent = 125;
///
/// 流量范围最大百分比 0 表示没有设置(至少大于100)
///
public double TargetQmaxDefaultPercent { get { return _targetQmaxDefaultPercent; } set { _targetQmaxDefaultPercent = value; } }
private double _targetQinDefaultPercent = 85;
private double _targetQ;
private double _targetInletPress;
private double _targetOutletPress;
private double _targetQmax, _targetQmin;
private List _machineRunFilterList = null;
private List _must_open_machine_array = null;
private List _must_close_machine_array = null;
private Dictionary _machine_flow_limit_max_dict = null;
private Dictionary _machine_flow_limit_min_dict = null;
private int _max_open_machine_number = 0;//最多开机数量
private List _anaSchemeList = null;
private List _allMachineList = null;
//组合运行约束(禁止判断)
private List _allCombineRunJudgeList4Forbid = null;
//组合运行约束(必须判断)
private List> _allCombineRunJudgeList4Must = null;
private bool _isAllowOverTargetPress = false;
///
/// 是否允许超过目标压力, 但最小变频频率都比要求压力高时, 按最小频率开泵
///
public bool IsAllowOverTargetPress { set { _isAllowOverTargetPress = value; } }
///
/// 初始化参数
///
///
///
///
///
///
///
///
///
///
///
///
public bool InitialParas(
double targetQ,
double inlet_para,bool inlet_is_waterlevel,
double outlet_para,bool outlet_is_waterlevel,
string MinQ, string MaxQ,
List pipeMachineList,
List MachineRunFilterList,
out string error_info)
{
if (inlet_is_waterlevel)
{
this._targetInletPress = Math.Round(inlet_para / 102, 4);
}
else
{
this._targetInletPress = Math.Round(inlet_para, 4);
}
if (outlet_is_waterlevel)
{
this._targetOutletPress = Math.Round(outlet_para / 102, 4);
}
else
{
this._targetOutletPress = outlet_para;
}
this._targetQ = targetQ;
if (targetQ < 10)
{
error_info = "流量值过低无法分析";
return false;
}
double min_rated_h = 1000;
foreach(var m in pipeMachineList)
{
if (m.RatedH < 0.1)
continue;
min_rated_h = Math.Min(min_rated_h, m.RatedH);
}
if (this._targetOutletPress <= this._targetInletPress + min_rated_h / 2000)
{
error_info = "进出口压力值设置不合理";
return false;
}
this._allMachineList = pipeMachineList;
if(_targetQmaxDefaultPercent >101)
this._targetQmax = targetQ * _targetQmaxDefaultPercent / 100;
else
this._targetQmax = targetQ * 1.25;
this._targetQmin = targetQ * _targetQinDefaultPercent /100;
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);
error_info = null;
return true;
}
#region 过滤
private void InitialFilter(List 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();
_must_open_machine_array.Add(m.MachineID);
}
if (m.RunStatus == 0)
{
if (_must_close_machine_array == null)
_must_close_machine_array = new List();
_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();
_machine_flow_limit_max_dict[m.MachineID] = m.MaxFlow;
}
}
}
}
//是否符合过滤
private bool IsAccordMachineRunFilter(List 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;
}
}
//判断最大开机数
if (_max_open_machine_number > 0)
{
if (current_open_machine_id_array.Count() > _max_open_machine_number)
return false;
}
return true;
}
#endregion
///
/// 计算(最优)
///
///
///
///
public List CalcOptList(
IStation.Calculation.DispatchAna.Model.eAnaSchemeSortType SchemeSortType,
int ReturnSchemeNumber)
{
if (this._allMachineList == null || this._allMachineList.Count() == 0)
{
return null;
}
bool isHaveFrequency = false;
foreach (var machine in this._allMachineList)
{
if (machine.IsFrequency)
{//变频泵
isHaveFrequency = true;
break;
}
}
if (isHaveFrequency)
{
return CalcOptList有变频(SchemeSortType, ReturnSchemeNumber);
}
else
{
return CalcOptList无变频(SchemeSortType, ReturnSchemeNumber);
}
}
///
/// 有变频泵
///
///
///
///
private List CalcOptList有变频(
IStation.Calculation.DispatchAna.Model.eAnaSchemeSortType SchemeSortType,
int ReturnSchemeNumber)
{
#region 预算一下
List all_machine_ana_result_list =
new List();
int frequency_pump_count = 0;
foreach (var machine in this._allMachineList)
{
if (machine.IsFrequency)
{//变频泵
frequency_pump_count++;
var anaData = GetFrePumpAnaData(machine);
if (anaData != null)
{
all_machine_ana_result_list.Add(anaData);
}
}
else
{//固频泵
var anaData = GetFixPumpAnaData(machine);
if (anaData != null)
{
all_machine_ana_result_list.Add(anaData);
}
}
}
#endregion
#region 开始分析
_anaSchemeList = new List();
if (all_machine_ana_result_list.Count() == 0)
{
return null;
}
if (frequency_pump_count > 0)
{
#region 有变频泵,可以精确计算
if (all_machine_ana_result_list.Count() == 1)
{
var first_pump = all_machine_ana_result_list.First();
first_pump.AsFrequency = true;
IStation.Calculation.DispatchAna.Model.PumpAnaDataBase[] open_machine_list = new
IStation.Calculation.DispatchAna.Model.PumpAnaDataBase[] { first_pump };
AnaMahineComb(open_machine_list);
}
else
{
int max_fre_num = 2;//最多变频2台, 其余的即使变频,也按50HZ运行
var arry_allMachineList = all_machine_ana_result_list.ToArray();
for (int openPumpNum = 1; openPumpNum <= all_machine_ana_result_list.Count(); openPumpNum++)
{
//得到所有排列组合
List open_machine_combine_list =
IStation.Model.PermutationAndCombination.GetCombination(
arry_allMachineList, openPumpNum);
foreach (var open_machine_list in open_machine_combine_list)
{
var fre_machines = (from x in open_machine_list where x.IsFrequency select x).ToArray();
if (fre_machines.Count() > max_fre_num)
{//最多把2台泵当作变频泵运行, 其余按工频泵运行
List real_fre_machine_combine_list =
IStation.Model.PermutationAndCombination.GetCombination(
fre_machines, max_fre_num);//排列组合,找里面的2台
foreach (var real_fre_machine_list in real_fre_machine_combine_list)
{
foreach (var m in fre_machines)
{//先把所有变频泵当作工频泵
m.AsFrequency = false;
}
foreach (var m in real_fre_machine_list)
{//把排列组合中的两台设置位变频泵
m.AsFrequency = true;
}
int ana_ret = AnaMahineComb(open_machine_list);
}
}
else
{
foreach (var m in fre_machines)
{
if (m.IsFrequency)
m.AsFrequency = true;
}
int ana_ret = AnaMahineComb(open_machine_list);
}
}
}
}
#endregion
}
else
{
#region 都是工频泵
var arry_allMachineList = all_machine_ana_result_list.ToArray();
for (int openPumpNum = 1; openPumpNum <= all_machine_ana_result_list.Count(); openPumpNum++)
{
//得到所有排列组合
List open_machine_combine_list =
IStation.Model.PermutationAndCombination.GetCombination(
arry_allMachineList, openPumpNum);
foreach (var open_machine_list in open_machine_combine_list)
{
int ana_ret = AnaMahineComb(open_machine_list);
}
}
#endregion
}
#endregion
if (_anaSchemeList.Count() == 0)
return null;
//计算
var ds_disp_project_list = new List();
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();
}
///
/// 没有变频泵,全是工频泵
///
///
///
///
private List CalcOptList无变频 (
IStation.Calculation.DispatchAna.Model.eAnaSchemeSortType SchemeSortType,
int ReturnSchemeNumber)
{
//
List all_machine_ana_result_list =
new List();
foreach (var machine in this._allMachineList)
{
var anaData = GetFixPumpAnaData(machine);
if (anaData != null)
{
all_machine_ana_result_list.Add(anaData);
}
}
if (all_machine_ana_result_list.Count() == 0)
{
return null;
}
#region 开始分析
_anaSchemeList = new List();
var ds_disp_project_list = new List();
var arry_allMachineList = all_machine_ana_result_list.ToArray();
for (int openPumpNum = 1; openPumpNum <= all_machine_ana_result_list.Count(); openPumpNum++)
{
//得到所有排列组合
List open_machine_combine_list =
IStation.Model.PermutationAndCombination.GetCombination(
arry_allMachineList, openPumpNum);
foreach (var open_machine_list in open_machine_combine_list)
{
//检查是否符合开机约束
List machine_ids = (from x in open_machine_list select x.MachineID).ToList();
if (!IsAccordMachineRunFilter(machine_ids))
{
continue;
}
var total_flow = (from x in open_machine_list select x.AnaItem50Hz.WorkPointQ).Sum();
if (total_flow > _targetQmax || total_flow < this._targetQmin)
{
continue;
}
var project = new IStation.Calculation.DispatchAna.Model.AnaScheme();
project.ID = 1;
project.TotalWrkQ = total_flow;
project.Items = new List();
foreach (var fixPump in open_machine_list)
{
if (fixPump.AnaItem50Hz.WorkPointQ < 1)
continue;
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem50Hz);
project.Items.Add(itemRow);
}
project.TotalWrkP = (from x in project.Items where x.WorkPointP > 0 select x.WorkPointP).Sum();
var default_pump = open_machine_list.FirstOrDefault();
project.TotalWrkH = Math.Round(this.CalcHeadByPress(this._targetInletPress,
this._targetOutletPress,
default_pump.MachineDetail.InletCaliber, default_pump.MachineDetail.OutletCaliber,
total_flow / open_machine_list.Count()), 3);
project.TotalWrkE = IStation.Common.PumpParaHelper.CalculateE(project.TotalWrkQ, project.TotalWrkH, project.TotalWrkP);
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);
}
}
#endregion
// 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();
}
///
/// 没有变频泵,全是工频泵
///
///
///
///
private List CalcOptList无变频_最近(
IStation.Calculation.DispatchAna.Model.eAnaSchemeSortType SchemeSortType,
int ReturnSchemeNumber)
{
//
List all_machine_ana_result_list =
new List();
foreach (var machine in this._allMachineList)
{
var anaData = GetFixPumpAnaData(machine);
if (anaData != null)
{
all_machine_ana_result_list.Add(anaData);
}
}
if (all_machine_ana_result_list.Count() == 0)
{
return null;
}
#region 开始分析
_anaSchemeList = new List();
double total_flow_最靠近 = 0;
double total_flow_最靠近_dis = this._targetQ * 2;
List open_machine_combine_list_最靠近 = null;
var arry_allMachineList = all_machine_ana_result_list.ToArray();
for (int openPumpNum = 1; openPumpNum <= all_machine_ana_result_list.Count(); openPumpNum++)
{
//得到所有排列组合
List open_machine_combine_list =
IStation.Model.PermutationAndCombination.GetCombination(
arry_allMachineList, openPumpNum);
foreach (var open_machine_list in open_machine_combine_list)
{
//检查是否符合开机约束
List machine_ids = (from x in open_machine_list select x.MachineID).ToList();
if (!IsAccordMachineRunFilter(machine_ids))
{
continue;
}
var total_flow = (from x in open_machine_list select x.AnaItem50Hz.WorkPointQ).Sum();
if (Math.Abs(this._targetQ - total_flow) < total_flow_最靠近_dis)
{
if (total_flow_最靠近 < total_flow)
{
if ((Math.Abs(total_flow_最靠近 - total_flow) / this._targetQ) < 10)
continue;
}
total_flow_最靠近 = total_flow;
total_flow_最靠近_dis = Math.Abs(total_flow_最靠近 - total_flow);
open_machine_combine_list_最靠近 = open_machine_list.ToList();
}
}
}
#endregion
if (total_flow_最靠近 > _targetQmax && total_flow_最靠近 < this._targetQmin)
return null;
var project = new IStation.Calculation.DispatchAna.Model.AnaScheme();
project.ID = 1;
project.TotalWrkQ = total_flow_最靠近;
var default_pump = open_machine_combine_list_最靠近.FirstOrDefault();
project.TotalWrkH = Math.Round(this.CalcHeadByPress(this._targetInletPress,
this._targetOutletPress,
default_pump.MachineDetail.InletCaliber, default_pump.MachineDetail.OutletCaliber,
total_flow_最靠近 / open_machine_combine_list_最靠近.Count()), 3);
project.Items = new List();
foreach (var fixPump in open_machine_combine_list_最靠近)
{
if (fixPump.AnaItem50Hz.WorkPointQ < 1)
continue;
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem50Hz);
project.Items.Add(itemRow);
}
var ds_disp_project_list = new List();
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();
return ds_disp_project_list;
}
///
///
///
///
private int AnaMahineComb(IStation.Calculation.DispatchAna.Model.PumpAnaDataBase[] open_machine_list)
{
List machine_ids = (from x in open_machine_list select x.MachineID).ToList();
#region 检查是否符合开机约束
if (!IsAccordMachineRunFilter(machine_ids))
{
return 0;
}
#endregion
List fixPumpAnaCombine = new List();
List frePumpAnaDataList = new List();
int fre_pump_count = 0;
double total_min_flow_开机泵 = 0;
double total_max_flow_开机泵 = 0;
foreach (var machine in open_machine_list)
{
if (machine.AnaItem50Hz == null)
return 0;
total_max_flow_开机泵 += machine.AnaItem50Hz.CurveInfoQH.Max;
if (machine.IsFrequency)
{
if (!machine.AsFrequency)
{
fixPumpAnaCombine.Add(machine);
total_min_flow_开机泵 += machine.AnaItem50Hz.CurveInfoQH.Min;
}
else
{
frePumpAnaDataList.Add(machine);
fre_pump_count++;
total_min_flow_开机泵 += machine.AnaItemList.Last().WorkPointQ;//最小频率的流量
}
}
else
{
total_min_flow_开机泵 += machine.AnaItem50Hz.CurveInfoQH.Min;
fixPumpAnaCombine.Add(machine);
}
}
if (fre_pump_count > 0)
{
if (total_min_flow_开机泵 > _targetQmax * 1.02)
{
//if(open_machine_list.Count() == 1 && this._isAllowOverTargetPress)
//{
// return AddSinglePumpOver低(open_machine_list.FirstOrDefault(),_targetQ);
//}
return 0;
}
if (total_max_flow_开机泵 < _targetQmin * 0.98)
{
return 0;
}
}
if (fre_pump_count == 0)
{//只用固频泵即可
var ret = AddOnlyFixPumpPrj(open_machine_list, _targetQ);
if (ret)
return 1;
else
return 0;
}
else if (fre_pump_count == 1)
{ //只有一台变频泵
return AddSingleFreqPumpPrj1(fixPumpAnaCombine, frePumpAnaDataList);
}
else if (fre_pump_count == 2)
{ //有2台变频泵
return AddMultiFreqPumpPrj2(fixPumpAnaCombine, frePumpAnaDataList);
}
else if (fre_pump_count == 3)
{//有3台变频泵
return AddMultiFreqPumpPrj3(fixPumpAnaCombine, frePumpAnaDataList);
}
else if (fre_pump_count == 4)
{//有4台变频泵
return AddMultiFreqPumpPrj4(fixPumpAnaCombine, frePumpAnaDataList);
}
else if (fre_pump_count == 5)
{//有5台变频泵
return AddMultiFreqPumpPrj5(fixPumpAnaCombine, frePumpAnaDataList);
}
else if (fre_pump_count == 6)
{//有6台变频泵
return AddMultiFreqPumpPrj5(fixPumpAnaCombine, frePumpAnaDataList);
}
else
{
return 0;
}
}
///
/// 最小变频量都无法满足, 按最小变频, 超扬程运行
///
///
///
///
private int AddSinglePumpOver低(IStation.Calculation.DispatchAna.Model.PumpAnaDataBase freqPump, double targetQ)
{
if (freqPump == null)
return 0;
if (!freqPump.IsFrequency)
return 0;//暂时只支持变频
double ok_fre = 0;
double ok_h = 0;
IStation.Model.CurveExpress ok_curve_qh = null;
double target_h = (this._targetOutletPress - this._targetInletPress) * 102;
for (double fre = MinChangeFrequence; fre <= 50; fre++)
{
var qh_curve = IStation.Common.SpeedSimuCalculer.GetSimuPointQH( freqPump.MachineDetail.MaxCurveInfoQH, 50, fre);
if (targetQ > qh_curve.Max * 1.1)
{
continue;
}
if (targetQ < qh_curve.Min * 0.8)
{
continue;
}
var h_c = IStation.Model.FitCurveHelper.GetFitPointY(qh_curve, targetQ);
if(h_c > target_h)
{
ok_h = h_c;
ok_curve_qh = qh_curve;
ok_fre = fre;
break;
}
}
if (ok_curve_qh == null)
return 0;
var min_curve_qp = IStation.Common.SpeedSimuCalculer.GetSimuPointQP(freqPump.MachineDetail.MaxCurveInfoQP, 50, ok_fre);
var p = IStation.Model.FitCurveHelper.GetFitPointY(min_curve_qp, targetQ);
IStation.Calculation.DispatchAna.Model.AnaCurveItem currentAna = new IStation.Calculation.DispatchAna.Model.AnaCurveItem();
currentAna.Note = "超所需扬程";
currentAna.Status = 2;
currentAna.Frequence = ok_fre;
currentAna.CurveInfoQH = ok_curve_qh;
currentAna.CurveInfoQP = min_curve_qp;
currentAna.WorkPointQ = targetQ;
currentAna.WorkPointH = ok_h;
currentAna.WorkPointP = Math.Round(p, 1);
currentAna.WorkPointE = Math.Round(IStation.Common.PumpParaHelper.CalculateE(
currentAna.WorkPointQ, currentAna.WorkPointH, currentAna.WorkPointP), 1);
currentAna.Speed = freqPump.MachineDetail.CalcSpeedByFrequence(ok_fre);
var rowPrj = new IStation.Calculation.DispatchAna.Model.AnaScheme();
rowPrj.Items = new List();
var itemRowF = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(freqPump.MachineDetail, currentAna);
rowPrj.Items.Add(itemRowF);
AddScheme(rowPrj, false);
return 1;
}
///
/// 计算(保持当前开泵状态)
///
///
///
public IStation.Calculation.DispatchAna.Model.AnaScheme CalcKeepStatus(List openMachineIdList)
{
if (_allMachineList == null || _allMachineList.Count() == 0)
{
return null;
}
if (openMachineIdList == null || openMachineIdList.Count() == 0)
{
return null;
}
this._allCombineRunJudgeList4Must = new List>();
_allCombineRunJudgeList4Must.Add(openMachineIdList);
#region 获取并预算一下
List all_machine_ana_result_list =
new List();
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)
all_machine_ana_result_list.Add(anaData);
}
else
{//固频泵
var anaData = GetFixPumpAnaData(machine);
if (anaData != null)
all_machine_ana_result_list.Add(anaData);
}
}
#endregion
#region 开始分析
_anaSchemeList = new List();
// AnaMahineComb(all_machine_ana_result_list.ToArray());
int max_fre_num = 2;//最多变频2台, 其余的即使变频,也按50HZ运行
var fre_machines = (from x in all_machine_ana_result_list where x.IsFrequency select x).ToArray();
if (fre_machines.Count() > max_fre_num)
{//最多把2台泵当作变频泵运行, 其余按工频泵运行
List real_fre_machine_combine_list =
IStation.Model.PermutationAndCombination.GetCombination(
fre_machines, max_fre_num);//排列组合,找里面的2台
foreach (var real_fre_machine_list in real_fre_machine_combine_list)
{
foreach (var m in fre_machines)
{//先把所有变频泵当作工频泵
m.AsFrequency = false;
}
foreach (var m in real_fre_machine_list)
{//把排列组合中的两台设置位变频泵
m.AsFrequency = true;
}
AnaMahineComb(all_machine_ana_result_list.ToArray());
}
}
else
{
foreach (var m in fre_machines)
{
m.AsFrequency = true;
}
AnaMahineComb(all_machine_ana_result_list.ToArray());
}
#endregion
if (_anaSchemeList.Count() == 0)
return null;
//计算
var ds_disp_project_list = new List();
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._targetInletPress, this._targetOutletPress,
Machine.InletCaliber , Machine.OutletCaliber, 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() { MachineID = Machine.MachineID, MachineDetail = Machine, AnaItem50Hz = anaData };
}
#endregion
///
///
///
///
///
///
///
///
///
private double CalcHeadByPress(double InletPress, double OutletPress, double? InletDia, double? OutletDia, double Flow)
{
//return (OutletPress - InletPress) * 102;
double h4Press = (OutletPress - InletPress) * 102;
if (Flow > 0 )
{
double rPipeInV = 0;
if(InletDia.HasValue && InletDia > 0)
{
rPipeInV = OtherPressCoeff * Flow / InletDia.Value / InletDia.Value;
}
double rPipeOutV = 0;
if (OutletDia.HasValue && OutletDia > 0)
{
rPipeOutV = OtherPressCoeff * Flow / OutletDia.Value / OutletDia.Value;
}
double rVDif = (rPipeOutV * rPipeOutV - rPipeInV * rPipeInV) / 9.81 / 2.0;
return h4Press + rVDif;
}
else
{
return h4Press;
}
}
#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.MachineID = Machine.MachineID;
anaData.MachineDetail = Machine;
anaData.AnaItemList = new List();
double targetH = this.CalcHeadByPress(this._targetInletPress,
this._targetOutletPress, Machine.InletCaliber, Machine.OutletCaliber,
this._targetQ);
//CalcHeadByPress(this._targetInletPress, this._targetOutletPress);
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._targetInletPress, this._targetOutletPress,
Machine.InletCaliber, Machine.OutletCaliber, freqCurrentFrequ, ref curve);
if (ret == -1)
break;//-1 表示最大扬程都已经低于目标扬程了, 没必要再迭代了
if (ret == 0)
continue;
if (ret == -99)
continue;
curve.Speed = Machine.CalcSpeedByFrequence(curve.Frequence);
anaData.AnaItemList.Add(curve);
}
anaData.AnaItem50Hz = anaData.AnaItemList.FirstOrDefault();
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._targetInletPress, this._targetOutletPress,
current_machine.InletCaliber, current_machine.OutletCaliber,
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._targetInletPress, this._targetOutletPress);
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 item_js_1 = new List();
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._targetInletPress, this._targetOutletPress,
adjust_machine_1.InletCaliber, adjust_machine_1.OutletCaliber,
fre, ref ana_item);
if (ret == -1)
break;
item_js_1.Add(ana_item);
}
List item_js_2 = new List();
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._targetInletPress, this._targetOutletPress,
adjust_machine_2.InletCaliber, adjust_machine_2.OutletCaliber,
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._targetInletPress, this._targetOutletPress);
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._targetInletPress, this._targetOutletPress);
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._targetInletPress, this._targetOutletPress,
pump_curve.InletCaliber, pump_curve.OutletCaliber,
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._targetInletPress, this._targetOutletPress);
project.WP = Calcu_WP(project.TotalWrkP, project.TotalWrkQ);
}
if (total_q < this._targetQ)
{
break;
}
}
}
}
}
#endregion
#region 根据频率值,计算变频曲线
///
/// 根据频率值,计算变频曲线(外部也会调用)
///
///
///
///
///
///
///
///
///
///
public static int CalcAnaCurve(
IStation.Model.CurveExpress MaxCurveInfoQH,
IStation.Model.CurveExpress MaxCurveInfoQP,
double inletPress, double outletPress,
double? InletDia, double? OutletDia,
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;
if (!GetFolwByPress(ana_data.CurveInfoQH, inletPress, outletPress, InletDia, OutletDia, 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, 2);
ana_data.WorkPointQ = flow;
ana_data.WorkPointH = head;
ana_data.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(ana_data.CurveInfoQP, ana_data.WorkPointQ), 1);
if (ana_data.WorkPointP < 0.1)
{
if (ana_data.WorkPointQ > ana_data.CurveInfoQP.Max && ana_data.WorkPointQ < ana_data.CurveInfoQP.Max * 1.15)
{
ana_data.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(ana_data.CurveInfoQP, ana_data.CurveInfoQP.Max), 1);
}
else
{
return -99;
}
}
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;
if (!GetFolwByPress(ana_data.CurveInfoQH, inletPress, outletPress, InletDia, OutletDia, 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, 2);
ana_data.WorkPointQ = flow;
ana_data.WorkPointH = head;
ana_data.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(ana_data.CurveInfoQP, ana_data.WorkPointQ), 1);
if (ana_data.WorkPointP < 0.1)
{
if(ana_data.WorkPointQ > ana_data.CurveInfoQP.Max && ana_data.WorkPointQ < ana_data.CurveInfoQP.Max * 1.15)
{
ana_data.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(ana_data.CurveInfoQP, ana_data.CurveInfoQP.Max ), 1);
}
else
{
return -99;
}
}
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;
///
///
///
///
///
///
///
///
///
///
public static bool GetFolwByPress(
IStation.Model.CurveExpress curveInfoQH,
double InletPress, double OutletPress,
double? InletDia, double? OutletDia,
ref double flow)
{
double g = 9.81;
double h4Press = (OutletPress - InletPress) * 102;
//计算流量
var points = IStation.Model.FitCurveHelper.GetFitPointsByExtend(curveInfoQH, ExtendMaxRatio, 50);
List listQ = IStation.Model.FitCurveHelper.GetInterPointX(points, h4Press);
if (listQ == null || listQ.Count == 0)
{
return false;
}
flow = listQ.Last().X;
double initialQ = listQ.Last().X;
double calcQ = initialQ;//用于计算的流量
for (int calcNo = 1; calcNo <= 3; calcNo++)
{
double rPipeInV = 0;
if(InletDia.HasValue && InletDia > 10)
{
rPipeInV = OtherPressCoeff * calcQ / InletDia.Value / InletDia.Value;
}
double rPipeOutV = 0;
if (OutletDia.HasValue && OutletDia > 10)
{
rPipeOutV = OtherPressCoeff * calcQ / OutletDia.Value / OutletDia.Value;
}
double rVDif = (rPipeOutV * rPipeOutV - rPipeInV * rPipeInV) / g / 2.0;
double dieDai1H = h4Press + rVDif;
if (GetFolwByHead(points, dieDai1H, ref flow))
{
if (Math.Abs(calcQ - flow) / flow < 0.005)
{
return true;
}
//继续迭代
if (calcQ > flow)
{
calcQ = flow + Math.Abs(calcQ - flow) / 2;
}
else
{
calcQ = flow - Math.Abs(calcQ - flow) / 2;
}
}
else
{
return false;
}
}
return true;
}
///
///
///
///
///
///
///
public static bool GetFolwByHead(List curveInfoQH, double h, ref double q)
{
List listQ = IStation.Model.FitCurveHelper.GetInterPointX(curveInfoQH, h);
if (listQ == null || listQ.Count == 0)
{
return false;
}
q = listQ.Last().X;
return true;
}
///
/// 根据频率值,计算变频曲线
///
///
///
///
///
///
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 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 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 bool AddOnlyFixPumpPrj(
IStation.Calculation.DispatchAna.Model.PumpAnaDataBase[] fixPumpAnaDataList,
double totalQ)
{
int pump_count = fixPumpAnaDataList.Count();
var default_pump = fixPumpAnaDataList.First();
var rowPrj = new IStation.Calculation.DispatchAna.Model.AnaScheme();
rowPrj.TotalWrkQ = totalQ;
rowPrj.TotalWrkH = Math.Round(this.CalcHeadByPress(this._targetInletPress,
this._targetOutletPress,
default_pump.MachineDetail.InletCaliber, default_pump.MachineDetail.OutletCaliber,
totalQ / pump_count), 3);
rowPrj.Items = new List();
foreach (var fixPump in fixPumpAnaDataList)
{
if (fixPump.AnaItem50Hz.WorkPointQ < 1)
continue;
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem50Hz);
rowPrj.Items.Add(itemRow);
}
return AddScheme(rowPrj, false);
}
#endregion
#region 添加项目 只有1台变频泵:AddOneFreqPumpPrj
private int AddSingleFreqPumpPrj1(
List allFixPumpAnaList,
List allFreqPumpAnaList)
{
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() != 1)
return 0;
double fix_pump_total_flow = 0;
if (allFixPumpAnaList != null && allFixPumpAnaList.Count>0)
{
fix_pump_total_flow = (from x in allFixPumpAnaList select x.AnaItem50Hz.WorkPointQ).Sum();
}
if (fix_pump_total_flow >= this._targetQ * 0.99)
return 0;
int addPrjNum = 0;
var freqPump = allFreqPumpAnaList.FirstOrDefault();
{
var frePump_flow = (this._targetQ - fix_pump_total_flow);
double h = //this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress);
Math.Round(this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress,
freqPump.MachineDetail.InletCaliber, freqPump.MachineDetail.OutletCaliber, frePump_flow), 3);
var dp = new IStation.Model.CurvePoint(frePump_flow, h);
var wrkSpeed = IStation.Common.SpeedSimuCalculer.GetSimuValue(
freqPump.MachineDetail.MaxCurveInfoQH,
dp, 2900);
if (wrkSpeed < 0)
return 0;//
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._targetInletPress, this._targetOutletPress,
freqPump.MachineDetail.InletCaliber, freqPump.MachineDetail.OutletCaliber, fre, ref currentAna);
if (ret == -1)
return 0;
if (ret == -99)
return 0;
if (ret == 0)
return 0;
currentAna.Speed = freqPump.MachineDetail.CalcSpeedByFrequence(fre);
var rowPrj = new IStation.Calculation.DispatchAna.Model.AnaScheme();
rowPrj.Items = new List();
#region 加入固频泵开启信息
if (allFixPumpAnaList != null)
{
foreach (var fixPump in allFixPumpAnaList)
{
if (fixPump.AnaItem50Hz.WorkPointQ < 1)
continue;
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem50Hz);
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(
List allFixPumpAnaList,
List allFreqPumpAnaList)
{
int addPrjNum = 0;
int frePumpNum = 2;
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() != frePumpNum)
return addPrjNum;
double fix_pump_total_flow = 0;
if (allFixPumpAnaList != null && allFixPumpAnaList.Count > 0)
{
fix_pump_total_flow = (from x in allFixPumpAnaList select x.AnaItem50Hz.WorkPointQ).Sum();
}
var freqPump1 = allFreqPumpAnaList[0];
var freqPump2 = allFreqPumpAnaList[1];
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();
#region 加入固频泵开启信息
if (allFixPumpAnaList != null)
{
foreach (var fixPump in allFixPumpAnaList)
{
if (fixPump.AnaItem50Hz.WorkPointQ < 1)
continue;
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem50Hz);
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 = //this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress);
Math.Round(this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress,
freqPump1.MachineDetail.InletCaliber, freqPump1.MachineDetail.OutletCaliber,
fre_pump_total_flow/2), 3);
//流量对半分
var wrkSpeed1 = IStation.Common.SpeedSimuCalculer.GetSimuValue(freqPump1.MachineDetail.MaxCurveInfoQH,
new IStation.Model.CurvePoint(fre_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._targetInletPress, this._targetOutletPress,
freqPump1.MachineDetail.InletCaliber, freqPump1.MachineDetail.OutletCaliber,
fre1, ref curveData1);
if (ret1 == -1)
return 0;
if (ret1 == 0)
return 0;
curveData1.Speed = freqPump1.MachineDetail.CalcSpeedByFrequence(fre1);
var wrkSpeed2 = IStation.Common.SpeedSimuCalculer.GetSimuValue(freqPump2.MachineDetail.MaxCurveInfoQH,
new IStation.Model.CurvePoint(fre_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._targetInletPress, this._targetOutletPress,
freqPump2.MachineDetail.InletCaliber, freqPump2.MachineDetail.OutletCaliber,
fre2, ref curveData2);
if (ret2 == -1)
return 0;
if (ret2 == 0)
return 0;
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];
}
}
}
if (curveData1 == null || curveData2 == null)
return 0;
#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(
List allFixPumpAnaList,
List allFreqPumpAnaList)
{
int addPrjNum = 0;
int frePumpNum = 3;
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() != frePumpNum)
return addPrjNum;
double fix_pump_total_flow = 0;
if (allFixPumpAnaList != null && allFixPumpAnaList.Count > 0)
{
fix_pump_total_flow = (from x in allFixPumpAnaList select x.AnaItem50Hz.WorkPointQ).Sum();
}
var freqPump1 = allFreqPumpAnaList[0];
var freqPump2 = allFreqPumpAnaList[1];
var freqPump3 = allFreqPumpAnaList[2];
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 = //this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress);
Math.Round(this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress,
freqPump1.MachineDetail.InletCaliber, freqPump1.MachineDetail.OutletCaliber,
(this._targetQ- fix_pump_total_flow)/3), 3);
rowPrj.Items = new List();
//找到离_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.AnaItem50Hz.WorkPointQ < 1)
continue;
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem50Hz);
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(
List allFixPumpAnaList,
List allFreqPumpAnaList)
{
double fix_pump_total_flow = 0;
if (allFixPumpAnaList != null && allFixPumpAnaList.Count > 0)
{
fix_pump_total_flow = (from x in allFixPumpAnaList select x.AnaItem50Hz.WorkPointQ).Sum();
}
int addPrjNum = 0;
int frePumpNum = 4;
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() != frePumpNum)
return addPrjNum;
var freqPump1 = allFreqPumpAnaList[0];
var freqPump2 = allFreqPumpAnaList[1];
var freqPump3 = allFreqPumpAnaList[2];
var freqPump4 = allFreqPumpAnaList[3];
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 = //this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress);
Math.Round(this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress,
freqPump1.MachineDetail.InletCaliber, freqPump1.MachineDetail.OutletCaliber,
(this._targetQ - fix_pump_total_flow) / 4), 3);
rowPrj.Items = new List();
//找到离_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.AnaItem50Hz.WorkPointQ < 1)
continue;
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem50Hz);
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(
List allFixPumpAnaList,
List allFreqPumpAnaList)
{
int addPrjNum = 0;
int frePumpNum = 5;
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() != frePumpNum)
return addPrjNum;
double fix_pump_total_flow = 0;
if (allFixPumpAnaList != null && allFixPumpAnaList.Count() > 0)
{
fix_pump_total_flow = (from x in allFixPumpAnaList select x.AnaItem50Hz.WorkPointQ).Sum();
}
var freqPump1 = allFreqPumpAnaList[0];
var freqPump2 = allFreqPumpAnaList[1];
var freqPump3 = allFreqPumpAnaList[2];
var freqPump4 = allFreqPumpAnaList[3];
var freqPump5 = allFreqPumpAnaList[4];
#region 检查是否符合开机约束
List machine_ids = new List();
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);
}
#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 = //this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress);
Math.Round(this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress,
freqPump1.MachineDetail.InletCaliber, freqPump1.MachineDetail.OutletCaliber,
(this._targetQ - fix_pump_total_flow) / 5), 3);
rowPrj.Items = new List();
//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.AnaItem50Hz.WorkPointQ < 1)
continue;
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem50Hz);
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(
List allFixPumpAnaList,
List allFreqPumpAnaList)
{
int addPrjNum = 0;
int frePumpNum = 6;
if (allFreqPumpAnaList == null || allFreqPumpAnaList.Count() != frePumpNum)
return addPrjNum;
double fix_pump_total_flow = 0;
if (allFixPumpAnaList != null && allFixPumpAnaList.Count() > 0)
{
fix_pump_total_flow = (from x in allFixPumpAnaList select x.AnaItem50Hz.WorkPointQ).Sum();
}
var freqPump1 = allFreqPumpAnaList[0];
var freqPump2 = allFreqPumpAnaList[1];
var freqPump3 = allFreqPumpAnaList[2];
var freqPump4 = allFreqPumpAnaList[3];
var freqPump5 = allFreqPumpAnaList[4];
var freqPump6 = allFreqPumpAnaList[5];
#region 检查是否符合开机约束
List machine_ids = new List();
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);
}
#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 = //this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress);
Math.Round(this.CalcHeadByPress(this._targetInletPress, this._targetOutletPress,
freqPump1.MachineDetail.InletCaliber, freqPump1.MachineDetail.OutletCaliber,
(this._targetQ - fix_pump_total_flow) / 6), 3);
rowPrj.Items = new List();
//找到离_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.AnaItem50Hz.WorkPointQ < 1)
continue;
var itemRow = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(fixPump.MachineDetail, fixPump.AnaItem50Hz);
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._targetInletPress, this._targetOutletPress);
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();
//再精算一下
if (IsAccurateCalc)
CalcDetailAccurate(ref project);
project.ID = _schemeID;
_anaSchemeList.Add(project);
_schemeID++;
return true;
}
///
/// 单位水耗 千吨水
///
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;
}
///
/// 单位水耗 千吨水
///
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;
}
///
/// 单位水耗
///
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;
}
}
}