Solis Grid-connected inverters (S5) Modbus register map
Single and three-phase grid-connected PV inverters with RS485 Modbus RTU
- Official
- 151 registers
- Modbus RTU
- Revision 1 · 2026-11-11
Official: Written from the manufacturer's documentation, but not tested on a device yet. Check the map against the manufacturer's documentation before you write to a live device. Tested it? Report a test.
Communication
- Protocol
- Modbus RTU
- Unit ID
- 1
- Serial
- 9600 8N1 · 9600 baud, 8 data bits, none parity, 1 stop bit
- Byte / word order
- ABCD · bytes big-endian, words high first
- Addresses
- 0-based
Connection values are defaults: the device may be configured differently.
Map
- Registers
- 17 holding registers, 134 input registers
- Groups
- 11
- Translation tables
- 5
- Revision
- 1 · 2026-11-11
- Added
- ()
- File
- maps/solis/grid-connected.mbmap.json · 33 KB · history
- SHA-256
- 16947d4e9e307943a08a9372143da67043c2aaac0c8179e2e5658911b88a7d05
- Manufacturer
- solisinverters.com
Sources and notes
- RS485_MODBUS Solis PV Grid-Connected Inverter · version 3.7 Sections 5.1 (function 0x04) and 5.2 (functions 0x03, 0x06, 0x10); linked from the Solis service portal, Modbus table article
Source: Solis, RS485_MODBUS Communication, Solis PV Grid-Connected Inverter, version 3.7 (2025/2026)
- The manual applies to Solis grid-connected inverters of every power range made after mid-2023; older units may use another register layout. The hybrid inverters have a separate document (ESINV-33000ID) and are not covered here.
- Addresses are the ones in the manual and its examples (a read of register 2999 sends 0x0BB7), so address_base is 0. Input registers are read with function 0x04; holding registers with 0x03, 0x06 and 0x10. Registers not implemented in a model read as 0.
- 32-bit values (U32, S32) are two registers with the high word first (big word order).
- Slave address 1 to 99, 9600 baud, no parity, 8 data bits, 1 stop bit. Leave more than 300 ms between reads and 700 ms between writes; write one register at a time. A frame can carry at most 50 registers.
- Input registers 2999 and 3000 are the product model and DSP version, while holding registers 2999 to 3004 are the clock: the two areas are separate.
- Not mapped: the model code table (appendix 1), alarm and fault code tables (appendix 2), status bit definitions (appendix 3) and the setting instructions (appendix 4). Registers marked 'Only for the 320K series' exist only on that series.
- Several labels in the manual contradict their units (3298, 3544); this map follows the unit and says so in the description.
| Area | Address | Name | Type | Access | Unit | Scale | Description |
|---|---|---|---|---|---|---|---|
| IR | 35000 | uint16 | R | Model code, appendix 1 of the manual | |||
| IR | 2999 | uint16 | R | ||||
| IR | 3000 | uint16 | R | Slave DSP version in the high byte and main DSP version in the low byte | |||
| IR | 3001 | uint16 | R | Major version in the low byte | |||
| IR | 3020 | uint16 | R | ||||
| IR | 3003 | uint16 | R | Number of DC inputs minus 1 (0 = 1 input, 1 = 2 inputs, ...) | |||
| IR | 3060 | uint16 | R | Serial number in hexadecimal, 4 words | |||
| IR | 3061 | uint16 | R | Serial number in hexadecimal, 4 words | |||
| IR | 3062 | uint16 | R | Serial number in hexadecimal, 4 words | |||
| IR | 3063 | uint16 | R | Serial number in hexadecimal, 4 words | |||
| IR | 3004 | int32 ABCD | R | W | |||
| IR | 3006 | uint32 ABCD | R | W | |||
| IR | 3008 | uint32 ABCD | R | kWh | |||
| IR | 3010 | uint32 ABCD | R | kWh | |||
| IR | 3012 | uint32 ABCD | R | kWh | |||
| IR | 3014 | uint16 | R | kWh | ×0.1 | ||
| IR | 3015 | uint16 | R | kWh | ×0.1 | ||
| IR | 3021 | uint16 | R | V | ×0.1 | ||
| IR | 3022 | uint16 | R | A | ×0.1 | ||
| IR | 3023 | uint16 | R | V | ×0.1 | ||
| IR | 3024 | uint16 | R | A | ×0.1 | ||
| IR | 3025 | uint16 | R | V | ×0.1 | ||
| IR | 3026 | uint16 | R | A | ×0.1 | ||
| IR | 3027 | uint16 | R | V | ×0.1 | ||
| IR | 3028 | uint16 | R | A | ×0.1 | ||
| IR | 3029 | uint16 | R | Used with register 3043 to subdivide the fault message; appendix 2 | |||
| IR | 3033 | uint16 | R | V | ×0.1 | ||
| IR | 3034 | uint16 | R | V | ×0.1 | ||
| IR | 3035 | uint16 | R | V | ×0.1 | ||
| IR | 3036 | uint16 | R | A | ×0.1 | ||
| IR | 3037 | uint16 | R | A | ×0.1 | ||
| IR | 3038 | uint16 | R | A | ×0.1 | ||
| IR | 3040 | uint16 | R | ||||
| IR | 3041 | int16 | R | °C | ×0.1 | AC NTC (IGBT) | |
| IR | 3042 | uint16 | R | Hz | ×0.01 | ||
| IR | 3043 | uint16 | R | Appendix 3 of the manual; used with register 3029 | |||
| IR | 3044 | int32 ABCD | R | W | |||
| IR | 3046 | int32 ABCD | R | var | |||
| IR | 3049 | uint16 | R | % | ×0.1 | 10000 = 100 % | |
| IR | 3051 | int16 | R | ×0.001 | 800 = 0.8 | ||
| IR | 3052 | int16 | R | % | ×0.1 | 10000 = 100 % | |
| IR | 3055 | int32 ABCD | R | var | |||
| IR | 3057 | int32 ABCD | R | VA | |||
| IR | 3059 | int16 | R | ×0.01 | |||
| IR | 3071 | uint16 | R | Appendix 3 | |||
| IR | 3072 | uint16 | R | Year is 0 to 99 | |||
| IR | 3073 | uint16 | R | ||||
| IR | 3074 | uint16 | R | ||||
| IR | 3075 | uint16 | R | ||||
| IR | 3076 | uint16 | R | ||||
| IR | 3077 | uint16 | R | ||||
| IR | 3089 | uint16 | R | ||||
| IR | 3090 | uint16 | R | ||||
| IR | 3094 | uint16 | R | Appendix 3 | |||
| IR | 3095 | uint16 | R | ||||
| IR | 3096 | uint16 | R | ||||
| IR | 3097 | uint16 | R | ||||
| IR | 3098 | uint16 | R | ||||
| IR | 3099 | uint16 | R | ||||
| IR | 3100 | uint16 | R | ||||
| IR | 3101 | uint16 | R | ||||
| IR | 3102 | uint16 | R | ||||
| IR | 3103 | uint16 | R | ||||
| IR | 3104 | uint16 | R | ||||
| IR | 3109 | uint16 | R | W | ×10 | ||
| IR | 3288 | int16 | R | A | ×0.1 | ||
| IR | 3289 | int16 | R | A | ×0.1 | ||
| IR | 3290 | int16 | R | A | ×0.1 | ||
| IR | 3291 | int16 | R | A | ×0.1 | ||
| IR | 3292 | int16 | R | A | ×0.1 | ||
| IR | 3293 | int16 | R | A | ×0.1 | ||
| IR | 3294 | int16 | R | A | ×0.1 | ||
| IR | 3295 | int16 | R | A | ×0.1 | ||
| IR | 3296 | int16 | R | A | ×0.1 | ||
| IR | 3297 | int16 | R | A | ×0.1 | ||
| IR | 3298 | uint16 | R | V | ×0.1 | The manual labels this register 'Total PV current' with the unit V; treated as the total PV voltage | |
| IR | 3299 | int16 | R | A | ×0.1 | ||
| IR | 3300 | int16 | R | A | ×0.1 | ||
| IR | 3301 | int16 | R | A | ×0.1 | ||
| IR | 3302 | int16 | R | A | ×0.1 | ||
| IR | 3303 | int16 | R | A | ×0.1 | ||
| IR | 3304 | int16 | R | A | ×0.1 | ||
| IR | 3305 | int16 | R | A | ×0.1 | ||
| IR | 3306 | int16 | R | A | ×0.1 | ||
| IR | 3307 | int16 | R | A | ×0.1 | ||
| IR | 3308 | int16 | R | A | ×0.1 | ||
| IR | 3309 | int16 | R | A | ×0.1 | ||
| IR | 3310 | int16 | R | A | ×0.1 | ||
| IR | 3311 | int16 | R | A | ×0.1 | ||
| IR | 3312 | int16 | R | A | ×0.1 | ||
| IR | 3313 | int16 | R | A | ×0.1 | ||
| IR | 3314 | int16 | R | A | ×0.1 | ||
| IR | 3315 | int16 | R | A | ×0.1 | ||
| IR | 3316 | int16 | R | A | ×0.1 | ||
| IR | 3317 | int16 | R | A | ×0.1 | ||
| IR | 3318 | int16 | R | A | ×0.1 | ||
| IR | 3319 | int16 | R | A | ×0.1 | ||
| IR | 3336 | int16 | R | A | ×0.1 | ||
| IR | 3337 | int16 | R | A | ×0.1 | ||
| IR | 3471 | uint16 | R |
No registers match
Try part of the name, an address (decimal or 0x hex) or clear the filters.
Help improve this map
- I tested it on a deviceReport whether it worked, even if you did not write the map.
- Suggest a correctionEdit the file on GitHub; it opens a pull request.
- Report a problemA wrong address, type, scale or byte order.
- Read the formatWhat each key of the file means (SPEC.md).