using IStation.Epanet; using IStation.Epanet.Enums; namespace IStation.Hydraulic { /// /// 模型验证辅助类 /// public partial class ModeVerifyHelper { /// /// 历史数据验证 /// /// 验证标识 /// 文件 /// 流量Scada标识字典 /// 压力Scada标识字典 /// 每日分析数据 /// public static List Verify(long verify_id, string file_path, Dictionary flow_id_mapping_dict, Dictionary pressure_id_mapping_dict, List day_value_list) { 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 (day_value_list == null || !day_value_list.Any()) { 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_msg = "初始化成功"; Log.Info(verify_id, log_title, log_msg); log_title = "验证"; var model_time_step = 0; var model_id_build = new StringBuilder(31); foreach (var day_value in day_value_list) { var pattern_list = day_value.PatternList; var time_value_list = day_value.TimeValueList; if (pattern_list == null || time_value_list == null) { continue; } var pattern_init = true; foreach (var pattern in pattern_list) { var patternId = 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(patternId, 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 = $"{day_value.Year}_{day_value.Month}_{day_value.Day}:模式初始化失败!"; Log.Info(verify_id, log_title, log_msg); continue; } EpanetMethods.ENinitH(0); do { EpanetMethods.ENrunH(out int current_ts); EpanetMethods.ENgetcount(CountType.Link, out int link_count); EpanetMethods.ENgetcount(CountType.Node, out int node_count); var current_time = TimeSpan.FromSeconds(current_ts); var time_value = time_value_list.Find(x => x.Time.TimeOfDay == current_time); if (time_value != null) { 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); 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); } } 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.ENnextH(out model_time_step); } while (model_time_step > 0); } EpanetMethods.ENcloseH(); return hydraulic_record_list; } /// /// 实时验证 /// /// 验证标识 /// 文件 /// 流量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.ToString("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; } } }