diff --git a/csharp/App/SodiStoreMax/src/Ess/Controller.cs b/csharp/App/SodiStoreMax/src/Ess/Controller.cs index 19a025426..145384e53 100644 --- a/csharp/App/SodiStoreMax/src/Ess/Controller.cs +++ b/csharp/App/SodiStoreMax/src/Ess/Controller.cs @@ -30,7 +30,7 @@ public static class Controller public static EssControl ControlEss(this StatusRecord s) { - var mode = s.SelectControlMode().WriteLine(); + var mode = s.SelectControlMode(); if (mode is EssMode.Off) // to test on prototype { @@ -88,7 +88,7 @@ public static class Controller var nInverters = acDcs.Count; if (nInverters < 2) - return control; // current loop cannot happen + return control; // the current loop cannot happen var nominalPower = acDcs.Average(d => d.Status.Nominal.Power); var maxStep = nominalPower / 25; //TODO magic number to config @@ -121,19 +121,28 @@ public static class Controller private static EssControl LimitChargePower(this EssControl control, StatusRecord s) { //var maxInverterChargePower = s.ControlInverterPower(s.Config.MaxInverterPower); - var maxBatteryChargePower = s.MaxBatteryChargePower(); + // var maxBatteryChargePower = s.MaxBatteryChargePower(MaxChargePower); + s.Battery.Devices.Count.WriteLine(" Number of batteries"); + + var maxBatteryChargePower = s.Battery.Devices.Count * MaxChargePower; maxBatteryChargePower.WriteLine(" Max Battery Charge Power"); - + + + if (control.Mode == EssMode.ReachMinSoc) + { + maxBatteryChargePower = s.MaxBatteryChargePower(MaxChargePower/4); // 0.25 C + maxBatteryChargePower.WriteLine(" A power limit applied while ReachMinSoc"); + return control + .LimitChargePower(maxBatteryChargePower, EssLimit.ChargeLimitedByBatteryPower); + } return control - //.LimitChargePower(, EssLimit.ChargeLimitedByInverterPower) - .LimitChargePower(maxBatteryChargePower, EssLimit.ChargeLimitedByBatteryPower); + .LimitChargePower(maxBatteryChargePower, EssLimit.ChargeLimitedByBatteryPower); } private static EssControl LimitDischargePower(this EssControl control, StatusRecord s) { - var maxBatteryDischargeDelta = s.Battery?.Devices.Count * MaxDischargePower ?? 0; + var maxBatteryDischargeDelta = s.MaxBatteryDischargePower(MaxDischargePower); var keepMinSocLimitDelta = s.ControlBatteryPower(s.HoldMinSocPower()); - maxBatteryDischargeDelta.WriteLine(" Max Battery Discharge Power"); if (control.Mode == EssMode.DownwardsCalibrationCharge ) { @@ -148,7 +157,9 @@ public static class Controller private static Double ComputePowerDelta(this StatusRecord s, EssMode mode) { var chargePower = s.AcDc.Devices.Sum(d => d.Status.Nominal.Power.Value); - var batteryDischargePower = s.Battery?.Devices.Count * MaxDischargePower ?? 0 ; + var batteryDischargePower = s.MaxBatteryDischargePower(MaxDischargePower) ; + + chargePower.WriteLine(" charge power for Upwards"); return mode switch { @@ -163,18 +174,14 @@ public static class Controller }; } - private static Double MaxBatteryChargePower(this StatusRecord s) + private static Double MaxBatteryChargePower(this StatusRecord s, Double chargePower) { - // This introduces a limit when we don't have communication with batteries, - // Otherwise the limit will be 0, and the batteries will be not heated - - var batteries = s.GetBatteries(); - - var maxChargePower = batteries.Count == 0 - ? 0 - : batteries.Count * MaxChargePower; - - return maxChargePower; + return (s.Battery?.ChargeModeBatteries ?? 0) * chargePower; // to be tested. maybe used available charge switch batteries + } + + private static Double MaxBatteryDischargePower(this StatusRecord s, Double dischargePower) + { + return (s.Battery?.DischargeModeBatteries ?? 0) * dischargePower; // to be tested. maybe used available discharge switch batteries } private static Double CurrentPowerSetPoint(this StatusRecord s) @@ -216,9 +223,6 @@ public static class Controller (calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && additionalCalibrationRequired) || (calibrationChargeForced == CalibrationChargeType.RepetitivelyEvery && repetitiveCalibrationRequired); - Console.WriteLine("Next Repetitive calibration charge date is "+ statusRecord.Config.DayAndTimeForRepetitiveCalibration); - Console.WriteLine("Next Additional calibration charge date is "+ statusRecord.Config.DayAndTimeForAdditionalCalibration); - if (statusRecord.Battery is not null) { if (calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && statusRecord.Battery.Eoc ) @@ -246,9 +250,6 @@ public static class Controller (calibrationDischargeForced == CalibrationDischargeType.AdditionallyOnce && additionalCalibrationRequired) || (calibrationDischargeForced == CalibrationDischargeType.RepetitivelyEvery && repetitiveCalibrationRequired); - Console.WriteLine("Next Repetitive calibration charge date is "+ statusRecord.Config.DownDayAndTimeForRepetitiveCalibration); - Console.WriteLine("Next Additional calibration charge date is "+ statusRecord.Config.DownDayAndTimeForAdditionalCalibration); - if (statusRecord.Battery is not null) { if (calibrationDischargeForced == CalibrationDischargeType.AdditionallyOnce && statusRecord.Battery.Eod ) @@ -258,8 +259,8 @@ public static class Controller } else if (calibrationDischargeForced == CalibrationDischargeType.RepetitivelyEvery && statusRecord.Battery.Eod && _hasRepetitiveCalibrationDischargeChecked) { - statusRecord.Config.DownDayAndTimeForRepetitiveCalibration = statusRecord.Config.DownDayAndTimeForRepetitiveCalibration.AddDays(7); - _hasRepetitiveCalibrationDischargeChecked = false; + statusRecord.Config.DownDayAndTimeForRepetitiveCalibration = statusRecord.Config.DownDayAndTimeForRepetitiveCalibration.AddDays(28); // this changed to one month, 28 to keep the calibration always on sunday + _hasRepetitiveCalibrationDischargeChecked = false; } }