JK BMS RS485 general protocol V1.1 Modbus register map
Modbus RTU over RS485 protocol of JK BMS (JIKONG, Chengdu Jikong Technology) battery management systems. The document is a general protocol and does not list product models; the vendor's download page names V1.0 for firmware V11.36. It defines four register blocks: settings at 0x1000, live data at 0x1200, device information at 0x1400 and write only commands at 0x1600. Per-cell values, protection thresholds, alarms, SOC and capacity are listed. The document also lists the per-cell connection and balance wire resistance registers, the protocol selection registers and the voltage and current calibration commands, but this file leaves them out.
- Protocol
- Modbus RTU over RS485
- Defaults
- 115200 baud, 8 data bits, no parity, 1 stop bit; slave addresses 1 to 247; function codes 03H (read registers) and 10H (write registers) (p. 3). The slave address is held in the DevAddr setting.
- Addresses in the manual
- 0-based protocol addresses, as sent on the wire
- 32 and 64-bit values
- High word first (AB CD)
- Registers listed
- 125
- Checked against
- Document 'Jikong BMS RS485 Modbus general protocol (V1.1)', Chengdu Jikong Technology Co., Ltd, dated 2024.02, revision record V1.1 2024.01 (fixes some errors and adds registers), 15 pages. The vendor hosts this document on its own site at http://www.jk-bms.com/Upload/2024-02-21/1345398693.pdf (http only, the https form did not respond). The linked https copy is hosted by JKVOLT (jkvolt.com, which describes itself as an authorized JK BMS distributor operated by Chengdu JK Volt Technology Co., Ltd.) on its download center page, served from the Shopify CDN. The two files are byte-identical (same SHA-256, b9b3f1e4...d22739), and a third copy on the jkbms.net downloads archive is also identical. Field names are in English and descriptions are Chinese, so labels here are translations; the document field name is given in every note.
Address base. The document gives each register as a block base address (0x1000, 0x1200, 0x1400, 0x1600) plus an Index (offset) printed in hex and decimal, with the Length column in bytes (UINT16 is 2, UINT32 is 4), so the offset is a byte offset. This file lists base plus offset converted to decimal. The worked write examples on p. 14 to 15 confirm that the wire address is base plus the byte offset: the 32-bit setting at offset 0x0004 is written with function 10H to address 0x1004 with a register quantity of 2 and 4 data bytes, and the next 32-bit setting is written to 0x1008. So 32-bit values are 4 apart and 16-bit live values are 2 apart, while the quantity counts 16-bit registers (length in bytes divided by 2). Addresses between the listed ones, such as 0x1002, are not defined by the document. The document has no read example for the 0x1200, 0x1400 or 0x1600 blocks; reading with function 03H at base plus byte offset and a quantity of length divided by 2 is inferred from the write examples, so confirm on the device that reading address 0x1200 with quantity 2 returns the first two cell voltages. Address 4096 in the manual is address 4096 on the wire.
Word order. The write examples on p. 14 show the 32-bit value 3540 (3.54 V, VolSmartSleep) sent as 00 00 0D D4, and -250 (0.1 degC units) as FF FF FF 06, so the high word comes first. The document gives no example for float values.
Modbus Poll and the Modbus protocol itself count from 0. The "Wire address" column is the number to type into Modbus Poll.
Downloads
The register table has every column on this page. The blocks file imports into Modbus Poll. The template JSON holds the same blocks plus unit, scale and access for scripts.
Registers
| Manual | Wire | Register | Type | Regs | Unit | Scale | Access | Area |
|---|---|---|---|---|---|---|---|---|
| 4096 | 4096 | Voltage to enter smart sleepSmart_Sleep_Voltage · Document field VolSmartSleep, block 0x1000 offset 0x0000. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4100 | 4100 | Cell undervoltage protectionCell_Undervoltage_Protection · Document field VolCellUV, block 0x1000 offset 0x0004. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4104 | 4104 | Cell undervoltage protection recoveryCell_Undervoltage_Recovery · Document field VolCellUVPR, block 0x1000 offset 0x0008. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4108 | 4108 | Cell overcharge protection voltageCell_Overcharge_Protection · Document field VolCellOV, block 0x1000 offset 0x000C. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4112 | 4112 | Cell overcharge protection recovery voltageCell_Overcharge_Recovery · Document field VolCellOVPR, block 0x1000 offset 0x0010. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4116 | 4116 | Cell voltage difference that triggers balancingBalance_Trigger_Difference · Document field VolBalanTrig, block 0x1000 offset 0x0014. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4120 | 4120 | SOC 100% voltageSoc_100_Voltage · Document field VolSOC100%, block 0x1000 offset 0x0018. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4124 | 4124 | SOC 0% voltageSoc_0_Voltage · Document field VolSOC0%, block 0x1000 offset 0x001C. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4128 | 4128 | Recommended charge voltageRecommended_Charge_Voltage · Document field VolCellRCV, block 0x1000 offset 0x0020. Added in V1.1 of the document. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4132 | 4132 | Float charge voltageFloat_Charge_Voltage · Document field VolCellRFV, block 0x1000 offset 0x0024. Added in V1.1 of the document. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4136 | 4136 | Automatic shutdown voltageAuto_Shutdown_Voltage · Document field VolSysPwrOff, block 0x1000 offset 0x0028. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4140 | 4140 | Continuous charge currentContinuous_Charge_Current · Document field CurBatCOC, block 0x1000 offset 0x002C. |
uint32 | 2 | mA | 1 | RW | Holding (FC03) |
| 4144 | 4144 | Charge overcurrent protection delayCharge_Overcurrent_Delay · Document field TIMBatCOCPDly, block 0x1000 offset 0x0030. |
uint32 | 2 | s | 1 | RW | Holding (FC03) |
| 4148 | 4148 | Charge overcurrent protection release delayCharge_Overcurrent_Release_Delay · Document field TIMBatCOCPRDly, block 0x1000 offset 0x0034. |
uint32 | 2 | s | 1 | RW | Holding (FC03) |
| 4152 | 4152 | Continuous discharge currentContinuous_Discharge_Current · Document field CurBatDcOC, block 0x1000 offset 0x0038. |
uint32 | 2 | mA | 1 | RW | Holding (FC03) |
| 4156 | 4156 | Discharge overcurrent protection delayDischarge_Overcurrent_Delay · Document field TIMBatDcOCPDly, block 0x1000 offset 0x003C. |
uint32 | 2 | s | 1 | RW | Holding (FC03) |
| 4160 | 4160 | Discharge overcurrent protection release delayDischarge_Overcurrent_Release_Delay · Document field TIMBatDcOCPRDly, block 0x1000 offset 0x0040. |
uint32 | 2 | s | 1 | RW | Holding (FC03) |
| 4164 | 4164 | Short circuit protection release delayShort_Circuit_Release_Delay · Document field TIMBatSCPRDly, block 0x1000 offset 0x0044. |
uint32 | 2 | s | 1 | RW | Holding (FC03) |
| 4168 | 4168 | Maximum balance currentMax_Balance_Current · Document field CurBalanMax, block 0x1000 offset 0x0048. |
uint32 | 2 | mA | 1 | RW | Holding (FC03) |
| 4172 | 4172 | Charge over-temperature protectionCharge_Overtemperature_Protection · Document field TMPBatCOT, block 0x1000 offset 0x004C. Document unit 0.1 degC. |
int32 | 2 | degC | 0.1 | RW | Holding (FC03) |
| 4176 | 4176 | Charge over-temperature recoveryCharge_Overtemperature_Recovery · Document field TMPBatCOTPR, block 0x1000 offset 0x0050. Document unit 0.1 degC. |
int32 | 2 | degC | 0.1 | RW | Holding (FC03) |
| 4180 | 4180 | Discharge over-temperature protectionDischarge_Overtemperature_Protection · Document field TMPBatDcOT, block 0x1000 offset 0x0054. Document unit 0.1 degC. |
int32 | 2 | degC | 0.1 | RW | Holding (FC03) |
| 4184 | 4184 | Discharge over-temperature recoveryDischarge_Overtemperature_Recovery · Document field TMPBatDcOTPR, block 0x1000 offset 0x0058. Document unit 0.1 degC. |
int32 | 2 | degC | 0.1 | RW | Holding (FC03) |
| 4188 | 4188 | Charge low-temperature protectionCharge_Undertemperature_Protection · Document field TMPBatCUT, block 0x1000 offset 0x005C. Document unit 0.1 degC. |
int32 | 2 | degC | 0.1 | RW | Holding (FC03) |
| 4192 | 4192 | Charge low-temperature recoveryCharge_Undertemperature_Recovery · Document field TMPBatCUTPR, block 0x1000 offset 0x0060. Document unit 0.1 degC. |
int32 | 2 | degC | 0.1 | RW | Holding (FC03) |
| 4196 | 4196 | MOS over-temperature protectionMos_Overtemperature_Protection · Document field TMPMosOT, block 0x1000 offset 0x0064. Document unit 0.1 degC. |
int32 | 2 | degC | 0.1 | RW | Holding (FC03) |
| 4200 | 4200 | MOS over-temperature protection recoveryMos_Overtemperature_Recovery · Document field TMPMosOTPR, block 0x1000 offset 0x0068. Document unit 0.1 degC. |
int32 | 2 | degC | 0.1 | RW | Holding (FC03) |
| 4204 | 4204 | Number of cellsCell_Count · Document field CellCount, block 0x1000 offset 0x006C. The document prints the unit as the Chinese character for series (cells in series). |
uint32 | 2 | 1 | RW | Holding (FC03) | |
| 4208 | 4208 | Charge switchCharge_Enable · Document field BatChargeEN, block 0x1000 offset 0x0070. 1: on; 0: off. |
uint32 | 2 | 1 | RW | Holding (FC03) | |
| 4212 | 4212 | Discharge switchDischarge_Enable · Document field BatDisChargeEN, block 0x1000 offset 0x0074. 1: on; 0: off. |
uint32 | 2 | 1 | RW | Holding (FC03) | |
| 4216 | 4216 | Balance switchBalance_Enable · Document field BalanEN, block 0x1000 offset 0x0078. 1: on; 0: off. |
uint32 | 2 | 1 | RW | Holding (FC03) | |
| 4220 | 4220 | Battery design capacityBattery_Design_Capacity · Document field CapBatCell, block 0x1000 offset 0x007C. Document unit mAH. |
uint32 | 2 | mAh | 1 | RW | Holding (FC03) |
| 4224 | 4224 | Short circuit protection delayShort_Circuit_Delay · Document field SCPDelay, block 0x1000 offset 0x0080. |
uint32 | 2 | us | 1 | RW | Holding (FC03) |
| 4228 | 4228 | Balance start voltageBalance_Start_Voltage · Document field VolStartBalan, block 0x1000 offset 0x0084. |
uint32 | 2 | mV | 1 | RW | Holding (FC03) |
| 4360 | 4360 | Device address (slave address)Device_Address · Document field DevAddr, block 0x1000 offset 0x0108. The document prints the unit as H. Slave addresses 1 to 247 are allowed (p. 3). |
uint32 | 2 | 1 | RW | Holding (FC03) | |
| 4364 | 4364 | Discharge precharge timeDischarge_Precharge_Time · Document field TIMProdischarge, block 0x1000 offset 0x010C. |
uint32 | 2 | s | 1 | RW | Holding (FC03) |
| 4372 | 4372 | Settings flag bitsSetting_Flags · Document fields at block 0x1000 offset 0x0114. Bit field. BIT0 HeatEN heating switch; BIT1 Disable temp-sensor; BIT2 GPS Heartbeat; BIT3 Port Switch (1: RS485, 0: CAN); BIT4 LCD Always On; BIT5 Special Charger; BIT6 SmartSleep; BIT7 DisablePCLModule; BIT8 TimedStoredData; BIT9 ChargingFloatMode. Each bit is 1: on, 0: off except BIT3. BIT7 to BIT9 were added in V1.1 of the document. |
bitfield16 | 1 | 1 | RW | Holding (FC03) | |
| 4608 | 4608 | Cell voltage, index 0Cell_Voltage_0 · Document field CellVol0, block 0x1200 offset 0x0000. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4610 | 4610 | Cell voltage, index 1Cell_Voltage_1 · Document field CellVol1, block 0x1200 offset 0x0002. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4612 | 4612 | Cell voltage, index 2Cell_Voltage_2 · Document field CellVol2, block 0x1200 offset 0x0004. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4614 | 4614 | Cell voltage, index 3Cell_Voltage_3 · Document field CellVol3, block 0x1200 offset 0x0006. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4616 | 4616 | Cell voltage, index 4Cell_Voltage_4 · Document field CellVol4, block 0x1200 offset 0x0008. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4618 | 4618 | Cell voltage, index 5Cell_Voltage_5 · Document field CellVol5, block 0x1200 offset 0x000A. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4620 | 4620 | Cell voltage, index 6Cell_Voltage_6 · Document field CellVol6, block 0x1200 offset 0x000C. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4622 | 4622 | Cell voltage, index 7Cell_Voltage_7 · Document field CellVol7, block 0x1200 offset 0x000E. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4624 | 4624 | Cell voltage, index 8Cell_Voltage_8 · Document field CellVol8, block 0x1200 offset 0x0010. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4626 | 4626 | Cell voltage, index 9Cell_Voltage_9 · Document field CellVol9, block 0x1200 offset 0x0012. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4628 | 4628 | Cell voltage, index 10Cell_Voltage_10 · Document field CellVol10, block 0x1200 offset 0x0014. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4630 | 4630 | Cell voltage, index 11Cell_Voltage_11 · Document field CellVol11, block 0x1200 offset 0x0016. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4632 | 4632 | Cell voltage, index 12Cell_Voltage_12 · Document field CellVol12, block 0x1200 offset 0x0018. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4634 | 4634 | Cell voltage, index 13Cell_Voltage_13 · Document field CellVol13, block 0x1200 offset 0x001A. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4636 | 4636 | Cell voltage, index 14Cell_Voltage_14 · Document field CellVol14, block 0x1200 offset 0x001C. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4638 | 4638 | Cell voltage, index 15Cell_Voltage_15 · Document field CellVol15, block 0x1200 offset 0x001E. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4640 | 4640 | Cell voltage, index 16Cell_Voltage_16 · Document field CellVol16, block 0x1200 offset 0x0020. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4642 | 4642 | Cell voltage, index 17Cell_Voltage_17 · Document field CellVol17, block 0x1200 offset 0x0022. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4644 | 4644 | Cell voltage, index 18Cell_Voltage_18 · Document field CellVol18, block 0x1200 offset 0x0024. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4646 | 4646 | Cell voltage, index 19Cell_Voltage_19 · Document field CellVol19, block 0x1200 offset 0x0026. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4648 | 4648 | Cell voltage, index 20Cell_Voltage_20 · Document field CellVol20, block 0x1200 offset 0x0028. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4650 | 4650 | Cell voltage, index 21Cell_Voltage_21 · Document field CellVol21, block 0x1200 offset 0x002A. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4652 | 4652 | Cell voltage, index 22Cell_Voltage_22 · Document field CellVol22, block 0x1200 offset 0x002C. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4654 | 4654 | Cell voltage, index 23Cell_Voltage_23 · Document field CellVol23, block 0x1200 offset 0x002E. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4656 | 4656 | Cell voltage, index 24Cell_Voltage_24 · Document field CellVol24, block 0x1200 offset 0x0030. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4658 | 4658 | Cell voltage, index 25Cell_Voltage_25 · Document field CellVol25, block 0x1200 offset 0x0032. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4660 | 4660 | Cell voltage, index 26Cell_Voltage_26 · Document field CellVol26, block 0x1200 offset 0x0034. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4662 | 4662 | Cell voltage, index 27Cell_Voltage_27 · Document field CellVol27, block 0x1200 offset 0x0036. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4664 | 4664 | Cell voltage, index 28Cell_Voltage_28 · Document field CellVol28, block 0x1200 offset 0x0038. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4666 | 4666 | Cell voltage, index 29Cell_Voltage_29 · Document field CellVol29, block 0x1200 offset 0x003A. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4668 | 4668 | Cell voltage, index 30Cell_Voltage_30 · Document field CellVol30, block 0x1200 offset 0x003C. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4670 | 4670 | Cell voltage, index 31Cell_Voltage_31 · Document field CellVol31, block 0x1200 offset 0x003E. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4672 | 4672 | Cell presence bitsCell_Presence · Document field CellSta, block 0x1200 offset 0x0040. Bit n is 1 when cell n is present. |
uint32 | 2 | 1 | R | Holding (FC03) | |
| 4676 | 4676 | Average cell voltageCell_Voltage_Average · Document field CellVolAve, block 0x1200 offset 0x0044. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4678 | 4678 | Maximum cell voltage differenceCell_Voltage_Max_Difference · Document field CellVdifMax, block 0x1200 offset 0x0046. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4746 | 4746 | Power board temperaturePower_Board_Temperature · Document field TempMos, block 0x1200 offset 0x008A. Document unit 0.1 degC. |
int16 | 1 | degC | 0.1 | R | Holding (FC03) |
| 4748 | 4748 | Balance wire resistance alarm bitsBalance_Wire_Alarm_Bits · Document field CellWireResSta, block 0x1200 offset 0x008C. Bit n is 1 when the balance wire of cell n is in alarm. |
uint32 | 2 | 1 | R | Holding (FC03) | |
| 4752 | 4752 | Battery total voltageBattery_Voltage · Document field BatVol, block 0x1200 offset 0x0090. |
uint32 | 2 | mV | 1 | R | Holding (FC03) |
| 4756 | 4756 | Battery powerBattery_Power · Document field BatWatt, block 0x1200 offset 0x0094. Unsigned type as printed; the document does not describe a sign convention. |
uint32 | 2 | mW | 1 | R | Holding (FC03) |
| 4760 | 4760 | Battery currentBattery_Current · Document field BatCurrent, block 0x1200 offset 0x0098. The document does not describe which current direction is positive. |
int32 | 2 | mA | 1 | R | Holding (FC03) |
| 4764 | 4764 | Battery temperature sensor 1Battery_Temperature_1 · Document field TempBat 1, block 0x1200 offset 0x009C. Document unit 0.1 degC. |
int16 | 1 | degC | 0.1 | R | Holding (FC03) |
| 4766 | 4766 | Battery temperature sensor 2Battery_Temperature_2 · Document field TempBat 2, block 0x1200 offset 0x009E. Document unit 0.1 degC. |
int16 | 1 | degC | 0.1 | R | Holding (FC03) |
| 4768 | 4768 | Alarm bitsAlarm_Bits · Document field Alarm, block 0x1200 offset 0x00A0. Each bit is 1: fault, 0: normal. BIT0 AlarmWireRes (balance wire resistance too large); BIT1 AlarmMosOTP (MOS over-temperature protection); BIT2 AlarmCellQuantity (cell count differs from the setting); BIT3 AlarmCurSensorErr (current sensor error); BIT4 AlarmCellOVP (cell overvoltage); BIT5 AlarmBatOVP (battery overvoltage); BIT6 AlarmChOCP (charge overcurrent); BIT7 AlarmChSCP (charge short circuit); BIT8 AlarmChOTP (charge over-temperature); BIT9 AlarmChUTP (charge low temperature); BIT10 AlarmCPUAuxCommuErr (internal communication error); BIT11 AlarmCellUVP (cell undervoltage); BIT12 AlarmBatUVP (battery undervoltage); BIT13 AlarmDchOCP (discharge overcurrent); BIT14 AlarmDchSCP (discharge short circuit); BIT15 AlarmDchOTP (discharge over-temperature); BIT16 AlarmChargeMOS (charge MOSFET error); BIT17 AlarmDischargeMOS (discharge MOSFET error); BIT18 GPSDisconneted (GPS disconnected); BIT19 Modify PWD. in time (modify the authorization password); BIT20 Discharge On Failed; BIT21 Battery Over Temp Alarm. V1.1 also lists Temperature sensor anomaly and PLCModule anomaly after BIT21 without bit numbers. |
uint32 | 2 | 1 | R | Holding (FC03) | |
| 4772 | 4772 | Balance currentBalance_Current · Document field BalanCurrent, block 0x1200 offset 0x00A4. |
int16 | 1 | mA | 1 | R | Holding (FC03) |
| 4776 | 4776 | Remaining capacityRemaining_Capacity · Document field SOCCapRemain, block 0x1200 offset 0x00A8. Document unit mAH. |
int32 | 2 | mAh | 1 | R | Holding (FC03) |
| 4780 | 4780 | Actual battery capacityFull_Charge_Capacity · Document field SOCFullChargeCap, block 0x1200 offset 0x00AC. Document unit mAH. |
uint32 | 2 | mAh | 1 | R | Holding (FC03) |
| 4784 | 4784 | Cycle countCycle_Count · Document field SOCCycleCount, block 0x1200 offset 0x00B0. The document prints the unit as the Chinese character for times. |
uint32 | 2 | 1 | R | Holding (FC03) | |
| 4788 | 4788 | Total cycle capacityCycle_Capacity · Document field SOCCycleCap, block 0x1200 offset 0x00B4. Document unit mAH. |
uint32 | 2 | mAh | 1 | R | Holding (FC03) |
| 4794 | 4794 | User level alarm wordUser_Alarm · Document field UserAlarm, block 0x1200 offset 0x00BA. The document does not describe the bits. |
uint16 | 1 | 1 | R | Holding (FC03) | |
| 4796 | 4796 | Run timeRun_Time · Document field RunTime, block 0x1200 offset 0x00BC. |
uint32 | 2 | s | 1 | R | Holding (FC03) |
| 4802 | 4802 | User level alarm word 2User_Alarm_2 · Document field UserAlarm2, block 0x1200 offset 0x00C2. The document does not describe the bits. |
uint16 | 1 | 1 | R | Holding (FC03) | |
| 4804 | 4804 | Discharge overcurrent protection release timeDischarge_Overcurrent_Release_Time · Document field TimeDcOCPR, block 0x1200 offset 0x00C4. |
uint16 | 1 | s | 1 | R | Holding (FC03) |
| 4806 | 4806 | Discharge short circuit protection release timeDischarge_Short_Circuit_Release_Time · Document field TimeDcSCPR, block 0x1200 offset 0x00C6. |
uint16 | 1 | s | 1 | R | Holding (FC03) |
| 4808 | 4808 | Charge overcurrent protection release timeCharge_Overcurrent_Release_Time · Document field TimeCOCPR, block 0x1200 offset 0x00C8. |
uint16 | 1 | s | 1 | R | Holding (FC03) |
| 4810 | 4810 | Charge short circuit protection release timeCharge_Short_Circuit_Release_Time · Document field TimeCSCPR, block 0x1200 offset 0x00CA. |
uint16 | 1 | s | 1 | R | Holding (FC03) |
| 4812 | 4812 | Cell undervoltage protection release timeCell_Undervoltage_Release_Time · Document field TimeUVPR, block 0x1200 offset 0x00CC. |
uint16 | 1 | s | 1 | R | Holding (FC03) |
| 4814 | 4814 | Cell overvoltage protection release timeCell_Overvoltage_Release_Time · Document field TimeOVPR, block 0x1200 offset 0x00CE. |
uint16 | 1 | s | 1 | R | Holding (FC03) |
| 4820 | 4820 | Emergency switch timeEmergency_Switch_Time · Document field TimeEmergency, block 0x1200 offset 0x00D4. |
uint16 | 1 | s | 1 | R | Holding (FC03) |
| 4822 | 4822 | Discharge current correction factorDischarge_Current_Correction · Document field BatDisCurCorrect, block 0x1200 offset 0x00D6. V1.0 of the document names this field BatCurCorrect. |
uint16 | 1 | 1 | R | Holding (FC03) | |
| 4824 | 4824 | Charge current sensor voltageCharge_Current_Sensor_Voltage · Document field VolChargCur, block 0x1200 offset 0x00D8. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4826 | 4826 | Discharge current sensor voltageDischarge_Current_Sensor_Voltage · Document field VolDischargCur, block 0x1200 offset 0x00DA. |
uint16 | 1 | mV | 1 | R | Holding (FC03) |
| 4828 | 4828 | Battery voltage correction factorBattery_Voltage_Correction · Document field BatVolCorrect, block 0x1200 offset 0x00DC. Printed type FLOAT, length 4. The document does not show the word order of floats. |
float32 | 2 | 1 | R | Holding (FC03) | |
| 4836 | 4836 | Battery voltage (16-bit)Battery_Voltage_Small · Document field BatVol, block 0x1200 offset 0x00E4. A second BatVol field, distinct from the 32-bit mV value at 0x1290. Document unit 0.01V. |
uint16 | 1 | V | 0.01 | R | Holding (FC03) |
| 4838 | 4838 | Heating currentHeating_Current · Document field HeatCurrent, block 0x1200 offset 0x00E6. |
int16 | 1 | mA | 1 | R | Holding (FC03) |
| 4848 | 4848 | System run ticksSystem_Ticks · Document field SysRunTicks, block 0x1200 offset 0x00F0. Document unit 0.1S. |
uint32 | 2 | s | 0.1 | R | Holding (FC03) |
| 4856 | 4856 | Battery temperature sensor 3Battery_Temperature_3 · Document field TempBat 3, block 0x1200 offset 0x00F8. Document unit 0.1 degC. |
int16 | 1 | degC | 0.1 | R | Holding (FC03) |
| 4858 | 4858 | Battery temperature sensor 4Battery_Temperature_4 · Document field TempBat 4, block 0x1200 offset 0x00FA. Document unit 0.1 degC. |
int16 | 1 | degC | 0.1 | R | Holding (FC03) |
| 4860 | 4860 | Battery temperature sensor 5Battery_Temperature_5 · Document field TempBat 5, block 0x1200 offset 0x00FC. Document unit 0.1 degC. |
int16 | 1 | degC | 0.1 | R | Holding (FC03) |
| 4864 | 4864 | RTC counterRtc_Ticks · Document field RTCTicks, block 0x1200 offset 0x0100. The document says the counter starts from 2020-1-1 and does not print a unit. |
uint32 | 2 | 1 | R | Holding (FC03) | |
| 4872 | 4872 | Time to enter sleepTime_Enter_Sleep · Document field TimeEnterSleep, block 0x1200 offset 0x0108. |
uint32 | 2 | s | 1 | R | Holding (FC03) |
| 4680 | 4680 | Cell numbers with maximum and minimum voltageMax_Min_Cell_Numbers · Block 0x1200 offset 0x0048 is a 2-byte slot holding two UINT8 fields, listed in the document in this order: MaxVolCellNbr then MinVolCellNbr. The document does not say which byte of the register holds which field, so read both and check against a known state. |
bitfield16 | 1 | 1 | R | Holding (FC03) | |
| 4774 | 4774 | Balance state and state of chargeBalance_State_And_Soc · Block 0x1200 offset 0x00A6 is a 2-byte slot holding two UINT8 fields, listed in the document in this order: BalanSta (2: discharge; 1: charge; 0: off) then SOCStateOfcharge (state of charge). The unit column prints % on the BalanSta line, but BalanSta is a state code, so the % most likely belongs to the state of charge; the table layout does not make this explicit. The document does not say which byte of the register holds which field, so read both and check against a known state. |
bitfield16 | 1 | 1 | R | Holding (FC03) | |
| 4792 | 4792 | State of health and precharge stateSoh_And_Precharge · Block 0x1200 offset 0x00B8 is a 2-byte slot holding two UINT8 fields, listed in the document in this order: SOCSOH (state of health, unit %) then Precharge (1: on; 0: off). The document does not say which byte of the register holds which field, so read both and check against a known state. |
bitfield16 | 1 | 1 | R | Holding (FC03) | |
| 4800 | 4800 | Charge and discharge stateCharge_And_Discharge_State · Block 0x1200 offset 0x00C0 is a 2-byte slot holding two UINT8 fields, listed in the document in this order: Charge (1: on; 0: off) then Discharge (1: on; 0: off). The document does not say which byte of the register holds which field, so read both and check against a known state. |
bitfield16 | 1 | 1 | R | Holding (FC03) | |
| 4816 | 4816 | Temperature sensor presence flags and heating stateTemp_Sensor_Flags_And_Heating · Block 0x1200 offset 0x00D0 is a 2-byte slot holding two UINT8 fields, listed in the document in this order: a flag byte (BIT0 MOS TempSensorAbsent; BIT1 to BIT5 BATTempSensor1Absent to BATTempSensor5Absent, BIT3 is sensor 3; for the battery sensor bits the document prints 1: normal, 0: missing), then Heating (1: on; 0: off). The document does not say which byte of the register holds which field, so read both and check against a known state. |
bitfield16 | 1 | 1 | R | Holding (FC03) | |
| 4846 | 4846 | Charger plugged stateReserved_And_Charger_Plugged · Block 0x1200 offset 0x00EE is a 2-byte slot holding two UINT8 fields, listed in the document in this order: RVD (reserved) then ChargerPlugged (1: plugged in; 0: not plugged in). The document does not say which byte of the register holds which field, so read both and check against a known state. |
bitfield16 | 1 | 1 | R | Holding (FC03) | |
| 4876 | 4876 | Parallel current limiting module statePcl_Module_State · Block 0x1200 offset 0x010C is a 2-byte slot holding two UINT8 fields, listed in the document in this order: PCLModuleSta (1: on; 0: off) then RVD (reserved). The document does not say which byte of the register holds which field, so read both and check against a known state. |
bitfield16 | 1 | 1 | R | Holding (FC03) | |
| 5120 | 5120 | Manufacturer device IDManufacturer_Device_Id · Document field ManufacturerDeviceID, block 0x1400 offset 0x0000. ASCII, 16 bytes. |
string | 8 | 1 | R | Holding (FC03) | |
| 5136 | 5136 | Hardware versionHardware_Version · Document field HardwareVersion, block 0x1400 offset 0x0010. ASCII, 8 bytes. |
string | 4 | 1 | R | Holding (FC03) | |
| 5144 | 5144 | Software versionSoftware_Version · Document field SoftwareVersion, block 0x1400 offset 0x0018. ASCII, 8 bytes. |
string | 4 | 1 | R | Holding (FC03) | |
| 5152 | 5152 | Accumulated run timeAccumulated_Run_Time · Document field ODDRunTime, block 0x1400 offset 0x0020. |
uint32 | 2 | s | 1 | R | Holding (FC03) |
| 5156 | 5156 | Number of power-onsPower_On_Count · Document field PWROnTimes, block 0x1400 offset 0x0024. The document prints the unit as the Chinese character for times. |
uint32 | 2 | 1 | R | Holding (FC03) | |
| 5636 | 5636 | Protection board shutdown commandCommand_Shutdown · Document field Shutdown, block 0x1600 offset 0x0004, write only. The document does not state which value to write. |
uint16 | 1 | 1 | W | Holding (FC03) | |
| 5642 | 5642 | One-key setting for ternary lithium (LI-ION)Command_Preset_Li_Ion · Document field LI-ION, block 0x1600 offset 0x000A, write only. The document does not state which value to write. |
uint16 | 1 | 1 | W | Holding (FC03) | |
| 5644 | 5644 | One-key setting for LiFePO4Command_Preset_LiFePO4 · Document field LIFEPO4, block 0x1600 offset 0x000C, write only. The document does not state which value to write. |
uint16 | 1 | 1 | W | Holding (FC03) | |
| 5646 | 5646 | One-key setting for lithium titanate (LTO)Command_Preset_Lto · Document field LTO, block 0x1600 offset 0x000E, write only. The document does not state which value to write. |
uint16 | 1 | 1 | W | Holding (FC03) | |
| 5648 | 5648 | Emergency start commandCommand_Emergency_Start · Document field Emergency, block 0x1600 offset 0x0010, write only. The document does not state which value to write. |
uint16 | 1 | 1 | W | Holding (FC03) | |
| 5650 | 5650 | Time calibrationCommand_Time_Calibration · Document field Timecalibration, block 0x1600 offset 0x0012, write only. The document does not state which value to write. |
uint32 | 2 | 1 | W | Holding (FC03) |
Scale is the number to multiply the raw value by to get the unit. Types with more than one register (32 and 64-bit) follow the word order above.
Open in Modbus Poll
- Download the Modbus Poll blocks file.
- Open Modbus Poll, connect to the device and set its unit ID. In Modbus Poll set Word order to AB CD.
- In the blocks panel on the right, click Import CSV and pick the file. CSV import is a Pro feature. Without Pro, Modbus Poll polls the first 20 values of your blocks.
- The wire addresses are already in the file, so there is no 0-based or 1-based conversion to do.
Once the values look right, export the tag list to Ignition, Kepware, Node-RED, Home Assistant or Voltrus SCADA.
Source and accuracy
Manufacturer document: JK BMS RS485 Modbus general protocol V1.1 (Chinese title: Jikong BMS RS485 Modbus tongyong xieyi V1.1) (cdn.shopify.com)
Document 'Jikong BMS RS485 Modbus general protocol (V1.1)', Chengdu Jikong Technology Co., Ltd, dated 2024.02, revision record V1.1 2024.01 (fixes some errors and adds registers), 15 pages. The vendor hosts this document on its own site at http://www.jk-bms.com/Upload/2024-02-21/1345398693.pdf (http only, the https form did not respond). The linked https copy is hosted by JKVOLT (jkvolt.com, which describes itself as an authorized JK BMS distributor operated by Chengdu JK Volt Technology Co., Ltd.) on its download center page, served from the Shopify CDN. The two files are byte-identical (same SHA-256, b9b3f1e4...d22739), and a third copy on the jkbms.net downloads archive is also identical. Field names are in English and descriptions are Chinese, so labels here are translations; the document field name is given in every note., p. 3 to 5 (interface, frames, errors), p. 6 to 13 (Register Map), p. 14 to 15 (worked examples). Read on 2026-10-24.
Also used: JK BMS RS485 Modbus Protocol V1.0 for Firmware V11.36 on the vendor's download center (jk-bms.com), earlier revision of the same document (www.jk-bms.com)
Also used: JKBMS technical downloads page (links the V1.0 Modbus protocol PDF) (www.jkbms.net)
Addresses, types, units and scale are taken from the document above. Names and descriptions are written by Voltrus. Firmware versions can differ, so confirm a value on your own device before you rely on it.
Found a mistake? Report it by email with the register address and the manual page.