Modbus TCP Register Map
Power Meter – Holding Registers (FC03)
1. Overview
This document describes the Modbus TCP Holding Register map (Function Code 03) for the Power Meter device. It is intended for system integrators, SCADA/BMS engineers, and OEM partners.
The register map provides instantaneous electrical measurements only. Energy counters are not implemented.
2. Communication Parameters
| Parameter | Value |
|---|---|
| Protocol | Modbus TCP |
| Function Code | 03 – Read Holding Registers |
| Addressing | 0-based |
| Unit ID | 1 (default) |
| 32-bit Byte Order | MSW first |
| Signed Encoding | Two’s complement |
3. Data Model
3.1 Data Types
| Type | Description |
|---|---|
| UINT16 | Unsigned 16-bit integer |
| INT16 | Signed 16-bit integer |
| UINT32 | Unsigned 32-bit integer (2 registers) |
| INT32 | Signed 32-bit integer (2 registers) |
All 32-bit values are encoded using two consecutive 16-bit registers, with Most Significant Word first.
3.2 Scaling Convention
Engineering values are calculated using a scale factor:
Engineering value = Register value × Scale| Quantity | Scale |
|---|---|
| Voltage | 0.01 |
| Current | 0.001 |
| Power Factor | 0.001 |
| Frequency | 0.001 |
| THD | 0.01 |
| Temperature | 0.1 |
| Power (P, Q, S) | 1 |
| RSSI | 1 |
3.3 Special Values
- Power Factor = 2000 → value invalid / undefined
- Active and reactive power values support import/export
- RSSI values are expressed in dBm
4. Holding Registers Map (FC03)
4.1 Voltages
| Addr (HEX) | Addr (DEC) | Len | Name | Type | Scale | Unit | Description |
|---|---|---|---|---|---|---|---|
| 0x1000 | 4096 | 2 | Voltage 3PH equivalent | UINT32 | 0.01 | V | Average L-N |
| 0x1002 | 4098 | 2 | Voltage L1-N | UINT32 | 0.01 | V | |
| 0x1004 | 4100 | 2 | Voltage L2-N | UINT32 | 0.01 | V | |
| 0x1006 | 4102 | 2 | Voltage L3-N | UINT32 | 0.01 | V | |
| 0x1008 | 4104 | 2 | Voltage L1-L2 | UINT32 | 0.01 | V | |
| 0x100A | 4106 | 2 | Voltage L2-L3 | UINT32 | 0.01 | V | |
| 0x100C | 4108 | 2 | Voltage L3-L1 | UINT32 | 0.01 | V |
4.2 Currents
| Addr (HEX) | Addr (DEC) | Len | Name | Type | Scale | Unit | Description |
|---|---|---|---|---|---|---|---|
| 0x100E | 4110 | 2 | Current 3PH equivalent | UINT32 | 0.001 | A | Average phases |
| 0x1010 | 4112 | 2 | Current L1 | UINT32 | 0.001 | A | |
| 0x1012 | 4114 | 2 | Current L2 | UINT32 | 0.001 | A | |
| 0x1014 | 4116 | 2 | Current L3 | UINT32 | 0.001 | A |
4.3 Power Factor
| Addr (HEX) | Addr (DEC) | Len | Name | Type | Scale | Unit | Notes |
|---|---|---|---|---|---|---|---|
| 0x1016 | 4118 | 2 | Power Factor 3PH | INT32 | 0.001 | — | 2000 = invalid |
| 0x1018 | 4120 | 2 | Power Factor L1 | INT32 | 0.001 | — | 2000 = invalid |
| 0x101A | 4122 | 2 | Power Factor L2 | INT32 | 0.001 | — | 2000 = invalid |
| 0x101C | 4124 | 2 | Power Factor L3 | INT32 | 0.001 | — | 2000 = invalid |
4.4 Apparent Power (S)
| Addr (HEX) | Addr (DEC) | Len | Name | Type | Scale | Unit |
|---|---|---|---|---|---|---|
| 0x1026 | 4134 | 2 | Apparent Power 3PH | UINT32 | 1 | VA |
| 0x1028 | 4136 | 2 | Apparent Power L1 | UINT32 | 1 | VA |
| 0x102A | 4138 | 2 | Apparent Power L2 | UINT32 | 1 | VA |
| 0x102C | 4140 | 2 | Apparent Power L3 | UINT32 | 1 | VA |
4.5 Active Power (P)
| Addr (HEX) | Addr (DEC) | Len | Name | Type | Scale | Unit |
|---|---|---|---|---|---|---|
| 0x102E | 4142 | 2 | Active Power 3PH | INT32 | 1 | W |
| 0x1030 | 4144 | 2 | Active Power L1 | INT32 | 1 | W |
| 0x1032 | 4146 | 2 | Active Power L2 | INT32 | 1 | W |
| 0x1034 | 4148 | 2 | Active Power L3 | INT32 | 1 | W |
4.6 Reactive Power (Q)
| Addr (HEX) | Addr (DEC) | Len | Name | Type | Scale | Unit |
|---|---|---|---|---|---|---|
| 0x1036 | 4150 | 2 | Reactive Power 3PH | INT32 | 1 | var |
| 0x1038 | 4152 | 2 | Reactive Power L1 | INT32 | 1 | var |
| 0x103A | 4154 | 2 | Reactive Power L2 | INT32 | 1 | var |
| 0x103C | 4156 | 2 | Reactive Power L3 | INT32 | 1 | var |
4.7 Frequency
| Addr (HEX) | Addr (DEC) | Len | Name | Type | Scale | Unit |
|---|---|---|---|---|---|---|
| 0x1046 | 4166 | 2 | Frequency 3PH average | UINT32 | 0.001 | Hz |
| 0x1048 | 4168 | 2 | Frequency L1 | UINT32 | 0.001 | Hz |
| 0x104A | 4170 | 2 | Frequency L2 | UINT32 | 0.001 | Hz |
| 0x104C | 4172 | 2 | Frequency L3 | UINT32 | 0.001 | Hz |
4.8 Total Harmonic Distortion (THD)
| Addr (HEX) | Addr (DEC) | Len | Name | Type | Scale | Unit |
|---|---|---|---|---|---|---|
| 0x1082 | 4226 | 2 | THD Voltage L1 | UINT32 | 0.01 | % |
| 0x1084 | 4228 | 2 | THD Voltage L2 | UINT32 | 0.01 | % |
| 0x1086 | 4230 | 2 | THD Voltage L3 | UINT32 | 0.01 | % |
| 0x1088 | 4232 | 2 | THD Current L1 | UINT32 | 0.01 | % |
| 0x108A | 4234 | 2 | THD Current L2 | UINT32 | 0.01 | % |
| 0x108C | 4236 | 2 | THD Current L3 | UINT32 | 0.01 | % |
4.9 Temperatures
| Addr (HEX) | Addr (DEC) | Len | Name | Type | Scale | Unit |
|---|---|---|---|---|---|---|
| 0x1090 | 4240 | 1 | AFE Temperature | INT16 | 0.1 | °C |
| 0x1091 | 4241 | 1 | MCU Temperature | INT16 | 0.1 | °C |
4.10 Diagnostics
| Addr (HEX) | Addr (DEC) | Len | Name | Type | Scale | Unit |
|---|---|---|---|---|---|---|
| 0x1092 | 4242 | 1 | WiFi RSSI | INT16 | 1 | dBm |
5. Example Read (mbpoll)
bash
mbpoll -m tcp -a 1 -0 -r 4098 -B -c 1 -t 4:int 192.168.1.186
Protocol configuration: ModBus TCP
Slave configuration...: address = [1]
start reference = 4098, count = 1
Communication.........: 192.168.1.186, port 502, t/o 1.00 s, poll rate 1000 ms
Data type.............: 32-bit integer (big endian), output (holding) register table
-- Polling slave 1... Ctrl-C to stop)
[4098]: 23367
-- Polling slave 1... Ctrl-C to stop)
[4098]: 23373
-- Polling slave 1... Ctrl-C to stop)
[4098]: 23366
-- Polling slave 1... Ctrl-C to stop)
[4098]: 23367
-- Polling slave 1... Ctrl-C to stop)
[4098]: 23361
-- Polling slave 1... Ctrl-C to stop)
[4098]: 23356
