Files
EMOS-TestApp/TestApp/Program.cs
2023-02-07 13:08:25 +01:00

119 lines
4.5 KiB
C#

using System.Reflection;
using TestApp.Configuration;
using TestApp.Driver;
namespace TestApp
{
internal class Program
{
private static ConfigurationManager _ConfigurationManager;
private static IChargerDriver? _Driver;
private static EnergyManager _EnergyManager;
private static ProcessVariable _ProcessVariable;
private static PidController _PidController;
static async Task Main(string[] args)
{
_ConfigurationManager = new ConfigurationManager();
_ConfigurationManager.SettingsChanged += OnSettingsChanged;
try
{
OnSettingsChanged(_ConfigurationManager, _ConfigurationManager.Settings);
} catch (Exception ex)
{
Console.WriteLine($"Error applying settings: {ex.Message}");
}
_EnergyManager = await EnergyManager.Create();
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);
} catch (Exception ex)
{
Console.WriteLine($"Error in main loop: {ex.Message}");
}
Thread.Sleep(1000);
}
}
private static void OnSettingsChanged(object? sender, Settings settings)
{
UpdateDriverSettings(settings);
UpdateControllerSettings(settings);
}
private static void UpdateDriverSettings(Settings settings) {
var dirverName = settings.ChargerDriver ?? Settings.DEFAULT_CHARGER_DRIVER;
var fullDriverTypeName = "TestApp.Driver." + dirverName;
var driverType = Assembly.GetExecutingAssembly().GetType(fullDriverTypeName);
if (driverType is null)
{
throw new ArgumentException($"Charger driver type '{dirverName}' not found!");
}
if (_Driver is null || !_Driver.GetType().Equals(driverType))
{
var newDriverObject = Activator.CreateInstance(driverType);
if (newDriverObject is null)
{
throw new InvalidOperationException("Could not instantiate driver!");
}
if (newDriverObject is not IChargerDriver newDriver)
{
throw new InvalidOperationException("New driver does not implement IChargerDriver!");
}
if (_Driver is IDisposable disposable)
{
disposable.Dispose();
}
_Driver = newDriver;
}
_Driver.HostAddress = settings.ChargerAddress ?? Settings.DEFAULT_CHARGER_ADDRESS;
_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();
}
}
}