In each simulated timestep, the control strategy sends a charge/discharge request to the battery module. The control strategies themselves are described in the next section. For now, it will suffice to say that the input to the battery module is a charge request (in kW) that can be either positive or negative.
charge_request > 0 // charge
charge_request < 0 // discharge
charge_request = 0 // do nothing
The battery has maximum charge and discharge rates (kW) set based on the battery’s size. CBECC-Res defines both as the same fixed fraction (kW/kWh) of the battery’s user-defined maximum capacity (kWh).
max_charge_power = 0.42 * max_capacity
max_discharge_power = 0.42 * max_capacity
And both a charge and discharge efficiency (fraction), which are user-defined:
η_charge
η_discharge
At each timestep, there are also maximum charge and discharge limits (kW) defined by the state of charge on the battery. Charge and discharge power levels are measured at the battery’s edge: before efficiency losses in the case of charging and after efficiency losses in the case of discharging. The battery’s state-of-charge is metered between the two efficiency multipliers.
max_charge_available = (max_capacity - charge_level) /
η_charge * (timestep_minutes / 60)
max_discharge_available = charge_level * η_discharge *
(timestep_minutes / 60)
All together, that enables the module to determine the amount the battery should charge or discharge in the hour:
if charge_request > 0:
charge_power
= min(charge_request, max_charge_rate,
max_charge_available)
else if charge_request < 0:
charge_power = max(charge_request, max_discharge_rate,
max_discharge_available)
else:
charge_power = 0
At the conclusion of that timestep, the battery’s charge level will have been updated:
if charge_power > 0: // charging
charge_level = charge_level + charge_power*η_charge
else if charge_power < 0 // discharging
charge_level = charge_level + charge_power/η_discharge
else:
charge_level = charge_level