# Property of PMA Electrical Solutions, LLC. # # ABB ACS880 running the PRIMARY CONTROL PROGRAM (AINLX), firmware 3.4x or # later. Embedded fieldbus (EFB), Modbus RTU on terminal XD2D of the drive # control unit — no option card. An FSCA-01 adapter is a DIFFERENT path (FBA A, # parameter groups 50-53) with different addressing; this profile does not # describe it. # # Source: ABB firmware manual 3AUA0000085967 Rev Y (EN), 690 pp. # pp. 15-16 applicability (control program 3.4x+) and Related manuals # pp. 630-633 EFB wiring (XD2D) and drive-side setup parameters # pp. 638-641 ABB Drives profile control word / status word bit tables # p. 643 reference scaling (20000 = par 46.01/46.02) # p. 645 Modbus holding register map (400001-400006, 400090-400100) # pp. 466-467 58.33 Addressing mode, the parameter->register formula # pp. 138-142 group 1 actual values and their 16-bit fieldbus scalings # pp. 146-147 group 4 active faults and stored fault history # pp. 430-431 group 46 scaling parameters (the 16-bit scaling definitions) # pp. 460-464 group 58 EFB configuration, comm-loss action/mode/time # pp. 579-621 warning/fault/event code table # # COVERAGE — also applies to the ACS880-07 cabinet-built drive, on two # statements that actually assert it: (a) Applicability (p. 15) is scoped to # "ACS880 primary control program version 3.4x or later" — by control program, # not by cabinet vs. module packaging; (b) this control program carries a # dedicated ACS880-07 cabinet-hardware option bit, par 95.20 HW options word 1 # b3 "RO2 for -07 cabinet cooling fan ... used only with specific ACS880-07 # hardware" (p. 540) — ABB's own program knows about -07 cabinets. (The # Related-manuals table on p. 16 also lists the -07 hardware manuals # 9AKK105408A8149 / 9AKK105713A6663, but that list is a hyperlink index, not # an applicability statement — it lists the -07CLC/-07LC too, which are # excluded below as CONSERVATISM, not because the document distinguishes # them.) The -07 is therefore the same AINLX map below. The cabinet # build adds no new top-level fault codes: cabinet/supply-unit trips surface as # the ONE code 7583 Line side unit faulted (p. 596), whose auxiliary code # carries the supply-unit fault (e.g. 4E06 cabinet/LCL overtemperature) — that # aux table is pp. 625-627 and is a SECOND-LEVEL code, not a value of par 04.11, # so it is deliberately not in [faults.codes]. The -07-specific cabinet cooling # fan is a hardware-option bit (par 95.20 b3, p. 540) affecting 10.27-10.29, not # a different register map. The -07 # hardware manuals themselves were NOT read — they cover cabinet mechanicals, # not registers — and no -07 has been bench-checked, so verified stays false. # The manual states only "applies to ACS880 primary control program version # 3.4x or later". NO sibling family is claimed. The ACS880 with the UCU/UCON # control board runs the YINLX program, a different manual — do not assume this # map covers it. Third-party sources are excluded on purpose: a web page once # corrupted profiles/abb_acs580.toml with a fault-reset value ABB's own manual # warns against. # # Drive-side setup (p. 631-633) — without these the drive ACKs writes and # ignores them: # 58.01 Protocol enable = Modbus RTU (claims XD2D, disables D2D link) # 58.03 Node address = 1..247 # 58.04 Baud rate = default 19.2 kbps # 58.05 Parity = default 8 EVEN 1 # 58.25 Control profile = ABB Drives (this profile assumes the default) # 58.06 Communication control = Refresh settings (validates 58.xx changes) # 20.01 Ext1 commands = Embedded fieldbus (start/stop from EFB) # 22.11 Speed ref1 source = EFB ref1 (reference from EFB) # Control-word bit 7 (RESET) and bit 6 (RAMP_IN_ZERO) are effective only if # the fieldbus is selected as the source for those signals by drive # parameters (p. 639). # # Addressing (58.33 Addressing mode = Mode 0, the default, p. 466). ABB prints # 6-digit references; these are 0-BASED PROTOCOL ADDRESSES: # 0-based = (400000 + 100 * group + index) - 400001 = 100 * group + index - 1 # par 01.06 Output frequency -> 100*1 + 6 - 1 = 105 # par 04.11 Latest fault -> 100*4 + 11 - 1 = 410 # The fixed cyclic words are 400001..400006 -> 0..5. # 32-bit access lives in a separate window (420000 + 200*group + 2*index) and # is NOT used here; every point below is the 16-bit converted view. # # SCALING IS FIELDBUS (FbEq16), NOT PANEL DECIMALS, and most of it is defined # by group 46 parameters — it is CONFIG-DEPENDENT. The scales below are the # factory defaults from pp. 430-431; confirm 46.01-46.05 on the actual unit. name = "ABB ACS880" vendor = "ABB" device_type = "vfd" verified = false probe_register = 3 # 400004 status word, readable whenever the EFB is alive # 58.04 / 58.05 factory defaults (p. 460-461). Not 9600 — the ACS880 ships 19200. [serial] baudrate = 19200 parity = "E" stopbits = 1 [monitor] # 400001-400004, ABB Drives profile bit tables, pp. 638-641. control_word = { address = 0, bits = { 0 = "OFF1_CONTROL", 1 = "OFF2_CONTROL", 2 = "OFF3_CONTROL", 3 = "INHIBIT_OPERATION", 4 = "RAMP_OUT_ZERO", 5 = "RAMP_HOLD", 6 = "RAMP_IN_ZERO", 7 = "RESET", 8 = "JOGGING_1", 9 = "JOGGING_2", 10 = "REMOTE_CMD", 11 = "EXT_CTRL_LOC" } } # REF1 at 400002. 58.26 EFB ref1 type defaults to Auto, and with 22.11 Speed ref1 # source = EFB ref1 (the setup above) that resolves to Speed scaling: 20000 = # par 46.01 (p. 643, p. 464). reference_1 = { address = 1, signed = true, scale = 0.005, unit = "%" } # 400003 (REF2) is deliberately absent for the same reason as ACT1/ACT2 below: # 58.27 EFB ref2 type defaults to TORQUE (p. 464), whose 16-bit scaling is # 46.03 at 10000 = 100% — not the 20000 = 100% of REF1. Shipping one scale for # a word whose meaning is a parameter setting would display a wrong number. # Bits 11-12: ABB's own manual conflicts with itself — the status word table # (p. 641) and the state diagram (p. 642, run transition gated on "SW # Bit12=1") give bit 11 USER_0 / bit 12 EXT_RUN_ENABLE, but the discrete-input # table (p. 650) maps SW bits 11-14 to "User-defined (0)…(3)" with no # EXT_RUN_ENABLE anywhere. The two-of-three reading is used; bit 12 is the # first thing to confirm on a bench. status_word = { address = 3, bits = { 0 = "RDY_ON", 1 = "RDY_RUN", 2 = "RDY_REF", 3 = "TRIPPED", 4 = "OFF_2_STA", 5 = "OFF_3_STA", 6 = "SWC_ON_INHIB", 7 = "ALARM", 8 = "AT_SETPOINT", 9 = "REMOTE", 10 = "ABOVE_LIMIT", 11 = "USER_0", 12 = "EXT_RUN_ENABLE" } } # 400005/400006 (ACT1/ACT2) are deliberately absent: their content AND scaling # follow 58.28/58.29, which default to Auto/Torque. Read the parameters below # instead — those have a fixed meaning. # 01.01, 16-bit scaling per 46.01 (default 1500 rpm = 20000, or 1800 rpm if # 95.20 b0 selects 60 Hz defaults). CONFIG-DEPENDENT. motor_speed = { address = 100, signed = true, scale = 0.075, unit = "rpm" } # 01.06, 16-bit scaling per 46.02 (default 50.00 Hz = 20000; 60.00 Hz on a # 60 Hz unit gives 0.003). CONFIG-DEPENDENT. output_frequency = { address = 105, signed = true, scale = 0.0025, unit = "Hz" } # 01.07, 16-bit scaling per 46.05 Current scaling (default 10000 A = 10000, so # 1 A per count — a coarse default). CONFIG-DEPENDENT: lowering 46.05 to the # drive's own rating changes this scale. motor_current = { address = 106, scale = 1.0, unit = "A" } # 01.08, FbEq16 fixed at 1 = 1 % (p. 138). Not scaled by group 46 — prefer this # over motor_current when 46.05 is unknown. motor_current_pct = { address = 107, scale = 1.0, unit = "%" } # 01.10, 16-bit scaling per 46.03 (default 100.0 % = 10000). CONFIG-DEPENDENT. motor_torque = { address = 109, signed = true, scale = 0.01, unit = "%" } dc_voltage = { address = 110, scale = 0.1, unit = "V" } # 01.11, FbEq16 10 = 1 V (fixed) output_voltage = { address = 112, unit = "V" } # 01.13, FbEq16 1 = 1 V (fixed) # 01.14, 16-bit scaling per 46.04 (default 1000.00 kW = 10000). CONFIG-DEPENDENT. output_power = { address = 113, signed = true, scale = 0.1, unit = "kW" } # 01.15, FbEq16 fixed at 10 = 1 % (p. 139). output_power_pct = { address = 114, signed = true, scale = 0.1, unit = "%" } # 04.01-04.05 are five CONCURRENT active faults, not a history (p. 146). active_fault_2 = { address = 401 } active_fault_3 = { address = 402 } # ABB Drives profile (58.25 default). The master must keep WRITING the control # word: 58.15 Communication loss mode defaults to Cw / Ref1 / Ref2, so reads # alone do NOT reset the timeout counter (p. 463). [control] command_register = 0 speed_register = 1 speed_scale = 0.005 # write %, 20000 raw = 100% of par 46.01 (or 46.02) speed_signed = true # direction IS the sign of the reference here speed_unit = "%" # NOT Hz — percent of the drive's scaling parameter max_ref = 100.0 step_delay = 0.05 # State transition diagram, p. 642. 0x0476 = READY TO SWITCH ON (OFF1 low, # OFF2/OFF3 high, ramp bits high, REMOTE_CMD set); 0x047F adds OFF1 and # INHIBIT_OPERATION to reach OPERATION ENABLED. Note the drive also requires # status word bit 12 EXT_RUN_ENABLE before it will leave READY TO OPERATE. stop = [0x0476] run_fwd = [0x0476, 0x047F] # Reset is a 0->1 edge on bit 7 layered on the normal 0x0476 word. 0x04F6 keeps # OFF1/INHIBIT_OPERATION low, so it is not a run command and it does not drive # OFF2/OFF3 low (those are Emergency OFF / Emergency stop, p. 638-639). reset = [0x0476, 0x04F6, 0x0476] # run_rev is deliberately absent. On the ABB Drives profile direction comes # from the SIGN OF THE REFERENCE (p. 643), not from a control-word bit, so a # "reverse" word would be byte-identical to forward. Reverse with a negative # reference. # 58.14 Communication loss action defaults to Fault -> 6681 EFB communication # loss, with 58.16 Communication loss time defaulting to 3.0 s (pp. 462-464). # 500 ms keeps a comfortable margin under that timeout. [control.watchdog] interval_ms = 500 fault = "6681 EFB communication loss" # Status word bit 2 RDY_REF = OPERATION ENABLED (p. 640). [running_check] register = 3 bit = 2 # 04.01 Tripping fault; stored history is 04.11-04.13 (addresses 410-412). [faults] register = 400 history = [410, 411, 412] # ABB prints these as hex; TOML keys must be numeric, so they are the decimal # equivalents. Short on purpose — "Warning, fault and pure event messages" # (pp. 579-621) mixes faults, warnings (Axxx) and pure events across 43 pages, # and only the entries read straight off that table are listed here. Every code # below was located on its own page: 2310/2330 p.579, 2340 p.580, 3130/3210 # p.581, 3220 p.582, 4210 p.583, 4310 p.584, 5091 p.585, 6681 p.591, 7121 p.592, # 7310 p.594, 7510 p.595, 9081 p.597. The second-level auxiliary codes # (XXXYYYZZ) are not modeled. [faults.codes] 0 = "No fault" 8976 = "0x2310 Overcurrent" 9008 = "0x2330 Earth leakage" 9024 = "0x2340 Short circuit" 12592 = "0x3130 Supply phase loss" 12816 = "0x3210 DC link overvoltage" 12832 = "0x3220 DC link undervoltage" 16912 = "0x4210 IGBT overtemperature" 17168 = "0x4310 Excess temperature" 20625 = "0x5091 Safe torque off" 26241 = "0x6681 EFB communication loss" 28961 = "0x7121 Motor stall" 29456 = "0x7310 Overspeed" 29968 = "0x7510 FBA A communication" # p. 596. Matters on the cabinet-built -07: every supply-unit trip arrives as # this one code, with the real cause in the auxiliary code (pp. 625-627). 30083 = "0x7583 Line side unit faulted (see auxiliary code)" 36993 = "0x9081 External fault 1" # 7.03 Drive rating id — "Type of the drive/inverter unit", uint16, group 07 # System info, "All parameters in this group are read-only" (p. 178). 0-based # = 100*7 + 3 - 1 = 702 (58.33 Mode 0, p. 466). An opaque identity code — an # equality guard, which is all the restore precondition performs — and the # same quantity the drive itself trips 5093 "Rating ID mismatch" on (p. 585). # Note: with no [parameters] ranges a restore currently refuses every address # anyway; this lands so the guard is ready when ranges are added. [rating] register = 702 words = 1 scale = 1.0 unit = "" label = "Drive rating id (7.03)" [connection] summary = "The ACS880 AINLX embedded Modbus RTU interface uses control-unit connector XD2D." warnings = ["Selecting Modbus RTU reserves XD2D and automatically disables drive-to-drive link functionality.","This profile applies to the AINLX primary control program identified in the profile header, not UCU/YINLX variants."] [[connection.methods]] id = "built_in_rs485" title = "Built-in Modbus RTU" transport = "serial" hardware = "built_in" port = "control-unit connector XD2D" connector = "XD2D:1 B, 2 A, 3 BGND, 4 SHIELD" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded twisted-pair RS-485 cable with signal common" parts = ["Isolated USB-to-RS-485 adapter","Shielded twisted-pair RS-485 cable with signal common","Termination hardware if required"] steps = ["Lock out all power, verify the motor cannot start, and wait for the DC bus to discharge.","Open the control compartment and locate control-unit connector XD2D.","Land the conductors exactly as shown below, preserving the shield through each daisy-chain node.","Enable termination only if this device is at a physical end of the RS-485 trunk.","Restore control power with the motor inhibited and verify a read before enabling fieldbus control."] setup = ["Set termination on only at each physical bus end.","Set 58.01 = Modbus RTU, 58.03 node, 58.04 baud, 58.05 parity and 58.25 = ABB Drives.","Select Embedded fieldbus for command/reference sources and refresh the settings."] warnings = [] source = "ABB 3AUA0000085967 Rev Y, pp. 34-38, 115 and 629-633." [[connection.methods.wiring]] adapter = "Data B" device = "XD2D:1 B" signal = "RS-485 B" [[connection.methods.wiring]] adapter = "Data A" device = "XD2D:2 A" signal = "RS-485 A" [[connection.methods.wiring]] adapter = "COM / signal common" device = "XD2D:3 BGND" signal = "Bus reference" [[connection.methods.wiring]] adapter = "Cable shield" device = "XD2D:4 SHIELD" signal = "Shield" required = false