{
 "manufacturer": "ABB",
 "manufacturer_slug": "abb",
 "model": "ACH580 HVAC drive (embedded Modbus RTU)",
 "model_slug": "ach580",
 "short_model": "ACH580",
 "aliases": [
  "ACH580-01",
  "ACH580-07",
  "ACH580-31",
  "ACH580-34",
  "ACH580 HVAC control program"
 ],
 "applies_to": "ACH580 drives running the ACH580 HVAC control program, embedded fieldbus (EFB) set to Modbus RTU, addressing mode 0 (default).",
 "summary": "ABB's HVAC variable frequency 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 drive parameter is also readable as a holding register derived from its group and index. This map covers the cyclic control block, error registers, key 01/04/05/06 monitoring parameters with fixed scaling, the comm-loss settings and the main 32-bit actual values.",
 "firmware": "ACH580 HVAC control program, manual revision J",
 "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": "ACH580 HVAC control program firmware manual",
  "doc_number": "3AXD50000027537 Rev J",
  "revision_date": "2026-02-23",
  "url": "https://search.abb.com/library/Download.aspx?DocumentID=3AXD50000027537&LanguageCode=en&DocumentPartId=1&Action=Launch",
  "pages": "Modbus RTU EFB chapter pp. 285-313 (register table p. 306, control/status words pp. 294-300, start/stop sequence p. 303, error registers p. 313); parameters pp. 397-412 and 618-623 (group 58); 32-bit scaling (Additional parameter data) pp. 715-718"
 },
 "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). 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, which has a fixed FbEq32 scaling.",
  "Left out: 01.50-01.53 hour/day kWh logs and 05.03 in 16-bit form (ranges exceed 16 bits), 05.20-05.22 diagnostic words (bit lists not fully captured), group 46 scaling parameters and all 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 1-based references map to wire addresses is ambiguous.",
  "ACH580 has no jogging: control-word bits 8-9 are reserved (unlike the ACS580).",
  "01.66 16-bit scaling is 10 = 1% in the ACH580 manual (the ACS580 manual lists 1 = 1%)."
 ],
 "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": 600,
   "documented": "400601",
   "name": "06.01 Main control word",
   "description": "Drive-internal control word actually in use.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Off1 control",
    "1": "Off2 control",
    "2": "Off3 control",
    "3": "Run",
    "4": "Ramp out zero",
    "5": "Ramp hold",
    "6": "Ramp in zero",
    "7": "Reset",
    "8": "Reserved",
    "9": "Reserved",
    "10": "Remote cmd",
    "11": "Ext ctrl loc",
    "12": "User bit 0",
    "13": "User bit 1",
    "14": "User bit 2",
    "15": "User bit 3"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 610,
   "documented": "400611",
   "name": "06.11 Main status word",
   "description": "Bits 10-14 can be re-assigned with 06.29-06.33.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Ready to switch ON",
    "1": "Ready run",
    "2": "Ready ref",
    "3": "Tripped",
    "4": "Off 2 inactive",
    "5": "Off 3 inactive",
    "6": "Switch-on inhibited",
    "7": "Warning",
    "8": "At setpoint",
    "9": "Remote",
    "10": "Above limit (default; selectable with 06.29)",
    "11": "User bit 0 (selectable with 06.30)",
    "12": "User bit 1 (selectable with 06.31)",
    "13": "User bit 2 (selectable with 06.32)",
    "14": "User bit 3 (selectable with 06.33)",
    "15": "Reserved"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 615,
   "documented": "400616",
   "name": "06.16 Drive status word 1",
   "description": "",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Enabled",
    "1": "Inhibited (start inhibited)",
    "2": "DC charged",
    "3": "Ready to start",
    "4": "Following reference",
    "5": "Started",
    "6": "Modulating",
    "7": "Limiting",
    "8": "Local control",
    "9": "Network control",
    "10": "Ext1 active",
    "11": "Ext2 active",
    "12": "Reserved",
    "13": "Start request",
    "14": "Running",
    "15": "Reserved"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 616,
   "documented": "400617",
   "name": "06.17 Drive status word 2",
   "description": "",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Identification run done",
    "1": "Magnetized",
    "2": "Reserved",
    "3": "Speed control",
    "4": "Reserved",
    "5": "Safe reference active",
    "6": "Last speed active",
    "7": "Reserved",
    "8": "Emergency stop failed",
    "9": "Reserved",
    "10": "Above limit",
    "13": "Start delay active"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 617,
   "documented": "400618",
   "name": "06.18 Start inhibit status word",
   "description": "Shows why a start is being refused.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Not ready run",
    "1": "Ctrl location changed",
    "2": "SSW inhibit",
    "3": "Fault reset",
    "4": "Start interlocked",
    "5": "Run permissive missing",
    "6": "Reserved",
    "7": "STO active",
    "8": "Current calibration ended",
    "9": "ID run ended",
    "10": "Reserved",
    "11": "Em Off1",
    "12": "Em Off2",
    "13": "Em Off3",
    "14": "Auto reset inhibit",
    "15": "Reserved"
   },
   "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.",
   "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 (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 (default No action; options No action / Fault / Last speed / Speed ref safe / Fault always / Warning) with 58.16 Communication loss time (0-6000 s, default 30.0 s) and 58.15 Communication loss mode (any message, or only control word/reference writes, resets 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) to 400001; once status bit 0 (RDY_ON) is 1, write 0x047E (1150, ready/stopped) 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": [
   "RS-485 connection per the hardware manual; termination on at both bus ends and bias on at one device, using the drive's TERM/BIAS switches.",
   "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 wiring (A/B swap), parity, baud and addressing errors; 58.08-58.12 count packets and errors."
  ],
  "gotchas": [
   "If a start command is ignored, read 06.18 Start inhibit status word (for example a missing run enable/permissive or STO).",
   "The drive handles about 10 registers per 10 ms, so large block reads add response time.",
   "If ACx550 legacy Modbus mapping is enabled (96.78 Legacy Modbus mapping on current firmware) 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/ach580",
 "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."
}
