using IStation.Model;
|
using System.ComponentModel.DataAnnotations;
|
|
namespace IStation.Test
|
{
|
/// <summary>
|
/// 数据导入
|
/// 根据3倍标准差粗过滤异常数据
|
/// 再用数据用1hz分类,调用修正算法更新出最新的曲线
|
/// 缺失的频率向上取最近的hz相似换算下去
|
/// 现场调度用更新后的曲线调度
|
/// </summary>
|
public class Station2Helper
|
{
|
/// <summary>
|
/// 绑定数据
|
/// </summary>
|
public static void Start()
|
{
|
var projectId = 661070185922629;
|
IStation.SettingsD.Project.ID = projectId;
|
var monitorDataSourcesId = 663976941449285;//2024-202504
|
var stationIndex = 2;
|
var stationId = 462958422204485;
|
var dtStart = new DateTime(2024, 1, 1);
|
var dtEnd = new DateTime(2025, 1, 1);
|
|
var bll = new BLL.StationSignalRecordPacket();
|
var bllEquipment = new BLL.Equipment();
|
var bllCurve = new BLL.PumpCurve();
|
|
|
var pumpList = bllEquipment.GetPumpListByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId);
|
var flagList = pumpList.Select(x => x.SortCode).OrderBy(x => x).ToList();
|
var flagPumpDict = pumpList.ToDictionary(x => x.SortCode, x => x.RatedParas);
|
var flagQhCurveDict = new Dictionary<int, Model.CurveExpress>();
|
|
foreach (var pump in pumpList)
|
{
|
Model.CurveExpress qh = null;
|
var curveInfo = bllCurve.GetDefaultWorkingByPumpID(pump.ID)?.CurveInfo;
|
if (curveInfo?.CurveQH != null)
|
{
|
qh = curveInfo.CurveQH;
|
}
|
flagQhCurveDict.Add(pump.SortCode, qh);
|
}
|
|
var pipe_flow_id_list = GlobalHelperW.GetPipeFlowIdList(stationIndex);
|
var pipe_pressure_id_list = GlobalHelperW.GetPipePressureIdList(stationIndex);
|
|
var packet_list = bll.Get(monitorDataSourcesId, stationId);
|
|
var allStationRecordList = packet_list.SelectMany(x => x.StationSignalRecords).ToList();
|
Console.WriteLine($"泵站总数:{allStationRecordList.Count}");
|
var stationRecordList = DynamicThresholdProcessorHelper.Filter(allStationRecordList);
|
Console.WriteLine($"泵站总数:{stationRecordList.Count} 过滤:{allStationRecordList.Count - stationRecordList.Count}");
|
var stationRecordList2 = stationRecordList.Where(x =>
|
{
|
var model_record_dict = x.ModelRecordDict;
|
foreach (var id in pipe_flow_id_list)
|
{
|
if (model_record_dict[id] < 1)
|
{
|
return false;
|
}
|
}
|
foreach (var id in pipe_pressure_id_list)
|
{
|
var value = model_record_dict[id];
|
if (value < 1 || value > 40)
|
{
|
return false;
|
}
|
}
|
return true;
|
}).ToList();
|
|
Console.WriteLine($"泵站总数:{stationRecordList2.Count} 二次过滤:{allStationRecordList.Count - stationRecordList2.Count}");
|
var allPumpRecordList = stationRecordList2.SelectMany(x => x.PumpSignalRecords).ToList();
|
Console.WriteLine($"泵总数:{allPumpRecordList.Count}");
|
|
var fullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "pumpcsv");
|
if (Directory.Exists(fullPath))
|
{
|
Directory.Delete(fullPath, true);
|
}
|
Directory.CreateDirectory(fullPath);
|
|
var allPumpRecordList2 = allPumpRecordList.Where(x =>
|
{
|
if (x.Rpm == IStation.Error.Default || x.Head == IStation.Error.Default)
|
{
|
return false;
|
}
|
if (x.FlowRate < 1 || x.FlowRate > 20000)
|
{
|
return false;
|
}
|
return true;
|
}).ToList();
|
Console.WriteLine($"泵总数:{allPumpRecordList2.Count} 过滤:{allPumpRecordList.Count - allPumpRecordList2.Count}");
|
var pumpFlagRecordGroup = allPumpRecordList.OrderBy(x => x.Flag).GroupBy(x => x.Flag);
|
var pumpFlagHzRecordGroup = new Dictionary<(int Flag, int Hz), List<Model.PumpSignalRecord>>();
|
foreach (var pumpFlag in pumpFlagRecordGroup)
|
{
|
var flag = pumpFlag.Key;
|
var pump = flagPumpDict[flag];
|
var pumpQh = flagQhCurveDict[flag];
|
if (!pump.IsBp)
|
{
|
var allFlagHzRecordList = pumpFlag.ToList();
|
if (allFlagHzRecordList.Count < 30)
|
{
|
Console.WriteLine($"{flag}泵-{50}hz 总数:{allFlagHzRecordList.Count},<5 跳过");
|
}
|
var flagHzRecordList = DynamicThresholdProcessorHelper.Filter(allFlagHzRecordList);
|
Console.WriteLine($"{flag}泵-{50}hz 总数:{allFlagHzRecordList.Count},过滤:{allFlagHzRecordList.Count - flagHzRecordList.Count}");
|
pumpFlagHzRecordGroup.Add((flag, 50), flagHzRecordList);
|
if (flagHzRecordList.Any())
|
{
|
var curvePtList = pumpQh.GetFitPoints(200).Select(x => new CurvePtViewModel(x)).ToList();
|
CsvHelper.ExportToCsv(curvePtList, Path.Combine(fullPath, $"{flag}_{50}_old_curve.csv"));
|
CsvHelper.ExportToCsv(flagHzRecordList, Path.Combine(fullPath, $"{flag}_{50}.csv"));
|
|
var splineX = curvePtList.Select(x => x.X).ToArray();
|
var splineY = curvePtList.Select(x => x.Y).ToArray();
|
var measuredXAll = flagHzRecordList.Select(x => x.FlowRate).ToArray();
|
var measuredYAll = flagHzRecordList.Select(x => x.Head).ToArray();
|
|
//var helper = new PumpCurveDataFusionCorrectorHelper2();
|
//(double[] mergedX, double[] mergedY, double[] optimizedX, double[] optimizedY) = helper.Corrent(splineX, splineY, measuredXAll, measuredYAll);
|
|
//if (optimizedX == null)
|
//{
|
// continue;
|
//}
|
//var optList = new List<CurvePoint>();
|
//for (int i = 0; i < optimizedX.Length; i++)
|
//{
|
// var x = optimizedX[i];
|
// var y = optimizedY[i];
|
// optList.Add(new CurvePoint(x, y));
|
//}
|
|
//CsvHelper.ExportToCsv(optList, Path.Combine(fullPath, $"{flag}_{50}_update_curve.csv"));
|
}
|
}
|
else
|
{
|
var hzGroup = pumpFlag.OrderBy(x => x.Rpm).GroupBy(x =>
|
{
|
return Math.Round(x.Rpm / pump.Nr * 50, 0);
|
});
|
hzGroup = hzGroup.Where(x => x.Key > 10).ToList();
|
foreach (var pumpFlagHz in hzGroup)
|
{
|
var hz = pumpFlagHz.Key;
|
var allFlagHzRecordList = pumpFlagHz.ToList();
|
if (allFlagHzRecordList.Count < 30)
|
{
|
Console.WriteLine($"{flag}泵-{hz}hz 总数:{allFlagHzRecordList.Count},<5 跳过");
|
}
|
var flagHzRecordList = DynamicThresholdProcessorHelper.Filter(allFlagHzRecordList);
|
if (allFlagHzRecordList.Count < 30)
|
{
|
Console.WriteLine($"{flag}泵-{hz}hz 过滤后总数:{allFlagHzRecordList.Count},<5 跳过");
|
}
|
Console.WriteLine($"{flag}泵-{hz}hz 总数:{allFlagHzRecordList.Count},过滤:{allFlagHzRecordList.Count - flagHzRecordList.Count}");
|
pumpFlagHzRecordGroup.Add((flag, (int)hz), flagHzRecordList);
|
if (flagHzRecordList.Any())
|
{
|
var curvePtList = SimilarCalculateHelper.CalculateQH(pumpQh, 50, hz).GetFitPoints(100);
|
CsvHelper.ExportToCsv(curvePtList.Select(x => new CurvePtViewModel(x)).ToList(), Path.Combine(fullPath, $"{flag}_{hz}_old_curve.csv"));
|
CsvHelper.ExportToCsv(flagHzRecordList, Path.Combine(fullPath, $"{flag}_{hz}.csv"));
|
|
|
var splineX = curvePtList.Select(x => x.X).ToArray();
|
var splineY = curvePtList.Select(x => x.Y).ToArray();
|
var measuredXAll = flagHzRecordList.Select(x => x.FlowRate).ToArray();
|
var measuredYAll = flagHzRecordList.Select(x => x.Head).ToArray();
|
|
|
//var helper = new PumpCurveDataFusionCorrectorHelper2();
|
//(double[] mergedX, double[] mergedY, double[] optimizedX, double[] optimizedY) = helper.Corrent(splineX, splineY, measuredXAll, measuredYAll);
|
|
|
//if (optimizedX == null)
|
//{
|
// continue;
|
//}
|
//var optList = new List<CurvePoint>();
|
//for (int i = 0; i < optimizedX.Length; i++)
|
//{
|
// var x = optimizedX[i];
|
// var y = optimizedY[i];
|
// optList.Add(new CurvePoint(x, y));
|
//}
|
|
//CsvHelper.ExportToCsv(optList, Path.Combine(fullPath, $"{flag}_{hz}_update_curve.csv"));
|
}
|
}
|
|
}
|
|
}
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#region ViewModel
|
|
public class CurvePtViewModel
|
{
|
public CurvePtViewModel() { }
|
public CurvePtViewModel(CurvePoint rhs)
|
{
|
X = Math.Round(rhs.X, 6);
|
Y = Math.Round(rhs.Y, 6);
|
}
|
|
|
[Display(Name = "X")]
|
public double X { get; set; }
|
[Display(Name = "Y")]
|
public double Y { get; set; }
|
}
|
|
#endregion
|
}
|