Implement CurrentLimiter and spare power mode

This commit is contained in:
2023-02-19 09:38:18 +01:00
parent 5277c3518f
commit d079d81230
8 changed files with 375 additions and 331 deletions

View File

@@ -1,4 +1,5 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using TestApp.Configuration;
using TestApp.Driver;
@@ -9,8 +10,7 @@ namespace TestApp
private static ConfigurationManager _ConfigurationManager;
private static IChargerDriver? _Driver;
private static EnergyManager _EnergyManager;
private static ProcessVariable _ProcessVariable;
private static PidController _PidController;
private static CurrentLimitter _CurrentLimitter;
static async Task Main(string[] args)
@@ -26,17 +26,24 @@ namespace TestApp
}
_EnergyManager = await EnergyManager.Create();
_CurrentLimitter = new CurrentLimitter(_ConfigurationManager, _EnergyManager);
while (true)
{
try
{
// TODO I1, I2, I3 von Wallbox mit I1-3 von Zähler per Kombinatorik max vom Haus ausrechnen
// newLoadingCurrent = maxSicherung - maxHaus
var measurement = _EnergyManager.GetValue(_ProcessVariable);
var newLoadingCurrent = _PidController.Update(measurement);
//if (newLoadingCurrent < 6) { newLoadingCurrent = 0; }
_Driver?.SetLoadingCurrent(newLoadingCurrent);
if (_Driver is null) {
Thread.Sleep(1000);
continue;
}
var newCurrent = double.MaxValue;
if (_ConfigurationManager.Settings.Mode == 2) {
newCurrent = GetMode2LoadingCurrent();
}
newCurrent = _CurrentLimitter.GetLimitedCurrent(_Driver, newCurrent);
_Driver?.SetLoadingCurrent(newCurrent);
} catch (Exception ex)
{
Console.WriteLine($"Error in main loop: {ex.Message}");
@@ -45,10 +52,26 @@ namespace TestApp
}
}
private static double GetMode2LoadingCurrent()
{
var minNegativePower = _ConfigurationManager.Settings.MinNegativePower ?? Settings.DEFAULT_MIN_NEGATIVE_POWER;
var negativePower = _EnergyManager.GetValue(EMVariable.ActivePowerNegative);
if (negativePower < minNegativePower) { return 0; }
var sparePower = negativePower - minNegativePower;
var i1 = sparePower / _EnergyManager.GetValue(EMVariable.VoltageL1);
var i2 = sparePower / _EnergyManager.GetValue(EMVariable.VoltageL2);
var i3 = sparePower / _EnergyManager.GetValue(EMVariable.VoltageL3);
return Math.Min(Math.Min(i1, i2), i3);
}
private static void OnSettingsChanged(object? sender, Settings settings)
{
UpdateDriverSettings(settings);
UpdateControllerSettings(settings);
}
private static void UpdateDriverSettings(Settings settings) {
@@ -84,35 +107,5 @@ namespace TestApp
_Driver.Port = settings.ChargerPort ?? Settings.DEFAULT_CHARGER_PORT;
}
private static void UpdateControllerSettings(Settings settings)
{
var allModeSettings = settings.ModeSettings ?? Array.Empty<ModeSettings>();
if (!allModeSettings.Any()) {
allModeSettings = new ModeSettings[]{
new ModeSettings() {
ProcessVariable = ProcessVariable.ActivePowerPositive,
SetPoint = 0,
PositivePid = new PidSetting(),
NegativePid = new PidSetting(),
}
};
}
var mode = settings.Mode;
if (mode < 0) { mode = 0; }
if (mode >= allModeSettings.Length) { mode = allModeSettings.Length - 1; }
var modeSetting = allModeSettings[mode];
if (_ProcessVariable != modeSetting.ProcessVariable)
{
_PidController = new PidController();
_ProcessVariable = modeSetting.ProcessVariable;
}
_PidController.SetPoint = modeSetting.SetPoint;
_PidController.PositiveSettings = modeSetting.PositivePid ?? new PidSetting();
_PidController.NegativeSettings = modeSetting.NegativePid ?? new PidSetting();
}
}
}