using IStation.Epanet;
using IStation.Epanet.Enums;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace IStation.WinFrmUI
{
///
/// 导出 分析系数
///
public partial class ExportModelAnalysisFactorHelper
{
public class ModelDiffViewModel
{
public string Time { get; set; }
public string MonitorID { get; set; }
public string ModelID { get; set; }
public string Type { get; set; }
public double ModelValue { get; set; }
public double MonitorValue { get; set; }
public double DiffVlaue { get; set; }
public int? Flag { get; set; }
public double? Hz { get; set; }
public double? Hz0 { get; set; }
}
///
/// 分析系数
///
public class AnalysisFactor
{
///
/// 泵标志
///
public int Flag { get; set; }
///
/// 频率
///
public double Hz { get; set; }
///
/// 扬程标准差
///
public double? HeadSTDP { get; set; }
///
/// 扬程偏差
///
public double? HeadDeviation { get; set; }
///
/// 准确度
///
public double Accuracy { get; set; }
}
private static BLL.StationSignalRecordPacket _packet = new BLL.StationSignalRecordPacket();
private static string _model_file = System.IO.Path.Combine(SettingsD.File.RootDirectory, SettingsD.File.DataFolder, "ch2_v3_20240918(Clear).inp");
///
/// 绑定数据
///
public static bool Export(long monitorDataSourcesId, long stationId, int station_index, string name)
{
var eq_list = new BLL.Equipment().GetPumpListByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId);
if (eq_list == null || !eq_list.Any())
{
return default;
}
var flag_pump_dict = eq_list.ToDictionary(x => x.SortCode, x => x.RatedParas);
var flag_curve_dict = new Dictionary();
var bll_curve = new BLL.PumpCurve();
foreach (var pump in eq_list)
{
Model.CurveExpress qh = null;
var curve_info = bll_curve.GetDefaultWorkingByPumpID(pump.ID)?.CurveInfo;
if (curve_info != null)
{
qh = curve_info.CurveQH;
}
flag_curve_dict.Add(pump.SortCode, qh);
}
if (flag_curve_dict == null || !flag_curve_dict.Any())
{
return default;
}
var all_list = Get(monitorDataSourcesId, stationId, station_index, 300);
if (all_list == null || !all_list.Any())
return default;
var pressure_id_mapping_dict = GetPumpPressureIdMappingDict(station_index);
var flow_id_mapping_dict = GetPumpFlowIdMappingDict(station_index);
var pump_id_mapping_dict = GetPumpIdMappingDict(station_index);
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 vm_list = new List();
var model_id_build = new StringBuilder(31);
foreach (var tuple in all_list)
{
var time = tuple.Item1.ToString("G");
var pattern_dict = tuple.Item2;
var scada_dict = tuple.Item3;
var pump_dict = tuple.Item4;
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;
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);
EpanetMethods.ENgetcount(CountType.Link, out int link_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 (pressure_id_mapping_dict.ContainsKey(model_id))
{
var scada_id = pressure_id_mapping_dict[model_id];
double? hz = null, hzr = null;
int? flag = null;
if (pump_dict.ContainsKey(scada_id))
{
if (!(pump_dict[scada_id] > 0))
{
continue;
}
hz = pump_dict[scada_id] * 50;
hz = Math.Round(hz.Value, 2);
hzr = Math.Round(hz.Value);
flag = pump_id_mapping_dict[model_id];
}
EpanetMethods.ENgetnodevalue(node_index, NodeValue.Head, out float model_head);
var scada_value = scada_dict[scada_id];
var vm = new ModelDiffViewModel();
vm.Time = time;
vm.MonitorID = scada_id;
vm.ModelID = model_id;
vm.ModelValue = model_head;
vm.MonitorValue = scada_value;
vm.DiffVlaue = scada_value - model_head;
vm.Type = "压力";
vm.Hz = hz;
vm.Hz0 = hzr;
vm.Flag = flag;
if (Math.Round(vm.DiffVlaue) > 100)
{
continue;
}
vm_list.Add(vm);
}
}
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];
double? hz = null, hzr = null;
int? flag = null;
if (pump_dict.ContainsKey(scada_id))
{
if (!(pump_dict[scada_id] > 0))
{
continue;
}
hz = pump_dict[scada_id] * 50;
hz = Math.Round(hz.Value, 2);
hzr = Math.Round(hz.Value);
flag = pump_id_mapping_dict[model_id];
}
EpanetMethods.ENgetlinkvalue(link_index, LinkValue.Flow, out float model_value);
model_value = Math.Abs(model_value);
var scada_value = scada_dict[scada_id];
var vm = new ModelDiffViewModel();
vm.Time = time;
vm.MonitorID = scada_id;
vm.ModelID = model_id;
vm.ModelValue = model_value;
vm.MonitorValue = scada_value;
vm.DiffVlaue = scada_value - model_value;
vm.Type = "流量";
vm.Hz = hz;
vm.Hz0 = hzr;
vm.Flag = flag;
vm_list.Add(vm);
}
EpanetMethods.ENgetlinktype(link_index, out LinkType linkType);
if (linkType == LinkType.Pump)
{
EpanetMethods.ENgetlinkvalue(link_index, LinkValue.InitStatus, out float on_off);
}
}
}
EpanetMethods.ENcloseH();
EpanetMethods.ENclose();
if (!vm_list.Any())
return default;
var analysis_facotr_list = new List();
var group_by_flag_hz = vm_list.Where(x => x.Type == "压力" && x.Flag.HasValue).GroupBy(x => new { x.Flag, x.Hz0 });
foreach (var flag_item in group_by_flag_hz)
{
var hz = flag_item.Key.Hz0.Value;
if (hz < 20)
{
continue;
}
var flag = flag_item.Key.Flag.Value;
var pump = flag_pump_dict[flag];
var qh = flag_curve_dict[flag];
var head_diff_list = flag_item.Select(x => x.DiffVlaue).ToList();
double head_diff_avg = 0d, std_dev_pop = 0d, std_dev_pop_head_avg = 0d;
var filter_std_dev_pop_tuple = FilterBySTDP(head_diff_list.ToArray(), 0.3, 0);
var filter_std_dev_pop_array = filter_std_dev_pop_tuple.Item1;
std_dev_pop = filter_std_dev_pop_tuple.Item2;
std_dev_pop_head_avg = filter_std_dev_pop_array.Average();
head_diff_avg = std_dev_pop_head_avg;
if (Math.Abs(head_diff_avg) > 5)
{
continue;
}
if (std_dev_pop > 1)
{
continue;
}
if (std_dev_pop > 0.5 && flag_item.Count() < 5)
{
continue;
}
var analysis_facotr = new AnalysisFactor();
analysis_facotr.Flag = flag;
analysis_facotr.Hz = hz;
analysis_facotr.HeadSTDP = std_dev_pop;
analysis_facotr.HeadDeviation = std_dev_pop_head_avg;
analysis_facotr.Accuracy = 0;
analysis_facotr_list.Add(analysis_facotr);
}
analysis_facotr_list = analysis_facotr_list.OrderBy(x => x.Flag).ThenBy(x => x.Hz).ToList();
var flag_range5_hz_factor_dict = new Dictionary>>();
var group_by_flag = vm_list.Where(x => x.Type == "压力" && x.Flag.HasValue).GroupBy(x => x.Flag);
foreach (var flag_item in group_by_flag)
{
var flag = flag_item.Key.Value;
var pump = flag_pump_dict[flag];
var qh = flag_curve_dict[flag];
if (!pump.IsBp)
{
continue;
}
flag_range5_hz_factor_dict.Add(flag, new Dictionary>());
for (double i = 5; i <= 50; i += 5)
{
var min_hz = i - 5;
double max_hz = i;
var list = flag_item.Where(x => x.Hz >= min_hz && x.Hz <= max_hz).ToList();
if (list == null || list.Count() < 5)
continue;
var head_diff_list = list.Select(x => x.DiffVlaue).ToList();
double std_dev_pop = 0d, std_dev_pop_head_avg = 0d;
var filter_tuple = FilterBySTDP(head_diff_list.ToArray(), 0.3, 0);
var filter_array = filter_tuple.Item1;
std_dev_pop = filter_tuple.Item2;
std_dev_pop_head_avg = filter_array.Average();
flag_range5_hz_factor_dict[flag].Add(max_hz, new Tuple(std_dev_pop, std_dev_pop_head_avg, filter_array.Count()));
}
}
var not_hz_list = new List();
foreach (var eq in eq_list)
{
var flag = eq.SortCode;
var pump = flag_pump_dict[flag];
if (!pump.IsBp)
{
continue;
}
var qh = flag_curve_dict[flag];
var dict_item = flag_range5_hz_factor_dict[flag];
for (int hz = 1; hz <= 50; hz++)
{
if (analysis_facotr_list.Exists(x => x.Flag == flag && x.Hz == hz))
{
continue;
}
var num = hz / 5;
var hz_key = (num + 1) * 5;
if (hz_key > 50)
hz_key = 50;
if (dict_item.ContainsKey(hz_key))
{
var tuple = dict_item[hz_key];
var analysis_facotr = new AnalysisFactor();
analysis_facotr.Flag = flag;
analysis_facotr.Hz = hz;
analysis_facotr.HeadSTDP = tuple.Item1;
analysis_facotr.HeadDeviation = tuple.Item2;
analysis_facotr.Accuracy = 0;
not_hz_list.Add(analysis_facotr);
}
else
{
var key_list = dict_item.Select(x => x.Key).ToList();
var key = key_list.Where(x => x >= hz_key)?.OrderBy(x => x).FirstOrDefault();
if (key == null)
{
key = key_list.OrderByDescending(x => x).FirstOrDefault();
}
if (key == null)
{
throw new Exception("error");
}
var tuple = dict_item[key.Value];
double ratio = hz / key.Value;
double head_dev = tuple.Item2 * ratio;
double head_stdp = tuple.Item1 * ratio;
var analysis_facotr = new AnalysisFactor();
analysis_facotr.Flag = flag;
analysis_facotr.Hz = hz;
analysis_facotr.HeadSTDP = head_stdp;
analysis_facotr.HeadDeviation = head_dev;
analysis_facotr.Accuracy = -1;
not_hz_list.Add(analysis_facotr);
}
}
}
var analysis_factor_list = new List();
analysis_factor_list.AddRange(analysis_facotr_list);
analysis_factor_list.AddRange(not_hz_list);
var root_folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "分析系数");
if (!Directory.Exists(root_folder))
{
Directory.CreateDirectory(root_folder);
}
var fileName = root_folder + "\\" + name + ".json";
var json = JsonHelper.Object2Json(analysis_factor_list);
File.WriteAllText(fileName, json);
return true;
}
#region Function
private static List, Dictionary, Dictionary>> Get(long monitorDataSourcesId, long stationId, int station_index, int timeStep = 300)
{
var bllSummary = new BLL.MonitorDataSetSummary();
var yearMonths = bllSummary.GetYearMonth(monitorDataSourcesId);
if (yearMonths == null || !yearMonths.Any())
{
return default;
}
var bllEquipment = new BLL.Equipment();
var enginePumps = bllEquipment.GetEnginePumpListByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId);
if (enginePumps == null || !enginePumps.Any())
return default;
var bllMonitorPoint = new BLL.MonitorPoint();
var bllEquipmentMonitorMapping = new BLL.EquipmentMonitorMapping();
var bllMonitorDataSet = new BLL.MonitorDataSet();
var pumpParasDict = new Dictionary();
var pumpMonitorPointDict = new Dictionary>();
var stationMonitorPointList = new List();
var signalIds = new List();
foreach (var enginePump in enginePumps)
{
var pump = bllEquipment.GetChildPumpByEnginePumpID(enginePump.ID);
if (pump == null)
continue;
var equipmentMonitorMappings = bllEquipmentMonitorMapping.GetByEquipmentID(enginePump.ID);
if (equipmentMonitorMappings == null || !equipmentMonitorMappings.Any())
continue;
var monitorPointIds = equipmentMonitorMappings.Select(x => x.MonitorPointID).ToList();
var monitorPoints = bllMonitorPoint.GetExSignalWithSignalTypeByIds(monitorPointIds);
monitorPoints = monitorPoints?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList();
monitorPoints = monitorPoints?.Where(x => x.SignalType != IStation.SignalType.频率).ToList();
monitorPoints = monitorPoints?.Where(x => x.Flags != null && !x.Flags.Contains(Flags.总站)).ToList();
if (monitorPoints == null || !monitorPoints.Any())
continue;
pumpParasDict.Add(enginePump.SortCode, pump.RatedParas);
pumpMonitorPointDict.Add(enginePump.SortCode, monitorPoints);
signalIds.AddRange(monitorPoints.Select(x => x.SignalID));
}
var monitorPoints_station = bllMonitorPoint.GetExSignalWithSignalTypeByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId);
monitorPoints_station = monitorPoints_station?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList();
stationMonitorPointList = monitorPoints_station?
.Where(x => x.Flags != null && x.Flags.Contains(IStation.Flags.总站)).ToList();
if (stationMonitorPointList != null && stationMonitorPointList.Any())
{
signalIds.AddRange(stationMonitorPointList.Select(x => x.SignalID));
}
signalIds = signalIds.Distinct().ToList();
var pressure_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.压力).ToList();
var flow_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.瞬时流量).ToList();
var list = new List, Dictionary, Dictionary>>();
foreach (var yearMonth in yearMonths)
{
var year = yearMonth.Year;
var month = yearMonth.Month;
var summaries = bllSummary.GetAllByDate(monitorDataSourcesId, year, month);
if (summaries == null || !summaries.Any())
return default;
var minTime = summaries.Min(x => x.MinTime);
var maxTime = summaries.Max(x => x.MaxTime);
var totalSeconds = (int)(maxTime - minTime).TotalSeconds;
var startDay = minTime;//.AddDays(1);
var days = (maxTime - minTime).Days;
var capacity = _packet.CalcuCapacity(days, timeStep);// 每个月的数据量
var findIndexDict = new Dictionary();// 查找数据下标
var recordDict = new Dictionary();// 数据字典
signalIds.ForEach(x =>
{
findIndexDict.Add(x, 0);
recordDict.Add(x, IStation.Error.Default);
});
var signalRecordPackets = bllMonitorDataSet.GetSignalRecordPacket(monitorDataSourcesId, signalIds, year, month);
if (signalRecordPackets == null || !signalRecordPackets.Any())
return default;
//按天整理数据
for (int i = 0; i <= days; i++)
{
var day = startDay.AddDays(i);
//分割步长
for (int seconds = 0; seconds < _packet.TotalSecondsOfDay; seconds += timeStep) //00点的数据不要
{
var realTime = day.AddSeconds(seconds);
_packet.GetRecordDict(realTime, signalRecordPackets, findIndexDict, recordDict, timeStep, out bool existRecord);
if (!existRecord)
continue;
var timeValue = new ExportEpanetHelper.TimeValue
{
Time = realTime,
Value = new Dictionary()
};
if (stationMonitorPointList != null && stationMonitorPointList.Any())
{
foreach (var stationMonitorPoint in stationMonitorPointList)
{
var time = realTime;
var value = recordDict[stationMonitorPoint.SignalID];
if (stationMonitorPoint.SignalType == IStation.SignalType.压力)
{
value = Model.CurveCalcuHelper.Mpa2M(value);
}
else if (stationMonitorPoint.SignalType == IStation.SignalType.瞬时流量)
{
value = value < 0 ? 0 : value;
}
timeValue.Value.Add(stationMonitorPoint.TagName, value);
}
}
foreach (var pumpMonitorPointItem in pumpMonitorPointDict)
{
var key = pumpMonitorPointItem.Key;
var pumpParas = pumpParasDict[key];
var pumpMonitorPointList = pumpMonitorPointItem.Value;
foreach (var pumpMonitorPoint in pumpMonitorPointList)
{
var time = realTime;
var value = recordDict[pumpMonitorPoint.SignalID];
if (pumpMonitorPoint.SignalType == IStation.SignalType.转速)
{
value = value / pumpParas.Nr;
value = value < 0 ? 0 : value;
value = value > 1 ? 1 : value;
}
else if (pumpMonitorPoint.SignalType == IStation.SignalType.频率)
{
value = value / 50;
value = value < 0 ? 0 : value;
value = value > 1 ? 1 : value;
}
else if (pumpMonitorPoint.SignalType == IStation.SignalType.压力)
{
value = Model.CurveCalcuHelper.Mpa2M(value);
}
else if (pumpMonitorPoint.SignalType == IStation.SignalType.瞬时流量)
{
value = value < 0 ? 0 : value;
}
timeValue.Value.Add(pumpMonitorPoint.TagName, value);
}
}
if (station_index == 1)
{
list.Add(GetStation1(realTime, timeValue.Value));
}
else
{
list.Add(GetStation2(realTime, timeValue.Value));
}
}
}
}
return list;
}
private static Tuple, Dictionary, Dictionary> GetStation1(DateTime dateTime, Dictionary time_dict)
{
var pattern_dict = new Dictionary();
var scada_dict = new Dictionary();
var pump_dict = new Dictionary();
var limited_speed_ratio = 0.1;
var Pump11 = time_dict["Pump11"];
var Pump12 = time_dict["Pump12"];
var Pump13 = time_dict["Pump13"];
var Pump14 = time_dict["Pump14"];
var Pump15 = time_dict["Pump15"];
var Pump16 = time_dict["Pump16"];
var Pump17 = time_dict["Pump17"];
var Pump18 = time_dict["Pump18"];
Pump11 = Pump11 < limited_speed_ratio ? 0 : Pump11;
Pump12 = Pump12 < limited_speed_ratio ? 0 : Pump12;
Pump13 = Pump13 < limited_speed_ratio ? 0 : Pump13;
Pump14 = Pump14 < limited_speed_ratio ? 0 : Pump14;
Pump15 = Pump15 < limited_speed_ratio ? 0 : Pump15;
Pump16 = Pump16 < limited_speed_ratio ? 0 : Pump16;
Pump17 = Pump17 < limited_speed_ratio ? 0 : Pump17;
Pump18 = Pump18 < limited_speed_ratio ? 0 : Pump18;
pattern_dict.Add("R1", new float[] { (float)time_dict["R1"] });
pattern_dict.Add("R2", new float[] { (float)time_dict["R2"] });
pattern_dict.Add("R3", new float[] { (float)time_dict["R3"] });
pattern_dict.Add("SFJD1", new float[] { (float)time_dict["SFJD1"] });
pattern_dict.Add("SFJD2", new float[] { (float)time_dict["SFJD2"] });
pattern_dict.Add("SFJD3", new float[] { (float)time_dict["SFJD3"] });
pattern_dict.Add("Pump11", new float[] { (float)Pump11 });
pattern_dict.Add("Pump12", new float[] { (float)Pump12 });
pattern_dict.Add("Pump13", new float[] { (float)Pump13 });
pattern_dict.Add("Pump14", new float[] { (float)Pump14 });
pattern_dict.Add("Pump15", new float[] { (float)Pump15 });
pattern_dict.Add("Pump16", new float[] { (float)Pump16 });
pattern_dict.Add("Pump17", new float[] { (float)Pump17 });
pattern_dict.Add("Pump18", new float[] { (float)Pump18 });
scada_dict.Add("SPJD1", time_dict["SPJD1"]);
scada_dict.Add("SPJD2", time_dict["SPJD2"]);
scada_dict.Add("SPJD3", time_dict["SPJD3"]);
scada_dict.Add("SFJD1", time_dict["SFJD1"]);
scada_dict.Add("SFJD2", time_dict["SFJD2"]);
scada_dict.Add("SFJD3", time_dict["SFJD3"]);
scada_dict.Add("SPPump11", time_dict["SPPump11"]);
scada_dict.Add("SPPump12", time_dict["SPPump12"]);
scada_dict.Add("SPPump13", time_dict["SPPump13"]);
scada_dict.Add("SPPump14", time_dict["SPPump14"]);
scada_dict.Add("SPPump15", time_dict["SPPump15"]);
scada_dict.Add("SPPump16", time_dict["SPPump16"]);
scada_dict.Add("SPPump17", time_dict["SPPump17"]);
scada_dict.Add("SPPump18", time_dict["SPPump18"]);
pump_dict.Add("SPPump11", Pump11);
pump_dict.Add("SPPump12", Pump12);
pump_dict.Add("SPPump13", Pump13);
pump_dict.Add("SPPump14", Pump14);
pump_dict.Add("SPPump15", Pump15);
pump_dict.Add("SPPump16", Pump16);
pump_dict.Add("SPPump17", Pump17);
pump_dict.Add("SPPump18", Pump18);
return new Tuple, Dictionary, Dictionary>(dateTime, pattern_dict, scada_dict, pump_dict);
}
private static Tuple, Dictionary, Dictionary> GetStation2(DateTime dateTime, Dictionary time_dict)
{
var pattern_dict = new Dictionary();
var scada_dict = new Dictionary();
var pump_dict = new Dictionary();
var limited_speed_ratio = 0.1;
var Pump21 = time_dict["Pump21"];
var Pump22 = time_dict["Pump22"];
var Pump23 = time_dict["Pump23"];
var Pump24 = time_dict["Pump24"];
var Pump25 = time_dict["Pump25"];
var Pump26 = time_dict["Pump26"];
var Pump27 = time_dict["Pump27"];
Pump21 = Pump21 < limited_speed_ratio ? 0 : Pump21;
Pump22 = Pump22 < limited_speed_ratio ? 0 : Pump22;
Pump23 = Pump23 < limited_speed_ratio ? 0 : Pump23;
Pump24 = Pump24 < limited_speed_ratio ? 0 : Pump24;
Pump25 = Pump25 < limited_speed_ratio ? 0 : Pump25;
Pump26 = Pump26 < limited_speed_ratio ? 0 : Pump26;
Pump27 = Pump27 < limited_speed_ratio ? 0 : Pump27;
pattern_dict.Add("RPump21", new float[] { (float)time_dict["RPump21"] });
pattern_dict.Add("RPump22", new float[] { (float)time_dict["RPump22"] });
pattern_dict.Add("RPump23", new float[] { (float)time_dict["RPump23"] });
pattern_dict.Add("RPump24", new float[] { (float)time_dict["RPump24"] });
pattern_dict.Add("RPump25", new float[] { (float)time_dict["RPump25"] });
pattern_dict.Add("RPump26", new float[] { (float)time_dict["RPump26"] });
pattern_dict.Add("RPump27", new float[] { (float)time_dict["RPump27"] });
pattern_dict.Add("SFDN2400", new float[] { (float)time_dict["SFDN2400"] });
pattern_dict.Add("SFDN2700", new float[] { (float)time_dict["SFDN2700"] });
pattern_dict.Add("SFPump21", new float[] { (float)time_dict["SFPump21"] });
pattern_dict.Add("SFPump22", new float[] { (float)time_dict["SFPump22"] });
pattern_dict.Add("SFPump23", new float[] { (float)time_dict["SFPump23"] });
pattern_dict.Add("SFPump24", new float[] { (float)time_dict["SFPump24"] });
pattern_dict.Add("SFPump25", new float[] { (float)time_dict["SFPump25"] });
pattern_dict.Add("SFPump26", new float[] { (float)time_dict["SFPump26"] });
pattern_dict.Add("SFPump27", new float[] { (float)time_dict["SFPump27"] });
pattern_dict.Add("Pump21", new float[] { (float)Pump21 });
pattern_dict.Add("Pump22", new float[] { (float)Pump22 });
pattern_dict.Add("Pump23", new float[] { (float)Pump23 });
pattern_dict.Add("Pump24", new float[] { (float)Pump24 });
pattern_dict.Add("Pump25", new float[] { (float)Pump25 });
pattern_dict.Add("Pump26", new float[] { (float)Pump26 });
pattern_dict.Add("Pump27", new float[] { (float)(double)time_dict["Pump27"] });
scada_dict.Add("SPDN2400", time_dict["SPDN2400"]);
scada_dict.Add("SPDN2700", time_dict["SPDN2700"]);
scada_dict.Add("SPPump21", time_dict["SPPump21"]);
scada_dict.Add("SPPump22", time_dict["SPPump22"]);
scada_dict.Add("SPPump23", time_dict["SPPump23"]);
scada_dict.Add("SPPump24", time_dict["SPPump24"]);
scada_dict.Add("SPPump25", time_dict["SPPump25"]);
scada_dict.Add("SPPump26", time_dict["SPPump26"]);
scada_dict.Add("SPPump27", time_dict["SPPump27"]);
scada_dict.Add("SFDN2400", time_dict["SFDN2400"]);
scada_dict.Add("SFDN2700", time_dict["SFDN2700"]);
//scada_dict.Add("SFPump21", time_dict["SFPump21"]);
//scada_dict.Add("SFPump22", time_dict["SFPump22"]);
//scada_dict.Add("SFPump23", time_dict["SFPump23"]);
//scada_dict.Add("SFPump24", time_dict["SFPump24"]);
//scada_dict.Add("SFPump25", time_dict["SFPump25"]);
//scada_dict.Add("SFPump26", time_dict["SFPump26"]);
//scada_dict.Add("SFPump27", time_dict["SFPump27"]);
pump_dict.Add("SPPump21", Pump21);
pump_dict.Add("SPPump22", Pump22);
pump_dict.Add("SPPump23", Pump23);
pump_dict.Add("SPPump24", Pump24);
pump_dict.Add("SPPump25", Pump25);
pump_dict.Add("SPPump26", Pump26);
pump_dict.Add("SPPump27", Pump27);
pump_dict.Add("SFPump21", Pump21);
pump_dict.Add("SFPump22", Pump22);
pump_dict.Add("SFPump23", Pump23);
pump_dict.Add("SFPump24", Pump24);
pump_dict.Add("SFPump25", Pump25);
pump_dict.Add("SFPump26", Pump26);
pump_dict.Add("SFPump27", Pump27);
return new Tuple, Dictionary, Dictionary>(dateTime, pattern_dict, scada_dict, pump_dict);
}
private static Dictionary GetPumpPressureIdMappingDict(int station_index)
{
var dict = new Dictionary();
if (station_index == 1)
{
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"},
};
}
else
{
dict = new Dictionary()
{
{"Jdn2400","SPDN2400"},
{"Jdn2700","SPDN2700"},
{"Jpump21","SPPump21"},
{"Jpump22","SPPump22"},
{"Jpump23","SPPump23"},
{"Jpump24","SPPump24"},
{"Jpump25","SPPump25"},
{"Jpump26","SPPump26"},
{"Jpump27","SPPump27"}
};
}
return dict;
}
private static Dictionary GetPumpFlowIdMappingDict(int station_index)
{
var dict = new Dictionary();
if (station_index == 1)
{
dict = new Dictionary()
{
{ "Pjd1", "SFJD1"},
{ "Pjd2", "SFJD2"},
{ "Pjd3", "SFJD3"},
};
}
else
{
dict = new Dictionary()
{
{ "Pdn2400", "SFDN2400"},
{ "Pdn2700", "SFDN2700"},
//{ "Ppump21", "SFPump21"},
//{ "Ppump22", "SFPump22"},
//{ "Ppump23", "SFPump23"},
//{ "Ppump24", "SFPump24"},
//{ "Ppump25", "SFPump25"},
//{ "Ppump26", "SFPump26"},
//{ "Ppump27", "SFPump27"}
};
}
return dict;
}
private static Dictionary GetPumpIdMappingDict(int station_index)
{
var dict = new Dictionary();
if (station_index == 1)
{
dict = new Dictionary()
{
{"Jpump11",GlobalHelper.Flag11},
{"Jpump12",GlobalHelper.Flag12},
{"Jpump13",GlobalHelper.Flag13},
{"Jpump14",GlobalHelper.Flag14},
{"Jpump15",GlobalHelper.Flag15},
{"Jpump16",GlobalHelper.Flag16},
{"Jpump17",GlobalHelper.Flag17},
{"Jpump18",GlobalHelper.Flag18},
};
}
else
{
dict = new Dictionary()
{
{ "Ppump21", GlobalHelper.Flag21},
{ "Ppump22", GlobalHelper.Flag22},
{ "Ppump23", GlobalHelper.Flag23},
{ "Ppump24", GlobalHelper.Flag24},
{ "Ppump25", GlobalHelper.Flag25},
{ "Ppump26", GlobalHelper.Flag26},
{ "Ppump27", GlobalHelper.Flag27},
{"Jpump21",GlobalHelper.Flag21},
{"Jpump22",GlobalHelper.Flag22},
{"Jpump23",GlobalHelper.Flag23},
{"Jpump24",GlobalHelper.Flag24},
{"Jpump25",GlobalHelper.Flag25},
{"Jpump26",GlobalHelper.Flag26},
{"Jpump27",GlobalHelper.Flag27}
};
}
return dict;
}
private static Tuple FilterBySTDP(double[] array, double min_dev, int count)
{
if (array == null || !array.Any())
{
return default;
}
var array_avg = array.Average();
var array_count = array.Count();
FilterOutliersHelper.STDEV(array, out double std_dev, out double std_dev_pop);
if (Math.Abs(std_dev_pop) < min_dev)
{
return new Tuple(array, std_dev_pop);
}
if (count > 5)
{
return new Tuple(array, std_dev_pop);
}
var filter_array = array.Where(x => !(Math.Abs(x - array_avg) > Math.Abs(std_dev_pop * 2))).ToArray();
if (filter_array == null || !filter_array.Any())
{
return default;
}
count++;
return FilterBySTDP(filter_array, min_dev, count);
}
#endregion
}
}