Communication protocols
Modbus protocol
General information
The BMS Main 2.x device provides the information about the battery system using Modbus protocol. The BMS is a Modbus-server and it responds to the Modbus-client’s commands.
Interaction with the device is performed over the RS-485 bus (Modbus RTU) or the Ethernet network (Modbus TCP).
RS-485 bus connection parameters:
- baud rate, bps — 600, 1200, 2400, 4800, 9600 (by default), 19200, 38400, 57600, 115200;
- word length, bits — 8;
- parity — none;
- device address (by default) — 32.
Ethernet connection parameters:
- port — 502.
There is a description of the Input и Holding registers below. Column "Type" contains method of parameters coding:
- U8 — unsigned 8-bit integer number;
- U16 — unsigned 16-bit integer number;
- S16 — signed 16-bit integer number;
- U32 — unsigned 32-bit integer number;
- REAL32 — single precision floating point number (IEEE 754 standard);
- U8[x] — array of unsigned 8-bit integer numbers having a length of x;
- U16[x] — array of unsigned 16-bit integer numbers having a length of x;
- REAL32[x] — array of single precision floating point numbers having a length of x.
Words are in the little endian.
Input registers
| Register address | Number of registers | Content | Type |
| 0x0000 | 1 | Hardware version: byte 0 — minor; byte 1 — major. | U8[2] |
| 0x0001-0x0002 | 2 | Firmware version: byte 0 — patch; byte 1 — minor; byte 2 — major; byte 3 — not used (set to 0). | U8[4] |
| 0x0003-0x0004 | 2 | Bootloader version: byte 0 — patch; byte 1 — minor; byte 2 — major; byte 3 — not used (set to 0). | U8[4] |
| 0x1000-0x1003 | 3 | Current time on the device clock: byte 0 — day (BCD); byte 1 — month (BCD); byte 2 — year (BCD); byte 3 — hours (BCD); byte 4 — minutes (BCD); byte 5 — seconds (BCD). | U8[6] |
| 0x2000 | 1 | Discrete input signals 1 (bitfield): bit 0 — "Battery cover"; bit 1 — "Charger connected"; bit 2 — "Power up/down request"; bit 3 — "Inhibit charging"; bit 4 — "Inhibit discharging"; bit 5 — “Charging contactor feedback”; bit 6 — “Discharging contactor feedback”; bit 7 — “Insulation status”; bit 8 – “Charge request”; bit 9 – “Precharge request”; bit 10 – “Discharge request”; bit 11 – “PCH contactor feedback”; bit 12 – “CH/DCH contactor feedback”; bit 13 – “Main contactor feedback”; bit 14 – “Interlock”; bit 15 – “Fuse 1”. | U16 |
| 0x2001-0x2002 | 2 | Current measured by the primary sensor, А | REAL32 |
| 0x2003-0x2004 | 2 | External temperature, °C | REAL32 |
| 0x2005-0x2006 | 2 | Humidity, RH% | REAL32 |
| 0x2007-0x2008 | 2 | Errors 1 (bitfield): bit 0 – “Overcurrent”; bit 1 – “Undervoltage”; bit 2 – “Overvoltage”; bit 3 – “Low DCH temperature”, temperature is too low for discharging; bit 4 – “High DCH temperature”, temperature is too high for discharging; bit 5 – “Battery cover”; bit 6 – “High humidity”; bit 7 – “Water”; bit 8 – “High logic temperature”, some BMS Logic device is overheated; bit 9 – “Logic offline”, connection with some BMS Logic device is lost; bit 10 – “Critical error”; bit 11 – “Crown error”, connection with the Crown forklift is lost; bit 12 – “Cell count error”, number of cells in incorrect; bit 13 – “HYG offline”, connection with the HYG forklift is lost; bit 14 – “Need acknowledgement”, errors were detected in the past and should be acknowledged; bit 15 – “Combilift offline”, connection with the Combilift forklift is lost; bit 16 – “Short circuit”; bit 17 – “High contactor temperature”, the discharging contactor is overheated; bit 18 – “Logic count error”, number of BMS Logic devices is incorrect; bit 19 – “ADC error”, battery current cannot be measured by ADC; bit 20 – “Current sensor error”, wires which connect the current sensor with the BMS are damaged; bit 21 – “CH contactor cycles error”, the charging contactor switches very often; bit 22 – “DCH contactor cycles error”, the discharging contactor switches very often; bit 23 – “Shunt offline”, connection with the BMS Current sensor is lost; bit 24 – “Shunt error”, internal error of the BMS Current sensor; bit 25 – “Settings error”, checksum of the settings is incorrect; bit 26 – “WDT reset”, device is reset by the watchdog timer; bit 27 – “No temperature sensors”; bit 28 – “Temperature sensor is shorted”; bit 29 – “Spirit offline”, connection with the Spirit truck is lost; bits 30–31 – reserved. | U32 |
| 0x2009-0x200A | 2 | Internal signals (bitfield): bit 0 — "Low SOC"; bit 1 — "High charging current"; bit 2 — “Charging” (0 – open, 1 – closed); bit 3 — "Allow charging" (0 – open, 1 – closed); bit 4 — "Charging current present"; bit 5 — “Discharging” (0 – open, 1 – closed); bit 6 — "Discharging current present"; bit 7 — "Increased voltage" (EV); bit 8 — "Heater" (0 – off, 1 – on); bit 9 — "Cooler" (0 – off, 1 – on); bit 10 — “HYG shutdown”, command from the HYG forklift to open the discharging contactor; bit 11 — “Init”, initialization signal (during the initialization current sensor is calibrating and BMS Logic devices are scanning); bit 12 — “Precharging” (0 – open, 1 – closed); bit 13 — “Combilift shutdown”, command from the Combilift forklift to open the discharging contactor; bit 14 — “Cell analysis”, signal of started analysis of the cells; bit 15 — “Balancing series 1”; bit 16 — “Balancing series 2”; bit 17 — “Discharging (AUX)” (0 – open, 1 – closed); bit 18 — “Acknowledgement of power down”; bit 19 — “Crown EWS”; bit 20 — “Main contactor” (0 – open, 1 - closed); bit 21 – “Service reset”; bit 22 – “Charging/Discharging” (0 – open, 1 – closed); bit 23 – “Ready to charge” (the voltage of the cells is less than the threshold value and there are no errors that prohibit charging); bit 24 – “Ready to discharge” (the voltage of the cells is greater than the threshold value and there are no errors that prohibit discharging); bit 25 – “Power up”; bit 26 — signal “External 1”; bit 27 — signal “Heater (AUX)”; bits 28-31 — not used. | U32 |
| 0x200B | 1 | Discrete output signals (bitfield): bit 0 — state of the output #1; bit 1 — state of the output #2; bit 2 — state of the output #3; bit 3 — state of the output #4; bits 4-15 — not used. | U16 |
| 0x200C | 1 | Relay states (bitfield): bit 0 — state of the relay #1; bit 1 — state of the relay #2; bit 2 — state of the relay #3; bit 3 — state of the relay #4; bits 4-15 — not used. | U16 |
| 0x200E-0x200F | 2 | Errors 2 (bitfield): bit 0 – "Low CH temperature", temperature is too low for charging; bit 1 – “High CH temperature”, temperature is too high for charging; bit 2 – “SD mount error”; bit 3 – “SD read/write error”; bit 4 – “Unallowable charging”, charging the battery through the discharging contactor; bit 5 – “Stuck contactor”; bit 6 – “CH contactor feedback error”; bit 7 – “DCH contactor feedback error”; bit 8 – “Insulation fault”; bit 9 – “PCH contactor feedback error”; bit 10 – “CH/DCH contactor feedback error”; bit 11 – “Main contactor feedback error”; bit 12 – reserved (set to 0); bit 13 – “General error”; bit 14-16 — reserved (set to 0); bit 17 — “Precharge error”; bits 18-31 — not used. | U32 |
| 0x2010 | 1 | Address or the BMS Logic device whose parameters are in registers 0x2011-0x20C9 | U16 |
| 0x2011 | 1 | State of the BMS Logic (bitfield): bit 0 — device is present; bit 1 — device is online; bit 2 — device is ready; bit 3 — data from the device is actual; bit 4 — temperature sensor #1 is present; bit 5 — temperature sensor #2 is present; bit 6 — temperature sensor #1 is shorted; bit 7 — temperature sensor #2 is shorted; bits 8-15 — reserved. | U16 |
| 0x2012-0x2013 | 2 | Temperature of the BMS Logic, °C | REAL32 |
| 0x2014-0x2015 | 2 | Cell balancing flags (bitfield): bit i — balancing resistor is connected to the ith cell. | U32 |
| 0x2016-0x2029 | 20 | Array of cells states. Each element of the array corresponds to a cell and is a bitfield: bit 0 — cell is present; bit 1 — temperature sensor is present; bit 2 — need to connect a balancing resistor to the cell; bit 3 — balancing resistor is connected to the cell; bit 4 — temperature sensor is shorted; bit 5 — wires are connected to the cell; bits 6-15 — reserved. | U16[20] |
| 0x202A-0x2051 | 40 | Array of cells voltages (V) | REAL32[20] |
| 0x2052-0x2079 | 40 | Array of cells temperatures (°C) | REAL32[20] |
| 0x207A-0x20A1 | 40 | Array of cells SOCs (%) | REAL32[20] |
| 0x20A2-0x20C9 | 40 | Array of cells resistances (Ohm) | REAL32[20] |
| 0x20F4 | 1 | Discrete input signals 2 (bitfield): bit 0 — “Fuse 2”; bit 1 — “Fuse 3”; bit 2 — “Circuit breaker status”; bit 3 — signal "Balancing request"; bit 4 — signal "Close Main contactor"; bit 5 — signal "Close External 1"; bits 6-15 — not used. | U16 |
| 0x2100-0x2101 | 2 | Battery state of charge (SOC), % | REAL32 |
| 0x2102 | 1 | Number of BMS Logic devices | U16 |
| 0x2103 | 1 | Number of cells | U16 |
| 0x2104-0x2105 | 2 | Battery voltage, V | REAL32 |
| 0x2106-0x2107 | 2 | Battery resistance, Ohm | REAL32 |
| 0x2108-0x2109 | 2 | Effective capacity, A×h | REAL32 |
| 0x210A-0x210B | 2 | Balancing effectivity, % | REAL32 |
| 0x210C-0x210D | 2 | State of health, % | REAL32 |
| 0x210E-0x210F | 2 | Depth of discharge, A×h | REAL32 |
| 0x2110-0x2111 | 2 | Minimum BMS Logic temperature | REAL32 |
| 0x2112 | 1 | Address of the BMS Logic device whose temperature is minimal | U16 |
| 0x2113-0x2114 | 2 | Maximum BMS Logic temperature | REAL32 |
| 0x2115 | 1 | Address of the BMS Logic device whose temperature is maximal | U16 |
| 0x2116-0x2117 | 2 | BMS Logic polling rate, commands pre second | REAL32 |
| 0x2118-0x2119 | 2 | Minimum cell temperature | REAL32 |
| 0x211A | 1 | Address of the BMS Logic device which is connected to the cell whose temperature is minimal | U16 |
| 0x211B | 1 | Position of the cell whose temperature is minimal | U16 |
| 0x211C-0x211D | 2 | Maximum cell temperature | REAL32 |
| 0x211E | 1 | Address of the BMS Logic device which is connected to the cell whose temperature is maximal | U16 |
| 0x211F | 1 | Position of the cell whose temperature is maximal | U16 |
| 0x2120-0x2121 | 2 | Minimum cell voltage | REAL32 |
| 0x2122 | 1 | Address of the BMS Logic device which is connected to the cell whose voltage is minimal | U16 |
| 0x2123 | 1 | Position of the cell whose voltage is minimal | U16 |
| 0x2124-0x2125 | 2 | Maximum cell voltage | REAL32 |
| 0x2126 | 1 | Address of the BMS Logic device which is connected to the cell whose voltage is maximal | U16 |
| 0x2127 | 1 | Position of the cell whose voltage is maximal | U16 |
| 0x2128 | 1 | Error flag: 0 — no errors; 1 — there are some errors. | U16 |
| 0x2130-0x2131 | 2 | Energy received from the charger, W×h | REAL32 |
| 0x2132-0x2133 | 2 | Energy consumed by the load, W×h | REAL32 |
| 0x2134-0x2135 | 2 | Energy dissipated by the balancing resistors, W×h | REAL32 |
| 0x2140 | 1 | SD-card mounting flag: 0 — not mounted; 1 — mounted. | U16 |
| 0x2141 | 1 | Reserved | U16 |
| 0x2142 | 1 | Reserved | U16 |
| 0x2170 | 1 | Wi-Fi connection status: 0 — no connection; 1 — connection is established. | U16 |
| 0x2171-0x2172 | 2 | IP-address in the Wi-Fi network | U8[4] |
| 0x2173-0x2175 | 3 | MAC-address of the Wi-Fi module | U8[6] |
| 0x2179-0x217A | 2 | Instant effective capacity, A×h | REAL32 |
| 0x217B-0x217C | 2 | Coulomb received from the charger, A×h | REAL32 |
| 0x217D-0x217E | 2 | Coulomb consumed by the load, A×h | REAL32 |
| 0x217F-0x2180 | 2 | Ethernet IP-address | U8[4] |
| 0x2181-0x2182 | 2 | Ethernet netmask | U8[4] |
| 0x2183-0x2184 | 2 | Ethernet gateway | U8[4] |
| 0x2185-0x2186 | 2 | Calibrated voltage in the reference line of the current sensor, V | REAL32 |
| 0x218E | 2 | Voltage from the current sensor, V | REAL32 |
| 0x2190 | 2 | Voltage in the reference line of the current sensor, V | REAL32 |
| 0x2192 | 2 | Voltage from the auxiliary current sensor, V | REAL32 |
| 0x2194 | 2 | Voltage in the reference line of the auxiliary current sensor, V | REAL32 |
| 0x219F | 2 | Charge current limit, A | REAL32 |
| 0x21A1 | 2 | Discharge current limit, A | REAL32 |
| 0x21B8 | 1 | Flag indicating that the cells are balancing | U16 |
| 0x21C6 | 2 | Calibrated voltage in the reference line of the auxiliary current sensor, V | REAL32 |
| 0x21CA | 2 | Average cell voltage, V | REAL32 |
| 0x2200-0x2203 | 4 | Record #1 from the errors journal. First 32-bit word contains a timestamp, second 32-bit word contains errors 1 flags (see 0x2007-0x2008). Timestamp format: bits 0-5 — year; bits 6-9 — month; bits 10-14 — day; bits 15-19 — hours; bits 20-25 — minutes; bits 26-31 — seconds. | U32[2] |
| 0x2204-0x2207 | 4 | Record #2 from the errors journal | U32[2] |
| 0x2208-0x227B | Records #3-31 from the errors journal | ||
| 0x227C-0x227F | 4 | Record #32 from the errors journal | U32[2] |
| 0x2300 | 1 | Number of the last record from the errors journal (1..32) | U16 |
| 0x2380 | 4 | Record data #1 from the errors journal. First 32-bit word contains errors 2 flags (see 0x200E-0x200F). | U32[2] |
| 0x2384-0x2387 | 4 | Record data #2 from the errors journal | U32[2] |
| 0x2388-0x23FB | Records data #3-31 from the errors journal | ||
| 0x23FC-0x23FF | 4 | Record data #32 from the errors journal | U32[2] |
| 0x2400 | 2 | Current measured by the auxiliary current sensor, A | REAL32 |
| 0x2402 | 2 | Final battery current, A Note — Typically it is the sum of the values measured by the main and auxiliary current sensors | REAL32 |
| 0x2410 | 1 | Battery state: 0 – Unknown; 1 – Charging ON; 2 – Charging OFF; 3 – Relaxed (after charging); 4 – Discharging ON; 5 – Discharging OFF; 6 – Relaxed (after discharging). | U16 |
| 0x2411 | 2 | Duration of the battery state (0x2410), seconds | U32 |
| 0x2420 | 2 | Nominal battery capacity, A×h | REAL32 |
| 0x2422 | 2 | Maximum charge voltage, V | REAL32 |
| 0x2424 | 2 | Minimum discharge voltage, V | REAL32 |
| 0x2426 | 2 | Maximum charge current, A | REAL32 |
| 0x2428 | 2 | Maximum discharge current, A | REAL32 |
Holding registers
| Register address | Number of registers | Content | Type |
| 0x4000 | 1 | Address of the BMS Logic device whose parameters should be in the input registers 0x2011-0x20C9 | U16 |
| 0x4100 | 2 | Command to acknowledge errors in the errors journal (bitfield). Each ith bit corresponds to (i+1) record. Notes: 1 – After the errors are acknowledged, the register value will be set to 0. 2 – To acknowledge all errors, set 0xFFFFFFFF. | U32 |
| 0x5100 | 1 | Software control of the "Battery cover" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Battery cover". | U16 |
| 0x5101 | 1 | Software control of the "Charger connected" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Charger connected". | U16 |
| 0x5102 | 1 | Software control of the "Power down request" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Power down request". | U16 |
| 0x5103 | 1 | Software control of the "Inhibit charging" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Inhibit charging". | U16 |
| 0x5104 | 1 | Software control of the "Inhibit discharging" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Inhibit discharging". | U16 |
| 0x5105 | 1 | Software control of the "Charging contactor feedback" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Charging contactor feedback". | U16 |
| 0x5106 | 1 | Software control of the "Discharging contactor feedback" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Discharging contactor feedback". | U16 |
| 0x5107 | 1 | Software control of the "Insulation status" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Insulation status". | U16 |
| 0x5108 | 1 | Software control of the "Charge request" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Charge request". | U16 |
| 0x5109 | 1 | Software control of the "Precharge request" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Precharge request". | U16 |
| 0x510A | 1 | Software control of the "Discharge request" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Discharge request". | U16 |
| 0x510B | 1 | Software control of the "PCH contactor feedback" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "PCH contactor feedback". | U16 |
| 0x510C | 1 | Software control of the "CH/DCH contactor feedback" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "CH/DCH contactor feedback". | U16 |
| 0x510D | 1 | Software control of the "Main contactor feedback" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Main contactor feedback". | U16 |
| 0x510E | 1 | Software control of the "Interlock" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Interlock". | U16 |
| 0x510F | 1 | Software control of the "Fuse 1" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Fuse 1". | U16 |
| 0x5110 | 1 | Software control of the "Fuse 2" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Fuse 2". | U16 |
| 0x5111 | 1 | Software control of the "Fuse 3" signal. Allowable values: 0 – clear the signal; 1 – set the signal; 2-65535 – use the physical input "Fuse 3". | U16 |