using DevExpress.XtraEditors;
|
using IStation;
|
using System.IO;
|
using System.Text;
|
|
namespace Verify
|
{
|
public partial class VerifyView : DevExpress.XtraEditors.XtraUserControl
|
{
|
public VerifyView()
|
{
|
InitializeComponent();
|
this.treeList1.InitialMultiColSettings();
|
this.gridView2.SetNormalView();
|
this.gridView4.SetNormalView();
|
}
|
|
|
private List<Tuple<long, DateTime, string, bool>> _log_list = null;
|
private List<VerifyViewModel> _verify_vm_list = null;
|
|
private List<IStation.Model.Pump> _pumps = null;
|
private static readonly IStation.Service.Station _service_station = new();
|
private static readonly IStation.Service.ScheduleConfig _service_schedule_config = new();
|
private static readonly IStation.Service.ScheduleRequest _service_schedule_request = new();
|
private static readonly IStation.Service.ScheduleConclusion _service_schedule_conclusion = new();
|
private static readonly IStation.Service.SchedulePump _service_schedule_pump = new();
|
|
public void SetBindingData()
|
{
|
var station_info = _service_station.Get();
|
if (station_info != null)
|
{
|
_pumps = station_info.Station2;
|
}
|
|
//_log_list = LogHelper.Parse();
|
//if (_log_list == null || !_log_list.Any())
|
//{
|
// Clear();
|
// return;
|
//}
|
|
_verify_vm_list = new List<VerifyViewModel>();
|
|
var request_list = _service_schedule_request.GetAll();
|
var conclusion_list = _service_schedule_conclusion.GetAll();
|
var pump_list = _service_schedule_pump.GetAll();
|
if (request_list != null && request_list.Any())
|
{
|
foreach (var rhs in request_list)
|
{
|
var conclusion = conclusion_list?.Find(x => x.RequestID == rhs.ID && x.Station == IStation.eDockingStation.Ch2s);
|
if (conclusion == null)
|
continue;
|
|
var vm = new VerifyViewModel();
|
vm.Time = rhs.ReceptionTime;
|
vm.TargetFlow = rhs.TargetFlow2;
|
vm.TargetHead = Mpa2M(rhs.TargetPressure2);
|
|
var log_list = _log_list?.Where(x => x.Item1 == rhs.ID).ToList();
|
if (log_list == null ||!log_list.Any())
|
continue;
|
var total_flow = 0d;
|
{
|
var scada_str = log_list.Find(x => !x.Item4);
|
if (scada_str == null)
|
continue;
|
GetRealTimeZyScadaList(scada_str.Item3, out List<IStation.Model.ZyScada> zy_scada_list);
|
|
vm.SchedulingScadaList = GetScadaList(zy_scada_list);
|
vm.ScheduleFlow = conclusion.TotalFlow;
|
vm.SchedulePower = conclusion.TotalPower;
|
vm.SchedulePumpList = pump_list?.Where(x => x.RequestID == rhs.ID).ToList();
|
}
|
|
{
|
var real_scada_str = log_list.Find(x => x.Item4);
|
if (real_scada_str == null)
|
continue;
|
GetRealTimeZyScadaList(real_scada_str.Item3, out List<IStation.Model.ZyScada> zy_scada_list);
|
vm.VerifyScadaList = GetScadaList(zy_scada_list);
|
OutValue(
|
zy_scada_list,
|
out double? DN2400Flow,
|
out double? DN2400Head,
|
out double? DN2700Flow,
|
out double? DN2700Head);
|
|
vm.RealDN2400Q = DN2400Flow ?? 0;
|
vm.RealDN2700Q = DN2700Flow ?? 0;
|
vm.RealFlow = (DN2400Flow + DN2700Flow) ?? 0;
|
vm.RealPower = vm.VerifyScadaList?.Sum(x => x.Power) ?? 0;
|
vm.RealDN2400Head = DN2400Head ?? 0;
|
vm.RealDN2700Head = DN2700Head ?? 0;
|
}
|
|
var total_flow_diff = total_flow - vm.RealFlow;
|
|
vm.ScheduleFlowDiff = vm.ScheduleFlow - vm.TargetFlow;
|
vm.RealFlowDiff = vm.RealFlow - vm.TargetFlow;
|
vm.Round();
|
_verify_vm_list.Add(vm);
|
}
|
}
|
|
this.verifyViewModelBindingSource.DataSource = _verify_vm_list;
|
this.verifyViewModelBindingSource.ResetBindings(false);
|
this.treeList1.BestFitColumns();
|
Clear();
|
}
|
|
private bool _use_temp = false;
|
private bool _use_factor = false;
|
|
public void SetUseTempData(bool use)
|
{
|
_use_temp = use;
|
}
|
|
|
public void SetFactor(bool use)
|
{
|
_use_factor = use;
|
}
|
|
|
private void Clear()
|
{
|
this.memoExpand.Text = "";
|
this.pumpScadaViewModelBindingSource.DataSource = new List<PumpScadaViewModel>();
|
this.pumpScheduleViewModelBindingSource.DataSource = new List<PumpScheduleViewModel>();
|
}
|
|
|
#region config
|
|
private void OutValue(List<IStation.Model.ZyScada> zy_scada_list,
|
out double? DN2400Flow,
|
out double? DN2400Head,
|
out double? DN2700Flow,
|
out double? DN2700Head)
|
{
|
DN2400Flow = null;
|
DN2400Head = null;
|
DN2700Flow = null;
|
DN2700Head = null;
|
if (zy_scada_list == null || !zy_scada_list.Any())
|
{
|
return;
|
}
|
|
var zy_scada_dict = zy_scada_list.ToDictionary(x => x.Code, x => x.Value);
|
DN2400Flow = zy_scada_dict[IStation.GlobalHelper.DN2400总管_瞬时流量_长江管网图];
|
DN2400Head = Mpa2M(zy_scada_dict[IStation.GlobalHelper.DN2400_出厂压力_长江管网图] ?? 0);
|
DN2700Flow = zy_scada_dict[IStation.GlobalHelper.DN2700总管_瞬时流量_长江管网图];
|
DN2700Head = Mpa2M(zy_scada_dict[IStation.GlobalHelper.DN2700_出厂压力_长江管网图] ?? 0);
|
}
|
|
private List<PumpScadaViewModel> GetScadaList(
|
List<IStation.Model.ZyScada> zy_scada_list)
|
{
|
if (zy_scada_list == null || !zy_scada_list.Any())
|
{
|
return default;
|
}
|
|
var zy_scada_dict = zy_scada_list.ToDictionary(x => x.Code, x => x.Value);
|
var DN2400Flow = zy_scada_dict[IStation.GlobalHelper.DN2400总管_瞬时流量_长江管网图];
|
var DN2400Pressure = zy_scada_dict[IStation.GlobalHelper.DN2400_出厂压力_长江管网图];
|
var DN2700Flow = zy_scada_dict[IStation.GlobalHelper.DN2700总管_瞬时流量_长江管网图];
|
var DN2700Pressure = zy_scada_dict[IStation.GlobalHelper.DN2700_出厂压力_长江管网图];
|
|
var pump_vm21 = new PumpScadaViewModel();
|
var pump_vm22 = new PumpScadaViewModel();
|
var pump_vm23 = new PumpScadaViewModel();
|
var pump_vm24 = new PumpScadaViewModel();
|
var pump_vm25 = new PumpScadaViewModel();
|
var pump_vm26 = new PumpScadaViewModel();
|
var pump_vm27 = new PumpScadaViewModel();
|
|
pump_vm21.Flag = IStation.GlobalHelper.Flag21;
|
pump_vm22.Flag = IStation.GlobalHelper.Flag22;
|
pump_vm23.Flag = IStation.GlobalHelper.Flag23;
|
pump_vm24.Flag = IStation.GlobalHelper.Flag24;
|
pump_vm25.Flag = IStation.GlobalHelper.Flag25;
|
pump_vm26.Flag = IStation.GlobalHelper.Flag26;
|
pump_vm27.Flag = IStation.GlobalHelper.Flag27;
|
|
pump_vm21.RunStatus = zy_scada_dict[IStation.GlobalHelper.二输21泵_运行状态];
|
pump_vm22.RunStatus = zy_scada_dict[IStation.GlobalHelper.二输22泵_运行状态];
|
pump_vm23.RunStatus = zy_scada_dict[IStation.GlobalHelper.二输23泵_运行状态];
|
pump_vm24.RunStatus = zy_scada_dict[IStation.GlobalHelper.二输24泵_运行状态];
|
pump_vm25.RunStatus = zy_scada_dict[IStation.GlobalHelper.二输25泵_运行状态];
|
pump_vm26.RunStatus = zy_scada_dict[IStation.GlobalHelper.二输26泵_运行状态];
|
pump_vm27.RunStatus = zy_scada_dict[IStation.GlobalHelper.二输27泵_运行状态];
|
pump_vm21.WL = zy_scada_dict[IStation.GlobalHelper.二输21泵_泵井液位];
|
pump_vm22.WL = zy_scada_dict[IStation.GlobalHelper.二输22泵_泵井液位];
|
pump_vm23.WL = zy_scada_dict[IStation.GlobalHelper.二输23泵_泵井液位];
|
pump_vm24.WL = zy_scada_dict[IStation.GlobalHelper.二输24泵_泵井液位];
|
pump_vm25.WL = zy_scada_dict[IStation.GlobalHelper.二输25泵_泵井液位];
|
pump_vm26.WL = zy_scada_dict[IStation.GlobalHelper.二输26泵_泵井液位];
|
pump_vm27.WL = zy_scada_dict[IStation.GlobalHelper.二输27泵_泵井液位];
|
|
|
pump_vm21.Head = Mpa2M(zy_scada_dict[IStation.GlobalHelper.二输21泵_出水压力] ?? 0);
|
pump_vm22.Head = Mpa2M(zy_scada_dict[IStation.GlobalHelper.二输22泵_出水压力] ?? 0);
|
pump_vm23.Head = Mpa2M(zy_scada_dict[IStation.GlobalHelper.二输23泵_出水压力] ?? 0);
|
pump_vm24.Head = Mpa2M(zy_scada_dict[IStation.GlobalHelper.二输24泵_出水压力] ?? 0);
|
pump_vm25.Head = Mpa2M(zy_scada_dict[IStation.GlobalHelper.二输25泵_出水压力] ?? 0);
|
pump_vm26.Head = Mpa2M(zy_scada_dict[IStation.GlobalHelper.二输26泵_出水压力] ?? 0);
|
pump_vm27.Head = Mpa2M(zy_scada_dict[IStation.GlobalHelper.二输27泵_出水压力] ?? 0);
|
|
|
pump_vm21.Power = zy_scada_dict[IStation.GlobalHelper.二输21泵_有功功率];
|
pump_vm22.Power = zy_scada_dict[IStation.GlobalHelper.二输22泵_有功功率];
|
pump_vm23.Power = zy_scada_dict[IStation.GlobalHelper.二输23泵_有功功率];
|
pump_vm24.Power = zy_scada_dict[IStation.GlobalHelper.二输24泵_有功功率];
|
pump_vm25.Power = zy_scada_dict[IStation.GlobalHelper.二输25泵_有功功率];
|
pump_vm26.Power = zy_scada_dict[IStation.GlobalHelper.二输26泵_有功功率];
|
pump_vm27.Power = zy_scada_dict[IStation.GlobalHelper.二输27泵_有功功率];
|
|
pump_vm21.Flow = zy_scada_dict[IStation.GlobalHelper.二输21泵_瞬时流量];
|
pump_vm22.Flow = zy_scada_dict[IStation.GlobalHelper.二输22泵_瞬时流量];
|
pump_vm23.Flow = zy_scada_dict[IStation.GlobalHelper.二输23泵_瞬时流量];
|
pump_vm24.Flow = zy_scada_dict[IStation.GlobalHelper.二输24泵_瞬时流量];
|
pump_vm25.Flow = zy_scada_dict[IStation.GlobalHelper.二输25泵_瞬时流量];
|
pump_vm26.Flow = zy_scada_dict[IStation.GlobalHelper.二输26泵_瞬时流量];
|
pump_vm27.Flow = zy_scada_dict[IStation.GlobalHelper.二输27泵_瞬时流量];
|
|
pump_vm21.Speed = zy_scada_dict[IStation.GlobalHelper.二输21泵_转速];
|
pump_vm22.Speed = zy_scada_dict[IStation.GlobalHelper.二输22泵_转速];
|
pump_vm23.Speed = zy_scada_dict[IStation.GlobalHelper.二输23泵_转速];
|
pump_vm24.Speed = zy_scada_dict[IStation.GlobalHelper.二输24泵_转速];
|
pump_vm25.Speed = zy_scada_dict[IStation.GlobalHelper.二输25泵_转速];
|
pump_vm26.Speed = zy_scada_dict[IStation.GlobalHelper.二输26泵_转速];
|
pump_vm27.Speed = zy_scada_dict[IStation.GlobalHelper.二输27泵_转速];
|
|
pump_vm21.MaintenanceState = zy_scada_dict[IStation.GlobalHelper.二输21泵_检修状态];
|
pump_vm22.MaintenanceState = zy_scada_dict[IStation.GlobalHelper.二输22泵_检修状态];
|
pump_vm23.MaintenanceState = zy_scada_dict[IStation.GlobalHelper.二输23泵_检修状态];
|
pump_vm24.MaintenanceState = zy_scada_dict[IStation.GlobalHelper.二输24泵_检修状态];
|
pump_vm25.MaintenanceState = zy_scada_dict[IStation.GlobalHelper.二输25泵_检修状态];
|
pump_vm26.MaintenanceState = zy_scada_dict[IStation.GlobalHelper.二输26泵_检修状态];
|
pump_vm27.MaintenanceState = zy_scada_dict[IStation.GlobalHelper.二输27泵_检修状态];
|
|
|
var pump_dict = _pumps.ToDictionary(x=>x.Flag,x=>x);
|
|
pump_vm21.Round();
|
pump_vm22.Round();
|
pump_vm23.Round();
|
pump_vm24.Round();
|
pump_vm25.Round();
|
pump_vm26.Round();
|
pump_vm27.Round();
|
|
pump_vm21.Set(pump_dict[21]);
|
pump_vm22.Set(pump_dict[22]);
|
pump_vm23.Set(pump_dict[23]);
|
pump_vm24.Set(pump_dict[24]);
|
pump_vm25.Set(pump_dict[25]);
|
pump_vm26.Set(pump_dict[26]);
|
pump_vm27.Set(pump_dict[27]);
|
|
|
var pump_scada_list = new List<PumpScadaViewModel>
|
{
|
pump_vm21,
|
pump_vm22,
|
pump_vm23,
|
pump_vm24,
|
pump_vm25,
|
pump_vm26,
|
pump_vm27
|
};
|
|
return pump_scada_list;
|
}
|
|
|
|
/// <summary>
|
/// 获取泵站运行标志列表
|
/// </summary>
|
private void GetStationOpenFlagList(List<PumpScadaViewModel> list2, out List<int> station2_open_flag_list)
|
{
|
station2_open_flag_list = list2?.Where(x => x.RunStatus == 1).Select(x => x.Flag).ToList();
|
}
|
|
/// <summary>
|
/// 获取泵进口水位字典
|
/// </summary>
|
private void GetFlagInletWaterLevelDict(List<PumpScadaViewModel> list2, out Dictionary<int, double> station2_flag_inlet_water_level_dict)
|
{
|
station2_flag_inlet_water_level_dict = list2?.ToDictionary(x => x.Flag, x => x.WL ?? 0);
|
}
|
|
/// <summary>
|
/// 获取泵站检修标志列表(0是正常,1是检修)
|
/// </summary>
|
private void GetStationMaintenanceFlagList(List<PumpScadaViewModel> list2, out List<int> station2_maintenance_flag_list)
|
{
|
station2_maintenance_flag_list = list2?.Where(x => x.MaintenanceState == 1).Select(x => x.Flag).ToList();
|
|
}
|
|
/// <summary>
|
/// 获取组合偏差系数字典
|
/// </summary>
|
/// <param name="flow">总流量</param>
|
/// <param name="flags">组合标志</param>
|
/// <returns></returns>
|
private Dictionary<int, double> GetCombineDeviationFactorDict(double flow, IEnumerable<int> flags)
|
{
|
var deviation_factor_dict = new Dictionary<int, double>();
|
foreach (var flag in flags)
|
{
|
deviation_factor_dict.Add(flag, 0);
|
}
|
|
var analysis_deviation = new IStation.Service.AnalysisDeviation().GetByFlowAndRunFlags(flow, flags);
|
if (analysis_deviation == null)
|
{
|
if (IStation.GlobalHelper.IsStation2(flags))
|
{
|
Yw.LogHelper.Error($"[{Yw.Untity.IntListHelper.ToString(flags)}]组合不存在偏差系数!");
|
}
|
return deviation_factor_dict;
|
}
|
|
foreach (var flag in flags)
|
{
|
var scada_correction_factor = 0d;
|
var model_correction_factor = 0d;
|
var model_correction_factor_use = 0d;
|
|
if (analysis_deviation.CurveDeviation != null && analysis_deviation.CurveDeviation.ContainsKey(flag))
|
{
|
scada_correction_factor = analysis_deviation.CurveDeviation[flag];
|
}
|
if (analysis_deviation.ModelDeviation != null && analysis_deviation.ModelDeviation.ContainsKey(flag))
|
{
|
model_correction_factor = analysis_deviation.ModelDeviation[flag];
|
}
|
if (model_correction_factor < 0)
|
{
|
model_correction_factor_use = Math.Abs(model_correction_factor);
|
}
|
else
|
{
|
model_correction_factor_use = -model_correction_factor;
|
}
|
var correction_factor = scada_correction_factor + model_correction_factor_use;
|
deviation_factor_dict[flag] = correction_factor;
|
}
|
return deviation_factor_dict;
|
}
|
|
|
/// <summary>
|
/// 获取实时众毅Scada数据列表
|
/// </summary>
|
public static string GetRealTimeZyScadaList(string json, out List<IStation.Model.ZyScada> zy_scada_list, bool use_debug = false)
|
{
|
zy_scada_list = new List<IStation.Model.ZyScada>();
|
try
|
{
|
zy_scada_list = Yw.JsonHelper.Json2Object<List<IStation.Model.ZyScada>>(json);
|
}
|
catch (System.Exception ex)
|
{
|
return ex.Message;
|
}
|
if (zy_scada_list == null || !zy_scada_list.Any())
|
{
|
return "zy_scada_list 无数据";
|
}
|
|
return string.Empty;
|
}
|
|
|
|
/// <summary>
|
/// Mpa=>m
|
/// </summary>
|
public double Mpa2M(double mpa)
|
{
|
return mpa * IStation.Curve.Constant.WaterDensity / IStation.Curve.Constant.g;
|
}
|
|
/// <summary>
|
/// m=>Mpa
|
/// </summary>
|
public double M2Mpa(double m)
|
{
|
return m * IStation.Curve.Constant.g / IStation.Curve.Constant.WaterDensity;
|
}
|
|
#endregion
|
|
#region event
|
private void treeList1_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e)
|
{
|
if (e.Column == this.colScheduleFlowDiff || e.Column == this.colRealFlowDiff)
|
{
|
if (e.CellValue != null)
|
{
|
var cell_value = e.CellValue.ToString() ?? string.Empty;
|
if (double.TryParse(cell_value, out double value))
|
{
|
if (value > 0)
|
{
|
e.Appearance.ForeColor = Color.Green;
|
}
|
else
|
{
|
e.Appearance.ForeColor = Color.Red;
|
}
|
}
|
}
|
}
|
}
|
private void gridView4_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
|
{
|
|
if (e.Column == this.colSpeedDiif || e.Column == this.colFlowDiif)
|
{
|
if (e.CellValue != null)
|
{
|
var cell_value = e.CellValue.ToString() ?? string.Empty;
|
if (double.TryParse(cell_value, out double value))
|
{
|
if (value > 0)
|
{
|
e.Appearance.ForeColor = Color.Green;
|
}
|
else
|
{
|
e.Appearance.ForeColor = Color.Red;
|
}
|
}
|
}
|
}
|
}
|
private void gridView2_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
|
{
|
|
if (e.Column == this.colCurveFlowDiff || e.Column == this.colCurveHeadDiff)
|
{
|
if (e.CellValue != null)
|
{
|
var cell_value = e.CellValue.ToString() ?? string.Empty;
|
if (double.TryParse(cell_value, out double value))
|
{
|
if (value > 0)
|
{
|
e.Appearance.ForeColor = Color.Green;
|
}
|
else
|
{
|
e.Appearance.ForeColor = Color.Red;
|
}
|
}
|
}
|
}
|
}
|
private void treeList1_RowCellClick(object sender, DevExpress.XtraTreeList.RowCellClickEventArgs e)
|
{
|
if (e.Column == this.colButton)
|
{
|
var vm = this.treeList1.GetFocusedRow() as VerifyViewModel;
|
if (vm == null) return;
|
var TargetFlow = vm.TargetFlow;
|
var TargetHead = vm.TargetHead;
|
var RealFlow = vm.RealFlow;
|
var RealDN2400Head = vm.RealDN2400Head;
|
var RealDN2700Head = vm.RealDN2700Head;
|
var SchedulePumpList = vm.SchedulePumpList;
|
var VerifyScadaList = vm.VerifyScadaList;
|
var SchedulingScadaList = vm.SchedulingScadaList;
|
|
if (_use_temp)
|
{
|
var temp_file_path = IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\0827_1.txt";
|
var temp_json = File.ReadAllText(temp_file_path);
|
var temp_scada_list = Yw.JsonHelper.Json2Object<List<IStation.Model.ZyScada>>(temp_json);
|
VerifyScadaList = GetScadaList(temp_scada_list);
|
|
OutValue(
|
temp_scada_list,
|
out double? DN2400Flow,
|
out double? DN2400Pressure,
|
out double? DN2700Flow,
|
out double? DN2700Pressure);
|
|
RealFlow = (DN2400Flow + DN2700Flow) ?? 0;
|
RealDN2400Head = DN2400Pressure ?? 0;
|
RealDN2700Head = DN2700Pressure ?? 0;
|
}
|
//Schedule(
|
// TargetFlow,
|
// TargetHead,
|
// RealFlow,
|
// RealDN2400Head,
|
// RealDN2700Head,
|
// SchedulePumpList,
|
// VerifyScadaList);
|
|
Schedule(
|
TargetFlow,
|
TargetHead,
|
RealFlow,
|
SchedulingScadaList,
|
VerifyScadaList);
|
}
|
}
|
|
#endregion
|
private void Schedule(
|
double TargetFlow,
|
double TargetHead,
|
double RealFlow,
|
double RealDN2400Head,
|
double RealDN2700Head,
|
List<IStation.Model.SchedulePump> SchedulePumpList,
|
List<PumpScadaViewModel> VerifyScadaList
|
)
|
{
|
if (SchedulePumpList == null || VerifyScadaList == null)
|
{
|
Clear();
|
return;
|
}
|
if (_pumps == null || !_pumps.Any())
|
{
|
WaitHelper.HideWaitForm();
|
XtraMessageBox.Show("Station文件缺失!");
|
return;
|
}
|
|
var station2 = _pumps;
|
var helper = new IStation.Algorithm.ScheduleHelper();
|
var rpm_dict = VerifyScadaList.ToDictionary(x => x.Flag, x => x.Speed ?? 0);
|
var inlet_water_level_dict = VerifyScadaList.ToDictionary(x => x.Flag, x => x.WL ?? 0);
|
var flow_dict = VerifyScadaList.ToDictionary(x => x.Flag, x => x.Flow ?? 0);
|
var head_dict = VerifyScadaList.ToDictionary(x => x.Flag, x => x.Head ?? 0);
|
var working_ana_pump_list = helper.GetAnaFrePumpListByWorking(station2, rpm_dict, inlet_water_level_dict, flow_dict, head_dict, RealFlow, out Dictionary<int, double> flag_curve_head_dict, _use_factor);
|
|
|
var schedule_vm_list = new List<PumpScheduleViewModel>();
|
var run_flags = SchedulePumpList.Select(x => x.Flag).OrderBy(x => x).ToList();
|
var analysis_deviation = new IStation.Service.AnalysisDeviation().GetByFlowAndRunFlags(TargetFlow, run_flags);
|
|
var str = new StringBuilder();
|
var dn24_head_diff = RealDN2400Head - TargetHead;
|
var dn27_head_diff = RealDN2700Head - TargetHead;
|
str.AppendLine($"目标扬程:{TargetHead}\r\n实际扬程:DN2400:{RealDN2400Head:N3} (差:{dn24_head_diff:N3}米) DN2700:{RealDN2700Head:N3} (差:{dn27_head_diff:N3}米)");
|
var diff_flow_sum = 0d;
|
foreach (var flag in IStation.GlobalHelper.Station2FlagList)
|
{
|
var pump = station2.Find(x => x.Flag == flag);
|
if (pump == null)
|
continue;
|
|
var verify_scada = VerifyScadaList.Find(x => x.Flag == flag);
|
var schedule_vm = new PumpScheduleViewModel();
|
schedule_vm.Flag = flag;
|
schedule_vm.WL = verify_scada.WL;
|
var ana_pump = SchedulePumpList.Find(x => x.Flag == flag);
|
if (ana_pump != null)
|
{
|
schedule_vm.RunStatus = 1;
|
schedule_vm.Flow = ana_pump.Flow;
|
schedule_vm.PumpHead = ana_pump.Head;
|
schedule_vm.Speed = ana_pump.Rpm;
|
schedule_vm.Power = ana_pump.Power;
|
schedule_vm.PressureDiff= ana_pump.PressureDiff;
|
schedule_vm.Head = ana_pump.PressureDiff + verify_scada.WL;
|
|
if (analysis_deviation != null)
|
{
|
var scada_correction_factor = 0d;
|
var model_correction_factor = 0d;
|
var model_correction_factor_use = 0d;
|
if (analysis_deviation.CurveDeviation != null && analysis_deviation.CurveDeviation.ContainsKey(flag))
|
scada_correction_factor = analysis_deviation.CurveDeviation[flag];
|
if (analysis_deviation.ModelDeviation != null && analysis_deviation.ModelDeviation.ContainsKey(flag))
|
model_correction_factor = analysis_deviation.ModelDeviation[flag];
|
if (model_correction_factor < 0)
|
model_correction_factor_use = Math.Abs(model_correction_factor);
|
else
|
model_correction_factor_use = -model_correction_factor;
|
schedule_vm.ScadaFactor = Math.Round(scada_correction_factor, 5);
|
schedule_vm.ModelFactor = Math.Round(model_correction_factor_use, 5);
|
}
|
}
|
|
schedule_vm.PowerDiff = verify_scada.Power - schedule_vm.Power;
|
schedule_vm.SpeedDiif = verify_scada.Speed - schedule_vm.Speed;
|
schedule_vm.FlowDiif = verify_scada.Flow - schedule_vm.Flow;
|
|
if (ana_pump != null)
|
{
|
var hz_diff = schedule_vm.SpeedDiif / pump.Nr * 50;
|
str.Append($"{flag}# 频率差:{hz_diff:N3} ");
|
}
|
|
var working_ana_pump = working_ana_pump_list?.Find(x => x.Flag == flag);
|
if (working_ana_pump != null)
|
{
|
var wokring_flow_diff = verify_scada.Flow - working_ana_pump.Flow;
|
verify_scada.CurveFlow = Math.Round(working_ana_pump.Flow, 2);
|
verify_scada.CurveFlowDiff = Math.Round(wokring_flow_diff ?? 0, 2);
|
diff_flow_sum += verify_scada.CurveFlowDiff ?? 0;
|
if (flag_curve_head_dict != null && flag_curve_head_dict.ContainsKey(flag))
|
{
|
var curve_head = flag_curve_head_dict[flag];
|
var wokring_head_diff = verify_scada.PumpHead - curve_head;
|
verify_scada.CurveHead = Math.Round(curve_head, 3);
|
verify_scada.CurveHeadDiff = Math.Round(wokring_head_diff ?? 0, 3);
|
}
|
}
|
|
|
schedule_vm.Round();
|
schedule_vm_list.Add(schedule_vm);
|
}
|
|
str.AppendLine($"曲线流量总偏差:{diff_flow_sum}");
|
this.memoExpand.Text = str.ToString();
|
|
var real_list = VerifyScadaList.Select(x => x).ToList();
|
real_list.ForEach(x => x.Round());
|
this.pumpScadaViewModelBindingSource.DataSource = real_list;
|
this.pumpScadaViewModelBindingSource.ResetBindings(false);
|
|
this.pumpScheduleViewModelBindingSource.DataSource = schedule_vm_list;
|
this.pumpScheduleViewModelBindingSource.ResetBindings(false);
|
this.gridView4.BestFitColumns();
|
}
|
|
|
private void Schedule(
|
double TargetFlow,
|
double TargetHead,
|
double RealFlow, List<PumpScadaViewModel> SchedulingScadaList, List<PumpScadaViewModel> VerifyScadaList)
|
{
|
var station_info = _service_station.Get();
|
if (station_info == null)
|
{
|
WaitHelper.HideWaitForm();
|
XtraMessageBox.Show("Station文件缺失!");
|
return;
|
}
|
|
|
var station2 = _pumps;
|
var rpm_dict = VerifyScadaList.ToDictionary(x => x.Flag, x => x.Speed ?? 0);
|
var inlet_water_level_dict = VerifyScadaList.ToDictionary(x => x.Flag, x => x.WL ?? 0);
|
var flow_dict = VerifyScadaList.ToDictionary(x => x.Flag, x => x.Flow ?? 0);
|
var head_dict = VerifyScadaList.ToDictionary(x => x.Flag, x => x.Head ?? 0);
|
|
var helper = new IStation.Algorithm.ScheduleHelper();
|
var working_ana_pump_list = helper.GetAnaFrePumpListByWorking(station2, rpm_dict, inlet_water_level_dict, flow_dict, head_dict, RealFlow, out Dictionary<int, double> flag_curve_head_dict, _use_factor);
|
|
|
var station2_schedule_config = _service_schedule_config.GetStation2();
|
var station2_flag_list = GlobalHelper.Station2FlagList;
|
|
GetStationOpenFlagList(SchedulingScadaList, out List<int> station2_open_flag_list);
|
GetStationMaintenanceFlagList(SchedulingScadaList, out List<int> station2_maintenance_flag_list);
|
GetFlagInletWaterLevelDict(SchedulingScadaList, out Dictionary<int, double> station2_flag_inlet_water_level_dict);
|
if (station2_maintenance_flag_list != null && station2_maintenance_flag_list.Any())
|
{
|
station2_schedule_config.MustCloseFlagList.AddRange(station2_maintenance_flag_list);
|
}
|
|
var diff_flow_sum = 0d;
|
var schedule_vm_list = new List<PumpScheduleViewModel>();
|
var str = new StringBuilder();
|
helper.Initial(station2_open_flag_list, station2_schedule_config);
|
var optimal_combine2 = helper.GetOptAnaCombine(station2, station2_flag_inlet_water_level_dict, TargetFlow, TargetHead);
|
|
foreach (var flag in IStation.GlobalHelper.Station2FlagList)
|
{
|
var pump = station2.Find(x => x.Flag == flag);
|
if (pump == null)
|
continue;
|
|
var verify_scada = VerifyScadaList.Find(x => x.Flag == flag);
|
var schedule_vm = new PumpScheduleViewModel();
|
schedule_vm.Flag = flag;
|
schedule_vm.WL = verify_scada.WL;
|
var ana_pump = optimal_combine2?.AnaFrePumps?.Find(x => x.Flag == flag);
|
if (ana_pump != null)
|
{
|
schedule_vm.RunStatus = 1;
|
schedule_vm.Flow = ana_pump.Flow;
|
schedule_vm.PumpHead = ana_pump.Head;
|
schedule_vm.Speed = ana_pump.Speed;
|
schedule_vm.Power = ana_pump.Power;
|
schedule_vm.PressureDiff = ana_pump.PressureDiff;
|
schedule_vm.Head = ana_pump.PressureDiff + verify_scada.WL;
|
}
|
|
schedule_vm.PowerDiff = verify_scada.Power - schedule_vm.Power;
|
schedule_vm.SpeedDiif = verify_scada.Speed - schedule_vm.Speed;
|
schedule_vm.FlowDiif = verify_scada.Flow - schedule_vm.Flow;
|
|
if (ana_pump != null)
|
{
|
var hz_diff = schedule_vm.SpeedDiif / pump.Nr * 50;
|
str.Append($"{flag}# 频率差:{hz_diff:N3} ");
|
}
|
|
var working_ana_pump = working_ana_pump_list?.Find(x => x.Flag == flag);
|
if (working_ana_pump != null)
|
{
|
var wokring_flow_diff = verify_scada.Flow - working_ana_pump.Flow;
|
verify_scada.CurveFlow = Math.Round(working_ana_pump.Flow, 2);
|
verify_scada.CurveFlowDiff = Math.Round(wokring_flow_diff ?? 0, 2);
|
diff_flow_sum += verify_scada.CurveFlowDiff ?? 0;
|
if (flag_curve_head_dict != null && flag_curve_head_dict.ContainsKey(flag))
|
{
|
var curve_head = flag_curve_head_dict[flag];
|
var wokring_head_diff = verify_scada.PumpHead - curve_head;
|
verify_scada.CurveHead = Math.Round(curve_head, 3);
|
verify_scada.CurveHeadDiff = Math.Round(wokring_head_diff ?? 0, 3);
|
}
|
}
|
|
|
schedule_vm.Round();
|
schedule_vm_list.Add(schedule_vm);
|
}
|
|
// str.AppendLine($"曲线流量总偏差:{diff_flow_sum}");
|
|
|
var flow_sum = schedule_vm_list.Sum(x => x.Flow);
|
str.AppendLine($"调度总流量:{flow_sum:N2} 偏差:{flow_sum-TargetFlow:N2}");
|
|
this.memoExpand.Text = str.ToString();
|
|
var real_list = VerifyScadaList.Select(x => x).ToList();
|
real_list.ForEach(x => x.Round());
|
this.pumpScadaViewModelBindingSource.DataSource = real_list;
|
this.pumpScadaViewModelBindingSource.ResetBindings(false);
|
|
this.pumpScheduleViewModelBindingSource.DataSource = schedule_vm_list;
|
this.pumpScheduleViewModelBindingSource.ResetBindings(false);
|
this.gridView4.BestFitColumns();
|
|
}
|
|
}
|
}
|