{
 "manufacturer": "ABB",
 "manufacturer_slug": "abb",
 "model": "ACS880 industrial drive, primary control program (embedded Modbus RTU)",
 "model_slug": "acs880",
 "short_model": "ACS880",
 "aliases": [
  "ACS880-01",
  "ACS880-04",
  "ACS880-07",
  "ACS880-11",
  "ACS880-17",
  "ACS880-31",
  "ACS880-37",
  "AINLX",
  "ACS880 primary control program"
 ],
 "equipment_type": "Variable frequency drive",
 "applies_to": "ACS880 drives running the primary control program (AINLX) 3.4x or later, embedded fieldbus (EFB) Modbus RTU on terminal XD2D, 58.33 Addressing mode = Mode 0 (default).",
 "summary": "ABB's industrial variable frequency drive family. The control unit's XD2D RS-485 terminal can be switched from the drive-to-drive link to Modbus RTU, which puts a 16-bit control word, two references, a status word and two actual values in the first six holding registers and exposes every drive parameter as a holding register derived from its group and index. This map covers that cyclic block, the EFB error registers, key group 01/04/05/06 monitoring signals, the EFB diagnostics and comm-loss settings, and the main 32-bit actual values.",
 "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 writes holding registers as 6-digit references 400001-465536 covering the full 16-bit address field, so 400001 = wire address 0. Masters limited to 5 digits can reach 400001-409999 as 40001-49999, but nothing from 410000 up (which includes every 32-bit parameter register). 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 its 32-bit form 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. 32-bit registers are listed CDAB because 58.34 Word order defaults to LO-HI (low word in the first register)."
 },
 "default_word_order": "CDAB",
 "firmware": "ACS880 primary control program (AINLX) 3.4x or later",
 "source": {
  "title": "ACS880 primary control program (AINLX) firmware manual",
  "doc_number": "3AUA0000085967 Rev Y",
  "revision_date": "2024-03-07",
  "url": "https://search.abb.com/library/Download.aspx?DocumentID=3AUA0000085967&LanguageCode=en&DocumentPartId=1&Action=Launch",
  "pages": "EFB chapter printed pp. 629-652 (setup pp. 631-634, register addressing p. 637, CW/SW pp. 638-641, state diagram p. 642, references/actuals pp. 643-644, register table p. 645, function codes pp. 646-647, coils/discrete inputs pp. 648-651, error registers pp. 651-652); FbEq definition p. 134; groups 01/04/05/06 pp. 138-143, 146-147, 159-166; group 58 pp. 460-467; 6.01/6.11 bit tables pp. 659-661"
 },
 "notes": [
  "Registers 400001-400006 are the factory defaults of 58.101-58.106 Data I/O 1-6 and can be re-pointed; 400007-400024 (Data I/O 7-24) are user-selected and not listed.",
  "Control and status word bits are for 58.25 Control profile = ABB Drives (default). With Transparent the control word is passed unconverted (visible in 6.05) and the status word comes from the source chosen in 58.30.",
  "References and actual values are signed 16-bit. For speed/frequency 20000 equals 46.01 Speed scaling or 46.02 Frequency scaling (torque 46.03, power 46.04), so their engineering value depends on drive settings and they are left unscaled here. 58.27 and 58.29 default to Torque, not Auto.",
  "EFB status word bit 12 = EXT_RUN_ENABLE is confirmed three ways in the manual: the EFB status word table, the ABB Drives state diagram (SW bit 12 = 1 is the run-enable condition for OPERATION ENABLED) and 6.31 MSW bit 12 sel, whose default is Ext run enable. It is a user-selectable bit: the coil/discrete-input table calls status bits 11-14 User-defined (0)-(3), so a changed 6.31 changes its meaning. The bit 11 row of the status word table carries a stray '12 USER_1' fragment in its text; bit 11 is shown here only as a user-defined bit.",
  "16-bit scaling is the manual's FbEq 16b column (FbEq is defined as the integer used in communication, e.g. '10 = 1 V' -> scale 0.1). Signals 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 32-bit form, which has a fixed FbEq 32b scaling.",
  "01.14, 01.17, 01.30, 01.31 and 01.65 follow 96.16 Unit selection (kW or hp, Nm or lb·ft, °C or °F); the units shown assume metric.",
  "Left out: 01.35-01.37 resettable energy balance, 05.22 Diagnostic word 3 (only two fan bits in use), the ACS800-compatible fault words 4.21/4.22 (bit meanings depend on 4.120), the supply-unit signals 01.102-01.164 (visible only with IGBT supply control), and all configuration parameters other than the EFB diagnostics and comm-loss settings.",
  "Coils (control word bits at 00001-00032 plus 10.99 RO/DIO bits) and discrete inputs (status word bits at 10001-10032 plus 10.02 DI bits) also exist but are omitted, matching the ABB sibling maps; the manual does not spell out how those references map to wire addresses.",
  "Comm-loss defaults agree between the EFB setup table and the parameter list: 58.14 = Fault, 58.15 = Cw / Ref1 / Ref2, 58.16 = 3.0 s. 58.16 is 1 = 1 s in 16-bit form and 10 = 1 s in 32-bit form."
 ],
 "registers": [
  {
   "table": "holding_register",
   "address": 0,
   "documented": "400001",
   "name": "Control word (EFB CW)",
   "description": "ABB Drives profile bits shown (58.25 = ABB Drives).",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": {
    "0": "OFF1_CONTROL: 1 = proceed to ready to operate, 0 = ramp stop (OFF1)",
    "1": "OFF2_CONTROL: 0 = emergency OFF, coast to stop",
    "2": "OFF3_CONTROL: 0 = emergency stop (OFF3)",
    "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": "JOGGING_1: 1 = run at jogging 1 reference",
    "9": "JOGGING_2: 1 = run at jogging 2 reference",
    "10": "REMOTE_CMD: 1 = fieldbus control enabled",
    "11": "EXT_CTRL_LOC: 1 = select EXT2, 0 = select EXT1",
    "12": "Reserved",
    "13": "Reserved",
    "14": "Reserved",
    "15": "Reserved"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 1,
   "documented": "400002",
   "name": "Reference 1 (EFB Ref1)",
   "description": "Signed; type per 58.26 (20000 = 46.01/46.02 for speed/frequency).",
   "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; type and scaling per 58.27 (default Torque).",
   "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 (58.25 = ABB Drives).",
   "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_STA: 1 = OFF2 inactive",
    "5": "OFF_3_STA: 1 = OFF3 inactive",
    "6": "SWC_ON_INHIB: switch-on inhibited",
    "7": "ALARM: warning active",
    "8": "AT_SETPOINT: actual value within tolerance of reference",
    "9": "REMOTE: 1 = remote (EXT1/EXT2), 0 = local",
    "10": "ABOVE_LIMIT: speed/frequency at or above supervision limit",
    "11": "USER_0: user-defined status bit",
    "12": "EXT_RUN_ENABLE: external run enable received (user bit 1; 6.31 default)",
    "13": "Reserved",
    "14": "Reserved",
    "15": "Reserved"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 4,
   "documented": "400005",
   "name": "Actual value 1 (EFB Act1)",
   "description": "Signed; type per 58.28 (default Auto, follows Ref1 type).",
   "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; type per 58.29 (default Torque).",
   "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": {
    "1": "Reset"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 90,
   "documented": "400091",
   "name": "Error function code",
   "description": "Function code of the 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": 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": 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": 116,
   "documented": "400117",
   "name": "01.17 Motor shaft power",
   "description": "Estimated shaft power; kW or hp per 96.16.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 117,
   "documented": "400118",
   "name": "01.18 Inverter GWh motoring",
   "description": "Whole GWh toward the motor; combine with 01.19/01.20.",
   "data_type": "INT16",
   "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 motoring",
   "description": "Whole MWh, rolls over into 01.18.",
   "data_type": "INT16",
   "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 motoring",
   "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": "Used flux reference, percent of nominal flux.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 124,
   "documented": "400125",
   "name": "01.25 INU momentary cos phi",
   "description": "",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 130,
   "documented": "400131",
   "name": "01.31 Ambient temperature",
   "description": "Incoming cooling air; °C or °F per 96.16.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "°C",
   "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": "kW or hp per 96.16.",
   "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 Main fan on-time counter",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "days",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 509,
   "documented": "400510",
   "name": "05.10 Control board temperature",
   "description": "",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "°C",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 510,
   "documented": "400511",
   "name": "05.11 Inverter temperature",
   "description": "Percent of fault limit; about 94 % is the warning level.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 540,
   "documented": "400541",
   "name": "05.41 Main fan service counter",
   "description": "Fan age as percent of estimated life; 100 % warns A8C0.",
   "data_type": "UINT16",
   "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": "Inching 1",
    "9": "Inching 2",
    "10": "Remote cmd",
    "11": "Ext ctrl loc"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 610,
   "documented": "400611",
   "name": "06.11 Main status word",
   "description": "",
   "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 (source 6.29)",
    "11": "User bit 0 (source 6.30, default Ext ctrl loc)",
    "12": "User bit 1 (source 6.31, default Ext run enable)",
    "13": "User bit 2 (source 6.32)",
    "14": "User bit 3 (source 6.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 (run enable and start enable present, STO not active)",
    "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": "Reserved",
    "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": "Torque control",
    "3": "Speed control",
    "4": "Reserved",
    "5": "Safe reference active",
    "6": "Last speed active",
    "7": "Loss of reference",
    "8": "Emergency stop failed",
    "9": "Jogging active",
    "10": "Above limit",
    "11": "Emergency stop active",
    "12": "Reduced run",
    "13": "Reserved",
    "14": "Stop failed",
    "15": "Reserved"
   },
   "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",
    "4": "Lost start enable",
    "5": "Lost run enable",
    "6": "FSO inhibit",
    "7": "STO",
    "8": "Current calibration ended",
    "9": "ID run ended",
    "10": "Auto phase ended",
    "11": "Off1",
    "12": "Em Off2",
    "13": "Em Off3",
    "14": "Auto reset inhibit",
    "15": "Jogging active"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 618,
   "documented": "400619",
   "name": "06.19 Speed control status word",
   "description": "",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Zero speed",
    "1": "Forward",
    "2": "Reverse",
    "3": "Out of window",
    "4": "Internal speed feedback",
    "5": "Encoder 1 feedback",
    "6": "Encoder 2 feedback",
    "7": "Constant speed req",
    "8": "MF speed corr min",
    "9": "MF speed corr max"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 5806,
   "documented": "405807",
   "name": "58.07 Communication diagnostics",
   "description": "EFB link status flags.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Init failed",
    "1": "Addr config err",
    "2": "Silent mode",
    "3": "Reserved (Autobauding)",
    "4": "Wiring error (A/B possibly swapped)",
    "5": "Parity error",
    "6": "Baud rate error",
    "7": "No bus activity (5 s)",
    "8": "No packets (5 s)",
    "9": "Noise or addressing error",
    "10": "Comm loss",
    "11": "CW/Ref loss",
    "12": "Reserved (Not active)",
    "13": "Protocol 1",
    "14": "Protocol 2",
    "15": "Internal error"
   },
   "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; whole seconds in 16-bit form.",
   "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": "Measured or estimated 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": "kW or hp per 96.16; 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": 20259,
   "documented": "420260",
   "name": "01.30 Nominal torque scale (32-bit)",
   "description": "Torque equal to 100 %; Nm or lb·ft per 96.16; CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 0.001,
   "units": "Nm",
   "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": 31615,
   "documented": "431616",
   "name": "58.08 Received packets (32-bit)",
   "description": "Valid packets addressed to the drive; CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 31623,
   "documented": "431624",
   "name": "58.12 CRC errors (32-bit)",
   "description": "Packets received with a CRC error; CDAB assumes 58.34 = LO-HI (default).",
   "data_type": "UINT32",
   "length": 2,
   "word_order": "CDAB",
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  }
 ],
 "integration": {
  "summary": "Set 58.01 = Modbus RTU, set node, baud and parity, apply with 58.06 = Refresh settings, then point 20.01 Ext1 commands and the speed or frequency reference source at the embedded fieldbus. Write the ABB Drives control word and Reference 1 at 400001/400002, poll the status word and actual values at 400004-400006, and read other signals straight from their parameter registers.",
  "minimum_registers": [
   {
    "table": "holding_register",
    "address": 0,
    "why": "Control word: start/stop/reset"
   },
   {
    "table": "holding_register",
    "address": 1,
    "why": "Reference 1 (20000 = 46.01/46.02 for speed/frequency)"
   },
   {
    "table": "holding_register",
    "address": 3,
    "why": "Status word: ready/running/fault/remote"
   },
   {
    "table": "holding_register",
    "address": 4,
    "why": "Actual value 1 (feedback matching the Ref1 type)"
   },
   {
    "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)"
   },
   {
    "table": "holding_register",
    "address": 617,
    "why": "06.18 Start inhibit status word"
   }
  ],
  "enable": "Set 58.01 Protocol enable = Modbus RTU (this disables the drive-to-drive link on XD2D and cannot be changed while the drive runs), then 58.03 node address, 58.04 baud rate and 58.05 parity, and validate with 58.06 Communication control = Refresh settings or reboot the control unit. For control set 20.01 Ext1 commands (and 20.06 for EXT2) = Embedded fieldbus and the reference source, e.g. 22.11 Speed ref1 source or 28.11 Frequency ref1 source = EFB ref1. Fieldbus parameter writes are made permanent with 96.07 Parameter save manually = Save.",
  "watchdog": "58.14 Communication loss action (No / Fault / Last speed / Speed ref safe / Fault always / Warning) with 58.16 Communication loss time (default 3.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 for frequency). Apart from Fault always, it only acts when the EFB is the active control source or 58.36 forces supervision. Monitoring is held off for 30 s after power-up.",
  "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. Bytes within each register are always high byte first.",
   "References and actual values are signed 16-bit scaled to the group 46 values, not engineering units; 58.26-58.29 pick the type (Ref2 and Act2 default to Torque).",
   "Start per the ABB Drives state diagram: write 0x0476 (1142) to 400001; once status bit 0 (RDY_ON) is 1, write 0x0477 (1143) and then 0x047F (1151) to run. Clearing bit 0 (0x047E) gives an OFF1 ramp stop; a 0->1 edge on bit 7 resets a fault. Bit 10 (REMOTE_CMD) must be 1 for the fieldbus to have control.",
   "Control word bit 3 (run) only works when the run enable signal is present, unless run enable is itself taken from the fieldbus."
  ],
  "setup": [
   "Wire the RS-485 bus to terminal XD2D on the control unit; termination and chaining are in the drive's hardware manual (terminate only the two bus ends).",
   "Defaults: node 1, 19.2 kbit/s, 8 data bits, even parity, 1 stop bit (58.03-58.05); 4.8-115.2 kbit/s selectable.",
   "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 noise/addressing errors; 58.08-58.12 count packets, UART errors and CRC errors."
  ],
  "gotchas": [
   "If a start command is ignored, read 06.18 Start inhibit status word (e.g. missing run or start enable, STO, or a changed control location).",
   "The drive processes 10 registers per 10 ms, so a 20-register read takes about 22 ms before the reply starts.",
   "Exception 04h means the drive rejected the value; read 400092 Error code for the reason. Exception 03h means too many registers were requested, not an out-of-range value.",
   "Supported function codes are 01, 02, 03, 05, 06, 08, 0Bh, 0Fh, 10h, 16h, 17h and 2Bh/0Eh; there are no input registers (function 04 is not supported)."
  ]
 },
 "page": "https://easymodbus.com/modbus-register-maps/abb/acs880",
 "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."
}
