Holdings - celsworth/lxp-bridge GitHub Wiki
WIP
This is a list of holding registers on the inverter. All these registers are read-write. Register numbers are in decimal.
As with input, each register is 16 bits. They seem to be arranged in banks of 40 (so 80 bytes per bank), with read or write requests that cross the boundary being rejected by the inverter. Five banks of 40 (so 240 registers, 480 bytes) are available on at least one inverter, although most of the tail values are zeroes.
Also see https://github.com/celsworth/lxp-bridge/blob/master/doc/LXP_REGISTERS.txt
Also see https://eg4electronics.com/wp-content/uploads/2023/06/EG4-18KPV-12LV-Modbus-Protocol.pdf
Register | Register | Unit | Description |
---|---|---|---|
0 - 1 | HOLD_MODEL | ||
2 - 6 | HOLD_SERIAL_NUM | ||
7 | HOLD_FW_CODE | ||
8 | Unknown/Reserved | ||
9 | Unknown/Reserved | ||
10 | Unknown/Reserved | ||
11 | Unknown/Reserved | ||
12 | HOLD_TIME / year & month | ||
13 | HOLD_TIME / hour & day | ||
14 | HOLD_TIME / second & minute | ||
15 | COM_ADDR | ||
16 | LANGUAGE | ||
19 | DEVICE_TYPE | ||
20 | PV_INPUT_MODE | ||
21 | FUNCTIONS(?) | Bitmask (see Register 21, below) | |
22 | START_PV_VOLT | ||
23 | CONNECT_TIME | ||
24 | RECONNECT_TIME | ||
25 | GRID_VOLT_CONN_LOW | ||
26 | GRID_VOLT_CONN_HIGH | ||
27 | GRID_FREQ_CONN_LOW | ||
28 | GRID_FREQ_CONN_HIGH | ||
29 | GRID_VOLT_LIMIT1_LOW | ||
30 | GRID_VOLT_LIMIT1_HIGH | ||
31 | GRID_VOLT_LIMIT1_LOW_TIME | ||
32 | GRID_VOLT_LIMIT1_HIGH_TIME | ||
33 | GRID_VOLT_LIMIT2_LOW | ||
34 | GRID_VOLT_LIMIT2_HIGH | ||
35 | GRID_VOLT_LIMIT2_LOW_TIME | ||
36 | GRID_VOLT_LIMIT2_HIGH_TIME | ||
37 | GRID_VOLT_LIMIT3_LOW | ||
38 | GRID_VOLT_LIMIT3_HIGH | ||
39 | GRID_VOLT_LIMIT3_LOW_TIME | ||
40 | GRID_VOLT_LIMIT3_HIGH_TIME | ||
41 | GRID_VOLT_MOV_AVG_HIGH | ||
42 | GRID_FREQ_LIMIT1_LOW | ||
43 | GRID_FREQ_LIMIT1_HIGH | ||
44 | GRID_FREQ_LIMIT1_LOW_TIME | ||
45 | GRID_FREQ_LIMIT1_HIGH_TIME | ||
46 | GRID_FREQ_LIMIT2_LOW | ||
47 | GRID_FREQ_LIMIT2_HIGH | ||
48 | GRID_FREQ_LIMIT2_LOW_TIME | ||
49 | GRID_FREQ_LIMIT2_HIGH_TIME | ||
50 | GRID_FREQ_LIMIT3_LOW | ||
51 | GRID_FREQ_LIMIT3_HIGH | ||
52 | GRID_FREQ_LIMIT3_LOW_TIME | ||
53 | GRID_FREQ_LIMIT3_HIGH_TIME | ||
54 | MAX_Q_PERCENT_FOR_QV | ||
55 | V1L | ||
56 | V2L | ||
57 | V1H | ||
58 | V2H | ||
59 | REACTIVE_POWER_CMD_TYPE | ||
60 | ACTIVE_POWER_PERCENT_CMD | ||
61 | REACTIVE_POWER_PERCENT_CMD | ||
62 | PF_CMD | ||
63 | POWER_SOFT_START_SLOPE | ||
64 | CHARGE_POWER_PERCENT_CMD | ||
65 | DISCHG_POWER_PERCENT_CMD | ||
66 | AC_CHARGE_POWER_CMD | ||
67 | AC_CHARGE_SOC_LIMIT | ||
68 | AC_CHARGE_START_HOUR / AC_CHARGE_START_MINUTE | ||
69 | AC_CHARGE_END_HOUR / AC_CHARGE_END_MINUTE | ||
70 | AC_CHARGE_START_HOUR_1 / AC_CHARGE_START_MINUTE_1 | ||
71 | AC_CHARGE_END_HOUR_1 / AC_CHARGE_END_MINUTE_1 | ||
72 | AC_CHARGE_START_HOUR_2 / AC_CHARGE_START_MINUTE_2 | ||
73 | AC_CHARGE_END_HOUR_2 / AC_CHARGE_END_MINUTE_2 | ||
74 | FORCED_CHG_POWER_CMD | ||
75 | FORCED_CHG_SOC_LIMIT | ||
76 | FORCED_CHARGE_START_HOUR / FORCED_CHARGE_START_MINUTE | ||
77 | FORCED_CHARGE_END_HOUR/ FORCED_CHARGE_END_MINUTE | ||
78 | FORCED_CHARGE_START_HOUR_1 / FORCED_CHARGE_START_MINUTE_1 | ||
79 | FORCED_CHARGE_END_HOUR_1 / FORCED_CHARGE_END_MINUTE_1 | ||
80 | FORCED_CHARGE_START_HOUR_2 / FORCED_CHARGE_START_MINUTE_2 | ||
81 | FORCED_CHARGE_END_HOUR_2 / FORCED_CHARGE_END_MINUTE_2 | ||
82 | FORCED_DISCHG_POWER_CMD | ||
83 | FORCED_DISCHG_SOC_LIMIT | ||
84 | FORCED_DISCHARGE_START_HOUR / FORCED_DISCHARGE_START_MINUTE | ||
85 | FORCED_DISCHARGE_END_HOUR / FORCED_DISCHARGE_END_MINUTE | ||
86 | FORCED_DISCHARGE_START_HOUR_1 / FORCED_DISCHARGE_START_MINUTE_1 | ||
87 | FORCED_DISCHARGE_END_HOUR_1 / FORCED_DISCHARGE_END_MINUTE_1 | ||
88 | FORCED_DISCHARGE_START_HOUR_2 / FORCED_DISCHARGE_START_MINUTE_2 | ||
89 | FORCED_DISCHARGE_END_HOUR_2 / FORCED_DISCHARGE_END_MINUTE_2 | ||
90 | EPS_VOLT_SET | ||
91 | EPS_FREQ_SET | ||
99 | LEAD_ACID_CHARGE_VOLT_REF | ||
100 | LEAD_ACID_DISCHARGE_CUT_OFF_VOLT | ||
101 | LEAD_ACID_CHARGE_RATE | ||
102 | LEAD_ACID_DISCHARGE_RATE | ||
103 | FEED_IN_GRID_POWER_PERCENT | ||
105 | DISCHG_CUT_OFF_SOC_EOD | ||
106 | LEAD_ACID_TEMPR_LOWER_LIMIT_DISCHG | ||
107 | LEAD_ACID_TEMPR_UPPER_LIMIT_DISCHG | ||
108 | LEAD_ACID_TEMPR_LOWER_LIMIT_CHG | ||
109 | LEAD_ACID_TEMPR_UPPER_LIMIT_CHG | ||
110 | FUNCTIONS_GRID(?) | Bitmask (see Register 110) | |
112 | SET_MASTER_OR_SLAVE | ||
113 | SET_COMPOSED_PHASE | ||
116 | P_TO_USER_START_DISCHG | ||
118 | VBAT_START_DERATING | ||
119 | This seems to be some sort of grid ct calibration offset to achieve true zero import/export. only seems to work in recent firmwares | ||
120 | ST_SYS_ENABLE | Bitmask (see Register 120) | |
122 | MAINTENANCE_COUNT | ||
125 | SOC_LOW_LIMIT_EPS_DISCHG | ||
137 | SPEC_LOAD_COMPENSATE | ||
144 | FLOATING_VOLTAGE | ||
145 | OUTPUT_CONFIGURATION | ||
146 | LINE_MODE_INPUT | ||
147 | BATTERY_CAPACITY | ||
148 | NOMINAL_BATTERY_VOLTAGE | ||
149 | EQUALIZATION_VOLTAGE | ||
150 | EQUALIZATION_PERIOD | ||
151 | EQUALIZATION_TIME | ||
152 | AC_FIRST_START_HOUR / AC_FIRST_START_MINUTE | ||
153 | AC_FIRST_END_HOUR / AC_FIRST_END_MINUTE | ||
154 | AC_FIRST_START_HOUR_1 / AC_FIRST_START_MINUTE_1 | ||
155 | AC_FIRST_END_HOUR_1 / AC_FIRST_END_MINUTE_1 | ||
156 | AC_FIRST_START_HOUR_2 / AC_FIRST_START_MINUTE_2 | ||
157 | AC_FIRST_END_HOUR_2 / AC_FIRST_END_MINUTE_2 | ||
158 | AC_CHARGE_START_BATTERY_VOLTAGE | ||
159 | AC_CHARGE_END_BATTERY_VOLTAGE | ||
160 | AC_CHARGE_START_BATTERY_SOC | ||
161 | AC_CHARGE_END_BATTERY_SOC | ||
162 | BATTERY_WARNING_VOLTAGE | ||
163 | BATTERY_WARNING_RECOVERY_VOLTAGE | ||
164 | BATTERY_WARNING_SOC | ||
165 | BATTERY_WARNING_RECOVERY_SOC | ||
166 | BATTERY_LOW_TO_UTILITY_VOLTAGE | ||
167 | BATTERY_LOW_TO_UTILITY_SOC | ||
168 | AC_CHARGE_BATTERY_CURRENT | ||
169 | ON_GRID_EOD_VOLTAGE | ||
177 | MAX_GENERATOR_INPUT_POWER |
Register 21
This is a writable register controlling a range of functions, listed below. For instance, to enable AC charge, you need to retrieve the current value of the register, bitwise-or it with 0x80
, and write that value back to the register.
Bit ([MSB, LSB] ) |
Name / Description |
---|---|
0x8000 |
Feed in grid |
0x4000 |
DCI |
0x2000 |
GFCI |
0x1000 |
? - can't see any effect, normally on? |
0x0800 |
Charge priority (charge before supplying load) |
0x0400 |
Forced discharge |
0x0200 |
Normal / standby (doesn't seem to save any power anyway) |
0x0100 |
Seamless EPS switching |
0x0080 |
AC Charge |
0x0040 |
Grid on power SS |
0x0020 |
Neutral detect |
0x0010 |
Anti island |
0x0008 |
? Can't see any effect. Normally off. |
0x0004 |
drms |
0x0002 |
ovf load derate |
0x0001 |
eps - setting fails with error code 3? (134 in dataframe second byte) |
Register 110
Just like register 21, this is a set of functionality that can be individually switched on or off.
Bit ([MSB, LSB] ) |
Name / description |
---|---|
0x0004 |
Micro grid enable |
0x0002 |
Fast zero export |
0x0001 |
PV without grid? (setting fails with error 3 (134 in dataframe second byte) |
Register 120
Bit sparse on details here, this is just copied from the EG4 18kPV modbus protocol document. May only apply in newer inverters/firmwares.
Details about bits 1-3 are summarised nicely in this discussion post.
Bit | Values | Description |
---|---|---|
0 | 0, 1 | HalfHourACChrStartEn |
1 - 3 | 0 - 3 | ACChargeType : 0- disable; 1- according to time; 2- according to voltage; 3- according to SOC |
4 - 5 | 0 - 2 | DischgCtrlType : 0- according to voltage; 1- according to SOC; 2- according to both |
6 | 0, 1 | OnGridEODType : 0- according to voltage; 1- according to SOC |
7 | 0, 1 | GenChargeType : 0- According to Battery voltage; 1- According to Battery SOC |