Easy Modbus
  1. Home
  2. Modbus register maps
  3. Carlo Gavazzi
  4. 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

Short answer

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
Source document
WM20-WM30-WM40 Communication Protocol · Internal version rev. 4.0 · rev. 2018-03-28
Download CSV all columns JSON Manufacturer PDF ↗

Integration notes: Carlo Gavazzi WM20 / WM30 / WM40 power analyzers

Integration in brief

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.

RegisterNameTypeWhyAccess
IR 80V L1-NFLOAT32 CDABV L1-N (float)Read
IR 96A L1FLOAT32 CDABA L1 (float)Read
IR 110W systemFLOAT32 CDABW system (float)Read
IR 134PF systemFLOAT32 CDABPF systemRead
IR 136FrequencyFLOAT32 CDABFrequencyRead
IR 1280Total kWh(+)UINT64 CDABTotal kWh(+) in WhRead
IR 1288Total kWh(-)UINT64 CDABTotal kWh(-) in WhRead
IR 11Carlo Gavazzi identification codeUINT16Model 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

Network setup

Watch out for

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.

79 of 79 shown
Carlo Gavazzi WM20 / WM30 / WM40 power analyzers Modbus register map
TableAddressNameDescriptionTypeOrderScaleUnitsAccessValues / bits
IR0doc 300001 / 0000hBase firmware versionHigh byte ASCII model (A=AV5, B=AV6, C=AV4, D=AV7); low byte revision.UINT16Read
IR11doc 300012 / 000BhCarlo Gavazzi identification codeUINT16Read65 = WM30; 66 = WM40; 98 = WM20
IR80doc 300081 / 0050hV L1-NFLOAT32CDABVRead
IR82doc 300083 / 0052hV L2-NFLOAT32CDABVRead
IR84doc 300085 / 0054hV L3-NFLOAT32CDABVRead
IR86doc 300087 / 0056hV L-N systemFLOAT32CDABVRead
IR88doc 300089 / 0058hV L1-L2FLOAT32CDABVRead
IR90doc 300091 / 005AhV L2-L3FLOAT32CDABVRead
IR92doc 300093 / 005ChV L3-L1FLOAT32CDABVRead
IR94doc 300095 / 005EhV L-L systemFLOAT32CDABVRead
IR96doc 300097 / 0060hA L1FLOAT32CDABARead
IR98doc 300099 / 0062hA L2FLOAT32CDABARead
IR100doc 300101 / 0064hA L3FLOAT32CDABARead
IR102doc 300103 / 0066hA NCalculated by the base; WM40 can measure it with an optional module.FLOAT32CDABARead
IR104doc 300105 / 0068hW L1FLOAT32CDABWRead
IR106doc 300107 / 006AhW L2FLOAT32CDABWRead
IR108doc 300109 / 006ChW L3FLOAT32CDABWRead
IR110doc 300111 / 006EhW systemFLOAT32CDABWRead
IR112doc 300113 / 0070hVA L1FLOAT32CDABVARead
IR114doc 300115 / 0072hVA L2FLOAT32CDABVARead
IR116doc 300117 / 0074hVA L3FLOAT32CDABVARead
IR118doc 300119 / 0076hVA systemFLOAT32CDABVARead
IR120doc 300121 / 0078hvar L1FLOAT32CDABvarRead
IR122doc 300123 / 007Ahvar L2FLOAT32CDABvarRead
IR124doc 300125 / 007Chvar L3FLOAT32CDABvarRead
IR126doc 300127 / 007Ehvar systemFLOAT32CDABvarRead
IR128doc 300129 / 0080hPF L1Negative = capacitive (lead), positive = inductive (lag).FLOAT32CDABRead
IR130doc 300131 / 0082hPF L2Negative = capacitive (lead), positive = inductive (lag).FLOAT32CDABRead
IR132doc 300133 / 0084hPF L3Negative = capacitive (lead), positive = inductive (lag).FLOAT32CDABRead
IR134doc 300135 / 0086hPF systemNegative = capacitive (lead), positive = inductive (lag).FLOAT32CDABRead
IR136doc 300137 / 0088hFrequencyFLOAT32CDABHzRead
IR138doc 300139 / 008AhAsymmetry L-NFLOAT32CDAB%Read
IR140doc 300141 / 008ChAsymmetry L-LFLOAT32CDAB%Read
IR142doc 300143 / 008EhPhase sequenceFLOAT32CDABRead1 = L1-L2-L3; -1 = Wrong sequence
IR1280doc 301281 / 0500hTotal kWh(+)Value in Wh; 4 registers, least significant word first.UINT64CDABWhRead
IR1284doc 301285 / 0504hTotal kvarh(+)Value in varh; 4 registers, least significant word first.UINT64CDABvarhRead
IR1288doc 301289 / 0508hTotal kWh(-)Value in Wh; 4 registers, least significant word first.UINT64CDABWhRead
IR1292doc 301293 / 050ChTotal kvarh(-)Value in varh; 4 registers, least significant word first.UINT64CDABvarhRead
IR1296doc 301297 / 0510hPartial kWh(+)Value in Wh; 4 registers, least significant word first.UINT64CDABWhRead
IR1300doc 301301 / 0514hPartial kvarh(+)Value in varh; 4 registers, least significant word first.UINT64CDABvarhRead
IR1304doc 301305 / 0518hPartial kWh(-)Value in Wh; 4 registers, least significant word first.UINT64CDABWhRead
IR1308doc 301309 / 051ChPartial kvarh(-)Value in varh; 4 registers, least significant word first.UINT64CDABvarhRead
IR1316doc 301317 / 0524hTariff 1 kWh(+)WM40 only. Value in Wh.UINT64CDABWhRead
IR1320doc 301321 / 0528hTariff 1 kvarh(+)WM40 only. Value in varh.UINT64CDABvarhRead
IR1324doc 301325 / 052ChTariff 1 kWh(-)WM40 only. Value in Wh.UINT64CDABWhRead
IR1328doc 301329 / 0530hTariff 1 kvarh(-)WM40 only. Value in varh.UINT64CDABvarhRead
IR1332doc 301333 / 0534hTariff 2 kWh(+)WM40 only. Value in Wh.UINT64CDABWhRead
IR1336doc 301337 / 0538hTariff 2 kvarh(+)WM40 only. Value in varh.UINT64CDABvarhRead
IR1340doc 301341 / 053ChTariff 2 kWh(-)WM40 only. Value in Wh.UINT64CDABWhRead
IR1344doc 301345 / 0540hTariff 2 kvarh(-)WM40 only. Value in varh.UINT64CDABvarhRead
IR1348doc 301349 / 0544hTariff 3 kWh(+)WM40 only. Value in Wh.UINT64CDABWhRead
IR1352doc 301353 / 0548hTariff 3 kvarh(+)WM40 only. Value in varh.UINT64CDABvarhRead
IR1356doc 301357 / 054ChTariff 3 kWh(-)WM40 only. Value in Wh.UINT64CDABWhRead
IR1360doc 301361 / 0550hTariff 3 kvarh(-)WM40 only. Value in varh.UINT64CDABvarhRead
IR1364doc 301365 / 0554hTariff 4 kWh(+)WM40 only. Value in Wh.UINT64CDABWhRead
IR1368doc 301369 / 0558hTariff 4 kvarh(+)WM40 only. Value in varh.UINT64CDABvarhRead
IR1372doc 301373 / 055ChTariff 4 kWh(-)WM40 only. Value in Wh.UINT64CDABWhRead
IR1376doc 301377 / 0560hTariff 4 kvarh(-)WM40 only. Value in varh.UINT64CDABvarhRead
IR1380doc 301381 / 0564hTariff 5 kWh(+)WM40 only. Value in Wh.UINT64CDABWhRead
IR1384doc 301385 / 0568hTariff 5 kvarh(+)WM40 only. Value in varh.UINT64CDABvarhRead
IR1388doc 301389 / 056ChTariff 5 kWh(-)WM40 only. Value in Wh.UINT64CDABWhRead
IR1392doc 301393 / 0570hTariff 5 kvarh(-)WM40 only. Value in varh.UINT64CDABvarhRead
IR1396doc 301397 / 0574hTariff 6 kWh(+)WM40 only. Value in Wh.UINT64CDABWhRead
IR1400doc 301401 / 0578hTariff 6 kvarh(+)WM40 only. Value in varh.UINT64CDABvarhRead
IR1404doc 301405 / 057ChTariff 6 kWh(-)WM40 only. Value in Wh.UINT64CDABWhRead
IR1408doc 301409 / 0580hTariff 6 kvarh(-)WM40 only. Value in varh.UINT64CDABvarhRead
IR1520doc 301521 / 05F0hReal-time tariffUINT16Read0 = Tariff 1; 1 = Tariff 2; 2 = Tariff 3; 3 = Tariff 4; 4 = Tariff 5; 5 = Tariff 6; 6 = Tariff disabled
HR4400doc 304401 / 1130hRS485 address1-247. WM20/WM30. Apply with command 3052h.UINT16Read/write
HR4401doc 304402 / 1131hRS485 baud rateWM20/WM30. Apply with command 3052h.UINT16Read/write0 = 9600; 1 = 19200; 2 = 38400; 3 = 115200
HR4402doc 304403 / 1132hRS485 parityWM20/WM30. Apply with command 3052h.UINT16Read/write0 = None; 1 = Odd; 2 = Even
HR12370doc 312371 / 3052hApply serial settingsWrite 1 to activate new RS485 settings.UINT16Write
HR13568doc 313569 / 3500hReset total kWh(+)Write 1 to execute.UINT16Write
HR13569doc 313570 / 3501hReset total kvarh(+)Write 1 to execute.UINT16Write
HR13570doc 313571 / 3502hReset total kWh(-)Write 1 to execute.UINT16Write
HR13571doc 313572 / 3503hReset total kvarh(-)Write 1 to execute.UINT16Write
HR13572doc 313573 / 3504hReset partial kWh(+)Write 1 to execute.UINT16Write
HR13573doc 313574 / 3505hReset partial kvarh(+)Write 1 to execute.UINT16Write
HR13574doc 313575 / 3506hReset partial kWh(-)Write 1 to execute.UINT16Write
HR13575doc 313576 / 3507hReset partial kvarh(-)Write 1 to execute.UINT16Write

Notes on this map

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

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.