9. Appendice
9.1. Modbus UDP Interface
This appendix describes the Modbus UDP interface implemented by the VM-3P75CT and the VM-3P5A energy meters. It is intended for integrators and developers who want to read measurement data or configuration data directly over the network, in addition to the standard GX device and VictronConnect integration described earlier in this manual.
9.2. Overview
Both the VM-3P75CT and the VM-3P5A communicate using Modbus over UDP rather than the more common Modbus TCP. The meter listens on UDP port 502 and only responds to Modbus Unit ID 1. All requests must use MBAP protocol ID 0. Requests that use a different protocol ID or a different Unit ID are ignored.
Modbus UDP uses the same request and response format as Modbus TCP, except that each message is carried in a single UDP datagram instead of a TCP stream. This keeps the protocol simple to implement, but it also means that individual requests or responses can be lost, delayed, or arrive out of order on a poor network. See Compatibility Notes (A.15) for guidance on handling this.
9.3. Connecting to the meter
To exchange Modbus UDP data with the meter:
Connect the client device to the same IP network as the meter.
Find the meter IP address. This can be done in one of two ways: look it up in the DHCP lease table of your router, or discover it using mDNS. The meter advertises itself under the service name _victron-energy-meter._udp.
Send Modbus requests to meter_ip:502 over UDP, using Unit ID 1.
9.4. Supported function codes
The meter supports the following Modbus function codes. Any other function code results in exception 0x01 (Illegal Function).
Function code | Name |
|---|---|
0x03 | Read Holding Registers |
9.5. Exception codes
Code | Meaning |
|---|---|
0x01 | Illegal Function |
0x02 | Illegal Data Address |
0x03 | Illegal Data Value |
0x04 | Slave Device Failure |
9.6. Address space overview
Base address | Size (16 bit registers) | End address | Access | Description |
|---|---|---|---|---|
0x1000 | 12 | 0x100B | Read | Device info block (product, serial number, firmware, hardware) |
0x2000 | 38 | 0x2025 | Read | Configuration block |
0x3000 | 144 | 0x308F | Read | Main meter data map (measurements, energies, mirrors) |
Note
A single request must stay fully inside one block. A request that spans more than one block is rejected with exception 0x02 (Illegal Data Address).
9.7. Data representation
Registers are 16 bit words.
32 bit values are sent as two consecutive registers, high word first, then low word.
Text and byte array values are sent as raw bytes, packed two bytes per register.
Within each register, the byte order is big endian, as is standard for Modbus.
Some registers use fixed sentinel values to mark data that is invalid or not available, for example 0x7FFF, 0xFFFF, or 0x7FFFFFFF.
9.8. Function level limits
Function | Limit |
|---|---|
0x03 Read Holding Registers | 1 to 125 registers per request |
9.9. Device info block (0x1000, read only)
Address | Words | Name | Type | Access |
|---|---|---|---|---|
0x1000 | 1 | Product ID | uint16 | Read |
0x1001 | 8 | Serial number | string (16) | Read |
0x1009 | 2 | Firmware version | uint32 | Read |
0x100B | 1 | Hardware revision | uint16 | Read |
9.10. Configuration block (0x2000, read only)
Address | Words | Description | Logical type | Access | Notes |
|---|---|---|---|---|---|
0x2000 | 1 | Phase configuration | uint8 in uint16 | Read | 0 = SinglePhaseL1 1 = SinglePhaseL2 (if supported) 2 = SinglePhaseL3 (if supported) 3 = ThreePhase 4 = SplitPhase |
0x2001 | 1 | Meter role | uint8 in uint16 | Read | 0 = Grid 1 = Pv 2 = Generator 3 = AcMeter 4 = EvCharger 5 = HeatPump 6 = WaterPump 7 = WaterHeater |
0x2002 | 32 | User description | string (up to 64 bytes) | Read | 32 registers, packed byte by byte |
0x2022 | 1 | Meter position | uint8 in uint16 | Read | 0 = AcInput1 1 = AcOutput 2 = AcInput2 |
0x2023 | 1 | System instance | uint8 in uint16 | Read | Instance index, 0 to 255 |
0x2024 | 2 | Meter capabilities | uint32 (high, low) | Read | bit0 grid meter role support bit1 PV inverter role support bit2 generator role support bit3 AC meter role support bit4 EV charger role support bit5 heat pump role support bit6 split phase support bit7 water pump role support bit8 water heater role support bit9 PQ snapshots timeout support bit10 UDP PQ snapshots support bit11 single phase L2 support bit12 single phase L3 support |
9.11. Main meter data block (0x3000, read only)
This block contains the live measurements, energy totals, and several mirrored sections that exist for compatibility with existing client software.
9.11.1. Primary live data and totals (0x3000 to 0x303F)
Address | Words | Description | Type | Access | Notes |
|---|---|---|---|---|---|
0x3000 | 1 | L1 voltage | int16 | Read | 0.01 V |
0x3001 | 1 | L1 current | int16 | Read | 0.01 A - VM-3P75CT only |
0x3002 | 2 | L1 real power | int32 (high, low) | Read | 1 W |
0x3004 | 2 | L1 apparent power | int32 (high, low) | Read | 1 VA |
0x3006 | 2 | L1 forward energy | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x3008 | 2 | L1 reverse energy | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x300A | 4 | Reserved | - | Read | Always 0 |
0x300E | 2 | Reserved | - | Read | Always 0 |
0x3010 | 1 | L2 voltage | int16 | Read | 0.01 V |
0x3011 | 1 | L2 current | int16 | Read | 0.01 A - VM-3P75CT only |
0x3012 | 2 | L2 real power | int32 (high, low) | Read | 1 W |
0x3014 | 2 | L2 apparent power | int32 (high, low) | Read | 1 VA |
0x3016 | 2 | L2 forward energy | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x3018 | 2 | L2 reverse energy | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x301A | 4 | Reserved | - | Read | Always 0 |
0x301E | 2 | Reserved | - | Read | Always 0 |
0x3020 | 1 | L3 voltage | int16 | Read | 0.01 V |
0x3021 | 1 | L3 current | int16 | Read | 0.01 A - VM-3P75CT only |
0x3022 | 2 | L3 real power | int32 (high, low) | Read | 1 W |
0x3024 | 2 | L3 apparent power | int32 (high, low) | Read | 1 VA |
0x3026 | 2 | L3 forward energy | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x3028 | 2 | L3 reverse energy | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x302A | 4 | Reserved | - | Read | Always 0 |
0x302E | 2 | Reserved | - | Read | Always 0 |
0x3030 | 2 | Total real power | int32 (high, low) | Read | 1 W |
0x3032 | 1 | Grid frequency | uint16 | Read | 0.01 Hz |
0x3033 | 1 | PE to N voltage | int16 | Read | 0.01 V |
0x3034 | 2 | Total forward energy | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x3036 | 2 | Total reverse energy | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x3038 | 1 | Error code | uint8 in uint16 | Read | |
0x3039 | 1 | Neutral current | int16 | Read | 0.01 A |
0x303A | 1 | Total power factor | int16 | Read | 0.001 |
0x303B | 1 | Phase sequence | uint8 in uint16 | Read | 0 = L1L2L3 1 = L1L3L2 0xFF = Invalid |
0x303C | 2 | Alarms and warnings | uint32 (high, low) | Read | bits 1 to 0: phase rotation level 0 = Unsupported 1 = Ok 2 = Warning 3 = Alarm Bits 31 to 2 reserved. |
0x303E | 1 | Grid frequency (mHz resolution) | uint16 | Read | 0.001 Hz |
0x303F | 1 | Reserved | - | Read | Always 0 |
9.11.2. Mirror and per phase auxiliary map (0x3040 to 0x305F)
Address | Words | Description | Type | Access | Notes |
|---|---|---|---|---|---|
0x3040 | 1 | L1 voltage (mirror) | int16 | Read | 0.01 V |
0x3041 | 1 | L1 current (mirror) | int16 | Read | 0.01 A - VM-3P75CT only |
0x3042 | 2 | L1 forward energy (mirror) | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x3044 | 2 | L1 reverse energy (mirror) | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x3046 | 1 | L1 line to line voltage | uint16 | Read | 0.01 V |
0x3047 | 1 | L1 power factor | int16 | Read | 0.001 |
0x3048 | 1 | L2 voltage (mirror) | int16 | Read | 0.01 V |
0x3049 | 1 | L2 current (mirror) | int16 | Read | 0.01 A - VM-3P75CT only |
0x304A | 2 | L2 forward energy (mirror) | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x304C | 2 | L2 reverse energy (mirror) | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x304E | 1 | L2 line to line voltage | uint16 | Read | 0.01 V |
0x304F | 1 | L2 power factor | int16 | Read | 0.001 |
0x3050 | 1 | L3 voltage (mirror) | int16 | Read | 0.01 V |
0x3051 | 1 | L3 current (mirror) | int16 | Read | 0.01 A - VM-3P75CT only |
0x3052 | 2 | L3 forward energy (mirror) | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x3054 | 2 | L3 reverse energy (mirror) | uint32 (high, low) | Read | 0.01 kWh (10 Wh) |
0x3056 | 1 | L3 line to line voltage | uint16 | Read | 0.01 V |
0x3057 | 1 | L3 power factor | int16 | Read | 0.001 |
0x3058 | 2 | L1 high range current | int32 (high, low) | Read | 0.01 A - VM-3P5A only |
0x305A | 2 | L2 high range current | int32 (high, low) | Read | 0.01 A - VM-3P5A only |
0x305C | 2 | L3 high range current | int32 (high, low) | Read | 0.01 A - VM-3P5A only |
0x305E | 2 | Reserved | - | Read | Always 0 |
Addresses 0x3060 to 0x307F (32 registers) are reserved and always read back as 0.
9.11.3. Power mirror map (0x3080 to 0x308F)
Address | Words | Description | Type | Access | Notes |
|---|---|---|---|---|---|
0x3080 | 2 | Total real power (mirror) | int32 (high, low) | Read | 1 W |
0x3082 | 2 | L1 real power (mirror) | int32 (high, low) | Read | 1 W |
0x3084 | 2 | L1 apparent power (mirror) | int32 (high, low) | Read | 1 VA |
0x3086 | 2 | L2 real power (mirror) | int32 (high, low) | Read | 1 W |
0x3088 | 2 | L2 apparent power (mirror) | int32 (high, low) | Read | 1 VA |
0x308A | 2 | L3 real power (mirror) | int32 (high, low) | Read | 1 W |
0x308C | 2 | L3 apparent power (mirror) | int32 (high, low) | Read | 1 VA |
0x308E | 2 | Reserved | - | Read | Always 0 |
9.12. Recommended polling strategy
Read the static identification data once, from the 0x1000 block.
Read the configuration snapshot from the 0x2000 block on startup, and again whenever a configuration change is expected.
Poll the live values in the 0x3000 block at a fixed interval suited to your application.
Treat reserved addresses as always 0.
Apply the scaling given in this appendix, for example 0.01 V, 0.01 A, 0.01 Hz, or 0.001 for power factor.
Treat sentinel values and 0xFFFF fallback words as not available or invalid.
9.13. Important Compatibility Notes
This is UDP, so requests and responses are connectionless and may be lost or reordered on a poor network.
The register map includes mirrored addresses to remain compatible with existing client software.