4.1.1. State estimation
foxBMS 2 performs various state estimations for the battery system:
state-of-charge (SOC)
state-of-energy (SOE)
state-of-health (SOH)
state-of-function (SOF)
The SOC estimation is used to estimate the currently remaining charge (Ah) within the battery system whereas the SOE estimation provides the remaining available energy (Wh) that can be drawn from the battery. The SOH estimation tries to assess the degradation state of the battery pack (aging) - how much charge or energy can the battery pack store compared to its initial value.
The SOF calculation provides a metric for the current capability of the battery pack. For example, to prevent an accelerated degeneration of the battery materials (aging) through operation near the limits given by their electrochemical properties the SOF is reduced. Especially fast charging at low temperatures leads to accelerated aging. To attenuate these conditions, the lowered current capability, the maximum recommended battery current is calculated and communicated to other control units. The operator or the supervisory control unit is encouraged to respect these suggested limits, but violation of the current ranges is not resulting in an opening of the contactors.
In an airborne application, where in extreme cases the full availability of the system must be ensured, the operating area has to be widened at the expense of the batteries health state. A typical automotive application would rather prefer to enter a limp home mode with reduced system performance. Instead, a stationary application would use more sensitive settings for the safe operating area, as the long-term availability of the battery packs is of major importance.
Different estimation algorithms for SOC, SOE and SOH can be selected via the battery system configuration file (bms.json).
This is achieved as all state estimation implementations follow the State estimation API.
4.1.1.10. State estimation API
The state estimation API is defined in state_estimation.h
and shown
below in State estimation API (state_estimation.h).
The summary of all state-estimation-functions has to implement this API.
For more details refer to the
API documentation.
1/**
2 * @brief initializes startup SOC-related values like lookup from nonvolatile
3 * ram at startup
4 * @param[out] pSocValues pointer to SOC database entry
5 * @param[in] ccPresent true if current sensor present, false otherwise
6 * @param[in] stringNumber string addressed
7 */
8extern void SE_InitializeStateOfCharge(DATA_BLOCK_SOX_s *pSocValues, bool ccPresent, uint8_t stringNumber);
9
10/**
11 * @brief periodically called algorithm to calculate state-of-charge (SOC)
12 * @param[out] pSocValues pointer to SOC values
13 */
14extern void SE_CalculateStateOfCharge(DATA_BLOCK_SOX_s *pSocValues);
15
16/**
17 * @brief look-up table for SOC initialization
18 * @param[in] voltage_mV voltage in mV of battery cell
19 * @return returns SOC value in percentage from 0.0% to 100.0%
20 */
21extern float_t SE_GetStateOfChargeFromVoltage(int16_t voltage_mV);
22
23/**
24 * @brief initializes startup state-of-energy (SOE) related values
25 * @param[out] pSoeValues pointer to SOE database entry
26 * @param[in] ec_present true if current sensor EC message received, false otherwise
27 * @param[in] stringNumber string addressed
28 */
29extern void SE_InitializeStateOfEnergy(DATA_BLOCK_SOX_s *pSoeValues, bool ec_present, uint8_t stringNumber);
30
31/**
32 * @brief periodically called algorithm to calculate state-of-energy (SOE)
33 * @param[out] pSoeValues pointer to SOE database entry
34 */
35extern void SE_CalculateStateOfEnergy(DATA_BLOCK_SOX_s *pSoeValues);
36
37/**
38 * @brief initializes startup state-of-health related values
39 * @param[out] pSohValues pointer to SOH database entry
40 * @param[in] stringNumber string addressed
41 */
42extern void SE_InitializeStateOfHealth(DATA_BLOCK_SOX_s *pSohValues, uint8_t stringNumber);
43
44/**
45 * @brief calculates state-of-health (SOH)
46 * @param[out] pSohValues pointer to SOH database entry
47 */
48extern void SE_CalculateStateOfHealth(DATA_BLOCK_SOX_s *pSohValues);