Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 23 additions & 42 deletions packages/control/bat_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -318,31 +318,6 @@ def setup_bat(self):
except Exception:
log.exception("Fehler im Bat-Modul")

def _charging_power_left_while_recovering(self, config) -> float:
""" Speicher-Vorrang, waehrend sich der Speicher auf dem Weg zum naechsten SoC-Ziel befindet
(unterhalb Mindest-SoC, oder oberhalb Mindest-SoC aber noch nicht wieder beim Maximal-SoC
angekommen, hysteresis_discharge=False): ermittelt, wie viel Leistung den Fahrzeugen dabei
verbleibt, unter Beruecksichtigung einer optional reservierten Ladeleistung.
"""
if self.data.get.power < 0:
# Wenn der Speicher entladen wird, darf diese Leistung nicht zum Laden der Fahrzeuge
# genutzt werden. Wenn der Speicher schneller regelt als die LP, würde sonst der Speicher
# reduziert werden.
charging_power_left = self.data.get.power
self.data.set.regulate_up = True
else:
if config.power_reserve_active:
# Die Differenz zwischen aktueller Batterie-Leistung und Reserveleistung bestimmt,
# was fuer EV-Ladung verbleibt (positiv) oder zusaetzlich benoetigt wird (negativ).
charging_power_left = self.data.get.power - config.power_reserve
if charging_power_left < 0:
self.data.set.regulate_up = True
else:
# Speicher wird geladen
charging_power_left = 0
self.data.set.regulate_up = True
return charging_power_left

