using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IStation.EtaCalculation
{
///
/// 泵站分析
///
public abstract class EtaAnalyCalculatorBase4Station : EtaAnalyCalculatorBase, IEtaStationAnalyCalculator
{
///
///
///
protected int _machineCount = 0;//由外部输入,检验数据,保证外部数据没有遗漏
///
///
///
protected long _stationID = 0;
///
/// 所有机泵
///
protected List _allMachineList = null;
///
///
///
///
public List GetAllMachineBundleList()
{
return _allMachineList;
}
///
///
///
///
public Calculation.Eta.Model.StationAnaInfoBundle GetAnaBundle()
{
Calculation.Eta.Model.StationAnaInfoBundle bundle = new Calculation.Eta.Model.StationAnaInfoBundle();
bundle.StationID = this._stationID;
bundle.AnaResult = this._stationAnaResult;
return bundle;
}
///
/// 获取分析结果(机泵)
///
///
public virtual List GetAllSingleAnaRecord()
{
if(this._allMachineList == null)
return null;
List single_ana_result_list = new List();
foreach (var item in this._allMachineList)
{
single_ana_result_list.Add(item.AnaResult);
}
return single_ana_result_list;
}
///
/// 分析结果(泵站)
///
protected IStation.Model.EtaMultiRealRecordPure _stationAnaResult = null;
///
/// 获取分析结果(泵站和支线)
///
///
public virtual IStation.Model.EtaMultiRealRecordPure GetStationAnaRecord()
{
return _stationAnaResult;
}
///
/// (支线)
///
protected List _pipeAnaResultList = null;
///
/// 获取分析结果(泵站和支线)
///
///
public virtual List GetAllPipeAnaRecord()
{
return _pipeAnaResultList;
}
///
/// /所有测点
///
protected List _allMonitorList = null;
///
///
///
protected double _threshold_flow = 100;//流量计阀值(大于此值 就认为开通)
///
/// 外部调用
///
///
///
///
public virtual bool Calculate(
IStation.Model.EtaStationAnalyContextItem context, out string error_info)
{
error_info = "未实例化";
return false;
}
///
/// 计算总管数据
///
///
///
/// 子管路时只要输入相关泵即可,其余的泵,对于子管路来说就认为关机,泵站为空即可
///
protected virtual bool BuildConnectResult(
double? total_flow,
Model.EtaMultiRealRecordPure result_pipe,
List all_machine_list = null)
{
if (_allMachineList == null)
return false;
if (all_machine_list == null )//为空,表示分析的是泵站, 直接给所有泵即可
all_machine_list = this._allMachineList;
List all_flow = new List();
List all_head = new List();
List all_power = new List();
//用的是泵站的总数量,
result_pipe.InitialRunList(this._allMachineList.Count());
double qhTotal = 0;
#region 开机状态 和数量
int pump_open_count = 0;
bool allFlowMonitorOk = true;
bool allPumpHeadOk = true;
bool allPumpPowerOk = true;
for (int i = 0; i < this._allMachineList.Count; i++)
{
var pump = all_machine_list.Find(x => x.MachineID == this._allMachineList[i].MachineID);
if (pump == null)
{//子管路时只要输入相关泵即可,其余的泵,对于子管路来说就认为关机
continue;
}
var result_pump = pump.AnaResult;
if (result_pump == null)
{
allFlowMonitorOk = false;
allPumpHeadOk = false;
allPumpPowerOk = false;
continue;
}
if (!pump.IsRunIng)
{
result_pipe.SetPumpStatusByIndex(i, result_pump.HZa, result_pump.RSa);
continue;
}
bool validQ = false, validH = false;
result_pipe.PutStationAnalyInfo(result_pump.AnalyInfo, pump.MachineID);
pump_open_count++;
result_pipe.SetPumpStatusByIndex(i, result_pump.HZa, result_pump.RSa);
if (result_pump.IsHaveAnaTag(IStation.Model.EtaBasicRealRecord.InfoTag_RU))
{
allPumpPowerOk = false;
allPumpHeadOk = false;
allFlowMonitorOk = false;
}
if (result_pump.IsHaveAnaTag(IStation.Model.EtaBasicRealRecord.InfoTag_Qa))
{
allFlowMonitorOk = false;
}
else if (result_pump.Qa == null)
{
allFlowMonitorOk = false;
}
else
{
all_flow.Add(result_pump.Qa.Value);
validQ = true;
}
if (result_pump.IsHaveAnaTag(IStation.Model.EtaBasicRealRecord.InfoTag_Ha) ||
result_pump.IsHaveAnaTag(IStation.Model.EtaBasicRealRecord.InfoTag_P2))
{
allPumpHeadOk = false;
}
else if (result_pump.Ha == null)
{
allPumpHeadOk = false;
}
else if (result_pump.Ha < 1)
{
allPumpHeadOk = false;
}
else
{
all_head.Add(result_pump.Ha.Value);
validH = true;
}
if (validQ && validH)
{
qhTotal += result_pump.Qa.Value * result_pump.Ha.Value;
}
if (result_pump.IsHaveAnaTag(IStation.Model.EtaBasicRealRecord.InfoTag_Pa))
{
allPumpPowerOk = false;
}
else if (result_pump.Pa == null)
{
allPumpPowerOk = false;
}
else if (result_pump.Pa < 1)
{
allPumpPowerOk = false;
}
else
{
all_power.Add(result_pump.Pa.Value);
}
}
result_pipe.RunningCount = pump_open_count;
#endregion
if (total_flow != null)
result_pipe.Qa = total_flow.Value;
if (pump_open_count > 0)
{
if (allFlowMonitorOk && result_pipe.Qa == null && all_flow.Count > 0)
{
result_pipe.Qa = Math.Round(all_flow.Sum(), 1);
}
if (allPumpHeadOk && all_head.Count > 0)
{
result_pipe.Ha = Math.Round(all_head.Average(), 3);
}
if (allPumpPowerOk && all_power.Count > 0)
{
result_pipe.Pa = all_power.Sum();
}
if (allPumpPowerOk && result_pipe.Ha != null && result_pipe.Pa != null && result_pipe.Qa != null)
{
//计算效率 旧代码
//double eta = Math.Round(Model.EtaSingleRealRecordPure.Calc_Eta(result_pipe.Qa.Value, result_pipe.Ha.Value, result_pipe.Pa.Value, WaterDensity, g), 1);
double eta = 0;
foreach (var item in all_machine_list)
{
var result = item.AnaResult;
if (result == null)
continue;
if (result.IsHaveAnaTag(IStation.Model.EtaBasicRealRecord.InfoTag_Qa) || result.IsHaveAnaTag(IStation.Model.EtaBasicRealRecord.InfoTag_Ha))
continue;
if (result.Ea.HasValue && result.Qa.HasValue && result.Ha.HasValue)
{
eta += (result.Qa.Value * result.Ha.Value / qhTotal) * result.Ea.Value;
}
}
result_pipe.Ea = Math.Round(eta, 1);
result_pipe.UWPa = 0;
result_pipe.WPa = 0;
// 检查效率
if (eta > 95)
{//有时, 大流量曲线部分,是曲线不精确, 造成Q H曲线不符合实际, 造成效率计算出问题
result_pipe.AnalyStatus = Model.Eta.eAnalyStatus.Abnormal;
result_pipe.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ea, eta.ToString());
}
else
{//计算
if (result_pipe.AnalyStatus == Model.Eta.eAnalyStatus.Unkonw)
result_pipe.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
result_pipe.CalcUnitPower();
}
}
else
{
result_pipe.AnalyStatus = Model.Eta.eAnalyStatus.Abnormal;
}
}
else
{//表示没有开机的
result_pipe.SetEmptyPipe(this._machineCount);
}
return true;
}
#region 初始化测点列表
///
/// 初始化测点列表
///
///
///
///
protected bool InitialMonitorList(
Model.EtaStationAnalyContextItem context,
out string error_info)
{
if (this._allMonitorList != null && this._allMonitorList.Count > 0)
{//只用初始化一次即可
error_info = null;
return true;
}
List PatternContextItems = context.PipeLineContextItems;
this._allMonitorList = new List();
foreach (var s in PatternContextItems)
{
if (s.MonitorPointContextItems != null)
{
_allMonitorList.AddRange(s.MonitorPointContextItems);
}
}
if (_allMonitorList.Count() == 0)
{
error_info = "没有任何监测数据";
return false;
}
error_info = null;
return true;
}
#endregion
///
/// 初始化泵列表
///
///
///
///
protected virtual bool InitialPumpList(Model.EtaStationAnalyContextItem context, out string error_info)
{
error_info = "没有实例化";
return false;
}
#region 构造机泵列表
///
/// 构造机泵列表
///
/// 泵站上下文
///
///
///
///
///
///
///
///
///
///
///
///
protected List InitialPumpMachineList(
Model.EtaStationAnalyContextItem context,
long[] machine_id_array, //基本ID
long[] monitor_id_run_status,//运行状态
long[] monitor_id_pump_flow,// 流量计
bool is液位代替进口压力,
long[] monitor_id_inlet_press,//进口压力计
long[] monitor_id_outlet_press,//出口压力
long[] monitor_id_motor_power,//瞬间功率
long[] monitor_id_frequence,//频率
long[] monitor_id_zhuansu,//转速
long[] monitor_id_ele_curret,//电流
out string error_info)
{
int machine_count = machine_id_array.Count();
if (monitor_id_run_status == null || monitor_id_run_status.Count() != machine_count)
{
error_info = $"{context.Name}运行状态测点ID设置不正确!Error:67";
return null;
}
if (monitor_id_pump_flow == null || monitor_id_pump_flow.Count() != machine_count)
{
error_info = $"{context.Name}流量测点ID设置不正确!Error:72";
return null;
}
if (monitor_id_outlet_press == null || monitor_id_outlet_press.Count() != machine_count)
{
error_info = $"{context.Name}压力测点ID设置不正确!Error:77";
return null;
}
error_info = null;
List machine_list = new List(machine_count);
for (int i = 0; i < machine_count; i++)
{
var machine_id = machine_id_array[i];
Model.EtaEnginePumpAnalyContextItem machine_context = null;
foreach (var item in context.PipeLineContextItems)
{
if (item.Catalog != IStation.Product.Catalog_JiBeng)
continue;
machine_context = item.ProductContextItem as Model.EtaEnginePumpAnalyContextItem;
if (machine_context == null)
continue;
if (machine_id == machine_context.ObjectID)
{
var series_no = 0;
if (item.SerialNO.HasValue)
{
series_no = item.SerialNO.Value;
}
var bundle = new IStation.Calculation.Eta.Model.PumpAnaResult(machine_context)
{
SerialNO = series_no,
PipeLineID = machine_context.PipeLineID,
MachineID = machine_id
};
var result_pump = new Model.EtaSingleRealRecordPure();
result_pump.ObjectType = IStation.ObjectType.PipeLine;
result_pump.ObjectID = machine_context.PipeLineID;
result_pump.RSa = IStation.RunStatus.UnKnown;//默认未知
result_pump.AnalyStatus = Model.Eta.eAnalyStatus.Unkonw;
if (monitor_id_pump_flow != null && monitor_id_pump_flow.Count() > i)
{
bundle.MonitorID_PumpFlow = monitor_id_pump_flow[i];
}
if (monitor_id_run_status != null && monitor_id_run_status.Count() > i)
{
bundle.MonitorID_RunStatus = monitor_id_run_status[i];
}
bundle.Is液位代替进口压力 = is液位代替进口压力;
if (monitor_id_inlet_press != null && monitor_id_inlet_press.Count() > i)
{
bundle.MonitorID_InletPress = monitor_id_inlet_press[i];
}
if (monitor_id_outlet_press != null && monitor_id_outlet_press.Count() > i)
{
bundle.MonitorID_OutletPress = monitor_id_outlet_press[i];
}
if (monitor_id_motor_power != null && monitor_id_motor_power.Count() > i)
{
bundle.MonitorID_MotorPower = monitor_id_motor_power[i];
}
if (monitor_id_frequence != null && monitor_id_frequence.Count() > i)
{
bundle.MonitorID_Frequence = monitor_id_frequence[i];
}
if (monitor_id_zhuansu != null && monitor_id_zhuansu.Count() > i)
{
bundle.MonitorID_ZhuanSu = monitor_id_zhuansu[i];
}
if (monitor_id_ele_curret != null && monitor_id_ele_curret.Count() > i)
{
bundle.MonitorID_ele_current = monitor_id_ele_curret[i];
}
bundle.AnaResult = result_pump;
machine_list.Add(bundle);
}
}
if (machine_context == null)
{
error_info = "此机泵无法找到对应管路设置 , 机泵ID=" + machine_id_array[i];
return null;
}
}
if (machine_list.Count() != machine_count)
{
error_info = string.Format("错误代码Error:230, 能效实时分析任务中,机泵无法全部获取!stationID={0}", this._stationID);
return null;
}
var sort_machine_list = (from x in machine_list orderby x.SerialNO select x).ToList();
return sort_machine_list;
}
#endregion
#region 分析 泵的运行状态(开机关机)
///
/// 分析单泵的运行状态
///
///
///
protected bool AnaAllPumpRunStatus(out string error_info)
{
for (int i = 0; i < this._allMachineList.Count(); i++)
{
var pump_context = this._allMachineList[i];
if (!AnaPumpRunStatus(pump_context, out error_info))
{//分析单泵
return false;
}
if (pump_context.AnaResult.RSa == IStation.RunStatus.Shut)
{
pump_context.AnaResult.Qa = 0;
pump_context.AnaResult.Ha = 0;
pump_context.AnaResult.Pa = 0;
pump_context.AnaResult.Ea = 0;
pump_context.AnaResult.UWPa = 0;
pump_context.AnaResult.WPa = 0;
if (pump_context.AnaResult.AnalyStatus == Model.Eta.eAnalyStatus.Unkonw)
pump_context.AnaResult.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
}
}
error_info = null;
return true;
}
///
/// 分析单泵的运行状态
///
///
///
///
protected bool AnaPumpRunStatus( IStation.Calculation.Eta.Model.PumpAnaResult pump_context, out string error_info)
{
if (pump_context == null)
{
error_info = "Error 375";
return false;
}
#region 开停机状态,以及频率, 电流
var ana_context = pump_context.AnaResult;
if (ana_context == null)
{
error_info = "AnaResult 为空 错误代码! Error:359";
return false;
}
bool isAnaOk = false;
if (pump_context.MonitorID_RunStatus > 0)
{
var monitor_run = _allMonitorList.Find(x => x.ObjectID == pump_context.MonitorID_RunStatus);
if (monitor_run == null)
{
ana_context.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_context.PutAnalyInfo(Model.EtaSingleRealRecordPure.InfoTag_RU, null);
}
else if (monitor_run.DataValue > 0.1)
{
isAnaOk = true;
ana_context.RSa = IStation.RunStatus.Run;
}
else
{
isAnaOk = true;
ana_context.RSa = IStation.RunStatus.Shut;
ana_context.Qa = 0;
ana_context.Ha = 0;
ana_context.Pa = 0;
}
}
#endregion
bool isOk频率 = false;
bool isAddTag_hz = false;
//分析频率
if (isAnaOk)
{
#region 开机状态分析正常
if (pump_context.IsRunIng)
{
if (!pump_context.IsFrequency)
{
isOk频率 = true;
ana_context.HZa = 50;
}
else
{
if (pump_context.MonitorID_Frequence > 0)
{
#region 变频, 且已开机
var monitor_frequence = _allMonitorList.Find(x => x.ObjectID == pump_context.MonitorID_Frequence);
if (monitor_frequence == null)
{
isAddTag_hz = true;
ana_context.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_context.PutAnalyInfo(Model.EtaSingleRealRecordPure.InfoTag_HZ, null);
}
else if (monitor_frequence.DataValue < 10 || monitor_frequence.DataValue > 55)
{//数据不正常
ana_context.HZa = monitor_frequence.DataValue;
ana_context.AnalyStatus = Model.Eta.eAnalyStatus.Abnormal;
ana_context.PutAnalyInfo(Model.EtaSingleRealRecordPure.InfoTag_HZ, null);
}
else
{
isOk频率 = true;
ana_context.HZa = monitor_frequence.DataValue;
}
#endregion
}
else
{
isAddTag_hz = true;
ana_context.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_context.PutAnalyInfo(Model.EtaSingleRealRecordPure.InfoTag_HZ, null);
}
}
}
else
{
isOk频率 = true;
ana_context.HZa = 0;
}
#endregion
}
else
{
#region 开机状态分析不正常, 看看用频率判断开停机行不行
if (pump_context.MonitorID_Frequence > 0)
{
var monitor_frequence = _allMonitorList.Find(x => x.ObjectID == pump_context.MonitorID_Frequence);
if (monitor_frequence == null)
{
ana_context.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_context.PutAnalyInfo(Model.EtaSingleRealRecordPure.InfoTag_HZ, null);
}
else if (monitor_frequence.DataValue < 10 || monitor_frequence.DataValue > 55)
{//数据不正常
ana_context.HZa = monitor_frequence.DataValue;
ana_context.AnalyStatus = Model.Eta.eAnalyStatus.Abnormal;
ana_context.PutAnalyInfo(Model.EtaSingleRealRecordPure.InfoTag_HZ, null);
}
else
{//数据正常
isOk频率 = true;
ana_context.HZa = monitor_frequence.DataValue;
ana_context.RSa = IStation.RunStatus.Run;//表示开机了
}
}
#endregion
}
//
var monitor_id_转速 = pump_context.MonitorID_ZhuanSu;
if (monitor_id_转速 > 0 && !isOk频率)
{
var monitor_zhuansu = _allMonitorList.Find(x => x.ObjectID == monitor_id_转速);
if (monitor_zhuansu == null)
{
if (!isAddTag_hz)
{
ana_context.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_context.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_HZ, null);
}
}
else
{
var zhuansu = monitor_zhuansu.DataValue;
if (zhuansu < 10)
{
ana_context.HZa = 0;
ana_context.AnalyStatus = Model.Eta.eAnalyStatus.Abnormal;
ana_context.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_HZ, null);
}
else
{
if (pump_context.Context != null)
{
if (pump_context.Context.RatedParas.N < 10)
{
ana_context.AnalyStatus = Model.Eta.eAnalyStatus.Abnormal;
ana_context.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_HZ, "额定转速未设置");
}
else
{
if (isAddTag_hz)
{
ana_context.RemoveAnalyInfo(Model.EtaSingleRealRecordPure.InfoTag_HZ);
}
ana_context.HZa = Math.Round(50 * zhuansu / pump_context.Context.RatedParas.N, 2);
}
}
}
}
}
//用电流判断是否开机
if (!isAnaOk)
{
#region 用电流判断是否开机
if (pump_context.MonitorID_ele_current > 0)
{
var monitor_ele_current = _allMonitorList.Find(x => x.ObjectID == pump_context.MonitorID_ele_current);
if (monitor_ele_current == null)
{
ana_context.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_context.PutAnalyInfo(Model.EtaSingleRealRecordPure.InfoTag_Ia, null);
}
else if (monitor_ele_current.DataValue < 1)
{//数据不正常
ana_context.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_context.PutAnalyInfo(Model.EtaSingleRealRecordPure.InfoTag_Ia, null);
}
else
{//数据正常
ana_context.RSa = IStation.RunStatus.Run;//表示开机了
}
}
#endregion
}
error_info = null;
return true;
}
#endregion
///
/// 根据压差计算流量扬程点
///
///
///
///
///
///
///
///
protected IStation.Model.CurvePoint GetFolwByPress(
IStation.Model.CurveExpress pump_curve,
double inlet_dia, double inlet_press,
double outlet_dia, double outlet_press,
double hz)
{
//转成米
double h4Press = UnitConvert_MPa2M(outlet_press - inlet_press);
IStation.Model.CurveExpress curve_qh = null;
if (hz < 49 && hz > 20)
{//进行曲线换算
curve_qh = CalcCurveQhByHz(pump_curve, hz);
}
else
{//原始曲线即可
curve_qh = pump_curve;
}
if (curve_qh == null)
return null;
//先用压差查询流量
List listQ0 = IStation.Model.FitCurveHelper.GetInterPointExX(curve_qh, h4Press, 50, 1.5);//放大一点
if (listQ0 == null || listQ0.Count == 0)
{
return null;
}
var m_inlet_dia = inlet_dia / 1000;//转成m
var m_outlet_dia = outlet_dia / 1000;//转成m
double OtherPressCoeff = 4 / Math.PI / 3600;
//OtherPressCoeff = 4 * 1000 / Math.PI / 3.6;
double dieDai_q = listQ0.Last().X;//用于计算的流量
double dieDai_h = 0;
double last_dieDai_q = dieDai_q;
for (int calcNo = 1; calcNo <= 3; calcNo++)//迭代三次
{
if (last_dieDai_q < 1)
{//流量不可能过小
return null;
}
double rPipeInV = 0;
if (inlet_dia > 0)
{
rPipeInV = OtherPressCoeff * dieDai_q / m_inlet_dia / m_inlet_dia;
}
double rPipeOutV = 0;
if (outlet_dia > 0)
{
rPipeOutV = OtherPressCoeff * dieDai_q / m_outlet_dia / m_outlet_dia;
}
double rVDif = (rPipeOutV * rPipeOutV - rPipeInV * rPipeInV) / 9.81 / 2.0;
dieDai_h = h4Press + rVDif;
List listQ = IStation.Model.FitCurveHelper.GetInterPointExX(curve_qh, dieDai_h, 50, 1.5);//放大一点
if (listQ == null || listQ.Count() == 0)
{
return new IStation.Model.CurvePoint(dieDai_q, dieDai_h);
}
dieDai_q = listQ.Last().X;
if (Math.Abs(dieDai_q - last_dieDai_q) / last_dieDai_q < 0.005)
{
return new IStation.Model.CurvePoint(dieDai_q, dieDai_h);
}
//继续迭代
if (dieDai_q > last_dieDai_q)
{
dieDai_q = dieDai_q - Math.Abs(dieDai_q - last_dieDai_q) / 2;
}
else
{
dieDai_q = dieDai_q + Math.Abs(dieDai_q - last_dieDai_q) / 2;
}
last_dieDai_q = dieDai_q;
}
return new IStation.Model.CurvePoint(dieDai_q, dieDai_h);
}
///
///
///
///
///
///
public static IStation.Model.CurveExpress CalcCurveQhByHz(
IStation.Model.CurveExpress curve_QH, double hz)
{
if (curve_QH == null)
return null;
if (hz > 49.5)
return curve_QH;
double f_ratio = hz / 50.0;
var points = IStation.Model.FitCurveHelper.GetFitPoints(curve_QH, 12);
List simu_points = new List();
foreach (var pt in points)
{
double xshsFlow = pt.X * f_ratio;
double xshsHead = pt.Y * f_ratio * f_ratio;
simu_points.Add(new IStation.Model.CurvePoint(xshsFlow, xshsHead));
}
return new IStation.Model.CurveExpress(simu_points);
}
#region 单泵分析
///
/// 单泵流量计(运行状态待分析)
///
///
///
protected bool Analy_有单泵流量计_运行状态已分析_工频泵(
ref IStation.Calculation.Eta.Model.PumpAnaResult context_pump)
{
var ana_result = context_pump.AnaResult;
if (ana_result == null)
return false;
bool is液位代替出口压力 = context_pump.Is液位代替出口压力;
bool is液位代替进口压力 = context_pump.Is液位代替进口压力;
long monitor_id_进口压力 = context_pump.MonitorID_InletPress;
long monitor_id_出口压力 = context_pump.MonitorID_OutletPress;
long monitor_id_瞬时流量 = context_pump.MonitorID_PumpFlow;
long monitor_id_瞬时功率 = context_pump.MonitorID_MotorPower;
if (!context_pump.IsRunIng)
{//表示关机
context_pump.Ana_flow_ok = true;//没有开机就认为是成功
context_pump.Ana_head_ok = true;
context_pump.Ana_eta_ok = true;
context_pump.Ana_power_ok = true;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
ana_result.RSa = IStation.RunStatus.Shut;
ana_result.Qa = 0;
ana_result.Ha = 0;
ana_result.Pa = 0;
ana_result.HZa = 0;
return true;
}
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
context_pump.Ana_flow_ok = false;
context_pump.Ana_head_ok = false;
context_pump.Ana_eta_ok = false;
#region 流量
double total_flow = 0;
var monitor_flow = _allMonitorList.Find(x => x.ObjectID == monitor_id_瞬时流量);
if (monitor_flow == null)
{
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Qa, null);
context_pump.Ana_flow_ok = false;
}
else
{
ana_result.Qa = monitor_flow.DataValue;
total_flow = monitor_flow.DataValue;
if (monitor_flow.DataValue < _threshold_flow)
{
ana_result.Qa = monitor_flow.DataValue;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Qa, null);
context_pump.Ana_flow_ok = false;
}
context_pump.Ana_flow_ok = true;
}
#endregion
#region 功率
double total_power = 0;
var monitor_power = _allMonitorList.Find(x => x.ObjectID == monitor_id_瞬时功率);
if (monitor_power == null)
{
context_pump.Ana_power_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Pa, null);
}
else
{
total_power = monitor_power.DataValue;
if (total_power < 1)
{
context_pump.Ana_power_ok = false;
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Pa, total_power.ToString());
}
else
{
context_pump.Ana_power_ok = true;
}
ana_result.Pa = total_power;
}
#endregion
#region 频率
ana_result.HZa = 50;
#endregion
#region 进口压力
var monitor_inlet_press = _allMonitorList.Find(x => x.ObjectID == monitor_id_进口压力);
if (monitor_inlet_press == null)
{
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_P1, null);
return false;
}
double p1m = monitor_inlet_press.DataValue;
if (is液位代替进口压力)
{//液位一般都是m
p1m = UnitConvert_M2MPa(p1m);
}
if (monitor_inlet_press.Elevation != null)
{//判断是否有标高
p1m += UnitConvert_M2MPa(monitor_inlet_press.Elevation.Value);
}
double mm_inlet_dia = 0;//用 mm
if (monitor_inlet_press.PipeDia.HasValue)
{
mm_inlet_dia = monitor_inlet_press.PipeDia.Value;
}
#endregion
#region 出口压力
var monitor_outlet_press = _allMonitorList.Find(x => x.ObjectID == monitor_id_出口压力);
if (monitor_outlet_press == null)
{
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_P2, null);
return false;
}
double p2m = monitor_outlet_press.DataValue;
if (is液位代替出口压力)
{//液位一般都是m
p2m = UnitConvert_M2MPa(p2m);
}
if (monitor_outlet_press.Elevation != null)
{//判断是否有标高
p2m += UnitConvert_M2MPa(monitor_outlet_press.Elevation.Value);
}
double mm_outlet_dia = 0;//用 mm
if (monitor_outlet_press.PipeDia.HasValue)
{
mm_outlet_dia = monitor_outlet_press.PipeDia.Value;
}
#endregion
#region 计算扬程
double OtherPressCoeff = 4 * 1000 / Math.PI / 3.6;
double rPipeInV = 0;
if (mm_inlet_dia > 10)
{
rPipeInV = OtherPressCoeff * total_flow / mm_inlet_dia / mm_inlet_dia;
}
double rPipeOutV = 0;
if (mm_outlet_dia > 10)
{
rPipeOutV = OtherPressCoeff * total_flow / mm_outlet_dia / mm_outlet_dia;
}
double rVDif = (rPipeOutV * rPipeOutV - rPipeInV * rPipeInV) / (g * 2.0);
double total_head = Math.Round(UnitConvert_MPa2M(p2m - p1m) + rVDif, 2);
ana_result.Ha = total_head;
//检查扬程
if (total_head > 800)
{
context_pump.Ana_head_ok = false;
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ha, total_head.ToString());
}
else if (total_head < 1)
{
context_pump.Ana_head_ok = false;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ha, total_head.ToString());
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
}
else
{
context_pump.Ana_head_ok = true;
}
#endregion
ana_result.CalcUnitPower();
context_pump.Ana_eta_ok = false;
if (total_power > 1 && context_pump.Ana_power_ok && context_pump.Ana_head_ok && context_pump.Ana_flow_ok)
{
//计算效率
double eta = Math.Round(Model.EtaSingleRealRecordPure.Calc_Eta(total_flow, total_head, total_power, WaterDensity, g), 1);
ana_result.Ea = eta;
// 检查效率
if (eta > 95 || eta < 40)
{//有时, 大流量曲线部分,是曲线不精确, 造成Q H曲线不符合实际, 造成效率计算出问题
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ea, eta.ToString());
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
}
else
{//计算
if (ana_result.AnalyStatus == Model.Eta.eAnalyStatus.Unkonw)
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
context_pump.Ana_eta_ok = true;
}
}
return true;
}
///
/// 单泵流量计(运行状态待分析)
///
///
///
protected bool Analy_有单泵流量计_运行状态已分析_变频泵(
ref IStation.Calculation.Eta.Model.PumpAnaResult context_pump)
{
var ana_result = context_pump.AnaResult;
if (ana_result == null)
return false;
bool is液位代替出口压力 = context_pump.Is液位代替出口压力;
bool is液位代替进口压力 = context_pump.Is液位代替进口压力;
long monitor_id_进口压力 = context_pump.MonitorID_InletPress;
long monitor_id_出口压力 = context_pump.MonitorID_OutletPress;
long monitor_id_瞬时流量 = context_pump.MonitorID_PumpFlow;
long monitor_id_瞬时功率 = context_pump.MonitorID_MotorPower;
// long monitor_id_频率 = context_pump.MonitorID_Frequence;
// long monitor_id_转速 = context_pump.MonitorID_ZhuanSu;
if (!context_pump.IsRunIng)
{//表示关机
context_pump.Ana_flow_ok = true;//没有开机就认为是成功
context_pump.Ana_head_ok = true;
context_pump.Ana_eta_ok = true;
context_pump.Ana_power_ok = true;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
ana_result.RSa = IStation.RunStatus.Shut;
ana_result.Qa = 0;
ana_result.Ha = 0;
ana_result.Pa = 0;
ana_result.HZa = 0;
return true;
}
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
context_pump.Ana_flow_ok = false;
context_pump.Ana_head_ok = false;
context_pump.Ana_eta_ok = false;
#region 流量
double total_flow = 0;
var monitor_flow = _allMonitorList.Find(x => x.ObjectID == monitor_id_瞬时流量);
if (monitor_flow == null)
{
ana_result.Qa = null;
context_pump.Ana_flow_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Qa, null);
}
else
{
ana_result.Qa = monitor_flow.DataValue;
total_flow = monitor_flow.DataValue;
if (monitor_flow.DataValue < _threshold_flow)
{
ana_result.Qa = monitor_flow.DataValue;
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Qa, null);
context_pump.Ana_flow_ok = false;
}
else
{
context_pump.Ana_flow_ok = true;
}
}
#endregion
#region 功率
double total_power = 0;
var monitor_power = _allMonitorList.Find(x => x.ObjectID == monitor_id_瞬时功率);
if (monitor_power == null)
{
context_pump.Ana_power_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Pa, null);
}
else
{
total_power = monitor_power.DataValue;
if (total_power < 1)
{
context_pump.Ana_power_ok = false;
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Pa, total_power.ToString());
}
else
{
context_pump.Ana_power_ok = true;
}
ana_result.Pa = total_power;
}
#endregion
#region 进口压力
var monitor_inlet_press = _allMonitorList.Find(x => x.ObjectID == monitor_id_进口压力);
if (monitor_inlet_press == null)
{
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_P1, null);
return false;
}
double p1m = monitor_inlet_press.DataValue;
if (is液位代替进口压力)
{//液位一般都是m
p1m = UnitConvert_M2MPa(p1m);
}
if (monitor_inlet_press.Elevation != null)
{//判断是否有标高
p1m += UnitConvert_M2MPa(monitor_inlet_press.Elevation.Value);
}
double mm_inlet_dia = 0;//用 mm
if (monitor_inlet_press.PipeDia.HasValue)
{
mm_inlet_dia = monitor_inlet_press.PipeDia.Value;
}
#endregion
#region 出口压力
var monitor_outlet_press = _allMonitorList.Find(x => x.ObjectID == monitor_id_出口压力);
if (monitor_outlet_press == null)
{
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_P2, null);
return false;
}
double p2m = monitor_outlet_press.DataValue;
if (is液位代替出口压力)
{//液位一般都是m
p2m = UnitConvert_M2MPa(p2m);
}
if (monitor_outlet_press.Elevation != null)
{//判断是否有标高
p2m += UnitConvert_M2MPa(monitor_outlet_press.Elevation.Value);
}
double mm_outlet_dia = 0;//用 mm
if (monitor_outlet_press.PipeDia.HasValue)
{
mm_outlet_dia = monitor_outlet_press.PipeDia.Value;
}
#endregion
#region 计算扬程
double OtherPressCoeff = 4 * 1000 / Math.PI / 3.6;
double rPipeInV = 0;
if (mm_inlet_dia > 10)
{
rPipeInV = OtherPressCoeff * total_flow / mm_inlet_dia / mm_inlet_dia;
}
double rPipeOutV = 0;
if (mm_outlet_dia > 10)
{
rPipeOutV = OtherPressCoeff * total_flow / mm_outlet_dia / mm_outlet_dia;
}
double rVDif = (rPipeOutV * rPipeOutV - rPipeInV * rPipeInV) / (g * 2.0);
double total_head = Math.Round(UnitConvert_MPa2M(p2m - p1m) + rVDif, 2);
ana_result.Ha = total_head;
//检查扬程
if (total_head > 800)
{
context_pump.Ana_head_ok = false;
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ha, total_head.ToString());
}
else if (total_head < 1)
{
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ha, total_head.ToString());
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
context_pump.Ana_head_ok = false;
}
else
{
context_pump.Ana_head_ok = true;
}
#endregion
ana_result.CalcUnitPower();
context_pump.Ana_eta_ok = false;
if (total_power > 1 && total_flow > 1 &&
context_pump.Ana_head_ok && context_pump.Ana_power_ok)
{
//计算效率
double eta = Math.Round(Model.EtaSingleRealRecordPure.Calc_Eta(total_flow, total_head, total_power, WaterDensity, g), 1);
ana_result.Ea = eta;
// 检查效率
if (eta > 95 || eta < 40)
{//有时, 大流量曲线部分,是曲线不精确, 造成Q H曲线不符合实际, 造成效率计算出问题
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ea, eta.ToString());
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
}
else
{//计算
if (ana_result.AnalyStatus == Model.Eta.eAnalyStatus.Unkonw)
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
context_pump.Ana_eta_ok = true;
}
}
return true;
}
///
/// 单泵流量计
///
///
///
///
protected bool Analy_有单泵流量计_运行状态已分析_变频泵(
double pump_flow,//
ref IStation.Calculation.Eta.Model.PumpAnaResult pump)
{
if (pump == null)
return false;
var ana_result = pump.AnaResult;
if (ana_result == null)
ana_result = new IStation.Model.EtaSingleRealRecordPure();
long monitor_id_进口压力 = pump.MonitorID_InletPress;
long monitor_id_出口压力 = pump.MonitorID_OutletPress;
long monitor_id_瞬时功率 = pump.MonitorID_MotorPower;
Model.EtaMonitorPointAnalyContextitem monitor_record_进口压力 = this._allMonitorList.Find(x => x.ObjectID == monitor_id_进口压力);
Model.EtaMonitorPointAnalyContextitem monitor_record_出口压力 = this._allMonitorList.Find(x => x.ObjectID == monitor_id_出口压力);
Model.EtaMonitorPointAnalyContextitem monitor_record_瞬时功率 = this._allMonitorList.Find(x => x.ObjectID == monitor_id_瞬时功率);
pump.Ana_head_ok = false;
pump.Ana_eta_ok = false;
pump.Ana_flow_ok = true;
ana_result.Qa = pump_flow;
#region 功率
double total_power = 0;
if (monitor_record_瞬时功率 == null)
{
pump.Ana_power_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Pa, null);
}
else
{
total_power = monitor_record_瞬时功率.DataValue;
if (total_power < 1)
{
pump.Ana_power_ok = false;
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Pa, total_power.ToString());
}
else
{
pump.Ana_power_ok = true;
}
ana_result.Pa = total_power;
}
#endregion
#region 进口压力
if (monitor_record_进口压力 == null)
{
pump.Ana_head_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_P1, null);
return false;
}
double p1m = monitor_record_进口压力.DataValue;
if (pump.Is液位代替进口压力)
{//液位一般都是m
p1m = UnitConvert_M2MPa(p1m);
}
if (monitor_record_进口压力.Elevation != null)
{//判断是否有标高
p1m += UnitConvert_M2MPa(monitor_record_进口压力.Elevation.Value);
}
double mm_inlet_dia = 0;//用 mm
if (monitor_record_进口压力.PipeDia.HasValue)
{
mm_inlet_dia = monitor_record_进口压力.PipeDia.Value;
}
#endregion
#region 出口压力
if (monitor_record_出口压力 == null)
{
pump.Ana_head_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_P2, null);
return false;
}
double p2m = monitor_record_出口压力.DataValue;
if (monitor_record_出口压力.Elevation != null)
{//判断是否有标高
p2m += UnitConvert_M2MPa(monitor_record_出口压力.Elevation.Value);
}
double mm_outlet_dia = 0;//用 mm
if (monitor_record_出口压力.PipeDia.HasValue)
{
mm_outlet_dia = monitor_record_出口压力.PipeDia.Value;
}
#endregion
#region 计算扬程
pump.Ana_head_ok = false;
double OtherPressCoeff = 4 * 1000 / Math.PI / 3.6;
double rPipeInV = 0;
if (mm_inlet_dia > 10)
{
rPipeInV = OtherPressCoeff * pump_flow / mm_inlet_dia / mm_inlet_dia;
}
double rPipeOutV = 0;
if (mm_outlet_dia > 10)
{
rPipeOutV = OtherPressCoeff * pump_flow / mm_outlet_dia / mm_outlet_dia;
}
double rVDif = (rPipeOutV * rPipeOutV - rPipeInV * rPipeInV) / (g * 2.0);
double total_head = Math.Round(UnitConvert_MPa2M(p2m - p1m) + rVDif, 2);
ana_result.Ha = total_head;
if (total_head > 800)
{
pump.Ana_head_ok = false;
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ha, total_head.ToString());
}
else if (total_head < 1)
{
pump.Ana_head_ok = false;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ha, total_head.ToString());
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
}
else
{
pump.Ana_head_ok = true;
}
#endregion
ana_result.CalcUnitPower();
pump.Ana_eta_ok = false;
if (total_power > 1 && pump_flow > 1 && pump.Ana_head_ok)
{
//计算效率
double eta = Math.Round(Model.EtaSingleRealRecordPure.Calc_Eta(pump_flow, total_head, total_power, WaterDensity, g), 1);
ana_result.Ea = eta;
// 检查效率
if (eta > 95 || eta < 40)
{//有时, 大流量曲线部分,是曲线不精确, 造成Q H曲线不符合实际, 造成效率计算出问题
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ea, eta.ToString());
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
}
else
{//计算
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
pump.Ana_eta_ok = true;
}
}
pump.AnaResult = ana_result;
return true;
}
///
/// 无流量计分析
///
///
///
///
protected bool Analy_无单泵流量计_运行状态已分析_变频泵(
double averge_flow,//平均流量(用于预算)
ref IStation.Calculation.Eta.Model.PumpAnaResult pump)
{
if (pump == null)
return false;
var ana_result = pump.AnaResult;
if (ana_result == null)
ana_result = new IStation.Model.EtaSingleRealRecordPure();
pump.Ana_flow_ok = false;
pump.Ana_head_ok = false;
pump.Ana_eta_ok = false;
long monitor_id_进口压力 = pump.MonitorID_InletPress;
long monitor_id_出口压力 = pump.MonitorID_OutletPress;
long monitor_id_瞬时功率 = pump.MonitorID_MotorPower;
Model.EtaMonitorPointAnalyContextitem monitor_record_进口压力 = this._allMonitorList.Find(x => x.ObjectID == monitor_id_进口压力);
Model.EtaMonitorPointAnalyContextitem monitor_record_出口压力 = this._allMonitorList.Find(x => x.ObjectID == monitor_id_出口压力);
Model.EtaMonitorPointAnalyContextitem monitor_record_瞬时功率 = this._allMonitorList.Find(x => x.ObjectID == monitor_id_瞬时功率);
#region 功率
double total_power = 0;
if (monitor_record_瞬时功率 == null)
{
pump.Ana_power_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Pa, null);
}
else
{
total_power = monitor_record_瞬时功率.DataValue;
if (total_power < 1)
{
pump.Ana_power_ok = false;
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Pa, total_power.ToString());
}
else
{
pump.Ana_power_ok = true;
}
ana_result.Pa = total_power;
}
#endregion
#region 进口压力
if (monitor_record_进口压力 == null)
{
pump.Ana_head_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_P1, null);
return false;
}
double p1m = monitor_record_进口压力.DataValue;
if (monitor_record_进口压力.Elevation != null)
{//判断是否有标高
p1m += UnitConvert_M2MPa(monitor_record_进口压力.Elevation.Value);
}
if (pump.Is液位代替进口压力)
{//液位一般都是m
p1m = UnitConvert_M2MPa(p1m);
}
double mm_inlet_dia = 0;//用 mm
if (monitor_record_进口压力.PipeDia.HasValue)
{
mm_inlet_dia = monitor_record_进口压力.PipeDia.Value;
}
#endregion
#region 出口压力
if (monitor_record_出口压力 == null)
{
pump.Ana_head_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_P2, null);
return false;
}
double p2m = monitor_record_出口压力.DataValue;
if (monitor_record_出口压力.Elevation != null)
{//判断是否有标高
p2m += UnitConvert_M2MPa(monitor_record_出口压力.Elevation.Value);
}
double mm_outlet_dia = 0;//用 mm
if (monitor_record_出口压力.PipeDia.HasValue)
{
mm_outlet_dia = monitor_record_出口压力.PipeDia.Value;
}
#endregion
#region 计算扬程
double OtherPressCoeff = 4 * 1000 / Math.PI / 3.6;
double rPipeInV = 0;
if (mm_inlet_dia > 10)
{
rPipeInV = OtherPressCoeff * averge_flow / mm_inlet_dia / mm_inlet_dia;
}
double rPipeOutV = 0;
if (mm_outlet_dia > 10)
{
rPipeOutV = OtherPressCoeff * averge_flow / mm_outlet_dia / mm_outlet_dia;
}
double rVDif = (rPipeOutV * rPipeOutV - rPipeInV * rPipeInV) / (g * 2.0);
double total_head = Math.Round(UnitConvert_MPa2M(p2m - p1m) + rVDif, 2);
ana_result.Ha = total_head;
//检查扬程
if (total_head > 800)
{
pump.Ana_head_ok = false;
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ha, total_head.ToString());
}
else if (total_head < 1)
{
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ha, total_head.ToString());
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
pump.Ana_head_ok = false;
}
else
{
pump.Ana_head_ok = true;
}
#endregion
#region 根据曲线计算流量
pump.Ana_flow_ok = false;
if (pump.Ana_head_ok)
{
var machine = pump.Context;
if (machine == null || machine.CurveQH == null)
{
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Curve, null);
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
return false;
}
if (ana_result.HZa <= 1)
{
return false;
}
////根据曲线计算
var wrk_pt = GetFolwByPress(machine.CurveQH, mm_inlet_dia, p1m, mm_outlet_dia, p2m, ana_result.HZa);
if (wrk_pt == null)
{ //如果无法分析,就简单用进出口压差表示扬程
var h = Math.Round(UnitConvert_MPa2M(p2m - p1m), 2);
ana_result.Ha = h;
pump.Ana_flow_ok = false;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Curve, h.ToString("N2"));
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
return false;
}
pump.Ana_flow_ok = true;
double qa = Math.Round(wrk_pt.X, 1);
ana_result.Qa = qa;
}
#endregion
ana_result.CalcUnitPower();
pump.Ana_eta_ok = false;
if (total_power > 1 && pump.Ana_flow_ok && pump.Ana_head_ok && pump.Ana_power_ok)
{
//计算效率
double eta = Math.Round(Model.EtaSingleRealRecordPure.Calc_Eta(averge_flow, total_head, total_power, WaterDensity, g), 1);
ana_result.Ea = eta;
// 检查效率
if (eta > 95 || eta < 40)
{//有时, 大流量曲线部分,是曲线不精确, 造成Q H曲线不符合实际, 造成效率计算出问题
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ea, eta.ToString());
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
}
else
{//计算
if (ana_result.AnalyStatus == Model.Eta.eAnalyStatus.Unkonw)
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
pump.Ana_eta_ok = true;
}
}
return true;
}
///
/// 无流量计分析
///
///
///
///
protected bool Analy_无单泵流量计_运行状态已分析_工频泵(
double averge_flow,//平均流量(用于预算)
ref IStation.Calculation.Eta.Model.PumpAnaResult pump)
{
if (pump == null)
return false;
var ana_result = pump.AnaResult;
if (ana_result == null)
ana_result = new IStation.Model.EtaSingleRealRecordPure();
pump.Ana_flow_ok = false;
pump.Ana_head_ok = false;
pump.Ana_eta_ok = false;
long monitor_id_进口压力 = pump.MonitorID_InletPress;
long monitor_id_出口压力 = pump.MonitorID_OutletPress;
long monitor_id_瞬时功率 = pump.MonitorID_MotorPower;
Model.EtaMonitorPointAnalyContextitem monitor_record_进口压力 = this._allMonitorList.Find(x => x.ObjectID == monitor_id_进口压力);
Model.EtaMonitorPointAnalyContextitem monitor_record_出口压力 = this._allMonitorList.Find(x => x.ObjectID == monitor_id_出口压力);
Model.EtaMonitorPointAnalyContextitem monitor_record_瞬时功率 = this._allMonitorList.Find(x => x.ObjectID == monitor_id_瞬时功率);
#region 功率
double total_power = 0;
if (monitor_record_瞬时功率 == null)
{
pump.Ana_power_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Pa, null);
}
else
{
total_power = monitor_record_瞬时功率.DataValue;
if (total_power < 1)
{
pump.Ana_power_ok = false;
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Pa, total_power.ToString());
}
else
{
pump.Ana_power_ok = true;
}
ana_result.Pa = total_power;
}
#endregion
#region 进口压力
if (monitor_record_进口压力 == null)
{
pump.Ana_head_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_P1, null);
return false;
}
double p1m = monitor_record_进口压力.DataValue;
if (monitor_record_进口压力.Elevation != null)
{//判断是否有标高
p1m += UnitConvert_M2MPa(monitor_record_进口压力.Elevation.Value);
}
if (pump.Is液位代替进口压力)
{//液位一般都是m
p1m = UnitConvert_M2MPa(p1m);
}
double mm_inlet_dia = 0;//用 mm
if (monitor_record_进口压力.PipeDia.HasValue)
{
mm_inlet_dia = monitor_record_进口压力.PipeDia.Value;
}
#endregion
#region 出口压力
if (monitor_record_出口压力 == null)
{
pump.Ana_head_ok = false;
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Missing;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_P2, null);
return false;
}
double p2m = monitor_record_出口压力.DataValue;
if (monitor_record_出口压力.Elevation != null)
{//判断是否有标高
p2m += UnitConvert_M2MPa(monitor_record_出口压力.Elevation.Value);
}
double mm_outlet_dia = 0;//用 mm
if (monitor_record_出口压力.PipeDia.HasValue)
{
mm_outlet_dia = monitor_record_出口压力.PipeDia.Value;
}
#endregion
#region 计算扬程
double OtherPressCoeff = 4 * 1000 / Math.PI / 3.6;
double rPipeInV = 0;
if (mm_inlet_dia > 10)
{
rPipeInV = OtherPressCoeff * averge_flow / mm_inlet_dia / mm_inlet_dia;
}
double rPipeOutV = 0;
if (mm_outlet_dia > 10)
{
rPipeOutV = OtherPressCoeff * averge_flow / mm_outlet_dia / mm_outlet_dia;
}
double rVDif = (rPipeOutV * rPipeOutV - rPipeInV * rPipeInV) / (g * 2.0);
double total_head = Math.Round(UnitConvert_MPa2M(p2m - p1m) + rVDif, 2);
ana_result.Ha = total_head;
//检查扬程
if (total_head > 800)
{
pump.Ana_head_ok = false;
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ha, total_head.ToString());
}
else if (total_head < 1)
{
pump.Ana_head_ok = false;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ha, total_head.ToString());
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
return false;
}
else
{
pump.Ana_head_ok = true;
}
#endregion
#region 根据曲线计算流量
pump.Ana_flow_ok = false;
if (pump.Ana_head_ok)
{
var machine = pump.Context;
if (machine == null || machine.CurveQH == null)
{
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Curve, null);
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
return false;
}
////根据曲线计算
var wrk_pt = GetFolwByPress(machine.CurveQH, mm_inlet_dia, p1m, mm_outlet_dia, p2m, 50);
if (wrk_pt == null)
{ //如果无法分析,就简单用进出口压差表示扬程
var h = Math.Round(UnitConvert_MPa2M(p2m - p1m), 2);
ana_result.Ha = h;
pump.Ana_flow_ok = false;
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Curve, h.ToString("N2"));
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
return false;
}
pump.Ana_flow_ok = true;
double qa = Math.Round(wrk_pt.X, 1);
ana_result.Qa = qa;
}
#endregion
ana_result.CalcUnitPower();
pump.Ana_eta_ok = false;
if (total_power > 1 && pump.Ana_flow_ok && pump.Ana_head_ok && pump.Ana_power_ok)
{
//计算效率
double eta = Math.Round(Model.EtaSingleRealRecordPure.Calc_Eta(averge_flow, total_head, total_power, WaterDensity, g), 1);
ana_result.Ea = eta;
// 检查效率
if (eta > 95 || eta < 40)
{//有时, 大流量曲线部分,是曲线不精确, 造成Q H曲线不符合实际, 造成效率计算出问题
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ea, eta.ToString());
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
}
else
{//计算
if (ana_result.AnalyStatus == Model.Eta.eAnalyStatus.Unkonw)
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
pump.Ana_eta_ok = true;
}
}
return true;
}
#endregion
#region 多泵运行
///
/// 多泵运行(注意不要有子节点的管路了,下面都是泵才行):返回的只有开机的Result
///
///
///
///
protected bool Analy_多泵并联运行_单管出口(
double monitor_value_total_flow,
List all_pump_result_list)
{
//获取所有开机的
List open_pump_result_list = new List();
for (int i = 0; i < all_pump_result_list.Count(); i++)
{
if (all_pump_result_list[i].IsRunIng)
{
open_pump_result_list.Add(all_pump_result_list[i]);
}
}
int open_pump_count = open_pump_result_list.Count;
if (open_pump_count == 0)
{
return true;
}
bool isAllOk_flow = true;
double ana_total_flow = 0;//分析的总流量
//获取所有开机的
for (int i = 0; i < open_pump_count; i++)
{
var pump_context = open_pump_result_list[i];
if (pump_context.IsFrequency)
{
Analy_无单泵流量计_运行状态已分析_变频泵(
monitor_value_total_flow / open_pump_count,
ref pump_context);
}
else
{
Analy_无单泵流量计_运行状态已分析_工频泵(
monitor_value_total_flow / open_pump_count,
ref pump_context);
}
if (!pump_context.Ana_flow_ok)
isAllOk_flow = false;
if (!pump_context.Ana_head_ok)
isAllOk_flow = false;
if (pump_context.AnaResult.Qa == null)
{
isAllOk_flow = false;
}
else
{
ana_total_flow += pump_context.AnaResult.Qa.Value;
}
}
#region 按总流量进行等比分
if (isAllOk_flow)
{
for (int i = 0; i < open_pump_count; i++)
{
var ana_result = open_pump_result_list[i].AnaResult;
ana_result.Qa = Math.Round(ana_result.Qa.Value * monitor_value_total_flow / ana_total_flow, 1);
ana_result.UWPa = 0;
ana_result.WPa = 0;
if (ana_result.Pa != null && ana_result.Pa > 1)
{
double eta = Math.Round(Model.EtaSingleRealRecordPure.Calc_Eta(ana_result.Qa.Value, ana_result.Ha.Value, ana_result.Pa.Value, WaterDensity, g), 1);
ana_result.Ea = eta;
// 检查效率
if (eta > 95 || eta < 40)
{//有时, 大流量曲线部分,是曲线不精确, 造成Q H曲线不符合实际, 造成效率计算出问题
ana_result.PutAnalyInfo(IStation.Model.EtaSingleRealRecordPure.InfoTag_Ea, eta.ToString());
ana_result.AnalyStatus = IStation.Model.Eta.eAnalyStatus.Abnormal;
}
else
{//计算
if (ana_result.AnalyStatus == Model.Eta.eAnalyStatus.Unkonw)
ana_result.AnalyStatus = Model.Eta.eAnalyStatus.Normal;
ana_result.CalcUnitPower();
}
}
}
}
#endregion
return true;
}
#endregion
}
}