# Property of PMA Electrical Solutions, LLC. # # ABB ACS480 ONLY, standard control program. No other ABB family is claimed # here — not ACS580, not ACH480, not ACS380. The maps happen to agree today; # that agreement is not a citation, so each drive gets its own file. # # Communication path: the EMBEDDED fieldbus interface (EFB), Modbus RTU on the # drive's own EIA-485 (X5) terminals, ABB Drives control profile (58.25 = ABB # Drives, the default). The FSCA-01 / FMBT-21 / FENA-21 adapter-module path is # NOT documented here and does not use these register numbers. # # Source: ABB "ACS480 standard control program firmware manual", # 3AXD50000047399 Rev G (file ASDKA220x_en.pdf), pages: # EFB setup + drive-side sources ....... 552-554 # Control Word (ABB Drives profile) .... 559-560 # Status Word (ABB Drives profile) ..... 563-564 # State diagram, start/stop/reset words. 566-568 # Reference and actual-value scaling ... 569-570 # Default holding-register map ......... 571 # Addressing mode 58.33 ................ 429 # Group 01 actual values ............... 225-226 # Group 04 fault/warning codes ......... 229 # Group 46 scaling defaults ............ 409-410 # Fault message table .................. 536-548 # # Drive-side setup (without these the drive ACKs writes and ignores them): # 58.01 Protocol enable = Modbus RTU; 58.03 node address; 58.04 baud # (default 19.2 kbps); 58.05 parity (default 8 EVEN 1); 58.25 Control # profile = ABB Drives; 20.01 Ext1 commands = Embedded fieldbus; # 22.11 Ext1 speed ref1 = EFB ref1 (or 28.11 in frequency control); # 58.14 Communication loss action = Fault — SET IT EXPLICITLY: the # parameter listing (p.427) gives its default as "No action" (monitoring # disabled) while the setup table (p.552) claims "Fault (default)"; on an # as-shipped drive per p.427 the motor keeps running when the master goes # quiet. 58.15 Communication loss mode = Cw / Ref1 / Ref2 (same p.427 vs # p.552 conflict); 58.16 Communication loss time (see watchdog note); # 96.78 550 compatibility = Disable (the default) — Enable replaces this # whole map with an ACS550 register map (p.461, p.477); # then 58.06 Communication control = Refresh settings (p.552-554). # # Addressing (58.33 = Mode 0, the default, p.429). The manual gives 1-based # 4xxxxx numbers: register = 400000 + 100*group + index. This repo uses 0-based # protocol addresses, and 400001 is protocol address 0, so # 0-based address = (400000 + 100*group + index) - 400001 # = 100*group + index - 1 # manual's own example, par 22.80 -> 402280 -> 402280-400001 = 2279 # and 100*22 + 80 - 1 = 2279 # par 01.06 Output frequency -> 100*1 + 6 - 1 = 105 # Direct parameter access lives in 400101...465536 (0-based 100...65535); # 0-based 0...13 are the Data I/O words (p.571). # The manual states a 1-based wire offset for coils and discrete inputs # (p.574, p.576) but is silent for holding registers; the -400001 offset used # here is the standard convention, matches every other ABB profile in this # repo, and is unconfirmed on hardware. # # SCALING IS FIELDBUS (FbEq16), NOT PANEL DECIMALS, and the group 46 values it # derives from are configuration-dependent (p.569-570, 409-410). Defaults used # below: 46.02 = 50.00 Hz (60.00 Hz on a 95.20 b0 / North-America unit, which # makes the frequency scale 0.003 instead), 46.03 = 100.0%, 46.04 = 100.00 kW, # 46.05 = 10000 A. Confirm 46.02-46.05 on the actual unit before trusting them. # # NOT INCLUDED: no [rating] section. The manual contradicts itself on the # 16-bit scaling of 99.06 Motor nominal current: p.470 prints two mutually # exclusive values in the same FbEq16 cell ("1 = 0.01 A" and "See 46.05", # whose 10000 A default implies 1 = 1 A), and p.517 gives FbEq32 "10 = 1 A". # Unresolvable from the document — an ambiguous scale on a restore guard is # worse than none. (07.03 Drive rating id was not located in this manual's # pages read; if a page for it is found, it is the better guard.) # NOT INCLUDED: no [parameters] ranges — the writable range for clone/restore # was not mined from the ACS480 parameter table (p.225-475). name = "ABB ACS480" vendor = "ABB" device_type = "vfd" verified = false probe_register = 3 # status word, readable whenever the fieldbus is alive # 58.04 / 58.05 defaults, p.552. [serial] baudrate = 19200 parity = "E" stopbits = 1 [monitor] control_word = { address = 0, bits = { 0 = "OFF1_N", 1 = "OFF2_N", 2 = "OFF3_N", 3 = "RUN", 4 = "RAMP_OUT_ZERO_N", 5 = "RAMP_HOLD_N", 6 = "RAMP_IN_ZERO_N", 7 = "RESET", 8 = "JOGGING_1", 9 = "JOGGING_2", 10 = "REMOTE_CMD", 11 = "EXT_CTRL_LOC" } } reference_1 = { address = 1, signed = true, scale = 0.005, unit = "%" } # 20000 = 100% of 46.01/46.02 status_word = { address = 3, bits = { 0 = "RDY_ON", 1 = "RDY_RUN", 2 = "RDY_REF", 3 = "TRIPPED", 4 = "OFF_2_STATUS", 5 = "OFF_3_STATUS", 6 = "SWC_ON_INHIB", 7 = "ALARM", 8 = "AT_SETPOINT", 9 = "REMOTE", 10 = "ABOVE_LIMIT" } } # 01.06, scaled by 46.02 (default 20000 = 50.00 Hz). CONFIG-DEPENDENT. output_frequency = { address = 105, signed = true, scale = 0.0025, unit = "Hz" } motor_current = { address = 106, scale = 1.0, unit = "A" } # 01.07 via 46.05, default 10000 = 10000 A motor_torque = { address = 109, signed = true, scale = 0.01, unit = "%" } # 01.10 via 46.03, default 10000 = 100% dc_voltage = { address = 110, scale = 0.1, unit = "V" } # 01.11, 10 = 1 V (fixed) output_voltage = { address = 112, unit = "V" } # 01.13, 1 = 1 V (fixed) output_power = { address = 113, signed = true, scale = 0.01, unit = "kW" } # 01.14 via 46.04, default 10000 = 100.00 kW # 04.01-04.03 are three CONCURRENT active faults, not a history (p.229). active_fault_2 = { address = 401 } active_fault_3 = { address = 402 } # ABB Drives profile. Control-word values are the manual's own, p.567-568: # start 476h -> 477h -> 47Fh, stop 477h ("stop according to 21.03 Stop mode"). # With 58.14 = Fault the drive trips 6681 EFB comm loss after 58.16 # Communication loss time — the manual gives conflicting defaults for 58.16, # 30.0 s in the parameter listing (p.427) and 3.0 s in the setup table # (p.552); the 300 ms keepalive is conservative under either. [control] command_register = 0 speed_register = 1 speed_scale = 0.005 # write %, 20000 raw = 100% of the active group 46 scaling speed_signed = true # direction IS the sign of the reference here speed_unit = "%" # NOT Hz — percent of the drive's max reference max_ref = 100.0 step_delay = 0.05 stop = [0x0477] run_fwd = [0x0476, 0x0477, 0x047F] # Reset is a RISING EDGE of control-word bit 7 (p.568) laid on top of the # stopped word, not a magic value written to the run register. 0x0480 would # drive OFF1/OFF2/OFF3 low — Emergency OFF / Emergency stop, not a reset. reset = [0x0477, 0x04F7, 0x0477] # run_rev is deliberately absent. On the ABB Drives profile direction comes # from the SIGN OF THE REFERENCE (p.569), so a "reverse" control word would be # byte-identical to forward. Reverse with a negative reference. [control.watchdog] interval_ms = 300 fault = "6681 EFB comm loss" [running_check] register = 3 bit = 2 # RDY_REF / OPERATION ENABLED # 04.01 Tripping fault; stored history is 04.11-04.13 (addresses 410-412), p.229. [faults] register = 400 history = [410, 411, 412] # Fault message table, 3AXD50000047399 Rev G pp.536-548. ABB prints hex codes; # TOML keys must be numeric, so these keys are the decimal equivalents and the # hex is repeated in the text. Warnings (A-codes, pp.522-535) are NOT listed — # they are a different table and are not reported in 04.01. [faults.codes] 0 = "No fault" 4224 = "0x1080 Backup/Restore" 4225 = "0x1081 Rating ID fault" 8976 = "0x2310 Overcurrent" 9008 = "0x2330 Earth leakage" 9089 = "0x2381 IGBT overload" 12592 = "0x3130 Input phase loss" 12673 = "0x3181 Wiring or earth fault" 12816 = "0x3210 DC link overvoltage" 12832 = "0x3220 DC link undervoltage" 13185 = "0x3381 Output phase loss" 13189 = "0x3385 Autophasing" 16656 = "0x4110 Control board temperature" 16912 = "0x4210 IGBT overtemperature" 17040 = "0x4290 Cooling" 17137 = "0x42F1 IGBT temperature" 17168 = "0x4310 Excess temperature" 17280 = "0x4380 Excess temperature difference" 18817 = "0x4981 External temperature 1" 18818 = "0x4982 External temperature 2" 20608 = "0x5080 Fan" 20617 = "0x5089 SMT circuit" 20624 = "0x5090 STO hardware failure" 20625 = "0x5091 Safe torque off" 20626 = "0x5092 PU logic error" 20627 = "0x5093 Rating ID mismatch" 20628 = "0x5094 Measurement circuit" 20632 = "0x5098 I/O communication" 20640 = "0x50A0 Fan" 22146 = "0x5682 Power unit lost" 22161 = "0x5691 Measurement circuit" 22162 = "0x5692 PU board powerfail" 22163 = "0x5693 Measurement circuit" 22167 = "0x5697 Charging feedback" 22168 = "0x5698 Unknown PU fault" 24961 = "0x6181 FPGA version" 25088 = "0x6200 Checksum mismatch" 25350 = "0x6306 FBA A mapping file" 25729 = "0x6481 Task overload" 25735 = "0x6487 Stack overflow" 25761 = "0x64A1 Internal file load" 25764 = "0x64A4 Rating ID fault" 25766 = "0x64A6 Adaptive program" 25777 = "0x64B1 Internal SSW fault" 25778 = "0x64B2 User set fault" 25779 = "0x64B3 Macro parameterization error" 25825 = "0x64E1 Kernel overload" 25985 = "0x6581 Parameter system" 26001 = "0x6591 Backup/Restore" 26017 = "0x65A1 FBA A parameter" 26241 = "0x6681 EFB comm loss" 26242 = "0x6682 EFB config file" 26243 = "0x6683 EFB invalid" 26244 = "0x6684 EFB load fault" 26245 = "0x6685 EFB fault 2" 26246 = "0x6686 EFB fault 3" 26754 = "0x6882 Text 32-bit table" 26757 = "0x6885 Text file overflow" 28801 = "0x7081 Control panel loss" 28802 = "0x7082 I/O module comm loss" 28805 = "0x7085 Incompatible option" 28806 = "0x7086 AI Overvoltage" 28807 = "0x7087 I/O module configuration" 28961 = "0x7121 Motor stall" 28962 = "0x7122 Motor overload" 29059 = "0x7183 BR excess temperature" 29074 = "0x7192 BC IGBT excess temperature" 29456 = "0x7310 Overspeed" 29616 = "0x73B0 Emergency ramp failed" 29680 = "0x73F0 Overfrequency" 29968 = "0x7510 FBA A communication" 32769 = "0x8001 ULC underload fault" 32770 = "0x8002 ULC overload fault" 32928 = "0x80A0 AI supervision" 32944 = "0x80B0 Signal supervision 1" 32945 = "0x80B1 Signal supervision 2" 32946 = "0x80B2 Signal supervision 3" 32947 = "0x80B3 Signal supervision 4" 32948 = "0x80B4 Signal supervision 5" 32949 = "0x80B5 Signal supervision 6" 36993 = "0x9081 External fault 1" 36994 = "0x9082 External fault 2" 36995 = "0x9083 External fault 3" 36996 = "0x9084 External fault 4" 36997 = "0x9085 External fault 5" 54273 = "0xD401 Max cleaning fault" 54276 = "0xD404 Running dry" 54277 = "0xD405 Pipe fill-timeout" 54284 = "0xD40C Cavitation detected" 64129 = "0xFA81 Safe torque off 1" 64130 = "0xFA82 Safe torque off 2" 65377 = "0xFF61 ID run" 65379 = "0xFF63 STO diagnostics" 65409 = "0xFF81 FB A force trip" 65422 = "0xFF8E EFB force trip" [connection] summary = "Use the ACS480 built-in EIA-485 interface at X5 terminals 29-31." warnings = ["Tie shield conductors through at the drive but do not terminate them on SCR; ABB shows shield grounding only at the controller.","Enable bias at one device and termination at the two physical bus ends."] [[connection.methods]] id = "built_in_rs485" title = "Built-in Modbus RTU" transport = "serial" hardware = "built_in" port = "control terminal block X5" connector = "X5:29 B+, 30 A-, 31 DGND; S4 TERM and S5 BIAS" 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 terminal block X5.","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 S4 TERM at bus ends only and S5 BIAS at one device.","Set 58.01 = Modbus RTU and match node, baud, parity and ABB Drives profile.","Select Embedded fieldbus for command/reference sources, configure communication loss, then refresh settings."] warnings = ["Do not land the cable shield on SCR."] source = "ABB ASDKA220x ACS480 firmware manual, pp. 103-106 and 549-554." [[connection.methods.wiring]] adapter = "D+ / B / positive" device = "X5:29 B+" signal = "RS-485 positive" [[connection.methods.wiring]] adapter = "D- / A / negative" device = "X5:30 A-" signal = "RS-485 negative" [[connection.methods.wiring]] adapter = "COM / signal common" device = "X5:31 DGND" signal = "Signal reference" [[connection.methods.wiring]] adapter = "Cable shield" device = "Tie through; ground at controller only" signal = "Shield continuity" required = false