using IStation.Epanet.Enums; using IStation.Epanet; using IStation.Hydraulic; using System.Text; using Yw.Untity; using System.Collections.Generic; namespace IStation.Test { public class ScheduleModelValidHelper { public bool Analysis() { var pressure_id_mapping_dict = new Dictionary() { {"Jjd1","1输水总压力"}, {"Jjd2","1输水总压力"}, {"Jjd3","1输水总压力"}, {"Jpump11","1输水11#扬程"}, {"Jpump12","1输水12#扬程"}, {"Jpump13","1输水13#扬程"}, {"Jpump14","1输水14#扬程"}, {"Jpump15","1输水15#扬程"}, {"Jpump16","1输水16#扬程"}, {"Jpump17","1输水17#扬程"}, {"Jpump18","1输水18#扬程"}, {"Jdn2400","2输水总压力"}, {"Jdn2700","2输水总压力"}, {"Jpump21","2输水21#扬程"}, {"Jpump22","2输水22#扬程"}, {"Jpump23","2输水23#扬程"}, {"Jpump24","2输水24#扬程"}, {"Jpump25","2输水25#扬程"}, {"Jpump26","2输水26#扬程"}, {"Jpump27","2输水27#扬程"} }; var flow_id_mapping_dict = new Dictionary() { {"Pjd1","1输水总流量"}, {"Pjd2","1输水总流量"}, {"Pjd3","1输水总流量"}, {"Pdn2400","2输水总流量"}, {"Pdn2700","2输水总流量"}, {"Ppump21","2输水21#流量"}, {"Ppump22","2输水22#流量"}, {"Ppump23","2输水23#流量"}, {"Ppump24","2输水24#流量"}, {"Ppump25","2输水25#流量"}, {"Ppump26","2输水26#流量"}, {"Ppump27","2输水27#流量"} }; var pattern_id_mapping_dict = new Dictionary() { {"Pump11","1输水11#频率"}, {"Pump12","1输水12#频率"}, {"Pump13","1输水13#频率"}, {"Pump14","1输水14#频率"}, {"Pump15","1输水15#频率"}, {"Pump16","1输水16#频率"}, {"Pump17","1输水17#频率"}, {"Pump18","1输水18#频率"}, {"R3", "R3"}, {"R2", "R2"}, {"R1", "R1"}, {"SFJD1", "SFJD1"}, {"SFJD2", "SFJD2"}, {"SFJD3", "SFJD3"}, {"RPump21", "RPump21"}, {"SFPump21", "SFPump21"}, {"Pump21", "2输水21#频率"}, {"RPump22", "RPump22"}, {"SFPump22", "SFPump22"}, {"Pump22", "2输水22#频率"}, {"RPump23", "RPump23"}, {"SFPump23", "SFPump23"}, {"Pump23", "2输水23#频率"}, {"RPump24", "RPump24"}, {"SFPump24", "SFPump24"}, {"Pump24", "2输水24#频率"}, {"RPump25", "RPump25"}, {"SFPump25", "SFPump25"}, {"Pump25", "2输水25#频率"}, {"RPump26", "RPump26"}, {"SFPump26", "SFPump26"}, {"Pump26", "2输水26#频率"}, {"RPump27", "RPump27"}, {"SFPump27", "SFPump27"}, {"Pump27", "2输水27#频率"}, {"SFDN2400", "SFDN2400"}, {"SFDN2700", "SFDN2700"} }; var pressure_id_mapping_dict1 =new List() { "SPJD1", "SPJD2", "SPJD3" }; var pressure_id_mapping_dict2 = new List() { "SPDN2400", "SPDN2700" }; var flow_id_mapping_dict1 = new List() { "SFJD1", "SFJD2", "SFJD3" }; var flow_id_mapping_dict2 = new List() { "SFDN2400", "SFDN2700" }; var verify_id = Yw.YitIdHelper.NextId(); var file_path = $"{AppDomain.CurrentDomain.BaseDirectory}Data\\HydraulicModel.inp"; var day_value_list = IStation.Test.DayValueHelper.GetDayValues(); if (day_value_list == null || !day_value_list.Any()) return false; foreach (var day_value in day_value_list) { var patternList = new List(); foreach (var pattern_item in pattern_id_mapping_dict) { var pattern = new IStation.Hydraulic.Pattern { Id = pattern_item.Key, FactorList = new List() }; patternList.Add(pattern); } var timeValueList = day_value.TimeValueList.OrderBy(x => x.Time).ToList(); foreach (var timeValue in timeValueList) { var time = timeValue.Time; var value_dict = timeValue.Value; var pressure_1_list = new List(); var flow_1_list = new List(); var pressure_2_list = new List(); var flow_2_list = new List(); foreach (var item in value_dict) { var scada_id = item.Key; var scada_value = item.Value; var pattern = patternList.Find(x => x.Id == scada_id); if (pattern != null) { if (pattern.Id != scada_id) continue; pattern.FactorList.Add((float)scada_value); } if (pressure_id_mapping_dict1.Contains(scada_id)) { pressure_1_list.Add(scada_value); } else if (pressure_id_mapping_dict2.Contains(scada_id)) { pressure_2_list.Add(scada_value); } else if (flow_id_mapping_dict1.Contains(scada_id)) { flow_1_list.Add(scada_value); } else if (flow_id_mapping_dict2.Contains(scada_id)) { flow_2_list.Add(scada_value); } } var pressure_1 = pressure_1_list.Max(); var flow_1 = flow_1_list.Sum(); var pressure_2 = pressure_2_list.Max(); var flow_2= flow_2_list.Sum(); var helper = new Algorithm.ScheduleHelper(); helper.Initial(current_open_pump_flags1, schedule_config1); var optimal_combine1 = helper.Calc(station_info.S1, station_info.S1FlagsPart1, station_info.S1FlagsPart2, target_flow1, target_head1); helper.Initial(current_open_pump_flags2, schedule_config2); var optimal_combine2 = helper.Calc(station_info.S2, station_info.S2FlagsPart1, station_info.S2FlagsPart2, target_flow2, target_head2); } day_value.PatternList = patternList; } var hydraulic_model_validation = new IStation.Model.HydraulicModelValidation(); hydraulic_model_validation.ID = verify_id; hydraulic_model_validation.Time = DateTime.Now; hydraulic_model_validation.Config = "调度验证"; var bol = new IStation.Service.HydraulicModelValidation().Insert(hydraulic_model_validation) > 0; if (!bol) { return false; } var hydraulic_model_record_list = IStation.Hydraulic.ModeVerifyHelper.Verify(verify_id, file_path, flow_id_mapping_dict, pressure_id_mapping_dict, day_value_list); bol = new IStation.Service.HydraulicModelRecord().BulkInserts(hydraulic_model_record_list); return bol; } /// /// 实时验证 /// /// 验证标识 /// 文件 /// 流量Scada标识字典 /// 压力Scada标识字典 /// /// 验证数据 /// public static List Verify(long verify_id, string file_path, Dictionary flow_id_mapping_dict, Dictionary pressure_id_mapping_dict, List pattern_list, TimeValue time_value) { var log_title = "初始化"; var log_msg = string.Empty; var hydraulic_record_list = new List(); if (flow_id_mapping_dict == null || !flow_id_mapping_dict.Any()) { log_msg = "流量标签字典为空!"; Log.Info(verify_id, log_title, log_msg); return default; } if (pressure_id_mapping_dict == null || !pressure_id_mapping_dict.Any()) { log_msg = "压力标签字典为空!"; Log.Info(verify_id, log_title, log_msg); return default; } if (pattern_list == null || !pattern_list.Any()) { log_msg = "模式数据为空!"; Log.Info(verify_id, log_title, log_msg); return default; } if (time_value == null) { log_msg = "验证数据为空!"; Log.Info(verify_id, log_title, log_msg); return default; } var err = EpanetMethods.ENopen(file_path, "", ""); if (err != 0) { log_msg = err.GetMsg(); Log.Info(verify_id, log_title, log_msg); return default; } err = EpanetMethods.ENopenH(); if (err != 0) { log_msg = err.GetMsg(); Log.Info(verify_id, log_title, log_msg); return default; } log_title = "验证"; var model_id_build = new StringBuilder(31); var pattern_init = true; foreach (var pattern in pattern_list) { var pattern_id = pattern.Id; var pattern_factor_array = pattern.FactorList.ToArray(); 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; log_msg = err.GetMsg(); Log.Info(verify_id, log_title, log_msg); continue; } err = EpanetMethods.ENsetpattern(pattern_index, pattern_factor_array, pattern_factor_array_count); if (err != ErrorCode.Ok) { pattern_init = false; log_msg = err.GetMsg(); Log.Info(verify_id, log_title, log_msg); continue; } } if (!pattern_init) { log_msg = $"{time_value.Time:G}:模式初始化失败!"; Log.Info(verify_id, log_title, log_msg); return default; } EpanetMethods.ENinitH(0); EpanetMethods.ENrunH(out _); EpanetMethods.ENgetcount(CountType.Link, out int link_count); EpanetMethods.ENgetcount(CountType.Node, out int node_count); var time = time_value.Time; var scada_value_dcit = time_value.Value; for (int link_index = 1; link_index <= link_count; link_index++) { if (EpanetMethods.ENgetlinkid(link_index, model_id_build) != ErrorCode.Ok) continue; var model_id = model_id_build.ToString(); if (flow_id_mapping_dict.ContainsKey(model_id)) { var scada_id = flow_id_mapping_dict[model_id]; var scada_value = scada_value_dcit[scada_id]; EpanetMethods.ENgetlinkvalue(link_index, LinkValue.Flow, out float model_value); model_value = Math.Abs(model_value); var record = new IStation.Model.HydraulicModelRecord(); record.VerificationID = verify_id; record.Time = time; record.ModelId = model_id; record.ScadaId = scada_id; record.ValueType = IStation.eValueType.Flow; record.ModeValue = (double)model_value; record.ScadaValue = scada_value; record.DifferenceValue = record.ScadaValue - record.ModeValue; hydraulic_record_list.Add(record); } EpanetMethods.ENgetlinktype(link_index, out LinkType linkType); if (linkType == LinkType.Pump) { EpanetMethods.ENgetlinkvalue(link_index, LinkValue.InitStatus, out float on_off); } } 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 (pressure_id_mapping_dict.ContainsKey(model_id)) { var scada_id = pressure_id_mapping_dict[model_id]; var scada_value = scada_value_dcit[scada_id]; EpanetMethods.ENgetnodevalue(node_index, NodeValue.Head, out float model_value); var record = new IStation.Model.HydraulicModelRecord(); record.VerificationID = verify_id; record.Time = time; record.ModelId = model_id; record.ScadaId = scada_id; record.ValueType = IStation.eValueType.Head; record.ModeValue = (double)model_value; record.ScadaValue = scada_value; record.DifferenceValue = record.ScadaValue - record.ModeValue; hydraulic_record_list.Add(record); } } EpanetMethods.ENcloseH(); return hydraulic_record_list; } } }