{
 "manufacturer": "ABB",
 "manufacturer_slug": "abb",
 "model": "ACQ580 water and wastewater drive (embedded Modbus RTU)",
 "model_slug": "acq580",
 "short_model": "ACQ580",
 "aliases": [
  "ACQ580-01",
  "ACQ580-04",
  "ACQ580-07",
  "ACQ580-31",
  "ACQ580-34",
  "ACQ580 pump control program"
 ],
 "applies_to": "ACQ580 drives running the ACQ580 pump control program, embedded fieldbus (EFB) Modbus RTU, addressing mode 0 (default); firmware manual 3AXD50000035867 Rev H.",
 "summary": "ABB's water and wastewater pump drive with a built-in RS-485 port that speaks Modbus RTU. The first six holding registers carry the control word, two references, status word and two actual values; every parameter is also a holding register derived from its group and index. This map covers the cyclic block, the error registers, key 01/04/05 monitoring parameters, the comm-loss settings and the main 32-bit actual values.",
 "firmware": "ACQ580 pump control program, manual revision H",
 "equipment_type": "Variable frequency drive",
 "transport": [
  "RTU"
 ],
 "defaults": {
  "unit_id": 1,
  "baud": 19200,
  "parity": "Even",
  "data_bits": 8,
  "stop_bits": 1,
  "tcp_port": null
 },
 "addressing": {
  "convention": "Modicon",
  "note": "The manual prints holding registers as 6-digit references and maps 400001-465536 onto the 65536-register address field, so 400001 = wire address 0 (its setup table also pairs the parameter range with addresses 100-65535). Masters limited to 5 digits can use 40001-49999 for 400001-409999; 32-bit parameter registers (420000+) need 6-digit or raw addressing. With 58.33 Addressing mode = Mode 0 (default) a 16-bit parameter gg.ii sits at 400000 + 100*gg + ii (e.g. 01.11 -> 400111, wire 110) and a 32-bit copy at 420000 + 200*gg + 2*ii (e.g. 01.07 -> 420214, wire 20213). Mode 1 uses 400000 + 256*gg + ii and Mode 2 uses 400000 + 512*gg + 2*ii; this map assumes Mode 0. All 32-bit registers are listed CDAB, which assumes 58.34 Word order = LO-HI, the default."
 },
 "default_word_order": "CDAB",
 "source": {
  "title": "ACQ580 pump control program firmware manual",
  "doc_number": "3AXD50000035867 Rev H",
  "revision_date": "2025-12-30",
  "url": "https://search.abb.com/library/Download.aspx?DocumentID=3AXD50000035867&LanguageCode=en&DocumentPartId=1&Action=Launch",
  "pages": "EFB setup pp. 239-240; control/status words pp. 246-251; start/stop p. 255; holding register table p. 258; error registers p. 265; parameters 01/04/05 pp. 301-309; group 58 pp. 515-522; Additional parameter data (FbEq32) pp. 607-609"
 },
 "notes": [
  "Registers 400001-400006 are the factory defaults of Data I/O 1-6 (58.101-58.106) and can be re-pointed; 400007-400014 are user-selectable via 58.107-58.114 and are not listed.",
  "Control and status word bits are shown for the ABB Drives profile (58.25 = 0, default). With the DCU profile (58.25 = 5) the words are passed through unconverted with a different bit layout (bit 0 STOP, bit 1 START, bit 2 REVERSE, bit 4 RESET...).",
  "Reference/actual registers are signed 16-bit; 20000 corresponds to the value of 46.01 Speed scaling or 46.02 Frequency scaling (46.03 torque, 46.04 power), so their engineering value depends on drive settings and is left unscaled here.",
  "32-bit registers use 58.34 Word order; the default LO-HI sends the low word first (CDAB). If 58.34 is set to HI-LO the order becomes ABCD. Within each register the high byte is sent first.",
  "16-bit parameter scaling is the manual's FbEq16 column (e.g. '10 = 1 V' -> scale 0.1); 32-bit scaling is the FbEq32 column in the Additional parameter data chapter. Parameters whose 16-bit scaling is 'See par. 46.xx' (01.01 speed, 01.06 frequency, 01.07 current, 01.10 torque, 01.14 power, 01.72-01.74 phase currents) are listed only in their 32-bit form.",
  "Left out: 06.xx control/status/inhibit words (bit lists not re-checked for this drive), 01.50-01.53 hour/day kWh logs, group 46 scaling parameters and configuration parameters other than the comm-loss settings.",
  "Coils (CW bits) and discrete inputs (SW bits, DI status) also exist but are omitted: the manual's wording on how their references map to wire addresses is ambiguous.",
  "If 96.78 Legacy Modbus mapping (ACS550/ACx550 compatibility) is enabled, the register layout changes and this map no longer applies.",
  "Unlike the ACS480/ACS580, the ACQ580 lists 01.66 Abs output power % motor nom as '10 = 1%' (0.1 % steps) in 16-bit form.",
  "58.16 Communication loss time is '1 = 1 s' in this manual, so it is listed in whole seconds.",
  "The EFB setup table shows 58.16 = 30.0 s as default, while the parameter list shows 10.0 s; both agree on 58.14 = No action and 58.15 = Cw / Ref1 / Ref2. Read them back from the drive."
 ],
 "registers": [
  {
   "table": "holding_register",
   "address": 0,
   "documented": "400001",
   "name": "Control word (EFB CW)",
   "description": "ABB Drives profile bits shown; DCU profile layout differs (58.25).",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": {
    "0": "OFF1_CONTROL: 1 = ready to operate, 0 = ramp stop (OFF1)",
    "1": "OFF2_CONTROL: 0 = emergency OFF, coast to stop",
    "2": "OFF3_CONTROL: 0 = emergency stop (OFF3 ramp)",
    "3": "INHIBIT_OPERATION: 1 = operation enabled (run), 0 = inhibit",
    "4": "RAMP_OUT_ZERO: 0 = force ramp output to zero",
    "5": "RAMP_HOLD: 0 = hold ramp",
    "6": "RAMP_IN_ZERO: 0 = force ramp input to zero",
    "7": "RESET: 0->1 = fault reset",
    "8": "Reserved",
    "9": "Reserved",
    "10": "REMOTE_CMD: 1 = fieldbus control (manual text truncated to 'Fieldbus control d.'); 0 = last CW/reference kept unless both are 0",
    "11": "EXT_CTRL_LOC: 1 = select EXT2, 0 = select EXT1",
    "12": "USER_0",
    "13": "USER_1",
    "14": "USER_2",
    "15": "USER_3"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 1,
   "documented": "400002",
   "name": "Reference 1 (EFB Ref1)",
   "description": "Signed; 20000 = value of 46.01/46.02 scaling, type per 58.26.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 2,
   "documented": "400003",
   "name": "Reference 2 (EFB Ref2)",
   "description": "Signed second reference; type and scaling per 58.27.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 3,
   "documented": "400004",
   "name": "Status word (EFB SW)",
   "description": "ABB Drives profile bits shown; DCU profile layout differs (58.25).",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "RDY_ON: ready to switch on",
    "1": "RDY_RUN: ready to operate (0 = OFF1 active)",
    "2": "RDY_REF: operation enabled",
    "3": "TRIPPED: fault",
    "4": "OFF_2_STATUS: 1 = OFF2 inactive",
    "5": "OFF_3_STATUS: 1 = OFF3 inactive",
    "6": "SWC_ON_INHIB: switch-on inhibited",
    "7": "ALARM: warning active",
    "8": "AT_SETPOINT: actual value at reference",
    "9": "REMOTE: 1 = remote (EXT1/EXT2), 0 = local",
    "10": "ABOVE_LIMIT: speed/frequency at or above supervision limit",
    "11": "USER_0",
    "12": "USER_1",
    "13": "USER_2",
    "14": "USER_3",
    "15": "Reserved"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4,
   "documented": "400005",
   "name": "Actual value 1 (EFB Act1)",
   "description": "Signed; 20000 = value of 46.01/46.02, type per 58.28.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 5,
   "documented": "400006",
   "name": "Actual value 2 (EFB Act2)",
   "description": "Signed second actual value; type per 58.29 (default transparent).",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 89,
   "documented": "400090",
   "name": "Reset error registers",
   "description": "Write 1 to clear error registers 400091-400095.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Do nothing",
    "1": "Reset"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 90,
   "documented": "400091",
   "name": "Error function code",
   "description": "Function code of the last failed query.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 91,
   "documented": "400092",
   "name": "Error code",
   "description": "Detail code when exception 04h was returned.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "No error",
    "2": "Low/High limit exceeded",
    "3": "Faulty index (array parameter)",
    "5": "Incorrect data type",
    "101": "General error (65h)"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 92,
   "documented": "400093",
   "name": "Failed register",
   "description": "Last register that failed to read or write.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 93,
   "documented": "400094",
   "name": "Last register written successfully",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 94,
   "documented": "400095",
   "name": "Last register read successfully",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 102,
   "documented": "400103",
   "name": "01.03 Motor speed %",
   "description": "Motor speed in percent of synchronous speed.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 107,
   "documented": "400108",
   "name": "01.08 Motor current % of motor nom",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 108,
   "documented": "400109",
   "name": "01.09 Motor current % of drive nom",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 110,
   "documented": "400111",
   "name": "01.11 DC voltage",
   "description": "Measured DC link voltage.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 112,
   "documented": "400113",
   "name": "01.13 Output voltage",
   "description": "Calculated motor voltage (AC).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 114,
   "documented": "400115",
   "name": "01.15 Output power % of motor nom",
   "description": "",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 117,
   "documented": "400118",
   "name": "01.18 Inverter GWh counter",
   "description": "Whole GWh through the drive; combine with 01.19 and 01.20.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "GWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 118,
   "documented": "400119",
   "name": "01.19 Inverter MWh counter",
   "description": "Whole MWh, rolls over into 01.18.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "MWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 119,
   "documented": "400120",
   "name": "01.20 Inverter kWh counter",
   "description": "kWh part (0-1000), rolls over into 01.19.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 123,
   "documented": "400124",
   "name": "01.24 Flux actual %",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 161,
   "documented": "400162",
   "name": "01.62 Abs motor speed %",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 164,
   "documented": "400165",
   "name": "01.65 Abs output power",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 165,
   "documented": "400166",
   "name": "01.66 Abs output power % motor nom",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 400,
   "documented": "400401",
   "name": "04.01 Tripping fault",
   "description": "Hex code of the fault that caused the trip; 0 = none.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 401,
   "documented": "400402",
   "name": "04.02 Active fault 2",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 402,
   "documented": "400403",
   "name": "04.03 Active fault 3",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 405,
   "documented": "400406",
   "name": "04.06 Active warning 1",
   "description": "Hex code of the first active warning.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 406,
   "documented": "400407",
   "name": "04.07 Active warning 2",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 407,
   "documented": "400408",
   "name": "04.08 Active warning 3",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 410,
   "documented": "400411",
   "name": "04.11 Latest fault",
   "description": "Most recent stored (non-active) fault code.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 411,
   "documented": "400412",
   "name": "04.12 2nd latest fault",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 412,
   "documented": "400413",
   "name": "04.13 3rd latest fault",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 415,
   "documented": "400416",
   "name": "04.16 Latest warning",
   "description": "Most recent stored warning code.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 500,
   "documented": "400501",
   "name": "05.01 On-time counter",
   "description": "Days the drive has been powered.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "days",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 501,
   "documented": "400502",
   "name": "05.02 Run-time counter",
   "description": "Days the inverter has been modulating.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "days",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 503,
   "documented": "400504",
   "name": "05.04 Fan on-time counter",
   "description": "Cooling fan running time.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "days",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 510,
   "documented": "400511",
   "name": "05.11 Inverter temperature",
   "description": "Drive temperature as percent of fault limit.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 5813,
   "documented": "405814",
   "name": "58.14 Communication loss action",
   "description": "Reaction to EFB communication loss.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "No action",
    "1": "Fault",
    "2": "Last speed",
    "3": "Speed ref safe",
    "4": "Fault always",
    "5": "Warning"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 5814,
   "documented": "405815",
   "name": "58.15 Communication loss mode",
   "description": "Which messages reset the comm-loss timer (default Cw / Ref1 / Ref2).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "1": "Any message",
    "2": "Cw / Ref1 / Ref2"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 5815,
   "documented": "405816",
   "name": "58.16 Communication loss time",
   "description": "EFB comm-loss timeout, whole seconds (0-6000 s).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20201,
   "documented": "420202",
   "name": "01.01 Motor speed used (32-bit)",
   "description": "Estimated motor speed; CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.01,
   "units": "rpm",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20211,
   "documented": "420212",
   "name": "01.06 Output frequency (32-bit)",
   "description": "Estimated output frequency; CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.01,
   "units": "Hz",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20213,
   "documented": "420214",
   "name": "01.07 Motor current (32-bit)",
   "description": "Measured motor current; CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.01,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20219,
   "documented": "420220",
   "name": "01.10 Motor torque (32-bit)",
   "description": "Percent of nominal motor torque; CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20221,
   "documented": "420222",
   "name": "01.11 DC voltage (32-bit)",
   "description": "CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.01,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20227,
   "documented": "420228",
   "name": "01.14 Output power (32-bit)",
   "description": "Unit follows 96.16 Unit selection (kW or hp); CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.01,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20307,
   "documented": "420308",
   "name": "01.54 Cumulative inverter energy (32-bit)",
   "description": "Signed total energy through the drive; CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "INT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "kWh",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20343,
   "documented": "420344",
   "name": "01.72 U-phase RMS current (32-bit)",
   "description": "CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.01,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20345,
   "documented": "420346",
   "name": "01.73 V-phase RMS current (32-bit)",
   "description": "CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.01,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20347,
   "documented": "420348",
   "name": "01.74 W-phase RMS current (32-bit)",
   "description": "CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.01,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 21005,
   "documented": "421006",
   "name": "05.03 Hours run (32-bit)",
   "description": "Motor run time in hours; CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.1,
   "units": "h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  }
 ],
 "integration": {
  "summary": "Enable Modbus RTU in group 58, point the start/stop and reference sources at the embedded fieldbus, then write the ABB Drives control word and Reference 1 at 400001/400002 and poll the status word and actual values at 400004-400006. Read further monitoring values straight from their parameter registers (400000 + 100*group + index).",
  "minimum_registers": [
   {
    "table": "holding_register",
    "address": 0,
    "why": "Control word: start/stop/reset"
   },
   {
    "table": "holding_register",
    "address": 1,
    "why": "Reference 1 (speed/frequency setpoint, 20000 = 46.01/46.02)"
   },
   {
    "table": "holding_register",
    "address": 3,
    "why": "Status word: ready/running/fault/remote"
   },
   {
    "table": "holding_register",
    "address": 4,
    "why": "Actual value 1 (speed/frequency feedback)"
   },
   {
    "table": "holding_register",
    "address": 110,
    "why": "01.11 DC voltage"
   },
   {
    "table": "holding_register",
    "address": 400,
    "why": "04.01 Tripping fault code"
   },
   {
    "table": "holding_register",
    "address": 20211,
    "why": "01.06 Output frequency, 0.01 Hz (32-bit)"
   },
   {
    "table": "holding_register",
    "address": 20213,
    "why": "01.07 Motor current, 0.01 A (32-bit)"
   }
  ],
  "enable": "Set 58.01 Protocol enable = Modbus RTU, then 58.03 node address, 58.04 baud and 58.05 parity, and apply them with 58.06 Communication control = Refresh settings (or power-cycle). For control set 20.01 Ext1 commands (and 20.06 for EXT2) = Embedded fieldbus and the reference source, e.g. 22.11 Ext1 speed ref1 or 28.11 Ext1 frequency ref1 = EFB ref1. Every start/stop control-word value in the manual sets bit 10 (REMOTE_CMD); the manual's own description of that bit is truncated. Save parameter writes permanently with 96.07 Parameter save manually.",
  "watchdog": "58.14 Communication loss action (No action by default / Fault / Last speed / Speed ref safe / Fault always / Warning) with 58.16 Communication loss time (0-6000 s) and 58.15 Communication loss mode (default: only control word/reference writes reset the timer). A loss trips 6681 EFB comm loss or warns A7CE; 'Speed ref safe' runs at 22.41/28.41. There is a 30 s boot-up delay before monitoring starts.",
  "quirks": [
   "Addresses are 6-digit Modicon references: 400001 = wire 0. 32-bit parameter registers start at 420000 and cannot be reached with 5-digit (4xxxx) addressing.",
   "32-bit values in this map are listed CDAB, which assumes 58.34 Word order = LO-HI (the default: low word first). If 58.34 is set to HI-LO, read them as ABCD.",
   "References and actual values are signed 16-bit with 20000 = the 46.01/46.02 scaling value, not engineering units.",
   "Only the lower 16 bits of the drive's 32-bit control/status words are visible at 400001/400004.",
   "Start (manual's sequence): write 0x0476 (1142); once status bit 0 (RDY_ON) is 1, write 0x047E (1150) and then 0x047F (1151) to run. Stop: 0x0477 (1143) stops per 21.03 Stop mode; 0x047E (1150) OFF1 ramp stop; 0x047D (1149) OFF2 coast; 0x047B (1147) OFF3 emergency ramp. Fault reset: rising edge of control-word bit 7."
  ],
  "setup": [
   "Wire the RS-485 link per the drive's hardware manual; the control unit has switches for bus termination and bias resistors.",
   "Defaults: node 1, 19.2 kbit/s, 8 data bits, even parity, 1 stop bit (58.03-58.05); baud can also be set to Autodetect.",
   "Changes to group 58 take effect only after 58.06 = Refresh settings or a control-unit reboot.",
   "58.07 Communication diagnostics flags init/address errors, parity and baud errors, no bus activity, noise/addressing errors and comm loss; 58.08-58.12 count packets and errors."
  ],
  "gotchas": [
   "If a start command is ignored, check 06.18 Start inhibit status word on the panel (for example a missing run permissive or STO).",
   "Pump-program features (sleep, PID, multipump) can stop or start the pump on their own; check the active control mode before blaming the bus.",
   "If legacy (ACx550) Modbus mapping is enabled the register layout changes and this map no longer applies.",
   "Exception 04h means the request was rejected by the drive; read 400092 Error code for the reason (e.g. limit exceeded)."
  ]
 },
 "page": "https://easymodbus.com/modbus-register-maps/abb/acq580",
 "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."
}
