{
 "manufacturer": "Carlo Gavazzi",
 "manufacturer_slug": "carlo-gavazzi",
 "model": "WM50 power analyzer with TCD branch channels",
 "model_slug": "wm50",
 "short_model": "WM50",
 "aliases": [
  "WM50",
  "WM50AV5",
  "WM50-96",
  "WM50 AV5"
 ],
 "equipment_type": "Power meter (power analyzer)",
 "applies_to": "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).",
 "summary": "The WM50 is a modular Carlo Gavazzi power analyzer for a main feeder plus up to 96 single-phase TCD branch channels (grouped into 2/3-phase loads). Live values are IEEE-754 floats and energies are 64-bit Wh/varh counters, both sent low word first. This map covers the main feeder's voltage, current, power, PF, frequency, energy and tariff values, identification, status and alarm words, reset and remote-output commands, and channel 1 / load 1 of the branch blocks as a pattern.",
 "transport": [
  "RTU",
  "TCP"
 ],
 "defaults": {
  "unit_id": null,
  "baud": null,
  "parity": null,
  "data_bits": null,
  "stop_bits": null,
  "tcp_port": null
 },
 "addressing": {
  "convention": "Modicon",
  "note": "Each row shows a 6-digit Modicon number for function 04 (3xxxxx; replace the first digit with 4 for function 03) beside the hex 'physical address' that the document says goes in the frame. Wire address = physical address: 300081 / 0050h is requested as 0x0050."
 },
 "default_word_order": "CDAB",
 "firmware": "X0 (all WM50 firmware letters A and B)",
 "source": {
  "title": "WM50 Communication Protocol (User version)",
  "doc_number": "rev. 1.0.0",
  "revision_date": "2017-09-27",
  "url": "https://www.gavazziautomation.com/fileadmin/images/PIM/OTHERSTUFF/COMPRO/WM50_CP.pdf",
  "pages": "Real-time p. 5; energy p. 10; tariff p. 11; commands pp. 13-15; status pp. 15-16; TCD channels and loads pp. 17-18; ID and serial p. 23; functions p. 24; data format p. 28"
 },
 "notes": [
  "Float word order: the data-format page lists 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. 28). Under this library's 64-bit convention CDAB means least significant word first with all four words reversed, which is what the document describes.",
  "Functions 03 and 04 return the same data; reads are limited to 125 registers. Measured values are listed as input registers, commands and the default tariff as holding registers (written with 06 or 10h).",
  "After a reset sent with function 10h, wait at least 1 second before the next request.",
  "Float units are not printed in a separate column; the variable names (V, A, W, VA, var, Hz, %) give the engineering units, so no scaling is applied. Energy counters are in Wh / varh, not kWh.",
  "Source quirk: the A system row (009Ah) is printed with Modicon 300153, the same number as the row above it; the physical address is used here.",
  "Left out: the main-unit THD and TDD floats (00A0h-00DAh), which have no unit or scaling stated (precedent from the WM20/30/40 map); temperature and analogue input (0096h/0098h, optional module, unit not printed); the hour counter (0520h, packed hours x100 plus minutes); totalizers C-1..C-3 (0584h-058Ch, 'values multiplied by 1000' without a base unit); max/min/demand blocks; harmonics; clock; and alarm/latch reset commands.",
  "Left out: the TCD channel and load energy counters (Wh+, UINT32) and the min/max/demand timestamps (UINT32). The data-format page states the word order only for UINT16 and UINT64, not for UINT32.",
  "TCD blocks: only channel 1 and load 1 are listed. Channels repeat every 14 registers from C200h (channel 96 at C732h); loads 1-48 repeat every 24 registers from C760h (load 48 at CBC8h). The channel voltage references are one register per channel from C100h to C15Fh.",
  "RS485/Ethernet communication settings are not in this document; set them on the instrument (see the WM50 instruction manual).",
  "This document shows only RTU frames (with CRC); TCP is listed because the MCETH module is the Ethernet option, which this document does not describe further."
 ],
 "registers": [
  {
   "table": "input_register",
   "address": 0,
   "documented": "300001 / 0000h",
   "name": "Base firmware version",
   "description": "High byte ASCII model letter (A = WM50AV5); low byte revision number.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1,
   "documented": "300002 / 0001h",
   "name": "Ethernet module firmware version",
   "description": "Only with the MCETH module; 0 if absent. High byte model letter, low byte revision.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 11,
   "documented": "300012 / 000Bh",
   "name": "Carlo Gavazzi identification code",
   "description": "Reads 99 (0x0063) for WM50.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "99": "WM50"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 32,
   "documented": "300033 / 0020h",
   "name": "Serial number",
   "description": "13 ASCII characters, two per register, high byte first.",
   "data_type": "STRING",
   "length": 7,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 80,
   "documented": "300081 / 0050h",
   "name": "V L1-N",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 82,
   "documented": "300083 / 0052h",
   "name": "V L2-N",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 84,
   "documented": "300085 / 0054h",
   "name": "V L3-N",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 86,
   "documented": "300087 / 0056h",
   "name": "V L-N system",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 88,
   "documented": "300089 / 0058h",
   "name": "V L1-L2",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 90,
   "documented": "300091 / 005Ah",
   "name": "V L2-L3",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 92,
   "documented": "300093 / 005Ch",
   "name": "V L3-L1",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 94,
   "documented": "300095 / 005Eh",
   "name": "V L-L system",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 96,
   "documented": "300097 / 0060h",
   "name": "A L1",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 98,
   "documented": "300099 / 0062h",
   "name": "A L2",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 100,
   "documented": "300101 / 0064h",
   "name": "A L3",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 102,
   "documented": "300103 / 0066h",
   "name": "A N",
   "description": "Calculated by the base unit, or measured when the optional module is fitted.",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 104,
   "documented": "300105 / 0068h",
   "name": "W L1",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 106,
   "documented": "300107 / 006Ah",
   "name": "W L2",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 108,
   "documented": "300109 / 006Ch",
   "name": "W L3",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 110,
   "documented": "300111 / 006Eh",
   "name": "W system",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 112,
   "documented": "300113 / 0070h",
   "name": "VA L1",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 114,
   "documented": "300115 / 0072h",
   "name": "VA L2",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 116,
   "documented": "300117 / 0074h",
   "name": "VA L3",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 118,
   "documented": "300119 / 0076h",
   "name": "VA system",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 120,
   "documented": "300121 / 0078h",
   "name": "var L1",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 122,
   "documented": "300123 / 007Ah",
   "name": "var L2",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 124,
   "documented": "300125 / 007Ch",
   "name": "var L3",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 126,
   "documented": "300127 / 007Eh",
   "name": "var system",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 128,
   "documented": "300129 / 0080h",
   "name": "PF L1",
   "description": "Negative = leading (capacitive), positive = lagging (inductive).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 130,
   "documented": "300131 / 0082h",
   "name": "PF L2",
   "description": "Negative = leading (capacitive), positive = lagging (inductive).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 132,
   "documented": "300133 / 0084h",
   "name": "PF L3",
   "description": "Negative = leading (capacitive), positive = lagging (inductive).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 134,
   "documented": "300135 / 0086h",
   "name": "PF system",
   "description": "Negative = leading (capacitive), positive = lagging (inductive).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 136,
   "documented": "300137 / 0088h",
   "name": "Frequency",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Hz",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 138,
   "documented": "300139 / 008Ah",
   "name": "Asymmetry L-N",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 140,
   "documented": "300141 / 008Ch",
   "name": "Asymmetry L-L",
   "description": "",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 142,
   "documented": "300143 / 008Eh",
   "name": "Phase sequence",
   "description": "+1 = L1-L2-L3 sequence, -1 = wrong sequence.",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 154,
   "documented": "300153 / 009Ah",
   "name": "A system",
   "description": "Source prints Modicon 300153 for this row; the physical address 009Ah is used.",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1280,
   "documented": "301281 / 0500h",
   "name": "Total kWh+",
   "description": "Imported active energy. Counted in Wh / varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1284,
   "documented": "301285 / 0504h",
   "name": "Total kvarh+",
   "description": "Counted in Wh / varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1288,
   "documented": "301289 / 0508h",
   "name": "Total kWh-",
   "description": "Exported active energy. Counted in Wh / varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1292,
   "documented": "301293 / 050Ch",
   "name": "Total kvarh-",
   "description": "Counted in Wh / varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1296,
   "documented": "301297 / 0510h",
   "name": "Partial kWh+",
   "description": "Resettable partial counter. Counted in Wh / varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1300,
   "documented": "301301 / 0514h",
   "name": "Partial kvarh+",
   "description": "Counted in Wh / varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1304,
   "documented": "301305 / 0518h",
   "name": "Partial kWh-",
   "description": "Counted in Wh / varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1308,
   "documented": "301309 / 051Ch",
   "name": "Partial kvarh-",
   "description": "Counted in Wh / varh.",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "varh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1316,
   "documented": "301317 / 0524h",
   "name": "Tariff 1 kWh+",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1332,
   "documented": "301333 / 0534h",
   "name": "Tariff 2 kWh+",
   "description": "",
   "data_type": "UINT64",
   "length": 4,
   "word_order": "CDAB",
   "scale": 1,
   "units": "Wh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 1520,
   "documented": "301521 / 05F0h",
   "name": "Real-time tariff",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "Tariff 1",
    "1": "Tariff 2",
    "2": "Tariff 3",
    "3": "Tariff 4",
    "4": "Tariff 5",
    "5": "Tariff 6",
    "6": "Tariff disabled"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 16384,
   "documented": "316385 / 4000h",
   "name": "Virtual alarms",
   "description": "",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Alarm 1 on",
    "1": "Alarm 2 on",
    "2": "Alarm 3 on",
    "3": "Alarm 4 on",
    "4": "Alarm 5 on",
    "5": "Alarm 6 on",
    "6": "Alarm 7 on",
    "7": "Alarm 8 on",
    "8": "Alarm 9 on",
    "9": "Alarm 10 on",
    "10": "Alarm 11 on",
    "11": "Alarm 12 on",
    "12": "Alarm 13 on",
    "13": "Alarm 14 on",
    "14": "Alarm 15 on",
    "15": "Alarm 16 on"
   },
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 16385,
   "documented": "316386 / 4001h",
   "name": "Output port status and configuration",
   "description": "Bits 2-7: port closed (non-pulse ports). Bits 10-15: port set as pulse output.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "2": "Port 1 closed",
    "3": "Port 2 closed",
    "4": "Port 3 closed",
    "5": "Port 4 closed",
    "6": "Port 5 closed",
    "7": "Port 6 closed",
    "10": "Port 1 configured as pulse",
    "11": "Port 2 configured as pulse",
    "12": "Port 3 configured as pulse",
    "13": "Port 4 configured as pulse",
    "14": "Port 5 configured as pulse",
    "15": "Port 6 configured as pulse"
   },
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 16386,
   "documented": "316387 / 4002h",
   "name": "Hardware modules fitted",
   "description": "",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "MC485232 present",
    "1": "MCETH present",
    "2": "MATPN present",
    "3": "MFI6R4 present",
    "4": "MFI6O6 present"
   },
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 16387,
   "documented": "316388 / 4003h",
   "name": "Input port status",
   "description": "Inverted logic: bit = 0 means the input is closed, 1 means open.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Port 1 open",
    "1": "Port 2 open",
    "2": "Port 3 open",
    "3": "Port 4 open",
    "4": "Port 5 open",
    "5": "Port 6 open"
   },
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 16391,
   "documented": "316392 / 4007h",
   "name": "Wiring check status",
   "description": "All bits 0 = wiring correct.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Wrong voltage sequence",
    "1": "Current L1 inverted",
    "2": "Current L2 inverted",
    "3": "Current L3 inverted",
    "4": "Currents L1/L2 swapped",
    "5": "Currents L1/L3 swapped",
    "6": "Currents L2/L3 swapped",
    "7": "Currents L1/L2/L3 swapped"
   },
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 49408,
   "documented": "349409 / C100h",
   "name": "Channel 1 voltage reference",
   "description": "Phase this TCD channel is referenced to.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "1": "L1",
    "2": "L2",
    "3": "L3"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 49664,
   "documented": "349665 / C200h",
   "name": "Channel 1 current",
   "description": "TCD branch channel; channel n starts 14 registers after channel n-1 (channel 96 at C732h).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 49666,
   "documented": "349667 / C202h",
   "name": "Channel 1 active power",
   "description": "TCD branch channel; channel n starts 14 registers after channel n-1 (channel 96 at C732h).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 49668,
   "documented": "349669 / C204h",
   "name": "Channel 1 reactive power",
   "description": "TCD branch channel; channel n starts 14 registers after channel n-1 (channel 96 at C732h).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "var",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 49670,
   "documented": "349671 / C206h",
   "name": "Channel 1 apparent power",
   "description": "TCD branch channel; channel n starts 14 registers after channel n-1 (channel 96 at C732h).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "VA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 49672,
   "documented": "349673 / C208h",
   "name": "Channel 1 power factor",
   "description": "TCD branch channel; channel n starts 14 registers after channel n-1 (channel 96 at C732h).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 49674,
   "documented": "349675 / C20Ah",
   "name": "Channel 1 THD current",
   "description": "TCD branch channel; channel n starts 14 registers after channel n-1 (channel 96 at C732h).",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 51040,
   "documented": "351041 / C760h",
   "name": "Load 1 system voltage",
   "description": "2-phase/3-phase load built from TCD channels.",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 51042,
   "documented": "351043 / C762h",
   "name": "Load 1 current L1",
   "description": "2-phase/3-phase load built from TCD channels.",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 51044,
   "documented": "351045 / C764h",
   "name": "Load 1 current L2",
   "description": "2-phase/3-phase load built from TCD channels.",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 51046,
   "documented": "351047 / C766h",
   "name": "Load 1 current L3",
   "description": "Only when the load is configured 3-phase.",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 51048,
   "documented": "351049 / C768h",
   "name": "Load 1 active power",
   "description": "2-phase/3-phase load built from TCD channels.",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "W",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "input_register",
   "address": 51054,
   "documented": "351055 / C76Eh",
   "name": "Load 1 power factor",
   "description": "2-phase/3-phase load built from TCD channels.",
   "data_type": "FLOAT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 5183,
   "documented": "305184 / 143Fh",
   "name": "Default tariff",
   "description": "Tariff used when tariff management is set to remote command; default 6.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Tariff 1",
    "1": "Tariff 2",
    "2": "Tariff 3",
    "3": "Tariff 4",
    "4": "Tariff 5",
    "5": "Tariff 6",
    "6": "Disabled"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 12549,
   "documented": "312550 / 3105h",
   "name": "Remote output port 1",
   "description": "Needs an MFI6O6 or MFI6R4 module and the port set as REMOTE.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Open",
    "1": "Close"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 12550,
   "documented": "312551 / 3106h",
   "name": "Remote output port 2",
   "description": "Needs an MFI6O6 or MFI6R4 module and the port set as REMOTE.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Open",
    "1": "Close"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 12551,
   "documented": "312552 / 3107h",
   "name": "Remote output port 3",
   "description": "Needs an MFI6O6 or MFI6R4 module and the port set as REMOTE.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Open",
    "1": "Close"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 12552,
   "documented": "312553 / 3108h",
   "name": "Remote output port 4",
   "description": "Needs an MFI6O6 or MFI6R4 module and the port set as REMOTE.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Open",
    "1": "Close"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 12553,
   "documented": "312554 / 3109h",
   "name": "Remote output port 5",
   "description": "Needs an MFI6O6 or MFI6R4 module and the port set as REMOTE.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Open",
    "1": "Close"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 12554,
   "documented": "312555 / 310Ah",
   "name": "Remote output port 6",
   "description": "Needs an MFI6O6 or MFI6R4 module and the port set as REMOTE.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Open",
    "1": "Close"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13568,
   "documented": "313569 / 3500h",
   "name": "Reset total kWh+",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "1": "Execute"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13569,
   "documented": "313570 / 3501h",
   "name": "Reset total kvarh+",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "1": "Execute"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13570,
   "documented": "313571 / 3502h",
   "name": "Reset total kWh-",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "1": "Execute"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13571,
   "documented": "313572 / 3503h",
   "name": "Reset total kvarh-",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "1": "Execute"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13572,
   "documented": "313573 / 3504h",
   "name": "Reset partial kWh+",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "1": "Execute"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13573,
   "documented": "313574 / 3505h",
   "name": "Reset partial kvarh+",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "1": "Execute"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13574,
   "documented": "313575 / 3506h",
   "name": "Reset partial kWh-",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "1": "Execute"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 13575,
   "documented": "313576 / 3507h",
   "name": "Reset partial kvarh-",
   "description": "Write 1 to execute.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "W",
   "values": {
    "1": "Execute"
   },
   "bits": null,
   "offset": 0
  }
 ],
 "integration": {
  "summary": "Read input registers (function 04, or 03) from 0050h as low-word-first floats for main-feeder values and 0500h-051Fh as UINT64 Wh/varh counters (least significant word first). Branch circuits start at C200h, 14 registers per channel.",
  "minimum_registers": [
   {
    "table": "input_register",
    "address": 80,
    "why": "V L1-N (float)"
   },
   {
    "table": "input_register",
    "address": 96,
    "why": "A L1 (float)"
   },
   {
    "table": "input_register",
    "address": 110,
    "why": "W system (float)"
   },
   {
    "table": "input_register",
    "address": 134,
    "why": "PF system"
   },
   {
    "table": "input_register",
    "address": 136,
    "why": "Frequency"
   },
   {
    "table": "input_register",
    "address": 1280,
    "why": "Total kWh+ in Wh"
   },
   {
    "table": "input_register",
    "address": 11,
    "why": "Model ID (99 = WM50)"
   },
   {
    "table": "input_register",
    "address": 49666,
    "why": "Branch channel 1 active power"
   }
  ],
  "enable": "Fit a communication module (the status word at 4002h shows MC485232 or MCETH as present) and set its communication parameters on the instrument as described in the WM50 instruction manual; this document does not list them.",
  "watchdog": null,
  "quirks": [
   "Floats are low word first (CDAB).",
   "64-bit energy counters are least significant word first and in Wh/varh.",
   "Functions 03 and 04 are equivalent; up to 125 registers per read.",
   "Input port status bits are inverted: 0 = closed."
  ],
  "setup": [
   "Terminate the last instrument and the host on RS485; above 1000 m use a line amplifier.",
   "Assign each TCD channel to a phase; register C100h + (channel - 1) shows the assignment."
  ],
  "gotchas": [
   "Wait at least 1 s after a function 10h reset before the next query.",
   "Check register 4007h after installation: any bit set means a wiring error to correct."
  ]
 },
 "page": "https://easymodbus.com/modbus-register-maps/carlo-gavazzi/wm50",
 "address_note": "address = 0-based Modbus wire (PDU) address; documented = as printed in the source.",
 "note": "Re-typed from the manufacturer's public documentation (see source) and verified against it. Registers vary by firmware and options; verify against the live device before writing."
}
