# Property of PMA Electrical Solutions, LLC. # # ABB ACS180 machinery drive, embedded fieldbus interface (EFB), Modbus RTU. # # CLAIMS ONLY THE ACS180. The ACS380 is a different manual and a different # parameter set — no value here was taken from it, and this file must not be # pointed at one. No cross-family claim is made to ACS280/ACS480/ACS580. # # Source: ABB ACS180 machinery control program Firmware manual, # document 3AXD50000467860. Applies to control program 2.21 or later # (manual p.11 "Applicability"). # pp.377-404 chapter 9, Fieldbus control through the embedded fieldbus # interface — setup parameters, control/status word, references, # holding-register map, function codes # p.291 58.33 Addressing mode (the parameter -> register formula) # pp.387-388 Control Word, ABB Drives profile # pp.390-391 Status Word, ABB Drives profile # pp.394-395 state transition diagram and the literal CW sequence example # pp.111-113 group 01 Actual values with the FbEq16 column # p.115 group 04 Warnings and faults (04.01, 04.11-04.13) # pp.277-278 group 46 Monitoring/scaling settings (46.01-46.05 defaults) # pp.365-377 Fault messages table # p.316 99.06 Motor nominal current (group 99 listing, FbEq16 column) # p.129 07.03 Drive rating id (group 07, read-only) — [rating] # # COMMUNICATION PATH: embedded Modbus RTU on the drive's own EIA-485 # terminals (p.379). No option module and no adapter card is involved; this # manual documents no FBA fieldbus adapter for the ACS180. # Hardware note (p.378): on ACS180-04N and early ACS180-04S units the embedded # fieldbus port is shared with the external control panel via jumper J2. # # DRIVE-SIDE SETUP (pp.380-383). Selecting 96.04 Macro select = Modbus RTU sets # most of these; otherwise set them by hand: # 58.01 Protocol enable = Modbus RTU # 58.03 Node address, 58.04 Baud rate, 58.05 Parity # 20.01 Ext1 commands = Embedded fieldbus (start/stop source) # 22.11 Ext1 speed ref1 = EFB ref1 (speed control) # 28.11 Ext1 frequency ref1 = EFB ref1 (frequency control) # 58.06 Communication control = Refresh settings, then 96.07 = Save. # Without the 20.01 / 22.11 / 28.11 sources the drive ACKs Modbus writes to the # control word and reference and silently ignores them. # # ADDRESSING. All addresses below are 0-based Modbus PDU addresses. # The manual uses 6-digit decimal holding-register numbers, so # 0-based address = decimal register - 400001. # Parameters map per 58.33 Addressing mode = Mode 0 (factory default, p.291): # decimal register = 400000 + 100 * group + index # giving 0-based address = 100 * group + index - 1. # worked example, 01.06 Output frequency: # 400000 + 100*1 + 6 = 400106 -> 400106 - 400001 = 105 # worked example, 99.06 Motor nominal current: # 400000 + 100*99 + 6 = 409906 -> 409906 - 400001 = 9905 # If 58.33 is changed from Mode 0 on the unit, every parameter address here is # wrong. Registers 0-13 (the Data I/O slots) are unaffected by 58.33. # # SCALING IS FIELDBUS FbEq16, NOT PANEL DECIMALS, and several points are scaled # by group 46 parameters, so they DEPEND ON DRIVE CONFIGURATION (pp.111-112, # 277-278). 46.01/46.02 defaults are set PER DELIVERY MARKET by 95.20 HW # options word 1 bit 0 (p.322): 50.00 Hz / 1500 rpm on 50 Hz units, 60.00 Hz / # 1800 rpm on 60 Hz units — output_frequency scale is 0.0025 for the former # and 0.003 for the latter. The scales below assume the 50 Hz defaults # 46.02 Frequency scaling = 50.00 Hz (20000 = 46.02) # 46.03 Torque scaling = 100.0% (10000 = 46.03) # 46.04 Power scaling = 1000.00 (10000 = 46.04) # 46.05 Current scaling = 10000 A (10000 = 46.05) # Confirm 46.02-46.05 on the actual unit before trusting these numbers. name = "ABB ACS180" vendor = "ABB" device_type = "vfd" verified = false probe_register = 3 # status word, readable whenever the fieldbus is alive # 58.04 default 19.2 kbps, 58.05 default "8 EVEN 1" (p.380). [serial] baudrate = 19200 parity = "E" stopbits = 1 [monitor] # Default Data I/O mapping, 58.101-58.106 (p.397): CW, Ref1, Ref2, SW, Act1, Act2. control_word = { address = 0, bits = { 0 = "OFF1", 1 = "OFF2_N", 2 = "OFF3_N", 3 = "INHIBIT_OPERATION_N", 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 (p.396) status_word = { address = 3, bits = { 0 = "RDY_ON", 1 = "RDY_RUN", 2 = "RDY_REF", 3 = "TRIPPED", 4 = "OFF_2_INACTIVE", 5 = "OFF_3_INACTIVE", 6 = "SWC_ON_INHIB", 7 = "ALARM", 8 = "AT_SETPOINT", 9 = "REMOTE", 10 = "ABOVE_LIMIT" } } # Group 01 read directly by parameter address, FbEq16 column pp.111-112. output_frequency = { address = 105, signed = true, scale = 0.0025, unit = "Hz" } # 01.06, via 46.02. CONFIG- AND MARKET-DEPENDENT (0.003 on a 60 Hz unit, 95.20 b0). motor_current = { address = 106, scale = 1.0, unit = "A" } # 01.07, via 46.05. CONFIG-DEPENDENT. motor_torque = { address = 109, signed = true, scale = 0.01, unit = "%" } # 01.10, via 46.03. CONFIG-DEPENDENT. dc_voltage = { address = 110, scale = 0.1, unit = "V" } # 01.11, fixed 10 = 1 V output_voltage = { address = 112, unit = "V" } # 01.13, fixed 1 = 1 V output_power = { address = 113, signed = true, scale = 0.1, unit = "kW" } # 01.14, via 46.04. CONFIG-DEPENDENT. # 04.01-04.03 are three CONCURRENT active faults, not a history (p.115). active_fault_2 = { address = 401 } active_fault_3 = { address = 402 } # ABB Drives profile (58.25 default, p.381). Control-word values are the # manual's own sequence example, p.395: 476h -> 477h -> 47Fh to start, # 477h to stop per 21.03 Stop mode. [control] command_register = 0 speed_register = 1 speed_scale = 0.005 # write %, 20000 raw = 100% of 46.01/46.02 (p.396) speed_signed = true # direction IS the sign of the reference here speed_unit = "%" # NOT Hz — percent of the drive's scaled max reference max_ref = 100.0 step_delay = 0.05 # p.395's own words: "Stop: 477h = Stop according to 21.03 Stop mode / 47Eh = # OFF1 ramp stop". 477h is the manual's preferred stop. stop = [0x0477] # The manual's literal start sequence (p.395): 476h -> NOT READY TO SWITCH ON, # then (if MSW bit 0 = 1) 477h -> READY TO SWITCH ON, 47Fh -> OPERATION. run_fwd = [0x0476, 0x0477, 0x047F] # Reset is CW bit 7 rising (p.395, "Rising edge of MCW bit 7") pulsed on top # of the preferred stop word — bit 3 stays low throughout, so no step is a run # command. A bare 0x0480 would drive OFF1/OFF2/OFF3 low, which pp.387-388 flag # as Emergency OFF / Emergency stop, not a reset. reset = [0x0477, 0x04F7, 0x0477] # run_rev is deliberately absent. On the ABB Drives profile there is no reverse # bit in the control word (pp.387-388); direction is the sign of the reference # (p.395, "A negative reference is formed by calculating the two's complement"). # Reverse with a negative reference. # 58.14 Communication loss action = Fault and 58.16 Communication loss time = # 3.0 s by default (p.381), so the master must keep refreshing the control word. [control.watchdog] interval_ms = 300 fault = "6681 EFB comm loss" # SW bit 2 RDY_REF = OPERATION ENABLED (p.390). Bit 8 AT_SETPOINT is NOT used # as the running flag: p.391 defines it as "actual value equals Reference # within tolerance limits", so it reads 0 through the whole acceleration ramp. [running_check] register = 3 bit = 2 # 04.01 Tripping fault; stored history is 04.11-04.13 (p.115). [faults] register = 400 history = [410, 411, 412] # ABB reports faults as hex codes (pp.365-377); TOML keys are the decimals. [faults.codes] 0 = "No fault" 4224 = "0x1080 Backup/Restore timeout" 4225 = "0x1081 Rating ID fault" 8833 = "0x2281 Calibration" 8976 = "0x2310 Overcurrent" 9008 = "0x2330 Earth leakage" 9024 = "0x2340 Short circuit" 9089 = "0x2381 IGBT overload" 12592 = "0x3130 Input phase loss" 12673 = "0x3181 Cross connection" 12816 = "0x3210 DC link overvoltage" 12832 = "0x3220 DC link undervoltage" 13185 = "0x3381 Output phase loss" 13189 = "0x3385 Autophasing" 16656 = "0x4110 Control board temperature" 17168 = "0x4310 Excess temperature" 18817 = "0x4981 External temperature 1" 20624 = "0x5090 STO hardware failure" 20625 = "0x5091 Safe torque off" 20626 = "0x5092 PU logic error" 20627 = "0x5093 Rating ID mismatch" 20628 = "0x5094 Measurement circuit temperature" 20632 = "0x5098 I/O communication loss" 20640 = "0x50A0 Fan" 22145 = "0x5681 PU communication" 22146 = "0x5682 Power unit lost" 22160 = "0x5690 PU communication internal" 22161 = "0x5691 Measurement circuit ADC" 22162 = "0x5692 PU board powerfail" 22163 = "0x5693 Measurement circuit DFF" 22166 = "0x5696 PU state feedback" 25088 = "0x6200 Checksum mismatch" 25729 = "0x6481 Task overload" 25735 = "0x6487 Stack overflow" 25761 = "0x64A1 Internal file load" 25766 = "0x64A6 Adaptive program" 25778 = "0x64B2 User set fault" 25825 = "0x64E1 Kernel overload" 25985 = "0x6581 Parameter system" 26241 = "0x6681 EFB comm loss" 26242 = "0x6682 EFB config file" 26243 = "0x6683 EFB invalid parameterization" 26244 = "0x6684 EFB load fault" 26245 = "0x6685 EFB fault 2" 26246 = "0x6686 EFB fault 3" 26754 = "0x6882 Text 32-bit table overflow" 26757 = "0x6885 Text file overflow" 28801 = "0x7081 Control panel loss" 28802 = "0x7082 I/O module comm loss" 28806 = "0x7086 I/O module AI overvoltage" 28961 = "0x7121 Motor stall" 28962 = "0x7122 Motor overload" 29059 = "0x7183 BR excess temperature" 29456 = "0x7310 Overspeed" 29616 = "0x73B0 Emergency ramp failed" 29680 = "0x73F0 Overfrequency" 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" 64129 = "0xFA81 Safe torque off 1" 64130 = "0xFA82 Safe torque off 2" 65377 = "0xFF61 ID run" 65422 = "0xFF8E EFB force trip" # 0x64A6 Adaptive program carries a set of auxiliary sub-codes (000A, 000C, # 000E, 0011, 0012, 001C, 001E, 0023, 0024, Other) that are not independent # fault codes and are therefore not listed. # 07.03 Drive rating id — "Type of the drive/inverter unit", group 07 System # info, "All parameters in this group are read-only" (p.129; additional data # p.336: List, 1=1). A drive-HARDWARE identity, used as an opaque equality # guard. 0-based = 100*7 + 3 - 1 = 702. # 99.06 Motor nominal current was REJECTED as the guard: the manual prints two # mutually exclusive 16-bit scalings for it — the group-99 FbEq16 cell reads # "1 = 0.01 A (see par. 46.05)" (p.316) while 46.05 itself (default 10000 A = # 10000 counts, p.277) implies 1 = 1 A — and nothing in the document resolves # them. An ambiguous scale on a restore guard is worse than none; 07.03 needs # no scale at all. [rating] register = 702 words = 1 scale = 1.0 unit = "" label = "Drive rating id (07.03)" # NOT INCLUDED: no [parameters] ranges. Mode 0 places 16-bit parameters at # 400101-409999 (0-based 100-9998), but this manual publishes no consolidated # writable-parameter table, and the per-parameter writability is only marked # inline across the ~250-page parameter chapter. A guessed range on a # clone/restore corrupts a replacement drive, so the section is omitted rather # than approximated. [connection] summary = "Use the ACS180 built-in EIA-485 terminals 25-28 for Modbus RTU." warnings = ["On ACS180-04N and early ACS180-04S units, J2 selects between the external panel and Modbus; the two cannot share the port."] [[connection.methods]] id = "built_in_rs485" title = "Built-in Modbus RTU" transport = "serial" hardware = "built_in" port = "EIA-485 terminals 25-28" connector = "25 B+, 26 A-, 27 AGND, 28 SHIELD; J1 termination" 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 EIA-485 terminals 25-28.","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 = ["If fitted, set J2 to Modbus and use J1 termination only at a bus end.","Set 58.01 = Modbus RTU, node, baud, parity and ABB Drives profile.","Select Embedded fieldbus for command/reference sources and refresh the settings."] warnings = [] source = "ABB 3AXD50000467860, pp. 37-38 and 377-383." [[connection.methods.wiring]] adapter = "D+ / B / positive" device = "25 B+" signal = "RS-485 positive" [[connection.methods.wiring]] adapter = "D- / A / negative" device = "26 A-" signal = "RS-485 negative" [[connection.methods.wiring]] adapter = "COM / signal common" device = "27 AGND" signal = "Signal reference" [[connection.methods.wiring]] adapter = "Cable shield" device = "28 SHIELD" signal = "Shield" required = false