From fd681339c81201ed6fb3303647ecab89e3e6c0c1 Mon Sep 17 00:00:00 2001 From: Shuxia Ning <NingShuxia0927@outlook.com> Date: 星期三, 17 七月 2024 09:50:11 +0800 Subject: [PATCH] 调度逻辑修改,新增笛卡尔积过滤循环 --- IStation.Service/09-hydraulic/ModeVerifyHelper.cs | 461 ++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 291 insertions(+), 170 deletions(-) diff --git a/IStation.Service/08-hydraulic/ModeVerifyHelper.cs b/IStation.Service/09-hydraulic/ModeVerifyHelper.cs similarity index 65% rename from IStation.Service/08-hydraulic/ModeVerifyHelper.cs rename to IStation.Service/09-hydraulic/ModeVerifyHelper.cs index 07b671a..968326e 100644 --- a/IStation.Service/08-hydraulic/ModeVerifyHelper.cs +++ b/IStation.Service/09-hydraulic/ModeVerifyHelper.cs @@ -7,7 +7,286 @@ /// 妯″瀷楠岃瘉杈呭姪绫� /// </summary> public partial class ModeVerifyHelper - { + { + + + /// <summary> + /// 瀹炴椂楠岃瘉 + /// </summary> + /// <param name="verify_id">楠岃瘉鏍囪瘑</param> + /// <param name="verify_time">楠岃瘉鏃堕棿</param> + /// <param name="verify_file_path">楠岃瘉妯″瀷鏂囦欢</param> + /// <param name="zy_scada_list">ZyScada鏁版嵁鍒楄〃</param> + /// <param name="pump_pattern_custom_dict">鑷畾涔夋车妯″紡</param> + /// <returns></returns> + public static List<Model.HydraulicModelRecord> Verify( + long verify_id, + DateTime verify_time, + string verify_file_path, + List<Model.ZyScada> zy_scada_list, + Dictionary<string, double?> pump_pattern_custom_dict = null) + { + var log_title = "鍒濆鍖栭獙璇佹暟鎹�"; + var log_msg = string.Empty; + if (zy_scada_list == null || !zy_scada_list.Any()) + { + log_msg = "zy_scada_list 鏁版嵁涓虹┖!"; + Log.Info(verify_id, log_title, log_msg); + return default; + } + + var pump_nr_dict = GlobalHelper.ModelPumpNrDict; + var pattern_id_mapping_dict = GlobalHelper.ModelPatternIdMappingDict; + var flow_id_mapping_dict = GlobalHelper.ModelFlowIdMappingDict; + var pressure_id_mapping_dict = GlobalHelper.ModelPressureIdMappingDict; + var pressure_id_kPa_list = GlobalHelper.ModelPressureIdkPaList; + + var pattern_dict = new Dictionary<string, float[]>(); + var scada_dict = new Dictionary<string, double>(); + + var exist_pump_pattern_custom_dict = pump_pattern_custom_dict != null && pump_pattern_custom_dict.Any(); + + #region 鍒濆鍖� pattern_dict scada_dict + + foreach (var zy_scada in zy_scada_list) + { + var tag = zy_scada.Code; + var value = zy_scada.Value; + + #region Pattern + + foreach (var item in pattern_id_mapping_dict) + { + if (item.Value != tag) + continue; + var pattern_id = item.Key; + var factor = value ?? 0; + if (exist_pump_pattern_custom_dict) + { + if (pump_pattern_custom_dict.ContainsKey(pattern_id)) + { + factor = pump_pattern_custom_dict[pattern_id] ?? 0; + } + } + else + { + if (value.HasValue && pump_nr_dict.ContainsKey(pattern_id)) + { + factor /= pump_nr_dict[pattern_id]; + factor = factor < 0 ? 0 : factor; + } + } + + pattern_dict.Add(pattern_id, new float[] { (float)factor }); + } + + #endregion + + #region Scada + + foreach (var item in flow_id_mapping_dict) + { + if (item.Value != tag) + continue; + scada_dict.Add(tag, value ?? 0); + } + + foreach (var item in pressure_id_mapping_dict) + { + if (item.Value != tag) + continue; + var pressure_value = value ?? 0; + if (pressure_id_kPa_list.Contains(tag)) + { + pressure_value /= 1000; + } + pressure_value = IStation.Curve.PumpCalculateHelper.Mpa2M(pressure_value); + scada_dict.Add(tag, pressure_value); + } + #endregion + } + + #endregion + + + var hydraulic_record_list = Verify(verify_id, verify_time, verify_file_path, flow_id_mapping_dict, pressure_id_mapping_dict, pattern_dict, scada_dict); + return hydraulic_record_list; + } + + + + + + + /// <summary> + /// 瀹炴椂楠岃瘉 + /// </summary> + /// <param name="verify_id">楠岃瘉鏍囪瘑</param> + /// <param name="verify_time">楠岃瘉鏃堕棿</param> + /// <param name="verify_file_path">楠岃瘉妯″瀷鏂囦欢</param> + /// <param name="flow_id_mapping_dict">娴侀噺Scada鏍囪瘑瀛楀吀</param> + /// <param name="pressure_id_mapping_dict">鍘嬪姏Scada鏍囪瘑瀛楀吀</param> + /// <param name="pattern_dict">妯″紡鏁版嵁</param> + /// <param name="scada_dict">Scada鏁版嵁</param> + /// <returns></returns> + public static List<Model.HydraulicModelRecord> Verify( + long verify_id, + DateTime verify_time, + string verify_file_path, + Dictionary<string, string> flow_id_mapping_dict, + Dictionary<string, string> pressure_id_mapping_dict, + Dictionary<string, float[]> pattern_dict, + Dictionary<string, double> scada_dict) + { + var log_title = "寮�濮嬮獙璇�"; + var log_msg = string.Empty; + var hydraulic_record_list = new List<Model.HydraulicModelRecord>(); + 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_dict == null || !pattern_dict.Any()) + { + log_msg = "妯″紡鏁版嵁涓虹┖!"; + Log.Info(verify_id, log_title, log_msg); + return default; + } + if (scada_dict == null || !scada_dict.Any()) + { + log_msg = "Scada鏁版嵁涓虹┖!"; + Log.Info(verify_id, log_title, log_msg); + return default; + } + + var err = EpanetMethods.ENopen(verify_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_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; + 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 = $"{verify_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); + + 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_dict[scada_id]; + EpanetMethods.ENgetlinkvalue(link_index, LinkValue.Flow, out float model_value); + model_value = Math.Abs(model_value); + + var record = new IStation.Model.HydraulicModelRecord + { + VerificationID = verify_id, + Time = verify_time, + ModelId = model_id, + ScadaId = scada_id, + ValueType = IStation.eValueType.Flow, + ModelValue = (double)model_value, + ScadaValue = scada_value + }; + record.DifferenceValue = record.ScadaValue - record.ModelValue; + 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_dict[scada_id]; + + EpanetMethods.ENgetnodevalue(node_index, NodeValue.Head, out float model_value); + + var record = new IStation.Model.HydraulicModelRecord + { + VerificationID = verify_id, + Time = verify_time, + ModelId = model_id, + ScadaId = scada_id, + ValueType = IStation.eValueType.Head, + ModelValue = (double)model_value, + ScadaValue = scada_value + }; + record.DifferenceValue = record.ScadaValue - record.ModelValue; + hydraulic_record_list.Add(record); + } + } + + EpanetMethods.ENcloseH(); + return hydraulic_record_list; + } + /// <summary> /// 鍘嗗彶鏁版嵁楠岃瘉 @@ -62,7 +341,7 @@ log_title = "楠岃瘉"; var model_time_step = 0; - var model_id_build = new StringBuilder(31); + var model_id_build = new StringBuilder(31); foreach (var day_value in day_value_list) { var pattern_list = day_value.PatternList; @@ -133,11 +412,11 @@ record.ModelId = model_id; record.ScadaId = scada_id; record.ValueType = IStation.eValueType.Flow; - record.ModeValue = (double)model_value; + record.ModelValue = (double)model_value; record.ScadaValue = scada_value; - if (record.ModeValue.HasValue) - record.ModeValue = Math.Abs(record.ModeValue.Value); - record.DifferenceValue = record.ScadaValue - record.ModeValue; + if (record.ModelValue.HasValue) + record.ModelValue = Math.Abs(record.ModelValue.Value); + record.DifferenceValue = record.ScadaValue - record.ModelValue; hydraulic_record_list.Add(record); } } @@ -146,7 +425,7 @@ { if (EpanetMethods.ENgetnodeid(node_index, model_id_build) != ErrorCode.Ok) continue; - var model_id = model_id_build.ToString(); + var model_id = model_id_build.ToString(); if (pressure_id_mapping_dict.ContainsKey(model_id)) { var scada_id = pressure_id_mapping_dict[model_id]; @@ -160,11 +439,11 @@ record.ModelId = model_id; record.ScadaId = scada_id; record.ValueType = IStation.eValueType.Head; - record.ModeValue = (double)model_value; + record.ModelValue = (double)model_value; record.ScadaValue = scada_value; - if (record.ModeValue.HasValue) - record.ModeValue = Math.Abs(record.ModeValue.Value); - record.DifferenceValue = record.ScadaValue - record.ModeValue; + if (record.ModelValue.HasValue) + record.ModelValue = Math.Abs(record.ModelValue.Value); + record.DifferenceValue = record.ScadaValue - record.ModelValue; hydraulic_record_list.Add(record); } } @@ -177,166 +456,8 @@ EpanetMethods.ENcloseH(); return hydraulic_record_list; } - - /// <summary> - /// 瀹炴椂楠岃瘉 - /// </summary> - /// <param name="verify_id">楠岃瘉鏍囪瘑</param> - /// <param name="file_path">鏂囦欢</param> - /// <param name="flow_id_mapping_dict">娴侀噺Scada鏍囪瘑瀛楀吀</param> - /// <param name="pressure_id_mapping_dict">鍘嬪姏Scada鏍囪瘑瀛楀吀</param> - /// <param name="pattern_list"></param> - /// <param name="time_value">楠岃瘉鏁版嵁</param> - /// <returns></returns> - public static List<Model.HydraulicModelRecord> Verify(long verify_id, string file_path, Dictionary<string, string> flow_id_mapping_dict, Dictionary<string, string> pressure_id_mapping_dict, List<Pattern> pattern_list, TimeValue time_value) - { - var log_title = "鍒濆鍖�"; - var log_msg = string.Empty; - var hydraulic_record_list = new List<Model.HydraulicModelRecord>(); - 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; - } } + } -- Gitblit v1.9.3