{
  "spec_version": 1,
  "slug": "endress-hauser-promag-w-400",
  "manufacturer": "Endress+Hauser",
  "model": "Proline Promag W 400 (Modbus RS485)",
  "category": "Flow meter",
  "supplier_url": "https://www.endress.com/en/field-instruments-overview/flow-measurement-product-overview/Proline-Promag-W-400",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 247,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "LowFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "Even",
      "baud_rate": 19200,
      "data_bits": 8,
      "stop_bits": 1
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 3874,
      "count": 2,
      "name": "Volume flow",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed floating-point volume flow measured value. The unit is whatever is selected in the volume-flow unit register (2103)."
    },
    {
      "address": 3876,
      "count": 2,
      "name": "Mass flow",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed floating-point mass flow measured value (requires the density input used by the device). Unit from the mass-flow unit register (2101)."
    },
    {
      "address": 2013,
      "count": 2,
      "name": "Conductivity",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed floating-point conductivity measured value. Unit from the conductivity unit register (2121)."
    },
    {
      "address": 2610,
      "count": 2,
      "name": "Totalizer 1 value",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed floating-point totalizer 1 value. Unit from the volume unit register (2104)."
    },
    {
      "address": 2612,
      "count": 2,
      "name": "Totalizer 1 overflow",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed integer totalizer 1 overflow counter: the current totalizer 1 reading is the totalizer 1 value plus 10 000 000 x this overflow. Type caveat: the parameter's own description types it 'Integer with sign', while the register table's data type column says Float (4 bytes) - it is read here as a signed 32-bit integer, as the parameter description states; check it against the local display on an installation that has passed 7 digits before relying on it."
    },
    {
      "address": 2810,
      "count": 2,
      "name": "Totalizer 2 value",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed floating-point totalizer 2 value."
    },
    {
      "address": 2812,
      "count": 2,
      "name": "Totalizer 2 overflow",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed integer totalizer 2 overflow counter: the current totalizer 2 reading is the totalizer 2 value plus 10 000 000 x this overflow. Same type caveat as totalizer 1 overflow: parameter description 'Integer with sign' against the register table's Float (4 bytes)."
    },
    {
      "address": 3010,
      "count": 2,
      "name": "Totalizer 3 value",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed floating-point totalizer 3 value."
    },
    {
      "address": 3012,
      "count": 2,
      "name": "Totalizer 3 overflow",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed integer totalizer 3 overflow counter: the current totalizer 3 reading is the totalizer 3 value plus 10 000 000 x this overflow. Same type caveat as totalizer 1 overflow: parameter description 'Integer with sign' against the register table's Float (4 bytes)."
    },
    {
      "address": 2101,
      "count": 1,
      "name": "Mass flow unit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unit code for the mass flow. The vendor register table lists the complete selection list; the factory setting is country-dependent."
    },
    {
      "address": 2102,
      "count": 1,
      "name": "Mass unit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unit code for the mass. Factory setting is country-dependent."
    },
    {
      "address": 2103,
      "count": 1,
      "name": "Volume flow unit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unit code for the volume flow, e.g. 18 = l/h, 45 = gal/min (US). The vendor table lists the complete selection list; the factory setting is country-dependent."
    },
    {
      "address": 2104,
      "count": 1,
      "name": "Volume unit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unit code for the volume/totalizer, e.g. 2 = m3, 4 = l. The register table lists the complete selection list."
    },
    {
      "address": 2107,
      "count": 1,
      "name": "Density unit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unit code for the density, e.g. kg/l or lb/ft3. Factory setting is country-dependent."
    },
    {
      "address": 2109,
      "count": 1,
      "name": "Temperature unit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unit code for temperature: 0 = degC, 1 = K, 2 = degF, 3 = degR. Factory setting is country-dependent (degC or degF)."
    },
    {
      "address": 2121,
      "count": 1,
      "name": "Conductivity unit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Unit code for conductivity (1 = MS/m, 2 = kS/m, 3 = S/m, 4 = S/cm, ... 10 = nS/cm)."
    },
    {
      "address": 2150,
      "count": 1,
      "name": "Date/time format",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Date/time display format."
    },
    {
      "address": 4910,
      "count": 1,
      "name": "Bus address",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Modbus RS485 bus address of the device (1-247). Factory setting 247."
    },
    {
      "address": 4912,
      "count": 1,
      "name": "Baudrate",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Modbus RS485 baud-rate code (1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200). Factory setting 19200."
    },
    {
      "address": 4913,
      "count": 1,
      "name": "Data transfer mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Data transfer mode: ASCII or RTU. Factory setting RTU."
    },
    {
      "address": 4914,
      "count": 1,
      "name": "Parity",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Parity bits: 0 = even, 1 = odd, 2 = none/1 stop bit, 3 = none/2 stop bits. Factory setting 0 (even, 1 stop bit)."
    },
    {
      "address": 4915,
      "count": 1,
      "name": "Byte order",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Byte transmission sequence: 0-1-2-3, 3-2-1-0, 1-0-3-2 or 2-3-0-1. Factory setting 1-0-3-2."
    },
    {
      "address": 4920,
      "count": 1,
      "name": "Failure mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Measured-value output on a diagnostic message: NaN value or last valid value. Factory setting NaN value."
    },
    {
      "address": 2547,
      "count": 1,
      "name": "Device ID",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Modbus device ID of the measuring device."
    },
    {
      "address": 4481,
      "count": 1,
      "name": "Device revision",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Modbus device revision."
    },
    {
      "address": 2732,
      "count": 1,
      "name": "Actual diagnostics",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Diagnostic event code of the currently pending diagnostic message."
    },
    {
      "address": 2734,
      "count": 1,
      "name": "Previous diagnostics",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Diagnostic event code of the last diagnostic message that was pending."
    },
    {
      "address": 2736,
      "count": 1,
      "name": "Diagnostics 1",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Diagnostic list entry 1 (current diagnostic event code)."
    },
    {
      "address": 2738,
      "count": 1,
      "name": "Diagnostics 2",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Diagnostic list entry 2."
    },
    {
      "address": 2740,
      "count": 1,
      "name": "Diagnostics 3",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Diagnostic list entry 3."
    },
    {
      "address": 2742,
      "count": 1,
      "name": "Diagnostics 4",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Diagnostic list entry 4."
    },
    {
      "address": 2744,
      "count": 1,
      "name": "Diagnostics 5",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Diagnostic list entry 5."
    },
    {
      "address": 2026,
      "count": 16,
      "name": "Device tag",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Device tag, max. 32 characters, packed into 16 registers."
    },
    {
      "address": 7003,
      "count": 6,
      "name": "Serial number",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Serial number, max. 11 characters, packed into 6 registers."
    },
    {
      "address": 7277,
      "count": 4,
      "name": "Firmware version",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Firmware version as a character string xx.yy.zz, in 4 registers."
    },
    {
      "address": 7263,
      "count": 8,
      "name": "Device name",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Device name, max. 32 characters, in 8 registers."
    },
    {
      "address": 2058,
      "count": 10,
      "name": "Order code",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Order code string, in 10 registers."
    },
    {
      "address": 4818,
      "count": 1,
      "name": "Configuration counter",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Increments on every change of a device parameter; useful to detect configuration changes."
    },
    {
      "address": 2273,
      "count": 1,
      "name": "Filter options",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Filter option selection for the flow measurement."
    },
    {
      "address": 2274,
      "count": 1,
      "name": "Flow damping",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Flow damping (response time) of the flow measurement."
    },
    {
      "address": 5503,
      "count": 1,
      "name": "Flow override",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Flow override mode: forces the flow output to a configured value for a defined time."
    },
    {
      "address": 5106,
      "count": 1,
      "name": "Empty pipe detection",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Empty pipe detection on/off."
    },
    {
      "address": 2280,
      "count": 1,
      "name": "Electrode cleaning circuit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Electrode cleaning circuit (ECC) on/off."
    },
    {
      "address": 2328,
      "count": 2,
      "name": "ECC cleaning cycle",
      "data_type": "Float32",
      "units": "h",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Electrode cleaning cycle duration in hours; the register table gives the entry range as 0.5 to 168 h."
    },
    {
      "address": 2330,
      "count": 2,
      "name": "ECC duration",
      "data_type": "Float32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Duration of the electrode cleaning pulse in seconds."
    },
    {
      "address": 2332,
      "count": 2,
      "name": "ECC recovery time",
      "data_type": "Float32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Recovery time after electrode cleaning in seconds."
    },
    {
      "address": 2334,
      "count": 1,
      "name": "ECC polarity",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Polarity of the electrode cleaning circuit."
    },
    {
      "address": 2497,
      "count": 1,
      "name": "Density source",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Source of the density used for mass flow: fixed value or external density input."
    },
    {
      "address": 2117,
      "count": 2,
      "name": "External density",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "External density value supplied to the device."
    },
    {
      "address": 2830,
      "count": 2,
      "name": "Fixed density",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Fixed density value used when the density source is the fixed value."
    },
    {
      "address": 5501,
      "count": 1,
      "name": "Installation direction",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Installation direction of the sensor: flow direction or reverse flow direction."
    },
    {
      "address": 2260,
      "count": 2,
      "name": "Integration time",
      "data_type": "Float32",
      "units": "ms",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Integration time of the measuring signal in milliseconds; the register table gives the range as 1 to 65 ms."
    },
    {
      "address": 2852,
      "count": 2,
      "name": "Measuring period",
      "data_type": "Float32",
      "units": "ms",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Measuring period of the device in milliseconds; the register table gives the range as 2 to 1000 ms."
    },
    {
      "address": 5519,
      "count": 2,
      "name": "Volume flow factor",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Factor for the volume-flow process-variable adjustment."
    },
    {
      "address": 5521,
      "count": 2,
      "name": "Volume flow offset",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Offset for the volume-flow process-variable adjustment."
    },
    {
      "address": 5523,
      "count": 2,
      "name": "Mass flow factor",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Factor for the mass-flow process-variable adjustment."
    },
    {
      "address": 5525,
      "count": 2,
      "name": "Mass flow offset",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Offset for the mass-flow process-variable adjustment."
    },
    {
      "address": 5527,
      "count": 2,
      "name": "Conductivity factor",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Factor for the conductivity process-variable adjustment."
    },
    {
      "address": 5529,
      "count": 2,
      "name": "Conductivity offset",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Offset for the conductivity process-variable adjustment."
    },
    {
      "address": 6817,
      "count": 1,
      "name": "Device reset",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Device reset command (restart the device or restore settings, depending on the written value)."
    },
    {
      "address": 6814,
      "count": 2,
      "name": "Simulation process variable value",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Value used for the process variable when simulation is active."
    },
    {
      "address": 6812,
      "count": 1,
      "name": "Device alarm simulation",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Switches the device alarm on/off for simulation."
    },
    {
      "address": 4259,
      "count": 1,
      "name": "Diagnostic event simulation",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Diagnostic event selected for simulation."
    },
    {
      "address": 4261,
      "count": 1,
      "name": "Diagnostic event category",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Category used for the diagnostic event simulation."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Endress+Hauser 'Proline Promag W 400 — Modbus RS485 — Operating Instructions' BA01231D/06/EN/04.19 (2019), section 9.3 'Modbus RS485 information' and section 10.4.3 'Configuring the communication interface', plus the matching 'Description of Device Parameters — Proline Promag 400 Modbus RS485' GP01045D/06/EN/02.21 (2022-02-01), chapter 6.3 'Register information' — every row above is a row of that table (parameter name and register number). The pair covers the Modbus RS485 variant of the Promag W 400, the water/wastewater version of the Promag 400 family. Factory frame from the OI parameter overview: bus address 247, baud rate 19200, RTU, parity even with 1 stop bit, byte order 1-0-3-2. Addressing: section 6.1.2 'Address model' puts the register numbers on the Modbus Application Protocol scale and adds a '3'/'4' prefix only for Modicon notation, so the printed numbers are stored unchanged with addressing = zero_based; its illustrative example still calls mass flow 2007/32007 (a leftover from an earlier revision) while the register table gives mass flow as 3876 to 3877, and the table is followed. Byte order 1-0-3-2 for FLOAT is CDAB (Byte 1, Byte 0, Byte 3, Byte 2): the low word sits at the lower address, the bytes inside each 16-bit word staying big-endian (the same option's INTEGER table sends Byte 1/Byte 0, MSB first) → byte_order BigEndian, word_order LowFirst. The OI says the device does not distinguish function codes 03 and 04, so the whole map is carried in the holding-register area. Deliberately omitted: the diagnostic-list timestamp strings (no register count printed), the web-server IP strings and the display-only rows. Conductivity and mass flow need the matching software option/hardware. The totalizer overflow rows are typed 'Integer with sign' by the parameter description but 'Float (4 byte)' by the register table; they are read as Int32 and the conflict is stated in each row."
}