def get_charging_power_left_diff(self):
"""Ermittelt die Differenz zur aktuellen Batterie-Leistung,
die zum Laden der EV verwendet werden darf.
Expand Down Expand Up @@ -374,18 +349,30 @@ def get_charging_power_left_diff(self):
# Speicher soll geladen werden um min SoC zu erreichen
if self.data.get.soc < config.min_soc:
self.data.set.hysteresis_discharge = False
charging_power_left = self._charging_power_left_while_recovering(config)
if self.data.get.power < 0:
# Wenn der Speicher entladen wird, darf diese Leistung nicht zum Laden der Fahrzeuge
# genutzt werden. Wenn der Speicher schneller regelt als die LP, würde sonst der Speicher
# reduziert werden.
charging_power_left = self.data.get.power
self.data.set.regulate_up = True
else:
# Speicher-Vorrang bis zum Min-Soc
if config.power_reserve_active:
# Die Differenz zwischen aktueller Batterie-Leistung und Reserveleistung bestimmt,
# was fuer EV-Ladung verbleibt (positiv) oder zusaetzlich benoetigt wird (negativ).
charging_power_left = self.data.get.power - config.power_reserve
if charging_power_left < 0:
self.data.set.regulate_up = True
else:
# Speicher wird geladen
charging_power_left = 0
self.data.set.regulate_up = True
# Speicher zwischen min und max SoC
elif int(self.data.get.soc) >= config.min_soc and int(self.data.get.soc) < config.max_soc:
# Speicher soll aktiv weder ge- noch entladen werden.
# Mindest-SoC wird gehalten oder der Speicher mit weiterem vorhanden Überschuss geladen.
if self.data.set.hysteresis_discharge is False:
# Speicher befindet sich noch in der Erholung nach Unterschreiten des Mindest-SoC:
# Vorrang fuer den Speicher bis zum Erreichen des Maximal-SoC (hysteresis_discharge
# wird erst dort wieder True), analog zum Zweig unterhalb des Mindest-SoC - sonst
# bleibt der Speicher dauerhaft knapp oberhalb des Mindest-SoC haengen, weil die
# Hysterese nie zurueckgesetzt wird.
charging_power_left = self._charging_power_left_while_recovering(config)
charging_power_left = self.data.get.power
# Speicher darf wegen Hysterese bis min_soc entladen werden.
else:
if self.data.set.power_limit is None:
Expand Down Expand Up @@ -417,11 +404,8 @@ def get_charging_power_left_diff(self):
absolute_bat_discharge_power)
log.debug(f"Erlaubte Entlade-Leistung nutzen {charging_power_left}W")
else:
# Entladung nicht erlaubt: nur eine tatsächliche Entladung darf nicht ans
# Fahrzeug weitergereicht werden, sonst wird der Speicher entladen, obwohl der
# Nutzer das nicht erlaubt hat. Lädt der Speicher dagegen, bleibt diese Leistung
# weiterhin für ihn reserviert.
charging_power_left = max(base_power, 0)
# Speicher sollte weder ge- noch entladen werden.
charging_power_left = base_power
else:
log.debug("Keine erlaubte Entladeleistung freigeben, da der Speicher mit einer vorgegeben "
"Leistung entladen wird.")
Expand Down Expand Up @@ -457,11 +441,8 @@ def get_charging_power_left_diff(self):
absolute_bat_discharge_power)
log.debug(f"Erlaubte Entlade-Leistung nutzen {charging_power_left}W")
else:
# Entladung nicht erlaubt: nur eine tatsächliche Entladung darf nicht ans Fahrzeug
# weitergereicht werden, sonst wird der Speicher entladen, obwohl der Nutzer das
# nicht erlaubt hat. Lädt der Speicher dagegen, bleibt diese Leistung weiterhin für
# ihn reserviert.
charging_power_left = max(base_power, 0)
# Speicher sollte weder ge- noch entladen werden.
charging_power_left = base_power
else:
log.debug("Keine erlaubte Entladeleistung freigeben, da der Speicher mit einer vorgegeben "
"Leistung entladen wird.")
Expand Down
19 changes: 5 additions & 14 deletions packages/control/bat_all_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,9 @@ class Params:
Params("Mindest-SoC, SoC nicht erreicht, Speicher-Reserve ausgenutzt, Speicher lädt",
ChargemodeConfigBat(mode="min_soc_bat_mode", power_reserve=2000, power_reserve_active=True),
2200, 40, 200, False),
Params("Mindest-SoC, SoC erreicht, Entladung nicht erlaubt, Speicher entlädt trotzdem",
ChargemodeConfigBat(mode="min_soc_bat_mode"), -500, 90, 0, False),
Params("Mindest-SoC, SoC erreicht, Entladung nicht erlaubt, Speicher lädt",
Params("Mindest-SoC, SoC erreicht, Speicher entlädt", ChargemodeConfigBat(mode="min_soc_bat_mode"), -500, 90, -500,
False),
Params("Mindest-SoC, SoC erreicht, Speicher lädt",
ChargemodeConfigBat(mode="min_soc_bat_mode"), 500, 90, 500, False),
Params("Mindest-SoC, SoC erreicht, Speicher ist voll",
ChargemodeConfigBat(mode="min_soc_bat_mode"), 0, 100, 0, False),
Expand All @@ -156,23 +156,14 @@ class Params:
"Speicher-Sperre aktiv"),
ChargemodeConfigBat(mode="min_soc_bat_mode", power_discharge=500, power_discharge_active=True),
400, 90, 0, False, 600),
Params(("Mindest-SoC, Hysterese, Erholung nach Unterschreiten, Speicher-Vorrang bis Maximal-SoC"),
ChargemodeConfigBat(mode="min_soc_bat_mode"), 400, 60, -100, True, hysteresis_discharge=False),
Params(("Mindest-SoC, Hysterese, Erholung nach Unterschreiten, Speicher-Reserve aktiv"),
ChargemodeConfigBat(mode="min_soc_bat_mode", power_reserve=2000, power_reserve_active=True),
2200, 60, 200, False, hysteresis_discharge=False),
Params(("Mindest-SoC, Hysterese, Erholung nach Unterschreiten, Speicher entlädt noch"),
ChargemodeConfigBat(mode="min_soc_bat_mode"), -300, 60, -400, True, hysteresis_discharge=False),
Params(("Mindest-SoC, Hysterese, EV-Vorrang, keine Speichernutzung"),
ChargemodeConfigBat(mode="min_soc_bat_mode"), 400, 60, 400, False, hysteresis_discharge=False),
Params(("Mindest-SoC, Hysterese, Speicherentladung, Speichernutzung erlaubt"),
ChargemodeConfigBat(mode="min_soc_bat_mode", power_discharge=500, power_discharge_active=True),
400, 60, 900, False, hysteresis_discharge=True),
Params(("Mindest-SoC, Hysterese, Speicherentladung, Speichernutzung erlaubt, Speicher-Sperre aktiv"),
ChargemodeConfigBat(mode="min_soc_bat_mode", power_discharge=500, power_discharge_active=True),
400, 60, 0, False, 600, hysteresis_discharge=True),
Params(("Mindest-SoC, Hysterese, Entladung nicht erlaubt, Speicher entlädt trotzdem"),
ChargemodeConfigBat(mode="min_soc_bat_mode"), -500, 60, 0, False, hysteresis_discharge=True),
Params(("Mindest-SoC, Hysterese, Entladung nicht erlaubt, Speicher lädt"),
ChargemodeConfigBat(mode="min_soc_bat_mode"), 500, 60, 500, False, hysteresis_discharge=True),
]


Expand Down
Loading