Files
YuPu-OrpaonEMS/OrpaonEMS.App/ViewModels/ControlConfigViewModel.cs
2025-12-25 11:13:13 +08:00

348 lines
15 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using OrpaonEMS.App.Models;
using OrpaonEMS.App.Services;
using OrpaonEMS.Core;
using Prism.Commands;
using System;
using System.Collections.ObjectModel;
using System.Linq;
namespace OrpaonEMS.App.ViewModels
{
public class ControlConfigViewModel : NavigationViewModel
{
public ControlConfigViewModel(YuePuRunModelService yuePuRunModelService, ConfigDataService configDataService)
{
YuePuRunModelService = yuePuRunModelService;
ConfigDataService = configDataService;
// 从配置文件加载参数
if (ConfigDataService.ControlConfigValue != null)
{
SolarToEsAsFullSoc = ConfigDataService.ControlConfigValue.SolarToEsAsFullSoc;
Master_ToSlaveByMasterSoc = ConfigDataService.ControlConfigValue.Master_ToSlaveByMasterSoc;
Master_ToSlaveBySlaveSoc = ConfigDataService.ControlConfigValue.Master_ToSlaveBySlaveSoc;
Master_SolarToSlaveEsFullByMasterSoc = ConfigDataService.ControlConfigValue.Master_SolarToSlaveEsFullByMasterSoc;
Slave_ToMasterBySlaveSoc = ConfigDataService.ControlConfigValue.Slave_ToMasterBySlaveSoc;
Slave_ToMasterByMasterSoc = ConfigDataService.ControlConfigValue.Slave_ToMasterByMasterSoc;
Slave_SolarToMasterEsFullBySlaverSoc = ConfigDataService.ControlConfigValue.Slave_SolarToMasterEsFullBySlaverSoc;
NightMaster_ToMasterFullSoc = ConfigDataService.ControlConfigValue.NightMaster_ToMasterFullSoc;
NightSlave_ToSlaveFullSoc = ConfigDataService.ControlConfigValue.NightSlave_ToSlaveFullSoc;
// 加载放电模式列表与已选项
var list = ConfigDataService.GetDisChargeModel();
DisChargeModels = new ObservableCollection<DisChargeModelItem>(list);
var sel = ConfigDataService.ControlConfigValue.SelectedDisChargeModel;
if (DisChargeModels != null && DisChargeModels.Count > 0)
{
// 若配置中无效则回落到第一个项
if (DisChargeModels.Any(m => m.Model == sel))
SelectedDisChargeModelId = sel;
else
SelectedDisChargeModelId = DisChargeModels[0].Model;
}
else
{
SelectedDisChargeModelId = 1;
}
// 与旧逻辑保持同步(可选)
if (System.Enum.IsDefined(typeof(DisChargeType), SelectedDisChargeModelId))
SelectedDisChargeType = (DisChargeType)SelectedDisChargeModelId;
}
// 同步到运行模式服务
YuePuRunModelService.SolarToEsAsFullSoc = SolarToEsAsFullSoc;
YuePuRunModelService.Master_ToSlaveByMasterSoc = Master_ToSlaveByMasterSoc;
YuePuRunModelService.Master_ToSlaveBySlaveSoc = Master_ToSlaveBySlaveSoc;
YuePuRunModelService.Master_SolarToSlaveEsFullByMasterSoc = Master_SolarToSlaveEsFullByMasterSoc;
YuePuRunModelService.Slave_ToMasterBySlaveSoc = Slave_ToMasterBySlaveSoc;
YuePuRunModelService.Slave_ToMasterByMasterSoc = Slave_ToMasterByMasterSoc;
YuePuRunModelService.Slave_SolarToMasterEsFullBySlaverSoc = Slave_SolarToMasterEsFullBySlaverSoc;
YuePuRunModelService.NightMaster_ToMasterFullSoc = NightMaster_ToMasterFullSoc;
YuePuRunModelService.NightSlave_ToSlaveFullSoc = NightSlave_ToSlaveFullSoc;
//SelectedDisChargeType=
}
private DelegateCommand<string> _BtnConfigSave;
/// <summary>
/// 运行模式操作
/// </summary>
public DelegateCommand<string> BtnConfigSave
{
set
{
_BtnConfigSave = value;
}
get
{
if (_BtnConfigSave == null)
{
_BtnConfigSave = new DelegateCommand<string>((par) => BtnConfigSaveCall(par));
}
return _BtnConfigSave;
}
}
private DelegateCommand _BtnCloseSys;
/// <summary>
/// 关闭系统
/// </summary>
public DelegateCommand BtnCloseSys
{
set
{
_BtnCloseSys = value;
}
get
{
if (_BtnCloseSys == null)
{
_BtnCloseSys = new DelegateCommand(() => BtnCloseSysCall());
}
return _BtnCloseSys;
}
}
/// <summary>
/// 关闭系统的执行方法
/// </summary>
private void BtnCloseSysCall()
{
try
{
// 停止后台监听线程(例如削峰填谷时间监听)
if (ConfigDataService != null)
{
ConfigDataService.ThreadEnable = false;
}
// 关闭运行服务中的状态循环与通信连接
YuePuRunModelService?.CloseSystem();
}
catch (System.Exception ex)
{
System.Windows.MessageBox.Show($"关闭系统时发生异常: {ex.Message}", "错误", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
}
finally
{
try
{
// 退出应用程序
System.Windows.Application.Current.Shutdown();
}
catch
{
System.Environment.Exit(0);
}
}
}
private void BtnConfigSaveCall(string par)
{
try
{
// 同步到运行模式服务
YuePuRunModelService.SolarToEsAsFullSoc = SolarToEsAsFullSoc;
YuePuRunModelService.Master_ToSlaveBySlaveSoc = Master_ToSlaveBySlaveSoc;
YuePuRunModelService.Master_SolarToSlaveEsFullByMasterSoc = Master_SolarToSlaveEsFullByMasterSoc;
YuePuRunModelService.Slave_ToMasterBySlaveSoc = Slave_ToMasterBySlaveSoc;
YuePuRunModelService.Slave_ToMasterByMasterSoc = Slave_ToMasterByMasterSoc;
YuePuRunModelService.Slave_SolarToMasterEsFullBySlaverSoc = Slave_SolarToMasterEsFullBySlaverSoc;
YuePuRunModelService.NightMaster_ToMasterFullSoc = NightMaster_ToMasterFullSoc;
YuePuRunModelService.NightSlave_ToSlaveFullSoc = NightSlave_ToSlaveFullSoc;
// 保存到配置文件
if (ConfigDataService.ControlConfigValue != null)
{
ConfigDataService.ControlConfigValue.SolarToEsAsFullSoc = SolarToEsAsFullSoc;
ConfigDataService.ControlConfigValue.Master_ToSlaveByMasterSoc = Master_ToSlaveByMasterSoc;
ConfigDataService.ControlConfigValue.Master_ToSlaveBySlaveSoc = Master_ToSlaveBySlaveSoc;
ConfigDataService.ControlConfigValue.Master_SolarToSlaveEsFullByMasterSoc = Master_SolarToSlaveEsFullByMasterSoc;
ConfigDataService.ControlConfigValue.Slave_ToMasterBySlaveSoc = Slave_ToMasterBySlaveSoc;
ConfigDataService.ControlConfigValue.Slave_ToMasterByMasterSoc = Slave_ToMasterByMasterSoc;
ConfigDataService.ControlConfigValue.Slave_SolarToMasterEsFullBySlaverSoc = Slave_SolarToMasterEsFullBySlaverSoc;
ConfigDataService.ControlConfigValue.NightMaster_ToMasterFullSoc = NightMaster_ToMasterFullSoc;
ConfigDataService.ControlConfigValue.NightSlave_ToSlaveFullSoc = NightSlave_ToSlaveFullSoc;
// 保存选择的放电模式(以 Model Id 为准)
ConfigDataService.ControlConfigValue.SelectedDisChargeModel = SelectedDisChargeModelId;
// 同步旧字段
if (System.Enum.IsDefined(typeof(DisChargeType), SelectedDisChargeModelId))
SelectedDisChargeType = (DisChargeType)SelectedDisChargeModelId;
// 调用保存方法
bool saveResult = ConfigDataService.SaveControlConfigValue();
if (saveResult)
{
System.Windows.MessageBox.Show("控制参数配置保存成功!", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Information);
}
else
{
System.Windows.MessageBox.Show("控制参数配置保存失败,请查看日志!", "错误", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
}
}
else
{
System.Windows.MessageBox.Show("控制参数配置对象为空!", "错误", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
}
}
catch (System.Exception ex)
{
System.Windows.MessageBox.Show($"保存控制参数配置时发生异常: {ex.Message}", "错误", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
}
}
private double _SolarToEsAsFullSoc = 97;
/// <summary>
/// 光伏给储能充电 作为满的比值
/// 90-97
/// </summary>
public double SolarToEsAsFullSoc
{
get { return _SolarToEsAsFullSoc; }
set { _SolarToEsAsFullSoc = value; RaisePropertyChanged(); }
}
private double _Master_ToSlaveByMasterSoc = 5;
/// <summary>
/// Master模式切换到Slave模式时MasterSOC的阀值
/// 两个同时考虑
/// </summary>
public double Master_ToSlaveByMasterSoc
{
get { return _Master_ToSlaveByMasterSoc; }
set { _Master_ToSlaveByMasterSoc = value; RaisePropertyChanged(); }
}
private double _Master_ToSlaveBySlaveSoc = 15;
/// <summary>
/// Master模式切换到Slave模式时Slave SOC的阀值
/// 两个同时考虑
/// </summary>
public double Master_ToSlaveBySlaveSoc
{
get { return _Master_ToSlaveBySlaveSoc; }
set { _Master_ToSlaveBySlaveSoc = value; RaisePropertyChanged(); }
}
private double _Master_SolarToSlaveEsFullByMasterSoc = 95;
/// <summary>
/// Master模式光伏给从储能充满了是否切换到Slave模式但是此时需要判断主储能MasterSOC是否满了主储能也满的话也无法接收光伏的电否则不切换
/// 主要考虑尽可能的不浪费光伏的电,主从储能只要有余量就要接受光伏的电,也要防止频繁的切换
/// < SolarToEsAsFullSoc
/// </summary>
public double Master_SolarToSlaveEsFullByMasterSoc
{
get { return _Master_SolarToSlaveEsFullByMasterSoc; }
set { _Master_SolarToSlaveEsFullByMasterSoc = value; RaisePropertyChanged(); }
}
private double _Slave_ToMasterBySlaveSoc = 5;
/// <summary>
/// Slave模式切换到Master模式时SOC的阀值
/// 两个同时考虑
/// </summary>
public double Slave_ToMasterBySlaveSoc
{
get { return _Slave_ToMasterBySlaveSoc; }
set { _Slave_ToMasterBySlaveSoc = value; RaisePropertyChanged(); }
}
private double _Slave_ToMasterByMasterSoc = 15;
/// <summary>
/// Slave模式切换到Master模式时SOC的阀值
/// 两个同时考虑
/// </summary>
public double Slave_ToMasterByMasterSoc
{
get { return _Slave_ToMasterByMasterSoc; }
set { _Slave_ToMasterByMasterSoc = value; RaisePropertyChanged(); }
}
private double _Slave_SolarToMasterEsFullBySlaverSoc = 95;
/// <summary>
/// Slave模式光伏给主储能充满了是否切换到Master模式但是此时需要判断从储能SOC是否满了从储能也满的话也无法接收光伏的电否则不切换
/// 主要考虑尽可能的不浪费光伏的电,主从储能只要有余量就要接受光伏的电,也要防止频繁的切换
/// < SolarToEsAsFullSoc
/// </summary>
public double Slave_SolarToMasterEsFullBySlaverSoc
{
get { return _Slave_SolarToMasterEsFullBySlaverSoc; }
set { _Slave_SolarToMasterEsFullBySlaverSoc = value; RaisePropertyChanged(); }
}
private double _NightMaster_ToMasterFullSoc = 98;
/// <summary>
/// 晚上,主储能充满的标志,也是切换到从储能的控制标志
/// </summary>
public double NightMaster_ToMasterFullSoc
{
get { return _NightMaster_ToMasterFullSoc; }
set { _NightMaster_ToMasterFullSoc = value; RaisePropertyChanged(); }
}
private double _NightSlave_ToSlaveFullSoc = 98;
/// <summary>
/// 晚上,从储能充满的标志,也是切换到主储能的控制标志
/// </summary>
public double NightSlave_ToSlaveFullSoc
{
get { return _NightSlave_ToSlaveFullSoc; }
set { _NightSlave_ToSlaveFullSoc = value; RaisePropertyChanged(); }
}
public YuePuRunModelService YuePuRunModelService { get; }
/// <summary>
/// 配置数据服务
/// </summary>
public ConfigDataService ConfigDataService { get; }
/// <summary>
/// 选中的放电模式
/// </summary>
private DisChargeType _SelectedDisChargeType;
public DisChargeType SelectedDisChargeType
{
get { return _SelectedDisChargeType; }
set { _SelectedDisChargeType = value; RaisePropertyChanged(); }
}
/// <summary>
/// 放电模式列表
/// </summary>
private ObservableCollection<DisChargeModelItem> _DisChargeModels;
public ObservableCollection<DisChargeModelItem> DisChargeModels
{
get { return _DisChargeModels; }
set { _DisChargeModels = value; RaisePropertyChanged(); }
}
/// <summary>
/// 选中的放电模式(列表项的 Model Id
/// </summary>
private int _SelectedDisChargeModelId;
public int SelectedDisChargeModelId
{
get { return _SelectedDisChargeModelId; }
set
{
_SelectedDisChargeModelId = value;
// 同步枚举值(若兼容)
if (System.Enum.IsDefined(typeof(DisChargeType), _SelectedDisChargeModelId))
SelectedDisChargeType = (DisChargeType)_SelectedDisChargeModelId;
RaisePropertyChanged();
}
}
}
}