Read Carlo Gavazzi EM24 with QModMaster (Watch the Word Order!)
You’ve got the Carlo Gavazzi EM24 energy meter wired up, QModMaster returns registers without errors — and the numbers are nonsense. Voltage reads as millions of volts, or the power figure is off by a factor of 65,536. Before you rewire anything: the EM24 uses little-endian word order (low word at the lower address), the opposite of what most Modbus devices use. That single reversed assumption is the #1 cause of wrong EM24 readings, and it’s documented in the EM24 register-map reference used by the victron-grid-meter-esphome project, which emulates an EM24 over Modbus TCP: “All multi-register values use little-endian word order (low word at lower address)”.
What “little-endian word order” means in practice
A 32-bit value spans two 16-bit registers. On most devices the high word sits at the lower address (big-endian words: high word first). On the EM24 it’s flipped — the low word comes first:
Registers at 0x0000, 0x0001 hold a 32-bit voltage value
0x0000 = LOW word (EM24: low word at lower address)
0x0001 = HIGH word
value = LOW + HIGH × 65536 (then apply the scale)
Wrong assumption (big-endian words):
value = HIGH + LOW × 65536 → garbage / millions
So if you decode EM24 registers the “normal” way, every 32-bit reading — voltage, current, power, energy — comes out wrong. It’s not a wiring problem and it’s not a bad meter. It’s the word order.
Step 1: Prove your link with the Model ID register
Before touching multi-register values, read a single 16-bit register that has a known answer. The EM24 register map lists address 0x000B as the Model ID, which should read 1648 (EM24DINAV23XE1X). In QModMaster:
- Function code 0x03 or 0x04 (the EM24 map supports both for reads), Unit ID matching your meter’s slave address.
- Read 1 register at address 0x000B.
- Expect 1648. If you get it, your link, baud rate, and addressing are all correct — anything weird after this point is data interpretation, not communication.
Step 2: Read voltage and test both word orders
Now read 2 registers starting at 0x0000 (Voltage L1, int32, scale ÷10 V) and display them as raw hex (QModMaster’s View menu lets you switch the display format). Then decode both ways by hand:
Example: registers read back as 0x0000 = 0x08FC, 0x0001 = 0x0000
Little-endian words (correct for EM24):
value = 0x08FC + 0x0000 × 65536 = 2300 → 2300 ÷ 10 = 230.0 V ✓
Big-endian words (wrong for EM24):
value = 0x0000 + 0x08FC × 65536 = 587,202,560 → garbage ✗
Whichever decoding matches your multimeter / the meter display is your answer. For the EM24, it will be the little-endian one. Apply the same low-word-first rule to every 32-bit register.
EM24 register map (Ethernet model, excerpt)
From the community-documented EM24 register map — confirm every address against your own Carlo Gavazzi manual, as variants differ:
| Address | Field | Type | Scale |
|---|---|---|---|
| 0x0000–0x0001 | Voltage L1 | int32 | ÷10 V |
| 0x000B | Model ID | uint16 | expect 1648 |
| 0x000C–0x000D | Current L1 | int32 | ÷1000 A |
| 0x0012–0x0013 | Active power L1 | int32 | ÷10 W (positive = import) |
| 0x0028–0x0029 | Total active power | int32 | ÷10 W |
| 0x0033 | Frequency | uint16 | ÷10 Hz |
| 0x0034–0x0035 | Energy import total | int32 | ÷10 kWh |
Per-phase registers step by 2 per phase: L1 at the base address, L2 at base+2, L3 at base+4. Power is signed (negative = exporting); current is always a positive magnitude with direction taken from the power sign.
Wiring the meter to your PC
USB-to-RS485 adapter (Amazon) — to read an EM24 over its serial port you’ll need a USB-to-RS485 adapter on the PC side. Get an FTDI-based one; flaky adapters are the classic source of intermittent Modbus timeouts.
FAQ
My EM24 voltage reads in the millions. Is the meter broken?
No — you’re decoding with big-endian word order. The EM24 puts the low word first. Re-decode as low + high × 65536 and the value will snap to something sensible.
How do I confirm my communication settings are right before worrying about word order?
Read address 0x000B (Model ID). It should return 1648 on an EM24DINAV23XE1X. If it does, your link is fine and any wrong values are an interpretation problem.
Does the word order apply to energy registers too?
Yes — every multi-register (32-bit) value on the EM24 uses little-endian word order, including power and energy. Single 16-bit registers (like 0x000B and 0x0033) are unaffected.
Related Guides
The little-endian word order and register map above are documented in the remcom/victron-grid-meter-esphome project (an EM24 Modbus TCP emulation whose register table mirrors the meter). Register addresses, scales, and word order can vary between EM24 variants — always confirm against your Carlo Gavazzi manual. qmodmaster.com is an independent community resource for the upstream QModMaster project (LGPLv3) and is not affiliated with Carlo Gavazzi.
