# Property of PMA Electrical Solutions, LLC. # # ABB ACS860 running the ACS860 PRIMARY CONTROL PROGRAM (ZGKLX) on the UCU # control unit, version 1.40 or later. Embedded fieldbus (EFB), Modbus RTU on # terminal XD2D of the control unit — no option card. An FSCA-01 adapter is a # DIFFERENT path (FBA A, parameter groups 50-53, its own chapter starting # p. 479 with its own control/status word sections on pp. 483-486); this # profile does NOT describe it. # # Source: ABB firmware manual 3AXD50001240004 Rev B (EN), # "ACS860 primary control program (ZGKLX) Firmware manual". # PDF page index == printed page number in this document (offset 0). # p. 13 Applicability — "ACS860 primary control program for UCU # control unit version 1.40 or later" # p. 14 Related manuals (the hardware variants, see COVERAGE below) # pp. 109-112 group 01 actual values and their 16-bit FbEq scalings # pp. 116-118 group 04 active faults and stored fault history # pp. 309-310 group 46 scaling parameters (the 16-bit scaling definitions) # pp. 331-339 group 58 EFB configuration, 58.33 addressing, 58.34 word order # pp. 402-403 99.06 Motor nominal current # p. 413-429 warning/fault/event code table (the codes used below) # pp. 457-459 EFB wiring (XD2D) and the drive-side setup parameters # pp. 464-467 ABB Drives profile control word / status word bit tables # p. 468 state transition diagram (the control-word bit patterns) # pp. 469-470 reference / actual-value scaling (20000 = par 46.01/46.02) # p. 471 Modbus holding register map (400001-400006, 400090-400100) # pp. 472-473 supported function codes (03/06/10/16/17 all present) # # COVERAGE — the ACS860 only. This is a SEPARATE firmware family from the # ACS880: the ACS860 runs the ZGKLX program on the UCU control unit and has its # own firmware manual (3AXD50001240004); profiles/abb_acs880.toml is AINLX # (3AUA0000085967). ABB does NOT state anywhere in this manual that the two # share a register map, so no such claim is made here — this file is sourced # end to end from the ACS860 manual. It happens to agree with the ACS880 map # because both implement the same documented ABB Drives profile, not because # one covers the other. Do not merge the two files. # The Related manuals table (p. 14) lists the ACS860-104 inverter modules # (3AXD50000034054) and ACS860-107 inverter units (3AXD50000034048) hardware # manuals alongside this one firmware manual, and applicability (p. 13) is # scoped by CONTROL PROGRAM, not by packaging. Those hardware manuals were # NOT read — they cover mechanics, not registers — so this file claims # "ACS860" and names no sub-variant map. Nothing has been bench-checked: # verified = false. # Oddity worth knowing on a live bus: the Read Device Identification example # in this manual (p. 473) still prints the ACS880 strings ("AINFX", # "ACS880") as its examples. Do not use FC 2Bh device identity to confirm you # are talking to an ACS860. # # Drive-side setup (pp. 457-459) — without these the drive ACKs writes and # silently ignores them: # 58.01 Protocol enable = Modbus RTU (claims XD2D, disables D2D link) # 58.03 Node address = 1 (default) # 58.04 Baud rate = 19.2 kbps (default) # 58.05 Parity = 8 EVEN 1 (default) # 58.25 Control profile = ABB Drives (default; this profile assumes it) # 58.33 Addressing mode = Mode 0 (default; the formula below assumes it) # 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 or EFB ref2 (reference from EFB) # Control-word bit 7 (RESET) and bit 6 (RAMP_IN_ZERO) are effective ONLY if # the fieldbus is set as the source for those signals by drive parameters # (p. 465-466). # # ADDRESSING (58.33 = Mode 0, the default, p. 337). ABB prints 6-digit # references (400001-465536, p. 463). Everything below is a 0-BASED PROTOCOL # ADDRESS: # 0-based = (400000 + 100 * group + index) - 400001 = 100 * group + index - 1 # ABB's own worked example, par 22.80 -> 402280 (p. 337) # -> 0-based 402280 - 400001 = 2279 # par 01.07 Motor current -> 100*1 + 7 - 1 = 106 # par 04.11 Latest fault -> 100*4 + 11 - 1 = 410 # par 99.06 Motor nom curr -> 100*99 + 6 - 1 = 9905 # The fixed cyclic words are 400001..400006 -> 0..5 (p. 471). # Mode 0 also defines a SEPARATE 32-bit window (420000 + 200*group + 2*index) # whose word order follows 58.34 (default LO-HI, p. 338). That window is NOT # used here — every point below is the 16-bit converted view, so 58.34 does not # affect this profile. # # SCALING IS FIELDBUS (FbEq16), NOT PANEL DECIMALS, and most of it is defined # by group 46 — it is CONFIG-DEPENDENT. The scales below are the factory # defaults from pp. 309-310; confirm 46.01-46.05 on the actual unit. Note # 46.01/46.02 default differently on a 60 Hz unit (95.20 b0): 1800 rpm / # 60.00 Hz instead of 1500 rpm / 50.00 Hz. name = "ABB ACS860" 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. 457). Not 9600 — the ACS860 ships 19200. [serial] baudrate = 19200 parity = "E" stopbits = 1 [monitor] # 400001 / 400004, ABB Drives profile bit tables, pp. 464-467. 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. With 22.11 Speed ref1 source = EFB ref1 (the setup above) and # 58.26 EFB ref1 type = Auto, this resolves to speed scaling: 20000 = par 46.01 # (p. 469). reference_1 = { address = 1, signed = true, scale = 0.005, unit = "%" } # 400003 (REF2) is deliberately absent: 58.27 EFB ref2 type decides what it # means and how it scales (torque scales 10000 = 100% via 46.03, speed scales # 20000 = 46.01). Shipping one scale for a word whose meaning is a parameter # setting would display a wrong number. 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 for the same reason: their # content AND scaling follow 58.28/58.29. Read the group 01 parameters below # instead — those have a fixed meaning. # 01.01, 16-bit scaling per 46.01 (default 1500.00 rpm = 20000; 1800 rpm on a # 60 Hz unit gives 0.09). 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. 109). 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, p. 109) output_voltage = { address = 112, unit = "V" } # 01.13, FbEq16 1 = 1 V (fixed, p. 110) # 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. 110). output_power_pct = { address = 114, signed = true, scale = 0.1, unit = "%" } # 04.01-04.05 are five CONCURRENT active faults, not a history (p. 116). 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 (p. 457), so # reads alone do NOT reset the timeout counter. [control] command_register = 0 speed_register = 1 speed_scale = 0.005 # write %, 20000 raw = 100% of par 46.01 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. 468, read against the CW bit table on pp. 464-466. # 0x0476 = xxxx x1xx x111 0110: OFF1 low, OFF2/OFF3 high, ramp bits high, # REMOTE_CMD set -> READY TO SWITCH ON. 0x047F = xxxx x1xx x111 1111 adds OFF1 # and INHIBIT_OPERATION, walking READY TO OPERATE -> OPERATION ENABLED -> RFG # stages -> OPERATING. Note the diagram also gates OPERATION ENABLED on status # word bit 12 EXT_RUN_ENABLE — without an external run-enable the drive stays # in READY TO OPERATE. The manual draws these as bit patterns, not hex # literals; the hex here is that pattern with bits 12-15 (Reserved, p. 466) # written as zero. stop = [0x0476] run_fwd = [0x0476, 0x047F] # Reset is a 0->1 edge on bit 7 (p. 465) 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 and # the manual carries a WARNING on OFF3 (p. 464). reset = [0x0476, 0x04F6, 0x0476] # run_rev is deliberately absent. On the ABB Drives profile direction comes # from the SIGN OF THE REFERENCE (p. 469: "A negative reference is formed by # calculating the two's complement"), 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, 58.16 Communication loss # time defaults to 3.0 s (p. 457). The fault raised is 6681 EFB communication # loss, "Communication break in embedded fieldbus (EFB) communication" (p. 425). # 500 ms keeps a comfortable margin under the 3 s timeout. [control.watchdog] interval_ms = 500 fault = "6681 EFB communication loss" # Status word bit 2 RDY_REF = OPERATION ENABLED (p. 466). [running_check] register = 3 bit = 2 # 04.01 Tripping fault; stored history is 04.11-04.13 (addresses 410-412, p. 116). [faults] register = 400 history = [410, 411, 412] # ABB prints these as hex (04.01 range is 0000...FFFFh, p. 116); TOML keys must # be numeric, so they are the decimal equivalents. SHORT ON PURPOSE — the # "Warnings, faults and pure events" table (pp. 413-429) mixes faults, warnings # and pure events, and only entries read straight off that table are listed. # Page for each: 2310 p.413, 2330/2340 p.414, 3130 p.415, 3210/3220 p.416, # 4210/4310 p.417, 5091 p.419, 6681 p.425, 7121 p.426, 7310 p.427, 7510 p.428, # 9081 p.429. Second-level auxiliary codes 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" 36993 = "0x9081 External fault 1" # 99.06 Motor nominal current (p. 403). FbEq 16b is "1 = 1 A" on the 16-bit # converted view, so scale 1.0 — this is NOT the 0.1 A of the older # ACS310/ACS550 generation. Used as the restore/frame-size guard. [rating] register = 9905 words = 1 scale = 1.0 unit = "A" label = "99.06 Motor nominal current" # NO [parameters] BLOCK, DELIBERATELY. Mode 0 does map every parameter into # 400101-465536, so clone/restore addressing is documented — but which of # groups 01-99 are writable was NOT established. That needs a systematic RW/RO # pass over the parameter listing (pp. 108-408), which was not done. Writing a # range that includes read-only or hardware-configuration parameters is how a # restore corrupts a replacement drive, so the block is omitted rather than # guessed. [connection] summary = "The ACS860 embedded Modbus RTU interface uses control-unit connector XD2D." warnings = ["Selecting Modbus RTU on XD2D disables the drive-to-drive/master-follower use of that connector.","Use the exact B/A labels; ABB labels XD2D pin 1 B and pin 2 A."] [[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 and 58.05 parity.","Select Embedded fieldbus for commands/references and refresh the group 58 settings."] warnings = [] source = "ABB 3AXD50001240004 Rev B, pp. 34-38, 93 and 455-459." [[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