Skip to main content

Summary

The battery model tracks the internal state of the energy storage system and derives the stored energy and the DC power at the battery terminals (magnitude and direction) at each timestep. It combines the charge/discharge intent from the Dispatch Algorithms, the power limits from the Charge & Discharge Limits, calendar and per-cycle degradation, and the previous timestep’s stored energy. Unlike the rest of the PlantPredict pipeline, this model is iterative—each timestep depends on the previous timestep’s state.

Inputs

NameSymbolUnitsDescription
Charge FlagFcF_cbooleanTrue if battery should attempt to charge (from Dispatch Algorithms)
Discharge FlagFdF_dbooleanTrue if battery should attempt to discharge (from Dispatch Algorithms)
Available Charge PowerPchargeP_{charge}WMaximum charge power at battery DC (from Charge & Discharge Limits)
Available Discharge PowerPdischargeP_{discharge}WMaximum discharge power at battery DC (from Charge & Discharge Limits)
Nameplate Energy CapacityEnomE_{nom}MWhTotal manufacturer-rated energy capacity
Usable Capacity Factorfusablef_{usable}Usable fraction of nameplate capacity (0 to 1)
Initial Usable Energy CapacityEmax,initE_{max,init}MWhUsable energy capacity at system start
Initial Round-Trip DC EfficiencyηRT,init\eta_{RT,init}%DC round-trip efficiency at system start
Capacity Cycle Degradation RatedE,cycled_{E,cycle}%/cycleCapacity loss per normalized discharge cycle
Capacity Calendar Degradation RatedE,yeard_{E,year}%/yearCapacity loss per year of operation
RTE Cycle Degradation Ratedη,cycled_{\eta,cycle}%/cycleRound-trip efficiency loss per normalized discharge cycle
RTE Calendar Degradation Ratedη,yeard_{\eta,year}%/yearRound-trip efficiency loss per year of operation
Current Timestamptnt_ndatetimeTimestamp at timestep nn
Time Intervalδt\delta tminutesTime interval between consecutive timestamps

Outputs

NameSymbolUnitsDescription
State of ChargeSOCSOCWhEnergy stored in battery
Battery DC PowerPDC,battP_{DC,batt}WDC power at battery terminals (positive = charge, negative = discharge)
DC RTE LossLηL_{\eta}WRound-trip efficiency loss

Detailed Description

The model receives dispatch intent flags and power limits from upstream, then runs in sequence:
  1. Degradation updates the battery’s capacity and efficiency parameters.
  2. update adjusts stored energy based on the dispatch flags and available charge/discharge power. losses are consolidated into charging.
  3. DC power is derived from the change in stored energy.
In the equations below, all state variables use functional notation—e.g., SOC(tn)SOC(t_n) is the state of charge at timestep nn, and SOC(tn1)SOC(t_{n-1}) is its value at the previous timestep. All energy and power values are in Wh and W, respectively.

Initial Conditions

The usable energy capacity Emax,initE_{max,init} is derived from the nameplate energy capacity EnomE_{nom} and a usable capacity factor fusablef_{usable} (0 to 1): Emax,init=Enom×fusableE_{max,init} = E_{nom} \times f_{usable} The user specifies any two of the three values and the third is calculated automatically. fusablef_{usable} accounts for depth-of-discharge limits and reserve margins imposed by the battery manufacturer. At the first timestep (n=0n = 0), the battery is initialized to full charge with its initial parameters. Emax,initE_{max,init} is converted from MWh to Wh and ηRT,init\eta_{RT,init} from percentage to fraction before use. SOC(t0)=Emax,initSOC(t_0) = E_{max,init} ηRT(t0)=ηRT,init\eta_{RT}(t_0) = \eta_{RT,init} PDC,batt(t0)=0P_{DC,batt}(t_0) = 0

Degradation

For all subsequent timesteps (n1n \geq 1), degradation is calculated before the SOC update so that the battery operates with its current degraded parameters. All degradation rates (dE,cycled_{E,cycle}, dE,yeard_{E,year}, dη,cycled_{\eta,cycle}, dη,yeard_{\eta,year}) are converted from percentages to fractions before use. Two quantities degrade over time: the usable energy capacity (DED_E terms) and the round-trip DC efficiency (DηD_\eta terms). Each has a cycle component—accumulated from discharge activity—and a calendar component proportional to elapsed time.

Cycle Degradation

