using IStation.Epanet; using IStation.Epanet.Enums; using System.Text; namespace IStation.Test.Init { /// /// 调度分析辅助类 /// public class AnalysisDeviationHelper { private static string _model_file = System.IO.Path.Combine( Settings.ParasHelper.LocalFile.DataFolderDirectory, "ch2_v3_ 20240801(Clear).inp"); private static IStation.Service.AnalysisDeviation _service_analysis_deviation = new Service.AnalysisDeviation(); public static bool Ana() { _service_analysis_deviation.DeleteAll(); var day_value_list =Test.Init.DayValueHelper.GetDayValues(); if (day_value_list == null || !day_value_list.Any()) { return false; } OutScadaScheduleVmList(day_value_list, out List all_station1_scada_schedule_list, out List all_station2_scada_schedule_list); var station1_flow_range_correction_factor_list = AnaStation1CorrectionFactor(all_station1_scada_schedule_list); var station2_flow_range_correction_factor_list = AnaStation2CorrectionFactor(all_station2_scada_schedule_list); var list = new List(); foreach (var item in station1_flow_range_correction_factor_list) { var model = new Model.AnalysisDeviation(); model.RunFlags = Yw.Untity.IntListHelper.ToList(item.Item1); model.RunCount = model.RunFlags.Count; model.MinFlow = item.Item2; model.MaxFlow = item.Item3; model.CurveDeviation = item.Item4; model.ModelDeviation = item.Item5; model.DeviationAccuracy = 0; list.Add(model); } foreach (var item in station2_flow_range_correction_factor_list) { var model = new Model.AnalysisDeviation(); model.RunFlags = Yw.Untity.IntListHelper.ToList(item.Item1); model.RunCount = model.RunFlags.Count; model.MinFlow = item.Item2; model.MaxFlow = item.Item3; model.CurveDeviation = item.Item4; model.ModelDeviation = item.Item5; model.DeviationAccuracy = 0; list.Add(model); } var bol = _service_analysis_deviation.Inserts(list); if (!bol) { throw (new Exception("失败!")); } return bol; } public static void OutScadaScheduleVmList (List day_value_list, out List all_station1_scada_schedule_list, out List all_station2_scada_schedule_list) { all_station1_scada_schedule_list = new List(); all_station2_scada_schedule_list = new List(); if (day_value_list == null || !day_value_list.Any()) { return; } var limited_min_flow = 100; var limited_speed_ratio = 0.1; foreach (var day_value in day_value_list) { var time_value_list = day_value.TimeValueList; foreach (var time_value in time_value_list) { var time = time_value.Time; var scada_value_dict = time_value.Value; var vm1 = new Station1ScadaSchedule(); vm1.Time = time; vm1.R1 = scada_value_dict["R1"]; vm1.R2 = scada_value_dict["R2"]; vm1.R3 = scada_value_dict["R3"]; vm1.JD1P = scada_value_dict["SPJD1"]; vm1.JD2P = scada_value_dict["SPJD2"]; vm1.JD3P = scada_value_dict["SPJD3"]; vm1.Pump11P = scada_value_dict["SPPump11"]; vm1.Pump12P = scada_value_dict["SPPump12"]; vm1.Pump13P = scada_value_dict["SPPump13"]; vm1.Pump14P = scada_value_dict["SPPump14"]; vm1.Pump15P = scada_value_dict["SPPump15"]; vm1.Pump16P = scada_value_dict["SPPump16"]; vm1.Pump17P = scada_value_dict["SPPump17"]; vm1.Pump18P = scada_value_dict["SPPump18"]; vm1.JD1F = scada_value_dict["SFJD1"]; vm1.JD2F = scada_value_dict["SFJD2"]; vm1.JD3F = scada_value_dict["SFJD3"]; vm1.Pump11 = scada_value_dict["Pump11"]; vm1.Pump12 = scada_value_dict["Pump12"]; vm1.Pump13 = scada_value_dict["Pump13"]; vm1.Pump14 = scada_value_dict["Pump14"]; vm1.Pump15 = scada_value_dict["Pump15"]; vm1.Pump16 = scada_value_dict["Pump16"]; vm1.Pump17 = scada_value_dict["Pump17"]; vm1.Pump18 = scada_value_dict["Pump18"]; var power11 = scada_value_dict["Power11"]; var power12 = scada_value_dict["Power12"]; var power13 = scada_value_dict["Power13"]; var power14 = scada_value_dict["Power14"]; var power15 = scada_value_dict["Power15"]; var power16 = scada_value_dict["Power16"]; var power17 = scada_value_dict["Power17"]; var power18 = scada_value_dict["Power18"]; vm1.TotalPower = power11 + power12 + power13 + power14 + power15 + power16 + power17 + power18; vm1.Pump11 = vm1.Pump11 < limited_speed_ratio ? 0 : vm1.Pump11; vm1.Pump12 = vm1.Pump12 < limited_speed_ratio ? 0 : vm1.Pump12; vm1.Pump13 = vm1.Pump13 < limited_speed_ratio ? 0 : vm1.Pump13; vm1.Pump14 = vm1.Pump14 < limited_speed_ratio ? 0 : vm1.Pump14; vm1.Pump15 = vm1.Pump15 < limited_speed_ratio ? 0 : vm1.Pump15; vm1.Pump16 = vm1.Pump16 < limited_speed_ratio ? 0 : vm1.Pump16; vm1.Pump17 = vm1.Pump17 < limited_speed_ratio ? 0 : vm1.Pump17; vm1.Pump18 = vm1.Pump18 < limited_speed_ratio ? 0 : vm1.Pump18; var vm2 = new Station2ScadaSchedule(); vm2.Time = time; vm2.RPump21 = scada_value_dict["RPump21"]; vm2.RPump22 = scada_value_dict["RPump22"]; vm2.RPump23 = scada_value_dict["RPump23"]; vm2.RPump24 = scada_value_dict["RPump24"]; vm2.RPump25 = scada_value_dict["RPump25"]; vm2.RPump26 = scada_value_dict["RPump26"]; vm2.RPump27 = scada_value_dict["RPump27"]; vm2.DN2400P = scada_value_dict["SPDN2400"]; vm2.DN2700P = scada_value_dict["SPDN2700"]; vm2.Pump21P = scada_value_dict["SPPump21"]; vm2.Pump22P = scada_value_dict["SPPump22"]; vm2.Pump23P = scada_value_dict["SPPump23"]; vm2.Pump24P = scada_value_dict["SPPump24"]; vm2.Pump25P = scada_value_dict["SPPump25"]; vm2.Pump26P = scada_value_dict["SPPump26"]; vm2.Pump27P = scada_value_dict["SPPump27"]; vm2.DN2700F = scada_value_dict["SFDN2700"]; vm2.DN2400F = scada_value_dict["SFDN2400"]; vm2.Pump21F = scada_value_dict["SFPump21"]; vm2.Pump22F = scada_value_dict["SFPump22"]; vm2.Pump23F = scada_value_dict["SFPump23"]; vm2.Pump24F = scada_value_dict["SFPump24"]; vm2.Pump25F = scada_value_dict["SFPump25"]; vm2.Pump26F = scada_value_dict["SFPump26"]; vm2.Pump27F = scada_value_dict["SFPump27"]; vm2.Pump21 = scada_value_dict["Pump21"]; vm2.Pump22 = scada_value_dict["Pump22"]; vm2.Pump23 = scada_value_dict["Pump23"]; vm2.Pump24 = scada_value_dict["Pump24"]; vm2.Pump25 = scada_value_dict["Pump25"]; vm2.Pump26 = scada_value_dict["Pump26"]; vm2.Pump27 = scada_value_dict["Pump27"]; var power21 = scada_value_dict["Power21"]; var power22 = scada_value_dict["Power22"]; var power23 = scada_value_dict["Power23"]; var power24 = scada_value_dict["Power24"]; var power25 = scada_value_dict["Power25"]; var power26 = scada_value_dict["Power26"]; var power27 = scada_value_dict["Power27"]; vm2.TotalPower = power21 + power22 + power23 + power24 + power25 + power26 + power27; vm2.Pump21 = vm2.Pump21 < limited_speed_ratio ? 0 : vm2.Pump21; vm2.Pump22 = vm2.Pump22 < limited_speed_ratio ? 0 : vm2.Pump22; vm2.Pump23 = vm2.Pump23 < limited_speed_ratio ? 0 : vm2.Pump23; vm2.Pump24 = vm2.Pump24 < limited_speed_ratio ? 0 : vm2.Pump24; vm2.Pump25 = vm2.Pump25 < limited_speed_ratio ? 0 : vm2.Pump25; vm2.Pump26 = vm2.Pump26 < limited_speed_ratio ? 0 : vm2.Pump26; vm2.Pump27 = vm2.Pump27 < limited_speed_ratio ? 0 : vm2.Pump27; if (vm1.JD1F < limited_min_flow || vm1.JD2F < limited_min_flow || vm1.JD3F < limited_min_flow) { continue; } if (vm2.DN2400F < limited_min_flow || vm2.DN2700F < limited_min_flow) { continue; } vm1.Sum(); vm2.Sum(); all_station1_scada_schedule_list.Add(vm1); all_station2_scada_schedule_list.Add(vm2); } } } #region Station1 private static List, Dictionary>> AnaStation1CorrectionFactor(List all_station_scada_schedule_list) { if (all_station_scada_schedule_list == null || !all_station_scada_schedule_list.Any()) { return default; } #region init var flow_id_mapping_dict = new Dictionary() { {"Pjd1","SFJD1"}, {"Pjd2","SFJD2"}, {"Pjd3","SFJD3"} }; var pressure_id_mapping_dict = new Dictionary() { {"Jjd1","SPJD1"}, {"Jjd2","SPJD2"}, {"Jjd3","SPJD3"}, {"Jpump11","SPPump11"}, {"Jpump12","SPPump12"}, {"Jpump13","SPPump13"}, {"Jpump14","SPPump14"}, {"Jpump15","SPPump15"}, {"Jpump16","SPPump16"}, {"Jpump17","SPPump17"}, {"Jpump18","SPPump18"} }; var flag_mapping_dict = new Dictionary(){ { "SPPump11",GlobalHelper.Flag11}, { "SPPump12",GlobalHelper.Flag12}, { "SPPump13",GlobalHelper.Flag13}, { "SPPump14",GlobalHelper.Flag14}, { "SPPump15",GlobalHelper.Flag15}, { "SPPump16",GlobalHelper.Flag16}, { "SPPump17",GlobalHelper.Flag17}, { "SPPump18",GlobalHelper.Flag18} }; var pumps = new IStation.Service.Station().Get().Station2; #endregion var list = new List>>(); var minQ = 0; var maxQ = 40000; var spaceQ = 2500; for (int currentMinQ = minQ; currentMinQ <= maxQ; currentMinQ += spaceQ) { var currentMaxQ = currentMinQ + spaceQ; var station_scada_schedule_list = all_station_scada_schedule_list .Where(x => x.TotalFlow >= currentMinQ && x.TotalFlow <= currentMaxQ) .ToList(); if (station_scada_schedule_list == null || !station_scada_schedule_list.Any()) continue; var station_scada_schedule_group = station_scada_schedule_list.GroupBy(x => x.RunFlags); foreach (var item in station_scada_schedule_group) { var run_flags = item.Key; list.Add(new(run_flags, currentMinQ, currentMaxQ, item.ToList())); } } var scada_run_flags_head_avg_diff_dict_list = new List, Dictionary>>(); foreach (var item in list) { var run_flags = item.Item1; var min_flow = item.Item2; var max_flow = item.Item3; var station_scada_schedule_list = item.Item4; var flag_head_avg_diff_dict = GetScadaFlagHeadAvgDiffDict(pumps, station_scada_schedule_list); var model_head_avg_diff_dict = GetModelFlagHeadAvgDiffDict(pumps, flag_mapping_dict, station_scada_schedule_list); scada_run_flags_head_avg_diff_dict_list.Add(new(run_flags, min_flow, max_flow, flag_head_avg_diff_dict, model_head_avg_diff_dict)); } return scada_run_flags_head_avg_diff_dict_list; } private static Dictionary _pump_pressure_id_mapping_dict1 = new() { {"Jpump11","SPPump11"}, {"Jpump12","SPPump12"}, {"Jpump13","SPPump13"}, {"Jpump14","SPPump14"}, {"Jpump15","SPPump15"}, {"Jpump16","SPPump16"}, {"Jpump17","SPPump17"}, {"Jpump18","SPPump18"}, }; public static Dictionary GetModelFlagHeadAvgDiffDict (List pumps, Dictionary flag_mapping_dict, List station_scada_schedule_list) { if (station_scada_schedule_list == null || !station_scada_schedule_list.Any()) return default; var err = EpanetMethods.ENopen(_model_file, "", ""); if (err != ErrorCode.Ok) return default; err = EpanetMethods.ENopenH(); if (err != ErrorCode.Ok) return default; var multi_tag_head_diff_list = new List>(); var model_id_build = new StringBuilder(31); foreach (var station_scada_schedule in station_scada_schedule_list) { var pattern_init = true; var pattern_dict = station_scada_schedule.ToModelPatternDict(); var scada_dict = station_scada_schedule.ToModelScadaDict(); var pump_dict = station_scada_schedule.ToModelPumpDict(); foreach (var pattern in pattern_dict) { var pattern_id = pattern.Key; var pattern_factor_array = pattern.Value; var pattern_factor_array_count = pattern_factor_array.Length == 0 ? 1 : pattern_factor_array.Length; err = EpanetMethods.ENgetpatternindex(pattern_id, out int pattern_index); if (err != ErrorCode.Ok) { pattern_init = false; continue; } err = EpanetMethods.ENsetpattern(pattern_index, pattern_factor_array, pattern_factor_array_count); if (err != ErrorCode.Ok) { pattern_init = false; continue; } } if (!pattern_init) continue; EpanetMethods.ENinitH(0); EpanetMethods.ENrunH(out _); EpanetMethods.ENgetcount(CountType.Node, out int node_count); for (int node_index = 1; node_index <= node_count; node_index++) { if (EpanetMethods.ENgetnodeid(node_index, model_id_build) != ErrorCode.Ok) continue; var model_id = model_id_build.ToString(); if (_pump_pressure_id_mapping_dict1.ContainsKey(model_id)) { var scada_id = _pump_pressure_id_mapping_dict1[model_id]; if (!(pump_dict[scada_id] > 0)) { continue; } EpanetMethods.ENgetnodevalue(node_index, NodeValue.Head, out float model_head); var scada_head = scada_dict[scada_id]; var head_diff = model_head - scada_head; multi_tag_head_diff_list.Add(new(scada_id, head_diff)); } } } EpanetMethods.ENcloseH(); EpanetMethods.ENclose(); var tag_head_diff_list_group = multi_tag_head_diff_list.GroupBy(x => x.Item1).OrderBy(x => x.Key); var flag_head_avg_diff_dict = new Dictionary(); foreach (var item in tag_head_diff_list_group) { var flag = flag_mapping_dict[item.Key]; var head_diff_avg = item.Average(x => x.Item2); flag_head_avg_diff_dict.Add(flag, head_diff_avg); } return flag_head_avg_diff_dict; } /// /// 无法修正曲线 /// public static Dictionary GetScadaFlagHeadAvgDiffDict(List pumps, List station_scada_schedule_list) { if (station_scada_schedule_list == null || !station_scada_schedule_list.Any()) return default; var multi_flag_head_diff_list = new List>(); foreach (var station_scada_schedule in station_scada_schedule_list) { var time = station_scada_schedule.Time; var flag_inlet_water_level_dict = station_scada_schedule.ToFlagInletWaterLevelDict(); var flag_rpm_dict = station_scada_schedule.ToFlagRpmDict(); var flag_head_dict = station_scada_schedule.ToFlagHeadDict(); foreach (var item in flag_rpm_dict) { var flag = item.Key; var pump = pumps.Find(x => x.Flag == flag); if (pump == null) continue; var head_diff = 0; multi_flag_head_diff_list.Add(new(flag, head_diff)); } } var flag_head_diff_list_group = multi_flag_head_diff_list.GroupBy(x => x.Item1); var flag_head_avg_diff_dict = new Dictionary(); foreach (var item in flag_head_diff_list_group) { var flag = item.Key; var head_diff_avg = item.Average(x => x.Item2); flag_head_avg_diff_dict.Add(flag, head_diff_avg); } return flag_head_avg_diff_dict; } #endregion #region Station2 private static List, Dictionary>> AnaStation2CorrectionFactor(List all_station_scada_schedule_list) { if (all_station_scada_schedule_list == null || !all_station_scada_schedule_list.Any()) { return default; } #region init var flow_id_mapping_dict = new Dictionary() { {"Pdn2400","SFDN2400"}, {"Pdn2700","SFDN2700"}, {"Ppump21","SFPump21"}, {"Ppump22","SFPump22"}, {"Ppump23","SFPump23"}, {"Ppump24","SFPump24"}, {"Ppump25","SFPump25"}, {"Ppump26","SFPump26"}, {"Ppump27","SFPump27"} }; var pressure_id_mapping_dict = new Dictionary() { {"Jdn2400","SPDN2400"}, {"Jdn2700","SPDN2700"}, {"Jpump21","SPPump21"}, {"Jpump22","SPPump22"}, {"Jpump23","SPPump23"}, {"Jpump24","SPPump24"}, {"Jpump25","SPPump25"}, {"Jpump26","SPPump26"}, {"Jpump27","SPPump27"} }; var flag_mapping_dict = new Dictionary(){ { "SPPump21",GlobalHelper.Flag21}, { "SPPump22",GlobalHelper.Flag22}, { "SPPump23",GlobalHelper.Flag23}, { "SPPump24",GlobalHelper.Flag24}, { "SPPump25",GlobalHelper.Flag25}, { "SPPump26",GlobalHelper.Flag26}, { "SPPump27",GlobalHelper.Flag27} }; var pumps = new IStation.Service.Station().Get().Station2; #endregion var list = new List>>(); var minQ = 20000; var maxQ = 140000; var spaceQ = 5000; for (int currentMinQ = minQ; currentMinQ <= maxQ; currentMinQ += spaceQ) { var currentMaxQ = currentMinQ + spaceQ; var station_scada_schedule_list = all_station_scada_schedule_list .Where(x => x.TotalFlow >= currentMinQ && x.TotalFlow <= currentMaxQ) .ToList(); if (station_scada_schedule_list == null || !station_scada_schedule_list.Any()) continue; var station_scada_schedule_group = station_scada_schedule_list.GroupBy(x => x.RunFlags); foreach (var item in station_scada_schedule_group) { var run_flags = item.Key; list.Add(new(run_flags, currentMinQ, currentMaxQ, item.ToList())); } } var scada_run_flags_head_avg_diff_dict_list = new List, Dictionary>>(); foreach (var item in list) { var run_flags = item.Item1; var min_flow = item.Item2; var max_flow = item.Item3; var station_scada_schedule_list = item.Item4; var flag_head_avg_diff_dict = GetScadaFlagHeadAvgDiffDict(pumps, station_scada_schedule_list); var model_head_avg_diff_dict = GetModelFlagHeadAvgDiffDict(pumps, flag_mapping_dict, station_scada_schedule_list); scada_run_flags_head_avg_diff_dict_list.Add(new(run_flags, min_flow, max_flow, flag_head_avg_diff_dict, model_head_avg_diff_dict)); } return scada_run_flags_head_avg_diff_dict_list; } private static Dictionary _pump_pressure_id_mapping_dict2 = new() { {"Jpump21","SPPump21"}, {"Jpump22","SPPump22"}, {"Jpump23","SPPump23"}, {"Jpump24","SPPump24"}, {"Jpump25","SPPump25"}, {"Jpump26","SPPump26"}, {"Jpump27","SPPump27"} }; public static Dictionary GetModelFlagHeadAvgDiffDict (List pumps, Dictionary flag_mapping_dict, List station_scada_schedule_list) { if (station_scada_schedule_list == null || !station_scada_schedule_list.Any()) return default; var err = EpanetMethods.ENopen(_model_file, "", ""); if (err != ErrorCode.Ok) return default; err = EpanetMethods.ENopenH(); if (err != ErrorCode.Ok) return default; var multi_tag_head_diff_list = new List>(); var model_id_build = new StringBuilder(31); foreach (var station_scada_schedule in station_scada_schedule_list) { var pattern_init = true; var pattern_dict = station_scada_schedule.ToModelPatternDict(); var scada_dict = station_scada_schedule.ToModelScadaDict(); var pump_dict = station_scada_schedule.ToModelPumpDict(); foreach (var pattern in pattern_dict) { var pattern_id = pattern.Key; var pattern_factor_array = pattern.Value; var pattern_factor_array_count = pattern_factor_array.Length == 0 ? 1 : pattern_factor_array.Length; err = EpanetMethods.ENgetpatternindex(pattern_id, out int pattern_index); if (err != ErrorCode.Ok) { pattern_init = false; continue; } err = EpanetMethods.ENsetpattern(pattern_index, pattern_factor_array, pattern_factor_array_count); if (err != ErrorCode.Ok) { pattern_init = false; continue; } } if (!pattern_init) continue; EpanetMethods.ENinitH(0); EpanetMethods.ENrunH(out _); EpanetMethods.ENgetcount(CountType.Node, out int node_count); for (int node_index = 1; node_index <= node_count; node_index++) { if (EpanetMethods.ENgetnodeid(node_index, model_id_build) != ErrorCode.Ok) continue; var model_id = model_id_build.ToString(); if (_pump_pressure_id_mapping_dict2.ContainsKey(model_id)) { var scada_id = _pump_pressure_id_mapping_dict2[model_id]; if (!(pump_dict[scada_id] > 0)) { continue; } EpanetMethods.ENgetnodevalue(node_index, NodeValue.Head, out float model_head); var scada_head = scada_dict[scada_id]; var head_diff = model_head - scada_head; multi_tag_head_diff_list.Add(new(scada_id, head_diff)); } } } EpanetMethods.ENcloseH(); EpanetMethods.ENclose(); var tag_head_diff_list_group = multi_tag_head_diff_list.GroupBy(x => x.Item1).OrderBy(x => x.Key); var flag_head_avg_diff_dict = new Dictionary(); foreach (var item in tag_head_diff_list_group) { var flag = flag_mapping_dict[item.Key]; var head_diff_avg = item.Average(x => x.Item2); flag_head_avg_diff_dict.Add(flag, head_diff_avg); } return flag_head_avg_diff_dict; } public static Dictionary GetScadaFlagHeadAvgDiffDict(List pumps, List station_scada_schedule_list) { if (station_scada_schedule_list == null || !station_scada_schedule_list.Any()) return default; var multi_flag_head_diff_list = new List>(); foreach (var station_scada_schedule in station_scada_schedule_list) { var time = station_scada_schedule.Time; var flag_inlet_water_level_dict = station_scada_schedule.ToFlagInletWaterLevelDict(); var flag_rpm_dict = station_scada_schedule.ToFlagRpmDict(); var flag_head_dict = station_scada_schedule.ToFlagHeadDict(); var flag_flow_dict = station_scada_schedule.ToFlagFlowDict(); foreach (var item in flag_rpm_dict) { var flag = item.Key; var pump = pumps.Find(x => x.Flag == flag); if (pump == null) continue; var rpm = item.Value * pump.Nr; if (rpm < 1) continue; var curve_qh = Curve.PumpCalculateHelper.CalculateSimilarQH(pump.CurveQH, pump.Nr, rpm); var inlet_water_level = flag_inlet_water_level_dict[flag]; var flow = flag_flow_dict[pump.Flag]; var head = flag_head_dict[flag]; var curve_head = curve_qh.GetFitPointY(flow); var head_diff = curve_head - (head - inlet_water_level); multi_flag_head_diff_list.Add(new(flag, head_diff)); } } var flag_head_diff_list_group = multi_flag_head_diff_list.GroupBy(x => x.Item1); var flag_head_avg_diff_dict = new Dictionary(); foreach (var item in flag_head_diff_list_group) { var flag = item.Key; var head_diff_avg = item.Average(x => x.Item2); flag_head_avg_diff_dict.Add(flag, head_diff_avg); } return flag_head_avg_diff_dict; } #endregion } }