Modbus Registers¶
This page documents the complete Modbus register maps for both V1 and V2 protocols, including register addresses, field layout tables, real-time data parsing indices, and base config parsing.
15.3 Modbus Frame Construction¶
All Modbus frames use slave address 1 (01).
Read Single/Multiple Registers¶
<01> <03> <reg_addr_2bytes_big_endian> <reg_count_2bytes_big_endian> <CRC16_2bytes>
Example — read 11 registers starting at address 10 (base real data):
01 03 000A 000B xx xx
CRC16 uses standard Modbus CRC-16-IBM polynomial (0xA001).
Write Single Register (value fits in 1 register)¶
<01> <06> <reg_addr_2bytes_be> <value_2bytes_be> <CRC16_2bytes>
Write Multiple Registers¶
<01> <10> <reg_addr_2bytes_be> <reg_count_2bytes_be> <byte_count> <data> <CRC16_2bytes>
Where byte_count = reg_count * 2.
ASCII String Write¶
For register writes containing ASCII strings (e.g., WiFi password, BLE password), each pair of characters is byte-swapped: position i+1 is written before position i. Maximum length controls determine register count.
15.5 Complete Modbus Register Map¶
V1 Protocol (ProtocolAddr) — protocolVer < 2000¶
Address |
Name |
R/W |
Description |
|---|---|---|---|
1 |
|
R |
14-field base config (32 registers) |
7 |
|
R/W |
6-char BLE PIN (12 bytes ASCII) |
10 |
|
R |
Real-time power/SOC/status (~110 registers) |
16 |
|
R |
Protocol version |
21 |
|
R |
Device serial number |
22 |
|
R |
MCU status |
70 |
|
R |
Additional fields |
91 |
|
R |
BMS battery pack data |
130 |
|
R |
Three-phase data (if applicable) |
157 |
|
R |
PV/solar data |
190 |
|
R |
WiFi status |
1080 |
|
W |
Start OTA upgrade |
2000 |
|
R |
Fault history |
3000 |
|
R/W |
Main power switch |
3001 |
|
R/W |
Working mode |
3002 |
|
R/W |
Grid+ mode |
3003 |
|
R/W |
Output frequency (50/60Hz) |
3004 |
|
R/W |
Machine mode |
3005 |
|
R/W |
Modbus address |
3007 |
|
R/W |
AC output switch |
3008 |
|
R/W |
DC output switch |
3009 |
|
R/W |
PV/solar control |
3010 |
|
R/W |
Grid feedback switch |
3011 |
|
R/W |
Grid charging switch |
3014 |
|
R/W |
Max PV charge current |
3015 |
|
R/W |
Low power threshold |
3016 |
|
R/W |
High power threshold |
3018 |
|
R/W |
Max discharge current |
3019 |
|
R/W |
Max grid charge current |
3031 |
|
R/W |
System time |
3034 |
|
R/W |
LED control |
3035 |
|
R/W |
UPS mode |
3039 |
|
R/W |
Working time config |
3057 |
|
R/W |
Max charge power |
3058 |
|
R/W |
Max discharge power |
3060 |
|
W |
System power off |
3061 |
|
R/W |
LCD timeout |
3062 |
|
W |
Factory reset |
3063 |
|
R/W |
DC ECO mode |
3064 |
|
R/W |
ECO auto-off time |
3065 |
|
R/W |
Charging mode / silent |
3066 |
|
R/W |
Power lifting mode |
3067 |
|
R/W |
AC ECO mode |
3069 |
|
R/W |
DC ECO power threshold |
3070 |
|
R/W |
AC ECO power threshold |
3079 |
|
R/W |
Output voltage setting |
3090 |
|
R/W |
Switch state recovery |
4997 |
|
R |
BLE MAC address |
5000 |
|
R/W |
IoT/WiFi data |
5002 |
|
R |
OTA progress |
5003 |
|
W |
OTA module select |
5017 |
|
R/W |
WiFi settings |
5049 |
|
R |
WiFi RSSI |
12205 |
|
R/W |
IoT display settings |
13603 |
|
R |
Server BLE key (FPS pairing) |
V2 Protocol (ProtocolAddrV2) — protocolVer ≥ 2000 (AC2A uses this)¶
Device Core (read operations):
Address |
Name |
Description |
|---|---|---|
100 |
|
Home page data snapshot |
700 |
|
OTA start command |
720 |
|
OTA progress status |
1100 |
|
Inverter base info |
1200 |
|
PV/solar info |
1300 |
|
Grid input/output info |
1400 |
|
Load info |
1500 |
|
Inverter status info |
1700 |
|
Meter data |
1900 |
|
Meter settings |
3500 |
|
Lifetime energy totals |
3600 |
|
Current year energy |
Device Control (write operations):
Address |
Name |
R/W |
Description |
|---|---|---|---|
2000 |
|
R/W |
Base settings |
2001 |
|
R/W |
System clock |
2005 |
|
R/W |
Working mode |
2006 |
|
W |
Control events |
2007 |
|
R/W |
LED control |
2008 |
|
R/W |
Meter control |
2010 |
|
R/W |
Inverter control |
2011 |
|
R/W |
AC output |
2012 |
|
R/W |
DC output |
2013 |
|
W |
Power off |
2014 |
|
R/W |
DC ECO mode |
2015 |
|
R/W |
ECO auto-off time |
2016 |
|
R/W |
ECO power threshold |
2017 |
|
R/W |
AC ECO mode |
2018 |
|
R/W |
AC ECO auto-off |
2019 |
|
R/W |
AC ECO power |
2020 |
|
R/W |
Charging mode (Standard/Turbo/Silent) |
2021 |
|
R/W |
Power lifting mode |
2022 |
|
R/W |
Low SOC threshold |
2023 |
|
R/W |
High SOC threshold |
2026 |
|
W |
History energy type |
2027 |
|
W |
Current energy type |
2028 |
|
W |
Log history page |
2029 |
|
W |
Charge/discharge time control |
2030 |
|
R/W |
Working time start |
2060 |
|
R/W |
PV type setting |
2066 |
|
R/W |
Alarm sound |
2067 |
|
R/W |
LCD timeout |
2075 |
|
R/W |
SOC low setting |
2078 |
|
R/W |
LED color |
2083 |
|
R/W |
SOC high setting |
2084 |
|
R/W |
PV advanced settings |
2086 |
|
R/W |
12V output enable |
2200 |
|
R/W |
Advanced settings |
2206 |
|
W |
Factory reset |
2207 |
|
R/W |
Grid control |
2208 |
|
R/W |
Feed-in control |
2209 |
|
R/W |
Output voltage (120/220/230/240V) |
2210 |
|
R/W |
Output frequency (50/60Hz) |
2211 |
|
R/W |
Max charge voltage |
2212 |
|
R/W |
Max charge current |
2213 |
|
R/W |
Max grid power |
2214 |
|
R/W |
Max grid current |
2225 |
|
R/W |
Grid+ mode toggle |
2241 |
|
R/W |
EMS control mode |
2269 |
|
R/W |
PV advanced settings |
2271 |
|
R/W |
DC output voltage level |
IoT / Network:
Address |
Name |
Description |
|---|---|---|
11000 |
|
IoT module info |
11106 |
|
WiFi multi-info |
11127 |
|
Server BLE serial |
12002 |
|
WiFi settings |
12161 |
|
IoT enable info |
12163 |
|
Disaster warning |
13500 |
|
WiFi mesh settings |
13600 |
|
Extension settings |
Battery Pack:
Address |
Name |
Description |
|---|---|---|
6000 |
|
Pack main info |
6100 |
|
Pack item info |
6300 |
|
Sub-pack info |
7000 |
|
Pack settings |
7200 |
|
BMU info |
15.6 Real-Time Data Parsing (Register 10 / BASE_REAL_DATA)¶
Response format (ProtocolParse.getDeviceRealtimeData()): a List<String> of hex bytes (2-char strings each). Index is 0-based.
Index |
Field |
Type |
Parsing |
|---|---|---|---|
0–11 |
|
String |
ASCII chars from non-zero hex values |
12–13 |
|
int |
|
14–21 |
|
ULong |
Reverse-endian pairs, base-16 |
22–25 |
(reserved) |
— |
Skipped |
24–25 |
|
int |
Only if proto ≥ 1018; binary from hex |
26–29 |
|
String |
Endian |
30–33 |
|
String |
Same |
34–37 |
|
String |
Same |
38–41 |
|
String |
Same |
42–45 |
|
String |
Same |
46–49 |
|
String |
Same |
50–51 |
(padding) |
— |
Skipped |
52–53 |
|
int |
|
54–55 |
|
int |
Same |
56–57 |
|
int |
Same |
58–59 |
|
int |
Same |
60–61 |
|
int |
Same |
62–65 |
|
float |
Endian |
66–67 |
|
int |
Battery state of charge % |
68–69 |
|
int |
PV icon flag |
70–71 |
|
int |
Grid icon flag |
72–73 |
|
int |
PV→Battery flow |
74–75 |
|
int |
Grid→Battery flow |
76–77 |
|
int |
Battery→AC flow |
78–79 |
|
int |
Battery→DC flow |
80–81 |
|
int |
Battery→Grid flow |
82–83 |
|
int |
Grid→Load flow |
84–85 |
|
int |
PV→Grid flow |
86–87 |
|
int |
Discharge status flag |
88–95 |
|
bitmask |
4× 16-bit alarm flags (V1 reg 54–57) |
96–109 |
|
bitmask |
7× 16-bit fault flags (V1 reg 58–64) |
106–107 |
|
int |
Minutes until full (if present) |
108–109 |
|
int |
Minutes until empty (if present) |
111 |
|
int |
High voltage system flag |
112 |
|
int |
Max grid charge current enable |
113 |
|
int |
Grid+ mode enable |
114–115 |
|
int |
Rated voltage (if present) |
116–117 |
|
int |
Rated frequency (if present) |
The alarm/fault bitmasks decode against different name maps depending on the
protocol path and the model’s DeviceFunction.isLowPower flag.
V1 path (ProtocolParse.getDeviceRealtimeData, protocolVer < 2000):
zIsLowPower ? ConnConstantsV2.lowPowerWarnNames : ConnectConstants.alarmInfoNames
zIsLowPower ? ConnConstantsV2.lowPowerFaultNames : ConnectConstants.faultInfoNames
isLowPower == false(default — EB3A, AC200M, AC300, AC500, etc.):ConnectConstants.alarmInfoNames(1 word, 9 bits — grid voltage/frequency/ oscillation, meter comm, PV voltage, generator voltage) andConnectConstants.faultInfoNames(5 words: inverter/AC charger/battery pack/ generic fault4/fault5).isLowPower == true(AC240/AC200L/AC200PL, plus PES_BASE-derived models):ConnConstantsV2.lowPowerWarnNames(2 words) andConnConstantsV2.lowPowerFaultNames(5 words).
V2 path (ProtocolParserV2.parseDeviceData, protocolVer ≥ 2000):
Inverter type 3 (high-power):
ConnConstantsV2.highPowerWarnNames/highPowerFaultNames.Micro-inverter type:
ConnConstantsV2.microInvWarnNames/microInvFaultNames.Otherwise:
ConnConstantsV2.lowPowerWarnNames/lowPowerFaultNames.
BMS_PACK (V2 only, address 6000/6100/7200) is a separate path that uses
ConnConstantsV2.packHighVoltAlarmNames, packHighVoltErrorNames, and
bmuWarnNames. It does not decode the BASE_REAL_DATA alarm/fault region.
15.7 Base Config Parsing (parseBaseConfig())¶
From V1 protocol register 1. Fields parsed in order:
Field |
Source |
Width |
|---|---|---|
|
|
1 byte |
|
|
1 byte |
|
|
1 bit |
|
|
1 bit |
|
|
1 bit |
|
|
4 bits |
|
|
1 byte |
|
|
1 byte |
|
|
4 bits |
|
binary bits |
2 bits |
|
binary bits |
2 bits |
|
|
6 bytes |
|
|
2 bytes |
|
|
2 bytes |
For V2 protocol devices like the AC2A, base settings are read from INV_BASE_SETTINGS (address 2000).