ÎļþÃû´Ó IStation.Service/08-hydraulic/ModeVerifyHelper.cs ÐÞ¸Ä |
| | |
| | | /// 模åéªè¯è¾
å©ç±» |
| | | /// </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> |
| | | /// å岿°æ®éªè¯ |
| | |
| | | |
| | | 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; |
| | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | { |
| | | 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]; |
| | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | 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; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |