update the limit charge powerand limit discharge power

This commit is contained in:
atef 2025-06-11 15:58:58 +02:00
parent ab051a88d1
commit 8be31b4e0c
1 changed files with 29 additions and 28 deletions

View File

@ -30,7 +30,7 @@ public static class Controller
public static EssControl ControlEss(this StatusRecord s) 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 if (mode is EssMode.Off) // to test on prototype
{ {
@ -88,7 +88,7 @@ public static class Controller
var nInverters = acDcs.Count; var nInverters = acDcs.Count;
if (nInverters < 2) 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 nominalPower = acDcs.Average(d => d.Status.Nominal.Power);
var maxStep = nominalPower / 25; //TODO magic number to config 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) private static EssControl LimitChargePower(this EssControl control, StatusRecord s)
{ {
//var maxInverterChargePower = s.ControlInverterPower(s.Config.MaxInverterPower); //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"); 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 return control
//.LimitChargePower(, EssLimit.ChargeLimitedByInverterPower) .LimitChargePower(maxBatteryChargePower, EssLimit.ChargeLimitedByBatteryPower);
.LimitChargePower(maxBatteryChargePower, EssLimit.ChargeLimitedByBatteryPower);
} }
private static EssControl LimitDischargePower(this EssControl control, StatusRecord s) 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()); var keepMinSocLimitDelta = s.ControlBatteryPower(s.HoldMinSocPower());
maxBatteryDischargeDelta.WriteLine(" Max Battery Discharge Power");
if (control.Mode == EssMode.DownwardsCalibrationCharge ) if (control.Mode == EssMode.DownwardsCalibrationCharge )
{ {
@ -148,7 +157,9 @@ public static class Controller
private static Double ComputePowerDelta(this StatusRecord s, EssMode mode) private static Double ComputePowerDelta(this StatusRecord s, EssMode mode)
{ {
var chargePower = s.AcDc.Devices.Sum(d => d.Status.Nominal.Power.Value); 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 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, return (s.Battery?.ChargeModeBatteries ?? 0) * chargePower; // to be tested. maybe used available charge switch batteries
// Otherwise the limit will be 0, and the batteries will be not heated }
var batteries = s.GetBatteries(); private static Double MaxBatteryDischargePower(this StatusRecord s, Double dischargePower)
{
var maxChargePower = batteries.Count == 0 return (s.Battery?.DischargeModeBatteries ?? 0) * dischargePower; // to be tested. maybe used available discharge switch batteries
? 0
: batteries.Count * MaxChargePower;
return maxChargePower;
} }
private static Double CurrentPowerSetPoint(this StatusRecord s) private static Double CurrentPowerSetPoint(this StatusRecord s)
@ -216,9 +223,6 @@ public static class Controller
(calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && additionalCalibrationRequired) || (calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && additionalCalibrationRequired) ||
(calibrationChargeForced == CalibrationChargeType.RepetitivelyEvery && repetitiveCalibrationRequired); (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 (statusRecord.Battery is not null)
{ {
if (calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && statusRecord.Battery.Eoc ) if (calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && statusRecord.Battery.Eoc )
@ -246,9 +250,6 @@ public static class Controller
(calibrationDischargeForced == CalibrationDischargeType.AdditionallyOnce && additionalCalibrationRequired) || (calibrationDischargeForced == CalibrationDischargeType.AdditionallyOnce && additionalCalibrationRequired) ||
(calibrationDischargeForced == CalibrationDischargeType.RepetitivelyEvery && repetitiveCalibrationRequired); (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 (statusRecord.Battery is not null)
{ {
if (calibrationDischargeForced == CalibrationDischargeType.AdditionallyOnce && statusRecord.Battery.Eod ) if (calibrationDischargeForced == CalibrationDischargeType.AdditionallyOnce && statusRecord.Battery.Eod )
@ -258,8 +259,8 @@ public static class Controller
} }
else if (calibrationDischargeForced == CalibrationDischargeType.RepetitivelyEvery && statusRecord.Battery.Eod && _hasRepetitiveCalibrationDischargeChecked) else if (calibrationDischargeForced == CalibrationDischargeType.RepetitivelyEvery && statusRecord.Battery.Eod && _hasRepetitiveCalibrationDischargeChecked)
{ {
statusRecord.Config.DownDayAndTimeForRepetitiveCalibration = statusRecord.Config.DownDayAndTimeForRepetitiveCalibration.AddDays(7); statusRecord.Config.DownDayAndTimeForRepetitiveCalibration = statusRecord.Config.DownDayAndTimeForRepetitiveCalibration.AddDays(28); // this changed to one month, 28 to keep the calibration always on sunday
_hasRepetitiveCalibrationDischargeChecked = false; _hasRepetitiveCalibrationDischargeChecked = false;
} }
} }