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. 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.

Listing 4.2 State estimation API (state_estimation.h)
 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 SOC_Init(DATA_BLOCK_SOX_s *pSocValues, bool ccPresent, uint8_t stringNumber);
11 * @brief   periodically called algorithm to calculate state-of-charge (SOC)
12 * @param[out] pSocValues pointer to SOC values
13 */
14extern void SOC_Calculation(DATA_BLOCK_SOX_s *pSocValues);
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 SOC_GetFromVoltage(int16_t voltage_mV);
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 SOE_Init(DATA_BLOCK_SOX_s *pSoeValues, bool ec_present, uint8_t stringNumber);
32 * @brief   periodically called algorithm to calculate state-of-energy (SOE)
33 * @param[out] pSoeValues pointer to SOE database entry
34 */
35extern void SOE_Calculation(DATA_BLOCK_SOX_s *pSoeValues);
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 SOH_Init(DATA_BLOCK_SOX_s *pSohValues, uint8_t stringNumber);
45 * @brief   calculates state-of-health (SOH)
46 * @param[out] pSohValues pointer to SOH database entry
47 */
48extern void SOH_Calculation(DATA_BLOCK_SOX_s *pSohValues);