- Home
- Modbus register maps
- Carlo Gavazzi
- WM20 / WM30 / WM40 power analyzers
Power meter (power analyzer) · Modbus register map
Carlo Gavazzi WM20 / WM30 / WM40 power analyzers Modbus register map
Updated 16 October 2026
The WM20, WM30 and WM40 are Carlo Gavazzi's modular panel power analyzers. Unlike the smaller CG meters, live values are IEEE-754 floats (in base units) and energies are 64-bit counters in Wh/varh, both sent low word first. This map covers per-phase and system voltage, current, power, PF, frequency, asymmetry, phase sequence, total/partial/tariff energy, identification, RS485 settings and energy reset commands.
This page lists 79 Modbus registers for the Carlo Gavazzi WM20 / WM30 / WM40 power analyzers — 12 writable — with the table, 0-based wire address, data type, word order, scale, units and access of each, re-typed from Carlo Gavazzi’s own free documentation (linked below) and checked against it.
- Manufacturer
- Carlo Gavazzi
- Model
- WM20 / WM30 / WM40 power analyzers
- Equipment type
- Power meter (power analyzer)
- Registers
- 79 (12 writable)
- Transport
- Modbus RTU, Modbus TCP
- Default unit ID
- Not stated
- Documented addressing
- Modicon 3xxxx/4xxxx (drop the prefix, subtract 1)
- 32-bit word order
- CDAB low word first (word-swapped)
- Firmware
- Per-row compatibility codes in the source (X0/Y0/Z0 = all firmware of WM30/WM40/WM20)
- Also known as
- WM20, WM30, WM40, WM20-96, WM30-96, WM40-96
Integration notes: Carlo Gavazzi WM20 / WM30 / WM40 power analyzers
Read input registers 0050h-008Fh as floats (low word first) for live values and 0500h-051Fh as UINT64 Wh/varh counters (least significant word first).
Minimum registers to map
Addresses are 0-based wire addresses. Enough to monitor and run the unit; map more as the job needs.
| Register | Name | Type | Why | Access |
|---|---|---|---|---|
| IR 80 | V L1-N | FLOAT32 CDAB | V L1-N (float) | Read |
| IR 96 | A L1 | FLOAT32 CDAB | A L1 (float) | Read |
| IR 110 | W system | FLOAT32 CDAB | W system (float) | Read |
| IR 134 | PF system | FLOAT32 CDAB | PF system | Read |
| IR 136 | Frequency | FLOAT32 CDAB | Frequency | Read |
| IR 1280 | Total kWh(+) | UINT64 CDAB | Total kWh(+) in Wh | Read |
| IR 1288 | Total kWh(-) | UINT64 CDAB | Total kWh(-) in Wh | Read |
| IR 11 | Carlo Gavazzi identification code | UINT16 | Model ID (WM20/30/40) | Read |
Enable Modbus control & writes
Fit an RS485 (or Ethernet) communication module. Change RS485 address/baud/parity in 1130h-1132h, then write 1 to 3052h (or power-cycle) to apply.
Byte order & addressing
- Floats are low word first (CDAB).
- 64-bit energy counters are least significant word first and in Wh/varh.
- Up to 125 registers per read; functions 03/04 equivalent; 06 and 10h for writes.
Network setup
- Terminate the last instrument and the host; above 1000 m use a line amplifier.
- WM20/WM30 RS485 baud options: 9600, 19200, 38400, 115200; parity none/odd/even.
Watch out for
- New RS485 settings take effect only after the update command 3052h or a power cycle.
Carlo Gavazzi WM20 / WM30 / WM40 power analyzers Modbus registers
Address = 0-based wire address (the documented number is shown under it when it differs) · Order: ABCD = high word first, CDAB = low word first · Scale: engineering value = raw × scale.
| Table | Address | Name | Description | Type | Order | Scale | Units | Access | Values / bits |
|---|---|---|---|---|---|---|---|---|---|
| IR | 0doc 300001 / 0000h | Base firmware version | High byte ASCII model (A=AV5, B=AV6, C=AV4, D=AV7); low byte revision. | UINT16 | Read | ||||
| IR | 11doc 300012 / 000Bh | Carlo Gavazzi identification code | UINT16 | Read | 65 = WM30; 66 = WM40; 98 = WM20 | ||||
| IR | 80doc 300081 / 0050h | V L1-N | FLOAT32 | CDAB | V | Read | |||
| IR | 82doc 300083 / 0052h | V L2-N | FLOAT32 | CDAB | V | Read | |||
| IR | 84doc 300085 / 0054h | V L3-N | FLOAT32 | CDAB | V | Read | |||
| IR | 86doc 300087 / 0056h | V L-N system | FLOAT32 | CDAB | V | Read | |||
| IR | 88doc 300089 / 0058h | V L1-L2 | FLOAT32 | CDAB | V | Read | |||
| IR | 90doc 300091 / 005Ah | V L2-L3 | FLOAT32 | CDAB | V | Read | |||
| IR | 92doc 300093 / 005Ch | V L3-L1 | FLOAT32 | CDAB | V | Read | |||
| IR | 94doc 300095 / 005Eh | V L-L system | FLOAT32 | CDAB | V | Read | |||
| IR | 96doc 300097 / 0060h | A L1 | FLOAT32 | CDAB | A | Read | |||
| IR | 98doc 300099 / 0062h | A L2 | FLOAT32 | CDAB | A | Read | |||
| IR | 100doc 300101 / 0064h | A L3 | FLOAT32 | CDAB | A | Read | |||
| IR | 102doc 300103 / 0066h | A N | Calculated by the base; WM40 can measure it with an optional module. | FLOAT32 | CDAB | A | Read | ||
| IR | 104doc 300105 / 0068h | W L1 | FLOAT32 | CDAB | W | Read | |||
| IR | 106doc 300107 / 006Ah | W L2 | FLOAT32 | CDAB | W | Read | |||
| IR | 108doc 300109 / 006Ch | W L3 | FLOAT32 | CDAB | W | Read | |||
| IR | 110doc 300111 / 006Eh | W system | FLOAT32 | CDAB | W | Read | |||
| IR | 112doc 300113 / 0070h | VA L1 | FLOAT32 | CDAB | VA | Read | |||
| IR | 114doc 300115 / 0072h | VA L2 | FLOAT32 | CDAB | VA | Read | |||
| IR | 116doc 300117 / 0074h | VA L3 | FLOAT32 | CDAB | VA | Read | |||
| IR | 118doc 300119 / 0076h | VA system | FLOAT32 | CDAB | VA | Read | |||
| IR | 120doc 300121 / 0078h | var L1 | FLOAT32 | CDAB | var | Read | |||
| IR | 122doc 300123 / 007Ah | var L2 | FLOAT32 | CDAB | var | Read | |||
| IR | 124doc 300125 / 007Ch | var L3 | FLOAT32 | CDAB | var | Read | |||
| IR | 126doc 300127 / 007Eh | var system | FLOAT32 | CDAB | var | Read | |||
| IR | 128doc 300129 / 0080h | PF L1 | Negative = capacitive (lead), positive = inductive (lag). | FLOAT32 | CDAB | Read | |||
| IR | 130doc 300131 / 0082h | PF L2 | Negative = capacitive (lead), positive = inductive (lag). | FLOAT32 | CDAB | Read | |||
| IR | 132doc 300133 / 0084h | PF L3 | Negative = capacitive (lead), positive = inductive (lag). | FLOAT32 | CDAB | Read | |||
| IR | 134doc 300135 / 0086h | PF system | Negative = capacitive (lead), positive = inductive (lag). | FLOAT32 | CDAB | Read | |||
| IR | 136doc 300137 / 0088h | Frequency | FLOAT32 | CDAB | Hz | Read | |||
| IR | 138doc 300139 / 008Ah | Asymmetry L-N | FLOAT32 | CDAB | % | Read | |||
| IR | 140doc 300141 / 008Ch | Asymmetry L-L | FLOAT32 | CDAB | % | Read | |||
| IR | 142doc 300143 / 008Eh | Phase sequence | FLOAT32 | CDAB | Read | 1 = L1-L2-L3; -1 = Wrong sequence | |||
| IR | 1280doc 301281 / 0500h | Total kWh(+) | Value in Wh; 4 registers, least significant word first. | UINT64 | CDAB | Wh | Read | ||
| IR | 1284doc 301285 / 0504h | Total kvarh(+) | Value in varh; 4 registers, least significant word first. | UINT64 | CDAB | varh | Read | ||
| IR | 1288doc 301289 / 0508h | Total kWh(-) | Value in Wh; 4 registers, least significant word first. | UINT64 | CDAB | Wh | Read | ||
| IR | 1292doc 301293 / 050Ch | Total kvarh(-) | Value in varh; 4 registers, least significant word first. | UINT64 | CDAB | varh | Read | ||
| IR | 1296doc 301297 / 0510h | Partial kWh(+) | Value in Wh; 4 registers, least significant word first. | UINT64 | CDAB | Wh | Read | ||
| IR | 1300doc 301301 / 0514h | Partial kvarh(+) | Value in varh; 4 registers, least significant word first. | UINT64 | CDAB | varh | Read | ||
| IR | 1304doc 301305 / 0518h | Partial kWh(-) | Value in Wh; 4 registers, least significant word first. | UINT64 | CDAB | Wh | Read | ||
| IR | 1308doc 301309 / 051Ch | Partial kvarh(-) | Value in varh; 4 registers, least significant word first. | UINT64 | CDAB | varh | Read | ||
| IR | 1316doc 301317 / 0524h | Tariff 1 kWh(+) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1320doc 301321 / 0528h | Tariff 1 kvarh(+) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1324doc 301325 / 052Ch | Tariff 1 kWh(-) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1328doc 301329 / 0530h | Tariff 1 kvarh(-) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1332doc 301333 / 0534h | Tariff 2 kWh(+) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1336doc 301337 / 0538h | Tariff 2 kvarh(+) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1340doc 301341 / 053Ch | Tariff 2 kWh(-) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1344doc 301345 / 0540h | Tariff 2 kvarh(-) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1348doc 301349 / 0544h | Tariff 3 kWh(+) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1352doc 301353 / 0548h | Tariff 3 kvarh(+) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1356doc 301357 / 054Ch | Tariff 3 kWh(-) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1360doc 301361 / 0550h | Tariff 3 kvarh(-) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1364doc 301365 / 0554h | Tariff 4 kWh(+) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1368doc 301369 / 0558h | Tariff 4 kvarh(+) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1372doc 301373 / 055Ch | Tariff 4 kWh(-) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1376doc 301377 / 0560h | Tariff 4 kvarh(-) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1380doc 301381 / 0564h | Tariff 5 kWh(+) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1384doc 301385 / 0568h | Tariff 5 kvarh(+) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1388doc 301389 / 056Ch | Tariff 5 kWh(-) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1392doc 301393 / 0570h | Tariff 5 kvarh(-) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1396doc 301397 / 0574h | Tariff 6 kWh(+) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1400doc 301401 / 0578h | Tariff 6 kvarh(+) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1404doc 301405 / 057Ch | Tariff 6 kWh(-) | WM40 only. Value in Wh. | UINT64 | CDAB | Wh | Read | ||
| IR | 1408doc 301409 / 0580h | Tariff 6 kvarh(-) | WM40 only. Value in varh. | UINT64 | CDAB | varh | Read | ||
| IR | 1520doc 301521 / 05F0h | Real-time tariff | UINT16 | Read | 0 = Tariff 1; 1 = Tariff 2; 2 = Tariff 3; 3 = Tariff 4; 4 = Tariff 5; 5 = Tariff 6; 6 = Tariff disabled | ||||
| HR | 4400doc 304401 / 1130h | RS485 address | 1-247. WM20/WM30. Apply with command 3052h. | UINT16 | Read/write | ||||
| HR | 4401doc 304402 / 1131h | RS485 baud rate | WM20/WM30. Apply with command 3052h. | UINT16 | Read/write | 0 = 9600; 1 = 19200; 2 = 38400; 3 = 115200 | |||
| HR | 4402doc 304403 / 1132h | RS485 parity | WM20/WM30. Apply with command 3052h. | UINT16 | Read/write | 0 = None; 1 = Odd; 2 = Even | |||
| HR | 12370doc 312371 / 3052h | Apply serial settings | Write 1 to activate new RS485 settings. | UINT16 | Write | ||||
| HR | 13568doc 313569 / 3500h | Reset total kWh(+) | Write 1 to execute. | UINT16 | Write | ||||
| HR | 13569doc 313570 / 3501h | Reset total kvarh(+) | Write 1 to execute. | UINT16 | Write | ||||
| HR | 13570doc 313571 / 3502h | Reset total kWh(-) | Write 1 to execute. | UINT16 | Write | ||||
| HR | 13571doc 313572 / 3503h | Reset total kvarh(-) | Write 1 to execute. | UINT16 | Write | ||||
| HR | 13572doc 313573 / 3504h | Reset partial kWh(+) | Write 1 to execute. | UINT16 | Write | ||||
| HR | 13573doc 313574 / 3505h | Reset partial kvarh(+) | Write 1 to execute. | UINT16 | Write | ||||
| HR | 13574doc 313575 / 3506h | Reset partial kWh(-) | Write 1 to execute. | UINT16 | Write | ||||
| HR | 13575doc 313576 / 3507h | Reset partial kvarh(-) | Write 1 to execute. | UINT16 | Write |
Notes on this map
- Float word order: the document lists the frame bytes as float bits 15-8, 7-0, 31-24, 23-16, i.e. low word first with MSB-first bytes (CDAB).
- Integer word order: UINT16/UINT64 are MSB-first inside a word and LSW first across words (p. 10). Under this library's 64-bit convention CDAB means least significant word first with all four words reversed, which is exactly what the document describes: words arrive W0 (least) to W3 (most).
- Float units are not printed separately; the variable names (V, A, W, VA, var, Hz, %) are the engineering units, so no scaling is applied.
- Energy counters are in Wh / varh (not kWh); divide by 1000 for kWh.
- Tariff energies (0524h-0583h) are WM40 only; RS485 settings at 1130h-1132h are documented for WM30 and WM20 only (WM40 uses a different communication module table, not mapped here).
- Left out: the hour counter (0520h), whose value packs hours x100 plus minutes in the remainder rather than a plain scale; K-factor, temperature, analogue-input and the model-dependent 'A' rows at 0090h-009Ah, which overlap by model; odd/even THD, TDD, max/min/demand blocks; harmonic tables; module and alarm configuration; clock; record-file and special-register (42h) functions.
- Removed on verification: total THD floats (00A0h-00B0h). The table names them 'THD tot ...' without any unit, and the document never says whether the float is a percentage or a ratio, so the scaling is ambiguous. (Asymmetry rows 008Ah/008Ch print '%' in the name and are kept.)
Check it against the live device. A register map tells you what the controller can expose; the unit in front of you may differ by firmware or options. Read a few registers and compare them with the unit’s own display; for a 32-bit value the float and byte-order decoder shows all four word orders at once, so a wrong word order or scale is obvious. New to this? Read what a register map is and why addresses are off by one.
Questions about the Carlo Gavazzi WM20 / WM30 / WM40 power analyzers
What Modbus registers does the Carlo Gavazzi WM20 / WM30 / WM40 power analyzers have?
This map lists 79 registers: 67 input registers, 12 holding registers. 12 of them can be written. Registers vary with firmware, options and configuration, so confirm against the device.
Are the Carlo Gavazzi WM20 / WM30 / WM40 power analyzers Modbus addresses 0-based or 1-based?
The manufacturer's document numbers registers Modicon 3xxxx/4xxxx (drop the prefix, subtract 1). Every address on this page is the 0-based wire address you put in the request; the documented number is shown under it where it differs. Registers are printed as a 6-digit Modicon number for function 04 (3xxxxx; first digit becomes 4 for function 03) beside the hex physical address placed in the frame. Wire address = physical address (300081 / 0050h is address 0x50). Setup and command rows are written with 06/10h and are listed as holding registers.
What byte order does the Carlo Gavazzi WM20 / WM30 / WM40 power analyzers use for 32-bit values?
Multi-register values in this map use CDAB (low word first (word-swapped)). Set your client to this order for every 32/64-bit value in the table.
What are the minimum Modbus registers to integrate the Carlo Gavazzi WM20 / WM30 / WM40 power analyzers?
Start with IR 80 V L1-N (V L1-N (float)); IR 96 A L1 (A L1 (float)); IR 110 W system (W system (float)); IR 134 PF system (PF system); IR 136 Frequency (Frequency); IR 1280 Total kWh(+) (Total kWh(+) in Wh); IR 1288 Total kWh(-) (Total kWh(-) in Wh); IR 11 Carlo Gavazzi identification code (Model ID (WM20/30/40)).
How do I enable Modbus control of the Carlo Gavazzi WM20 / WM30 / WM40 power analyzers?
Fit an RS485 (or Ethernet) communication module. Change RS485 address/baud/parity in 1130h-1132h, then write 1 to 3052h (or power-cycle) to apply.
Where is the official Carlo Gavazzi WM20 / WM30 / WM40 power analyzers Modbus documentation?
The source is WM20-WM30-WM40 Communication Protocol (Internal version rev. 4.0), revision 2018-03-28, published free by Carlo Gavazzi at https://www.gavazziautomation.com/fileadmin/images/PIM/OTHERSTUFF/COMPRO/WM20_WM30_WM40_CP.pdf.
More Carlo Gavazzi Modbus register maps
- Energy meter
Carlo Gavazzi EM100 / ET100 series (EM111, EM112, ET112)
Single-phase EM111, EM112 energy meters and ET112 bidirectional meter with the S1 (RS485 Modbus RTU) port, protocol version 2 revision 14.
Also known as: EM111, EM112, ET112, EM110, EM111-DIN, EM112-DIN, ET112-DIN, EM111DINAV81XS1X, EM112DINAV01XS1X, ET112DINAV01XS1X - Energy meter (energy analyzer)
Carlo Gavazzi EM210 (AV versions)
EM210 three-phase energy analyzers, AV input versions with the RS485 Modbus RTU option, protocol version 4 revision 3 (newest variables need firmware A.5/A.6).
Also known as: EM210, EM210-72D, EM210 AV - Energy meter (energy analyzer)
Carlo Gavazzi EM24-DIN (PFA, PFB and X models)
EM24-DIN three-phase energy analyzers, PFA/PFB (MID) and X models with the RS485 Modbus RTU port (IS option), protocol version 4 revision 0.
Also known as: EM24, EM24DIN, EM24DINAV93XISPFA, EM24DINAV93XISPFB, EM24DINAV93XISX, EM24DINAV53XISX, EM24DINAV23XISX, EM24 DIN AV9, EM24 DIN AV5 - Energy meter (energy analyzer)
Carlo Gavazzi EM24-DIN Ethernet (E1)
EM24-DIN energy analyzers with the E1 Ethernet (RJ45) Modbus TCP port, AV2 and AV5 inputs, X/PFA/PFB, protocol version 0 revision 1.3 (FW 1.0).
Also known as: EM24 E1, EM24_E1, EM24DINAV23XE1X, EM24DINAV23XE1PFA, EM24DINAV23XE1PFB, EM24DINAV53XE1X, EM24DINAV53XE1PFA, EM24DINAV53XE1PFB - Energy meter
Carlo Gavazzi EM24-IS (SFA and SFB models)
EM24-DIN AV2/AV5 IS SFA and SFB versions (identification codes 1696-1699), protocol revision 2.0.
Also known as: EM24DINAV23XISSFA, EM24DINAV53XISSFA, EM24DINAV23XISSFB, EM24DINAV53XISSFB, EM24 SFA, EM24 SFB - Energy meter
Carlo Gavazzi EM270 / EM280 dual three-phase energy meters with TCD current sensors
EM270 X (firmware r.b0+), EM270 W (r.C0+) and EM280 (r.E0+) on RS485 Modbus RTU, per communication protocol version 5 revision 1 (2018-01-29).
Also known as: EM270, EM280, EM270 X, EM270 W, EM27072DMV53X2SX, EM28072DMV53X2SX - Energy meter
Carlo Gavazzi EM271 dual three-phase energy meter with TCD current sensors
EM271 (firmware r.d0+, PF values from r.d2) on RS485 Modbus RTU, per communication protocol version 1 revision 2 (2018-01-29).
Also known as: EM271, EM27172DMV53X2SX, EM27172DMV63X2SX - Energy meter
Carlo Gavazzi EM300 / ET300 series (EM330, EM340, ET330, ET340)
EM330, EM331, EM340, EM341 energy meters and ET330/ET340 bidirectional meters with the S1 (RS485 Modbus RTU) port, protocol version 2 revision 17.
Also known as: EM330, EM340, ET330, ET340, EM331, EM341, EM330-DIN, EM340-DIN, ET340-DIN, EM340DINAV23XS1X, EM340DINAV23XS1PFA, EM340DINAV23XS1PFB - Energy meter
Carlo Gavazzi EM530 / EM540 three-phase energy meters (RS485 Modbus)
EM530 (CT-connected) and EM540 (direct-connected) with the S1 RS485 port, X and MID (PFA/PFB/PFC) versions, protocol document version 1.3.
Also known as: EM530, EM540, EM530DINAV53XS1X, EM530DINAV53XS1PFA, EM530DINAV53XS1PFB, EM530DINAV53XS1PFC, EM540DINAV23XS1X, EM540DINAV23XS1PFA, EM540DINAV23XS1PFB, EM540DINAV23XS1PFC, EM500 series - Power meter (power analyzer)
Carlo Gavazzi WM15 power analyzer
WM15-96 three-phase panel power analyzers with RS485 Modbus RTU (OS / OSPF / HOS versions), protocol version 1.2.
Also known as: WM15, WM15-96, WM1596AV53XOSX, WM1596AV53XOSPFB, WM1596AV53HOSX - Power meter (power analyzer)
Carlo Gavazzi WM50 power analyzer with TCD branch channels
WM50 base unit (firmware X0, i.e. all A and B versions) with an MC485232 or MCETH communication module, plus TCD branch channels, per communication protocol user version rev. 1.0.0 (2017-09-27).
Also known as: WM50, WM50AV5, WM50-96, WM50 AV5
Source: WM20-WM30-WM40 Communication Protocol · Internal version rev. 4.0 · rev. 2018-03-28. Register numbers, types, scaling and units are reproduced as published; descriptions are our own.