Cycle degradation is applied during discharge timesteps. When the previous timestep was not a discharge, the cumulative values carry forward unchanged. During discharge, the discharged energy is normalized by the previous maximum capacity. PDC,batt(tn1)0{DE,cycle(tn)=DE,cycle(tn1)Dη,cycle(tn)=Dη,cycle(tn1)P_{DC,batt}(t_{n-1}) \geq 0 \Rightarrow \begin{cases} D_{E,cycle}(t_n) = D_{E,cycle}(t_{n-1}) \\ D_{\eta,cycle}(t_n) = D_{\eta,cycle}(t_{n-1}) \end{cases} PDC,batt(tn1)<0{DE,cycle(tn)=DE,cycle(tn1)+PDC,batt(tn1)Emax(tn1)×dE,cycleDη,cycle(tn)=Dη,cycle(tn1)+PDC,batt(tn1)Emax(tn1)×dη,cycleP_{DC,batt}(t_{n-1}) < 0 \Rightarrow \begin{cases} D_{E,cycle}(t_n) = D_{E,cycle}(t_{n-1}) + \dfrac{|P_{DC,batt}(t_{n-1})|}{E_{max}(t_{n-1})} \times d_{E,cycle} \\[8pt] D_{\eta,cycle}(t_n) = D_{\eta,cycle}(t_{n-1}) + \dfrac{|P_{DC,batt}(t_{n-1})|}{E_{max}(t_{n-1})} \times d_{\eta,cycle} \end{cases}

Calendar Degradation

Calendar degradation is proportional to the elapsed time Δt\Delta t in fractional years: Δt=n8760×δt60\Delta t = \frac{n}{8760} \times \frac{\delta t}{60} DE,year(tn)=dE,year×ΔtD_{E,year}(t_n) = d_{E,year} \times \Delta t Dη,year(tn)=dη,year×ΔtD_{\eta,year}(t_n) = d_{\eta,year} \times \Delta t

Combined Degradation

Cycle and calendar degradation are summed and applied to the initial values to obtain the degraded parameters: Emax(tn)=Emax,init×(1DE,cycle(tn)DE,year(tn))E_{max}(t_n) = E_{max,init} \times \left(1 - D_{E,cycle}(t_n) - D_{E,year}(t_n)\right) ηRT(tn)=ηRT,init×(1Dη,cycle(tn)Dη,year(tn))\eta_{RT}(t_n) = \eta_{RT,init} \times \left(1 - D_{\eta,cycle}(t_n) - D_{\eta,year}(t_n)\right)

State of Charge

The SOC update uses the degraded Emax(tn)E_{max}(t_n) and ηRT(tn)\eta_{RT}(t_n) from above. When both charge and discharge flags are set (possible with the Excess algorithm), the charge flag takes priority. Prior to Version 12, the equations below implicitly assumed δt=60\delta t = 60 minutes (hourly timesteps). Sub-hourly ESS simulations were not supported and would produce erroneous results.

Charging

When charging (Fc=TRUEF_c = \text{TRUE}), the available charge power is converted to energy (multiplied by δt/60\delta t / 60) and scaled by the round-trip efficiency before being added to the previous SOC, capped at the degraded maximum capacity: SOC(tn)=min ⁣(SOC(tn1)+Pcharge×δt60×ηRT(tn),  Emax(tn))SOC(t_n) = \min\!\left( SOC(t_{n-1}) + P_{charge} \times \frac{\delta t}{60} \times \eta_{RT}(t_n),\; E_{max}(t_n) \right) In practice, round-trip losses occur across both charge and discharge. The model lumps the entire round-trip efficiency (ηRT\eta_{RT}) into the charge step—the full power enters the battery but only a fraction is stored—rather than splitting losses between the two directions.

Discharging

When discharging (Fc=FALSEF_c = \text{FALSE} and Fd=TRUEF_d = \text{TRUE}), energy is drawn from the battery without round-trip losses. The SOC cannot drop below zero (empty battery): SOC(tn)=max ⁣(SOC(tn1)Pdischarge×δt60,  0)SOC(t_n) = \max\!\left( SOC(t_{n-1}) - P_{discharge} \times \frac{\delta t}{60},\; 0 \right)

Idle

When idle (Fc=FALSEF_c = \text{FALSE} and Fd=FALSEF_d = \text{FALSE}), the SOC carries forward unchanged: SOC(tn)=SOC(tn1)SOC(t_n) = SOC(t_{n-1})

Battery DC Power

DC power is derived from the change in SOC, converting the change in stored energy back to power. PDC,batt(tn)P_{DC,batt}(t_n) is positive during charging, negative during discharging, and zero when idle.

Charging

When charging (SOC(tn)>SOC(tn1)SOC(t_n) > SOC(t_{n-1})), the round-trip efficiency is divided out to recover the DC power that entered the battery: PDC,batt(tn)=SOC(tn)SOC(tn1)ηRT(tn)×δt/60>0P_{DC,batt}(t_n) = \frac{SOC(t_n) - SOC(t_{n-1})}{\eta_{RT}(t_n) \times \delta t / 60} > 0

Discharging

When discharging (SOC(tn)<SOC(tn1)SOC(t_n) < SOC(t_{n-1})), the SOC change maps directly to DC power: PDC,batt(tn)=SOC(tn)SOC(tn1)δt/60<0P_{DC,batt}(t_n) = \frac{SOC(t_n) - SOC(t_{n-1})}{\delta t / 60} < 0

Loss Reporting

Since the round-trip efficiency is applied entirely during charging, the associated loss is reported during charging timesteps (PDC,batt(tn)>0P_{DC,batt}(t_n) > 0): Lη(tn)=(1ηRT(tn))×PDC,batt(tn)L_{\eta}(t_n) = \bigl(1 - \eta_{RT}(t_n)\bigr) \times P_{DC,batt}(t_n)