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