using DevExpress.XtraEditors; using IStation.Win.View.ViewModel; using System.IO; using System.Text; namespace IStation.Win.View { public partial class ScheduleLogVerifyView2 : DevExpress.XtraEditors.XtraUserControl { public ScheduleLogVerifyView2() { InitializeComponent(); this.treeList1.InitialMultiColSettings(); this.gridView2.SetNormalView(); this.gridView4.SetNormalView(); } private List> _log_list = null; private List _scheduleFlowVerifyViewModles = null; private static readonly Service.Station _service_station = new(); private static readonly Service.ScheduleConfig _service_schedule_config = new(); private static readonly Service.ScheduleRequest _service_schedule_request = new(); private static readonly Service.ScheduleConclusion _service_schedule_conclusion = new(); private static readonly Service.SchedulePump _service_schedule_pump = new(); private bool _use_temp = true; public void Init() { var log_file_path = Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\log_debug.json"; var json = File.ReadAllText(log_file_path); _log_list = Yw.JsonHelper.Json2Object>>(json); if (_log_list == null || !_log_list.Any()) { Clear(); return; } _scheduleFlowVerifyViewModles = new List(); var request_list = _service_schedule_request.GetAll(); var conclusion_list = _service_schedule_conclusion.GetAll(); var pump_list = _service_schedule_pump.GetAll(); if (request_list != null && request_list.Any()) { foreach (var rhs in request_list) { var conclusion = conclusion_list?.Find(x => x.RequestID == rhs.ID && x.Station == eDockingStation.Ch2s); if (conclusion == null) continue; var vm = new ScheduleFlowVerifyViewModel(); vm.Time = rhs.ReceptionTime; vm.TargetFlow = rhs.TargetFlow2; vm.TargetPressure = rhs.TargetPressure2; var log_list = _log_list?.Where(x => x.Item1 == rhs.ID).ToList(); if (log_list == null && !log_list.Any()) continue; var total_flow = 0d; { var scada_str = log_list.Find(x => !x.Item4); if (scada_str == null) continue; GetRealTimeZyScadaList(scada_str.Item3, out List zy_scada_list); OutValue( zy_scada_list, out double? DN2400Flow, out double? DN2400Pressure, out double? DN2700Flow, out double? DN2700Pressure); total_flow = (DN2400Flow + DN2700Flow) ?? 0; vm.PumpScadaList = GetPumpScadaList(zy_scada_list); vm.ScheduleFlow = conclusion.TotalFlow; vm.SchedulePower = conclusion.TotalPower; vm.SchedulePumpList = pump_list?.Where(x => x.RequestID == rhs.ID).ToList(); } { var real_scada_str = log_list.Find(x => x.Item4); if (real_scada_str == null) continue; GetRealTimeZyScadaList(real_scada_str.Item3, out List zy_scada_list); vm.RealPumpScadaList = GetPumpScadaList(zy_scada_list); OutValue( zy_scada_list, out double? DN2400Flow, out double? DN2400Pressure, out double? DN2700Flow, out double? DN2700Pressure); vm.RealFlow = (DN2400Flow + DN2700Flow) ?? 0; vm.RealPower = vm.RealPumpScadaList?.Sum(x => x.ActivePower) ?? 0; vm.RealND2400P = DN2400Pressure ?? 0; vm.RealND2700P = DN2700Pressure ?? 0; } if (_use_temp) { var temp_file_path = Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\0822_1510.txt"; var temp_json = File.ReadAllText(temp_file_path); var temp_scada_list = Yw.JsonHelper.Json2Object>(temp_json); vm.RealPumpScadaList = GetPumpScadaList(temp_scada_list); } var total_flow_diff = total_flow - vm.RealFlow; vm.ScheduleFlowDiff = vm.ScheduleFlow - vm.TargetFlow; vm.RealFlowDiff = vm.RealFlow - vm.TargetFlow; vm.RealAndScheduleFlowDiff = vm.RealFlow - vm.ScheduleFlow; vm.Round(); _scheduleFlowVerifyViewModles.Add(vm); } } this.scheduleFlowVerifyViewModleBindingSource.DataSource = _scheduleFlowVerifyViewModles; this.scheduleFlowVerifyViewModleBindingSource.ResetBindings(false); this.treeList1.BestFitColumns(); Clear(); } private void Clear() { this.memoExpand.Text = ""; this.realTimePumpScadaViewModelBindingSource1.DataSource = new List(); this.realTimePumpScheduleViewModelBindingSource1.DataSource = new List(); } #region config private void OutValue(List zy_scada_list, out double? DN2400Flow, out double? DN2400Pressure, out double? DN2700Flow, out double? DN2700Pressure) { DN2400Flow = null; DN2400Pressure = null; DN2700Flow = null; DN2700Pressure = null; if (zy_scada_list == null || !zy_scada_list.Any()) { return; } var zy_scada_dict = zy_scada_list.ToDictionary(x => x.Code, x => x.Value); DN2400Flow = zy_scada_dict[GlobalHelper.DN2400总管_瞬时流量_长江管网图]; DN2400Pressure = zy_scada_dict[GlobalHelper.DN2400_出厂压力_长江管网图]; DN2700Flow = zy_scada_dict[GlobalHelper.DN2700总管_瞬时流量_长江管网图]; DN2700Pressure = zy_scada_dict[GlobalHelper.DN2700_出厂压力_长江管网图]; } private List GetPumpScadaList( List zy_scada_list) { if (zy_scada_list == null || !zy_scada_list.Any()) { return default; } var zy_scada_dict = zy_scada_list.ToDictionary(x => x.Code, x => x.Value); var DN2400Flow = zy_scada_dict[GlobalHelper.DN2400总管_瞬时流量_长江管网图]; var DN2400Pressure = zy_scada_dict[GlobalHelper.DN2400_出厂压力_长江管网图]; var DN2700Flow = zy_scada_dict[GlobalHelper.DN2700总管_瞬时流量_长江管网图]; var DN2700Pressure = zy_scada_dict[GlobalHelper.DN2700_出厂压力_长江管网图]; var pump_vm21 = new RealTimePumpScadaViewModel(); var pump_vm22 = new RealTimePumpScadaViewModel(); var pump_vm23 = new RealTimePumpScadaViewModel(); var pump_vm24 = new RealTimePumpScadaViewModel(); var pump_vm25 = new RealTimePumpScadaViewModel(); var pump_vm26 = new RealTimePumpScadaViewModel(); var pump_vm27 = new RealTimePumpScadaViewModel(); pump_vm21.Flag = GlobalHelper.Flag21; pump_vm22.Flag = GlobalHelper.Flag22; pump_vm23.Flag = GlobalHelper.Flag23; pump_vm24.Flag = GlobalHelper.Flag24; pump_vm25.Flag = GlobalHelper.Flag25; pump_vm26.Flag = GlobalHelper.Flag26; pump_vm27.Flag = GlobalHelper.Flag27; pump_vm21.RunStatus = zy_scada_dict[GlobalHelper.二输21泵_运行状态]; pump_vm22.RunStatus = zy_scada_dict[GlobalHelper.二输22泵_运行状态]; pump_vm23.RunStatus = zy_scada_dict[GlobalHelper.二输23泵_运行状态]; pump_vm24.RunStatus = zy_scada_dict[GlobalHelper.二输24泵_运行状态]; pump_vm25.RunStatus = zy_scada_dict[GlobalHelper.二输25泵_运行状态]; pump_vm26.RunStatus = zy_scada_dict[GlobalHelper.二输26泵_运行状态]; pump_vm27.RunStatus = zy_scada_dict[GlobalHelper.二输27泵_运行状态]; pump_vm21.InletWaterLevel = zy_scada_dict[GlobalHelper.二输21泵_泵井液位]; pump_vm22.InletWaterLevel = zy_scada_dict[GlobalHelper.二输22泵_泵井液位]; pump_vm23.InletWaterLevel = zy_scada_dict[GlobalHelper.二输23泵_泵井液位]; pump_vm24.InletWaterLevel = zy_scada_dict[GlobalHelper.二输24泵_泵井液位]; pump_vm25.InletWaterLevel = zy_scada_dict[GlobalHelper.二输25泵_泵井液位]; pump_vm26.InletWaterLevel = zy_scada_dict[GlobalHelper.二输26泵_泵井液位]; pump_vm27.InletWaterLevel = zy_scada_dict[GlobalHelper.二输27泵_泵井液位]; pump_vm21.OutletPressure = zy_scada_dict[GlobalHelper.二输21泵_出水压力]; pump_vm22.OutletPressure = zy_scada_dict[GlobalHelper.二输22泵_出水压力]; pump_vm23.OutletPressure = zy_scada_dict[GlobalHelper.二输23泵_出水压力]; pump_vm24.OutletPressure = zy_scada_dict[GlobalHelper.二输24泵_出水压力]; pump_vm25.OutletPressure = zy_scada_dict[GlobalHelper.二输25泵_出水压力]; pump_vm26.OutletPressure = zy_scada_dict[GlobalHelper.二输26泵_出水压力]; pump_vm27.OutletPressure = zy_scada_dict[GlobalHelper.二输27泵_出水压力]; pump_vm21.ActivePower = zy_scada_dict[GlobalHelper.二输21泵_有功功率]; pump_vm22.ActivePower = zy_scada_dict[GlobalHelper.二输22泵_有功功率]; pump_vm23.ActivePower = zy_scada_dict[GlobalHelper.二输23泵_有功功率]; pump_vm24.ActivePower = zy_scada_dict[GlobalHelper.二输24泵_有功功率]; pump_vm25.ActivePower = zy_scada_dict[GlobalHelper.二输25泵_有功功率]; pump_vm26.ActivePower = zy_scada_dict[GlobalHelper.二输26泵_有功功率]; pump_vm27.ActivePower = zy_scada_dict[GlobalHelper.二输27泵_有功功率]; pump_vm21.InstantaneousFlow = zy_scada_dict[GlobalHelper.二输21泵_瞬时流量]; pump_vm22.InstantaneousFlow = zy_scada_dict[GlobalHelper.二输22泵_瞬时流量]; pump_vm23.InstantaneousFlow = zy_scada_dict[GlobalHelper.二输23泵_瞬时流量]; pump_vm24.InstantaneousFlow = zy_scada_dict[GlobalHelper.二输24泵_瞬时流量]; pump_vm25.InstantaneousFlow = zy_scada_dict[GlobalHelper.二输25泵_瞬时流量]; pump_vm26.InstantaneousFlow = zy_scada_dict[GlobalHelper.二输26泵_瞬时流量]; pump_vm27.InstantaneousFlow = zy_scada_dict[GlobalHelper.二输27泵_瞬时流量]; pump_vm21.RotateSpeed = zy_scada_dict[GlobalHelper.二输21泵_转速]; pump_vm22.RotateSpeed = zy_scada_dict[GlobalHelper.二输22泵_转速]; pump_vm23.RotateSpeed = zy_scada_dict[GlobalHelper.二输23泵_转速]; pump_vm24.RotateSpeed = zy_scada_dict[GlobalHelper.二输24泵_转速]; pump_vm25.RotateSpeed = zy_scada_dict[GlobalHelper.二输25泵_转速]; pump_vm26.RotateSpeed = zy_scada_dict[GlobalHelper.二输26泵_转速]; pump_vm27.RotateSpeed = zy_scada_dict[GlobalHelper.二输27泵_转速]; pump_vm21.MaintenanceState = zy_scada_dict[GlobalHelper.二输21泵_检修状态]; pump_vm22.MaintenanceState = zy_scada_dict[GlobalHelper.二输22泵_检修状态]; pump_vm23.MaintenanceState = zy_scada_dict[GlobalHelper.二输23泵_检修状态]; pump_vm24.MaintenanceState = zy_scada_dict[GlobalHelper.二输24泵_检修状态]; pump_vm25.MaintenanceState = zy_scada_dict[GlobalHelper.二输25泵_检修状态]; pump_vm26.MaintenanceState = zy_scada_dict[GlobalHelper.二输26泵_检修状态]; pump_vm27.MaintenanceState = zy_scada_dict[GlobalHelper.二输27泵_检修状态]; pump_vm21.PumpPressure = Math.Round(pump_vm21.OutletPressure - Curve.PumpCalculateHelper.M2Mpa(pump_vm21.InletWaterLevel ?? 0) ?? 0, 3); pump_vm22.PumpPressure = Math.Round(pump_vm22.OutletPressure - Curve.PumpCalculateHelper.M2Mpa(pump_vm22.InletWaterLevel ?? 0) ?? 0, 3); pump_vm23.PumpPressure = Math.Round(pump_vm23.OutletPressure - Curve.PumpCalculateHelper.M2Mpa(pump_vm23.InletWaterLevel ?? 0) ?? 0, 3); pump_vm24.PumpPressure = Math.Round(pump_vm24.OutletPressure - Curve.PumpCalculateHelper.M2Mpa(pump_vm24.InletWaterLevel ?? 0) ?? 0, 3); pump_vm25.PumpPressure = Math.Round(pump_vm25.OutletPressure - Curve.PumpCalculateHelper.M2Mpa(pump_vm25.InletWaterLevel ?? 0) ?? 0, 3); pump_vm26.PumpPressure = Math.Round(pump_vm26.OutletPressure - Curve.PumpCalculateHelper.M2Mpa(pump_vm26.InletWaterLevel ?? 0) ?? 0, 3); pump_vm27.PumpPressure = Math.Round(pump_vm27.OutletPressure - Curve.PumpCalculateHelper.M2Mpa(pump_vm27.InletWaterLevel ?? 0) ?? 0, 3); var pump_scada_list = new List { pump_vm21, pump_vm22, pump_vm23, pump_vm24, pump_vm25, pump_vm26, pump_vm27 }; return pump_scada_list; } /// /// 获取泵站运行标志列表 /// private void GetStationOpenFlagList(List list2, out List station2_open_flag_list) { station2_open_flag_list = list2?.Where(x => x.RunStatus == 1).Select(x => x.Flag).ToList(); } /// /// 获取泵进口水位字典 /// private void GetFlagInletWaterLevelDict(List list2, out Dictionary station2_flag_inlet_water_level_dict) { station2_flag_inlet_water_level_dict = list2?.ToDictionary(x => x.Flag, x => x.InletWaterLevel ?? 0); } /// /// 获取泵站检修标志列表(0是正常,1是检修) /// private void GetStationMaintenanceFlagList(List list2, out List station2_maintenance_flag_list) { station2_maintenance_flag_list = list2?.Where(x => x.MaintenanceState == 1).Select(x => x.Flag).ToList(); } /// /// 获取组合偏差系数字典 /// /// 总流量 /// 组合标志 /// private Dictionary GetCombineDeviationFactorDict(double flow, IEnumerable flags) { var deviation_factor_dict = new Dictionary(); foreach (var flag in flags) { deviation_factor_dict.Add(flag, 0); } var analysis_deviation = new IStation.Service.AnalysisDeviation().GetByFlowAndRunFlags(flow, flags); if (analysis_deviation == null) { if (GlobalHelper.IsStation2(flags)) { Yw.LogHelper.Error($"[{Yw.Untity.IntListHelper.ToString(flags)}]组合不存在偏差系数!"); } return deviation_factor_dict; } foreach (var flag in flags) { var scada_correction_factor = 0d; var model_correction_factor = 0d; var model_correction_factor_use = 0d; if (analysis_deviation.CurveDeviation != null && analysis_deviation.CurveDeviation.ContainsKey(flag)) { scada_correction_factor = analysis_deviation.CurveDeviation[flag]; } if (analysis_deviation.ModelDeviation != null && analysis_deviation.ModelDeviation.ContainsKey(flag)) { model_correction_factor = analysis_deviation.ModelDeviation[flag]; } if (model_correction_factor < 0) { model_correction_factor_use = Math.Abs(model_correction_factor); } else { model_correction_factor_use = -model_correction_factor; } var correction_factor = scada_correction_factor + model_correction_factor_use; deviation_factor_dict[flag] = correction_factor; } return deviation_factor_dict; } /// /// 获取实时众毅Scada数据列表 /// public static string GetRealTimeZyScadaList(string json, out List zy_scada_list, bool use_debug = false) { zy_scada_list = new List(); try { zy_scada_list = Yw.JsonHelper.Json2Object>(json); } catch (System.Exception ex) { return ex.Message; } if (zy_scada_list == null || !zy_scada_list.Any()) { return "zy_scada_list 无数据"; } return string.Empty; } #endregion private void gridView4_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { if (e.Column == this.colRotateSpeedDiif || e.Column == this.colActivePowerDiff) { if (e.CellValue != null) { var cell_value = e.CellValue.ToString() ?? string.Empty; if (double.TryParse(cell_value, out double value)) { if (value > 0) { e.Appearance.ForeColor = Color.Red; } else { e.Appearance.ForeColor = Color.Green; } } } } } private void treeList1_RowCellClick(object sender, DevExpress.XtraTreeList.RowCellClickEventArgs e) { if (e.Column == this.colSimulation1) { var vm = this.treeList1.GetFocusedRow() as ScheduleFlowVerifyViewModel; if (vm == null) return; Schedule(vm); } } private void Schedule(ScheduleFlowVerifyViewModel vm) { if (vm == null) { Clear(); return; } var station_info = _service_station.Get(); if (station_info == null) { WaitHelper.HideWaitForm(); XtraMessageBox.Show("Station文件缺失!"); return; } var station2 = station_info.Station2; var helper = new Algorithm.ScheduleHelper(); var rpm_dict = vm.RealPumpScadaList.ToDictionary(x => x.Flag, x => x.RotateSpeed ?? 0); var inlet_water_level_dict = vm.RealPumpScadaList.ToDictionary(x => x.Flag, x => x.InletWaterLevel ?? 0); var head_dict = vm.RealPumpScadaList.ToDictionary(x => x.Flag, x => Curve.PumpCalculateHelper.Mpa2M(x.OutletPressure ?? 0)); var working_ana_pump_list = helper.GetAnaFrePumpListByWorking(station2, rpm_dict, inlet_water_level_dict, head_dict, vm.RealFlow, true); var pump_schedule_vm_list = new List(); var run_flags = vm.SchedulePumpList.Select(x => x.Flag).OrderBy(x => x).ToList(); var analysis_deviation = new IStation.Service.AnalysisDeviation().GetByFlowAndRunFlags(vm.TargetFlow, run_flags); var str = new StringBuilder(); var dn24_head_diff = Curve.PumpCalculateHelper.Mpa2M(vm.RealND2400P - vm.TargetPressure); var dn27_head_diff = Curve.PumpCalculateHelper.Mpa2M(vm.RealND2700P - vm.TargetPressure); str.AppendLine($"目标压力:{vm.TargetPressure}\r\n实际压力:DN2400:{vm.RealND2400P:N3} (差:{dn24_head_diff:N3}米) DN2700:{vm.RealND2700P:N3} (差:{dn27_head_diff:N3}米)"); foreach (var flag in GlobalHelper.Station2FlagList) { var pump = station2.Find(x => x.Flag == flag); if (pump == null) continue; var scada_vm = vm.RealPumpScadaList.Find(x => x.Flag == flag); var schedule_pump_vm = new RealTimePumpScheduleViewModel(); schedule_pump_vm.Flag = flag; schedule_pump_vm.InletWaterLevel = scada_vm.InletWaterLevel; var ana_pump = vm.SchedulePumpList.Find(x => x.Flag == flag); if (ana_pump != null) { schedule_pump_vm.RunStatus = 1; schedule_pump_vm.InstantaneousFlow = ana_pump.Flow; schedule_pump_vm.OutletPressure = Curve.PumpCalculateHelper.M2Mpa(ana_pump.Head); schedule_pump_vm.RotateSpeed = ana_pump.Rpm; schedule_pump_vm.ActivePower = ana_pump.Power; schedule_pump_vm.OutletPressureAddWL = Curve.PumpCalculateHelper.M2Mpa(ana_pump.Head + scada_vm.InletWaterLevel ?? 0); if (analysis_deviation != null) { var scada_correction_factor = 0d; var model_correction_factor = 0d; var model_correction_factor_use = 0d; if (analysis_deviation.CurveDeviation != null && analysis_deviation.CurveDeviation.ContainsKey(flag)) scada_correction_factor = analysis_deviation.CurveDeviation[flag]; if (analysis_deviation.ModelDeviation != null && analysis_deviation.ModelDeviation.ContainsKey(flag)) model_correction_factor = analysis_deviation.ModelDeviation[flag]; if (model_correction_factor < 0) model_correction_factor_use = Math.Abs(model_correction_factor); else model_correction_factor_use = -model_correction_factor; schedule_pump_vm.ScadaCorrectionFactor = Math.Round(Curve.PumpCalculateHelper.M2Mpa(scada_correction_factor), 5); schedule_pump_vm.ModelCorrectionFactor = Math.Round(Curve.PumpCalculateHelper.M2Mpa(model_correction_factor_use), 5); } } schedule_pump_vm.ActivePowerDiff = schedule_pump_vm.ActivePower - scada_vm.ActivePower; schedule_pump_vm.RotateSpeedDiif = schedule_pump_vm.RotateSpeed - scada_vm.RotateSpeed; schedule_pump_vm.InstantaneousFlowDiif = schedule_pump_vm.InstantaneousFlow - scada_vm.InstantaneousFlow; if (ana_pump != null) { var outlet_pressure_diff = schedule_pump_vm.OutletPressure - scada_vm.PumpPressure ?? 0; var hz_diff = schedule_pump_vm.RotateSpeedDiif / pump.Nr * 50; //str.AppendLine($"{flag}# 扬程:{ana_pump.Head} 频率差:{hz_diff:N3} 压力差:{outlet_pressure_diff:N3}({Curve.PumpCalculateHelper.Mpa2M(outlet_pressure_diff):N3}米)"); str.AppendLine($"{flag}# 频率差:{hz_diff:N3} 压力差:{outlet_pressure_diff:N3}({Curve.PumpCalculateHelper.Mpa2M(outlet_pressure_diff):N3}米)"); } var working_ana_pump = working_ana_pump_list?.Find(x => x.Flag == flag); if (working_ana_pump != null) { var wokring_flow_diff = working_ana_pump.Flow - scada_vm.InstantaneousFlow; //str.AppendLine($"{flag}# 工况流量:{scada_vm.InstantaneousFlow:N2} 工况曲线流量:{working_ana_pump.Flow:N2} 偏差:{wokring_flow_diff:N2} 修正流量偏差:{schedule_pump_vm.InstantaneousFlowDiif + wokring_flow_diff:N2} "); str.AppendLine($"{flag}# 工况流量:{scada_vm.InstantaneousFlow:N2} 工况曲线流量:{working_ana_pump.Flow:N2} 偏差:{wokring_flow_diff:N2} "); } schedule_pump_vm.Round(); pump_schedule_vm_list.Add(schedule_pump_vm); } // str.AppendLine($"总站 工况流量偏差:{vm.RealFlowDiff:N2} 调度流量偏差:{vm.ScheduleFlowDiff:N2}"); // str.AppendLine($"原总功率:{vm.RealPower:N2} 调度总功率{vm.SchedulePower:N2} 偏差:{vm.SchedulePower - vm.RealPower:N2}"); this.memoExpand.Text = str.ToString(); var real_list = vm.RealPumpScadaList.Select(x => x).ToList(); real_list.ForEach(x => x.Set()); this.realTimePumpScadaViewModelBindingSource1.DataSource = real_list; this.realTimePumpScadaViewModelBindingSource1.ResetBindings(false); this.realTimePumpScheduleViewModelBindingSource1.DataSource = pump_schedule_vm_list; this.realTimePumpScheduleViewModelBindingSource1.ResetBindings(false); this.gridView4.BestFitColumns(); } } }