{
 "manufacturer": "Grundfos",
 "manufacturer_slug": "grundfos",
 "model": "SMART Digital DDA dosing pump (SoftCIM, CIM 200 / CIM 500)",
 "model_slug": "smart-digital-dda",
 "short_model": "DDA dosing pump",
 "aliases": [
  "DDA",
  "DDA S",
  "DDA XL",
  "DDA-C",
  "DDA model C",
  "SMART Digital S",
  "SMART Digital XL",
  "CIM 200",
  "CIM 500",
  "98473491"
 ],
 "equipment_type": "Pump (chemical dosing pump)",
 "applies_to": "Grundfos SMART Digital DDA dosing pumps: DDA model C with built-in SoftCIM Modbus RTU/TCP, and DDA XL (or others) through a CIM 200 Modbus RTU or CIM 500 Modbus TCP module in a CIU 900, per functional profile 98473491 (09.2026).",
 "summary": "Grundfos DDA diaphragm dosing pumps expose one Modbus register map whether they talk through the built-in SoftCIM ports (DDA model C) or a CIM module in a CIU 900. Control registers start/stop the pump, pick the operating mode and write setpoints such as the manual dosing rate and batch volume; status and measurement registers report the actual mode, fault and warning codes, dosing capacity, backpressure, total volume and tank level. 32-bit values are split into HI/LO register pairs.",
 "transport": [
  "RTU",
  "TCP"
 ],
 "defaults": {
  "unit_id": null,
  "baud": 19200,
  "parity": "Even",
  "data_bits": 8,
  "stop_bits": 1,
  "tcp_port": 502
 },
 "addressing": {
  "convention": "1-based",
  "note": "Registers are printed as 5-digit numbers from 00001. The profile says register X is sent as X-1 in the telegram (its example: 00115 SetOutputRelays goes out as 00114), so 00101 is wire address 100."
 },
 "default_word_order": "ABCD",
 "firmware": null,
 "source": {
  "title": "Modbus for Smart Digital Dosing - SoftCIM Modbus RTU, SoftCIM Modbus TCP, CIM 200 Modbus RTU, CIM 500 Ethernet for Modbus TCP - Functional profile",
  "doc_number": "98473491 (ECM 1462084)",
  "revision_date": "2026-09",
  "url": "https://api.grundfos.com/literature/Grundfosliterature-6012959.pdf",
  "pages": "pp. 7-10 (specs, CIM 200 switches), p. 13 (function codes, X-1 rule), pp. 14-27 (register blocks, bit and enum meanings, alarm codes), pp. 28-30 (commissioning, watchdog), pp. 31-32 (32-bit HI/LO rule)"
 },
 "notes": [
  "Every block can be read with function 03 or 04 (same data); this map lists them as holding registers. Coils are not supported.",
  "32-bit values are register pairs named ...HI at the lower address and ...LO at the next. The profile's own troubleshooting sections (10.1.5 and 10.2, pp. 31-32) give the rule value = HI x 65536 + LO, so the high word comes first (ABCD).",
  "The profile says counters and scaled values are unsigned integers unless stated otherwise; no register here is marked signed.",
  "Left out: RTC set/read registers 00117-00122 and 00220-00225 (one BCD byte per register, no matching data type here); WarningBits 00219 (the profile lists 'Byte 1' and 'Byte 2' without saying which is the low byte); DosingPressureMax 00301 (scale column just says 'Bar'); PulseInputFrequency 00309 (unit printed as 'Hz/min'); RunTime 00321-00322 (no unit) and OperatingHours 00323-00324 (named hours but scaled in seconds); PropDosingTargetConcentration 00336-00337 (its LO register carries the wrong name); tank low-limit and process-flow sensor settings 00340-00346; alarm simulation block 00701 onward; GENIbus counters 00021-00028.",
  "FaultCode and WarningCode hold one event code each; only one alarm can be shown at a time. Event codes 210, 211, 35, 208, 36, 37, 17 and 169 need FlowControl enabled.",
  "Not every setting exists on every pump: for example Timer mode is DDA XL only, while HMI batch, proportional dosing, minimum-pressure monitoring and max. capacity are DDA model C only (see the overview table on pp. 20-21).",
  "The defaults above are the CIM 200's (19200 baud, even parity, 1 stop bit). The built-in SoftCIM Modbus RTU port on DDA model C defaults to 9600 baud; its parity and stop bits are set in the pump HMI or GO app."
 ],
 "registers": [
  {
   "table": "holding_register",
   "address": 0,
   "documented": "00001",
   "name": "SlaveMinimumReplyDelay",
   "description": "Extra reply delay 0-10000 ms; CIM 200 only.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "ms",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 2,
   "documented": "00003",
   "name": "SoftwareDefinedModbusAddr",
   "description": "Slave address for SoftCIM Modbus RTU on DDA model C.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 3,
   "documented": "00004",
   "name": "SoftwareDefinedBitRate",
   "description": "Used when SW4/SW5 select software-defined (CIM 200) or by SoftCIM RTU.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "1200",
    "1": "2400",
    "2": "4800",
    "3": "9600",
    "4": "19200",
    "5": "38400"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4,
   "documented": "00005",
   "name": "AutoAckControlBits",
   "description": "1 = rising-edge control bits are cleared automatically once accepted.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Disabled",
    "1": "Enabled"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 8,
   "documented": "00009",
   "name": "SoftwareDefinedParity",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "None",
    "1": "Even",
    "2": "Odd"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 9,
   "documented": "00010",
   "name": "SoftwareDefinedStopBit",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "No stop bit",
    "1": "1 stop bit",
    "2": "2 stop bits"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 22,
   "documented": "00023",
   "name": "VersionNumber",
   "description": "CIM / SoftCIM software version.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23,
   "documented": "00024",
   "name": "ActualModbusAddress",
   "description": "Slave address in use, 1-247.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 29,
   "documented": "00030",
   "name": "UnitFamily",
   "description": "30 = Smart Digital dosing DDA.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "30": "Smart Digital dosing DDA"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 30,
   "documented": "00031",
   "name": "UnitType",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "1": "DDA S",
    "3": "DDA XL",
    "4": "DDA-C"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 31,
   "documented": "00032",
   "name": "UnitVersion",
   "description": "Grundfos product version number.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 100,
   "documented": "00101",
   "name": "Mode/state settings",
   "description": "Control bits; bit 0 must be 1 for Modbus control.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": {
    "0": "RemoteAccessReq: 1 = control from Modbus",
    "1": "De-aerating (100 %): 1 = start de-aeration",
    "2": "AnalogMode: 0 = 0-20 mA, 1 = 4-20 mA",
    "3": "TimerMode: 0 = cycle timer, 1 = week timer",
    "4": "SlowMode: 1 = enabled",
    "5": "Velocity: 0 = SlowMode 50 %, 1 = SlowMode 25 %"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 101,
   "documented": "00102",
   "name": "Enable/disable functions",
   "description": "",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": {
    "0": "AutoDeaeratingEnable",
    "1": "FlowControlEnable",
    "2": "ModbusWatchdogEnable",
    "3": "AutoFlowAdaptEnable (needs FlowControl)",
    "4": "PulseMemoryEnable"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 102,
   "documented": "00103",
   "name": "Action commands",
   "description": "Rising-edge commands; acknowledged in 00203.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": {
    "0": "ResetFault",
    "1": "Pulse (same as an external pulse)",
    "2": "ResetVolumeCounter (trip counter)",
    "3": "SetRTC (load clock from 00117-00122)"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 103,
   "documented": "00104",
   "name": "ReqStartStop",
   "description": "Remote start/stop request.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "ReqStart",
    "1": "ReqStop"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 104,
   "documented": "00105",
   "name": "OperatingMode",
   "description": "Requested dosing mode.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Manual",
    "1": "Pulse",
    "2": "Analog",
    "3": "Timer",
    "4": "Batch",
    "5": "HMI batch",
    "7": "Proportional dosing, pulse flow sensor",
    "8": "Proportional dosing, 0-20 mA flow sensor",
    "9": "Proportional dosing, 4-20 mA flow sensor"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 105,
   "documented": "00106-00107",
   "name": "SetSetpointManual",
   "description": "Dosing setpoint for Manual mode.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "ml/h",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 107,
   "documented": "00108-00109",
   "name": "SetPulseVolume",
   "description": "Volume dosed per pulse in Pulse mode.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "nl",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 109,
   "documented": "00110-00111",
   "name": "SetBatchDosingVolume",
   "description": "Batch volume for Batch mode.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.001,
   "units": "ml",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 111,
   "documented": "00112-00113",
   "name": "SetBatchDosingTime",
   "description": "Batch dosing time for Batch mode.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 113,
   "documented": "00114",
   "name": "SetPressureMax",
   "description": "Pressure alarm limit.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "bar",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 114,
   "documented": "00115",
   "name": "SetOutputRelays",
   "description": "Relays must be set to Bus control in the pump first.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": {
    "0": "Relay 1: 1 = active",
    "1": "Relay 2: 1 = active"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 115,
   "documented": "00116",
   "name": "SetAnalogOutput",
   "description": "Analog output value when the output is set to Bus control.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.001,
   "units": "mA",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 122,
   "documented": "00123-00124",
   "name": "SetTargetConcentration",
   "description": "Target chemical concentration for proportional dosing.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "ppm",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 200,
   "documented": "00201",
   "name": "Actual mode/state settings",
   "description": "Read-back of 00101.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "ActRemoteAccess: 1 = pump is under Modbus control",
    "1": "ActDeaerating",
    "2": "ActAnalogMode: 0 = 0-20 mA, 1 = 4-20 mA",
    "3": "ActTimerMode: 0 = cycle, 1 = week",
    "4": "ActSlowMode",
    "5": "ActVelocity: 0 = 50 %, 1 = 25 %"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 201,
   "documented": "00202",
   "name": "Actual enable/disable functions",
   "description": "Read-back of 00102.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "ActAutoDeaeratingEnable",
    "1": "ActFlowControlEnable",
    "2": "ActModbusWatchdogEnable",
    "3": "ActAutoFlowAdaptEnable",
    "4": "ActPulseMemoryEnable"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 202,
   "documented": "00203",
   "name": "Action command acknowledgements",
   "description": "Set when a 00103 command is executed; cleared when its bit is cleared.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "ResetFaultAck",
    "1": "PulseAck",
    "2": "ResetVolumeCounterAck",
    "3": "SetRTCAck"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 203,
   "documented": "00204",
   "name": "Miscellaneous status",
   "description": "",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Dosing (running)",
    "1": "Warning",
    "2": "Fault (pump stopped)",
    "3": "BusControlLocallyEnabled"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 204,
   "documented": "00205",
   "name": "ActualStartStop",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "Started",
    "1": "Stopped",
    "2": "Calibrating",
    "3": "Service"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 205,
   "documented": "00206",
   "name": "ActualOperatingMode",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "Manual",
    "1": "Pulse",
    "2": "Analog",
    "3": "Timer",
    "4": "Batch",
    "5": "HMI batch",
    "7": "Proportional dosing, pulse flow sensor",
    "8": "Proportional dosing, 0-20 mA flow sensor",
    "9": "Proportional dosing, 4-20 mA flow sensor"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 206,
   "documented": "00207-00208",
   "name": "ActualSetpointManual",
   "description": "Manual-mode setpoint in use.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "ml/h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 208,
   "documented": "00209-00210",
   "name": "ActualPulseVolume",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "nl",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 210,
   "documented": "00211-00212",
   "name": "ActualBatchDosingVolume",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.001,
   "units": "ml",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 212,
   "documented": "00213-00214",
   "name": "ActualBatchDosingTime",
   "description": "",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "s",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 214,
   "documented": "00215",
   "name": "ActualPressureMax",
   "description": "Pressure alarm limit in use.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "bar",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 215,
   "documented": "00216",
   "name": "ControlSourceStates",
   "description": "Which stop sources are active (1 = active).",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Stop from pump HMI or GO app",
    "1": "External stop",
    "2": "Stop from bus"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 216,
   "documented": "00217",
   "name": "FaultCode",
   "description": "Event code of the active alarm.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "210": "Max. pressure limit exceeded (alarm)",
    "211": "Backpressure too low (alarm or warning)",
    "35": "Gas in pump head / de-aerating problem (warning)",
    "208": "Cavitation (warning)",
    "36": "Discharge valve leakage (warning)",
    "37": "Suction valve leakage (warning)",
    "12": "Service now (warning)",
    "33": "Service soon (warning)",
    "17": "Flow deviation (warning)",
    "51": "Blocked motor or pump (alarm)",
    "206": "Low level in tank (warning)",
    "57": "Empty tank / dry running (alarm)",
    "169": "FlowControl cable breakdown (warning)",
    "15": "Modbus communication fault, main network (alarm)",
    "159": "CIU / GENIbus communication fault (alarm)",
    "64": "Motor head overheated (alarm)",
    "157": "Real-time clock out of order / battery low (warning)",
    "165": "Analog input above 21 mA (alarm)",
    "97": "Analog input below 2 mA (alarm)",
    "247": "Pump powered on (alarm)"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 217,
   "documented": "00218",
   "name": "WarningCode",
   "description": "Event code of the first active warning.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "210": "Max. pressure limit exceeded (alarm)",
    "211": "Backpressure too low (alarm or warning)",
    "35": "Gas in pump head / de-aerating problem (warning)",
    "208": "Cavitation (warning)",
    "36": "Discharge valve leakage (warning)",
    "37": "Suction valve leakage (warning)",
    "12": "Service now (warning)",
    "33": "Service soon (warning)",
    "17": "Flow deviation (warning)",
    "51": "Blocked motor or pump (alarm)",
    "206": "Low level in tank (warning)",
    "57": "Empty tank / dry running (alarm)",
    "169": "FlowControl cable breakdown (warning)",
    "15": "Modbus communication fault, main network (alarm)",
    "159": "CIU / GENIbus communication fault (alarm)",
    "64": "Motor head overheated (alarm)",
    "157": "Real-time clock out of order / battery low (warning)",
    "165": "Analog input above 21 mA (alarm)",
    "97": "Analog input below 2 mA (alarm)",
    "247": "Pump powered on (alarm)"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 225,
   "documented": "00226",
   "name": "TankLevelMonitoring",
   "description": "How the feed-tank level is monitored.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "Float switch",
    "1": "Calculated (sensor-less)",
    "2": "Analog sensor"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 301,
   "documented": "00302-00303",
   "name": "DosingCapacityMax",
   "description": "Factory maximum dosing capacity of this pump.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "ml/h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 303,
   "documented": "00304-00305",
   "name": "DosingCapacityReference",
   "description": "Capacity setpoint shown on the display.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "ml/h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 305,
   "documented": "00306-00307",
   "name": "MeasuredDosingCapacity",
   "description": "Needs FlowControl enabled (00102 bit 1).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "ml/h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 307,
   "documented": "00308",
   "name": "MeasuredPressure",
   "description": "Backpressure; needs FlowControl enabled.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "bar",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 309,
   "documented": "00310-00311",
   "name": "RemainingDosingVolume",
   "description": "Volume still to dose in Batch mode.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.001,
   "units": "ml",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 311,
   "documented": "00312-00313",
   "name": "VolumeTotal",
   "description": "Total dosed volume, not resettable.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.001,
   "units": "l",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 313,
   "documented": "00314-00315",
   "name": "VolumeTripCounter",
   "description": "Resettable with 00103 bit 2.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.001,
   "units": "l",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 315,
   "documented": "00316",
   "name": "AnalogInput",
   "description": "0/4-20 mA input signal.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.001,
   "units": "mA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 316,
   "documented": "00317",
   "name": "AnalogOutput",
   "description": "Present analog output signal.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.001,
   "units": "mA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 317,
   "documented": "00318",
   "name": "DigitalInputs",
   "description": "1 = input active (NO/NC set in the pump).",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Low-level signal",
    "1": "Empty signal",
    "2": "External stop"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 318,
   "documented": "00319",
   "name": "OutputRelays",
   "description": "1 = output active.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Relay 1",
    "1": "Relay 2",
    "2": "Auto de-aerating valve open"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 319,
   "documented": "00320",
   "name": "NumberOfPowerOns",
   "description": "Power-up counter, not resettable.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 324,
   "documented": "00325-00326",
   "name": "StrokeCounter",
   "description": "Number of strokes, not resettable.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 326,
   "documented": "00327-00328",
   "name": "TimeToNextDosing",
   "description": "Timer mode only.",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 1,
   "units": "s",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 328,
   "documented": "00329-00330",
   "name": "TankVolume",
   "description": "Feed tank volume (tank monitoring without sensor).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "l",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 330,
   "documented": "00331-00332",
   "name": "TankVolumeRemaining",
   "description": "Chemical left in the feed tank (without sensor).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "l",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 332,
   "documented": "00333",
   "name": "TankLevelRemainingPct",
   "description": "Feed tank level (tank monitoring with sensor).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 333,
   "documented": "00334-00335",
   "name": "PropDosingProcessFlow",
   "description": "Measured process flow (proportional dosing).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "l/h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 337,
   "documented": "00338-00339",
   "name": "PropDosingActualConcentration",
   "description": "Actual concentration (proportional dosing).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "ABCD",
   "scale": 0.1,
   "units": "ppm",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  }
 ],
 "integration": {
  "summary": "Turn on Bus/Cloud control in the pump (HMI or Grundfos GO), then write 00101 bit 0 = 1 (RemoteAccessReq), choose the mode in 00105, write the setpoint (e.g. 00106-00107 in 0.1 ml/h) and send 00104 = 0 to start. Watch 00201 bit 0 to confirm remote control and poll 00204/00217/00218 for running, fault and warning.",
  "minimum_registers": [
   {
    "table": "holding_register",
    "address": 100,
    "why": "Remote access request bit"
   },
   {
    "table": "holding_register",
    "address": 103,
    "why": "Start/stop request"
   },
   {
    "table": "holding_register",
    "address": 104,
    "why": "Operating mode"
   },
   {
    "table": "holding_register",
    "address": 105,
    "why": "Manual dosing setpoint"
   },
   {
    "table": "holding_register",
    "address": 200,
    "why": "Remote access confirmed"
   },
   {
    "table": "holding_register",
    "address": 203,
    "why": "Running / warning / fault bits"
   },
   {
    "table": "holding_register",
    "address": 216,
    "why": "Fault code"
   },
   {
    "table": "holding_register",
    "address": 217,
    "why": "Warning code"
   },
   {
    "table": "holding_register",
    "address": 305,
    "why": "Measured dosing capacity"
   },
   {
    "table": "holding_register",
    "address": 311,
    "why": "Total dosed volume"
   }
  ],
  "enable": "In the pump HMI or the Grundfos GO app set Settings > Communication > Bus/Cloud control = On. Then set 00101 bit 0 (RemoteAccessReq) = 1; without it all control bits are ignored. Relays and the analog output answer Modbus only when their function is set to Bus control in the pump.",
  "watchdog": "A fixed 10 s communication watchdog is switched on the first time Bus/Cloud control is enabled; it can be turned off or on with 00102 bit 2 (persistent). If Modbus traffic stops for more than 10 s the pump stops dosing and raises alarm 15; it resumes when communication returns.",
  "quirks": [
   "Register numbers are 1-based: 00101 goes out as address 100.",
   "Commands in 00103 act on a rising edge; with AutoAckControlBits (00005) = 0 you must write the bit back to 0 before the next command.",
   "ReqStop cannot stop the pump while it is de-aerating."
  ],
  "setup": [
   "DDA model C (SoftCIM RTU): in Grundfos GO, Settings > Communication > RS485 AYB: protocol Modbus RTU, address 1-247, 9600/19200/38400 baud, parity and stop bits; the M12 port needs a termination plug at the line end.",
   "DDA model C (SoftCIM TCP): Settings > Communication > Ethernet RJ45: Ethernet On, protocol Modbus TCP, DHCP or static IP, TCP port (default 502).",
   "CIM 200: the slave address is set in the pump menu (its hex rotary switches are not used with DDA). SW4/SW5 select 9600 (OFF/ON), 19200 (OFF/OFF, default), 38400 (ON/OFF) or software-defined (ON/ON); SW3 OFF = even parity 1 stop, ON = no parity 2 stop; SW1+SW2 ON = 150 ohm termination in.",
   "CIM 500: set the rotary switch to Modbus TCP and set the IP in its web server (default 192.168.1.100, user admin); the Modbus TCP IP must differ from the web server IP."
  ],
  "gotchas": [
   "If Bus/Cloud control is not enabled in the pump, 00201 bit 0 stays 0 and no write takes effect.",
   "With Bus/Cloud control on, settings can no longer be changed from the pump HMI or GO app.",
   "Measured capacity and pressure read nothing useful unless FlowControl (00102 bit 1) is enabled."
  ]
 },
 "page": "https://easymodbus.com/modbus-register-maps/grundfos/smart-digital-dda",
 "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."
}
