# Property of PMA Electrical Solutions, LLC. # # ABB ACS530 ONLY, standard control program, embedded fieldbus interface (EFB) # Modbus RTU on the drive's own EIA-485 terminal X5 — no option module needed. # # NOT CLAIMED: ACH531 / ACQ531 or any other sibling. The manual used here is the # ACS530 firmware manual and it does not state that it covers those products, so # they get no coverage from this file. The FSCA-01 / FBA-A adapter path (groups # 50-53) also exists on this drive but is NOT mapped here — this file describes # the embedded interface only. # # Source: ABB "ACS530 standard control program Firmware manual", # document 3AXD50000728268 EN rev E (2023-02-09), library.e.abb.com (file # EN_ACS530_FW_E_A5.pdf); printed page == PDF page, offset 0. # pp. 332-337 Modbus holding register map, function codes, coils # pp. 321-329 ABB Drives profile control word, status word, state diagram # pp. 276-281 group 58 embedded-fieldbus parameters, addressing modes # pp. 133-137 group 01 actual values, group 04 warnings and faults # p. 142 06.16 Drive status word 1 bits # pp. 265-266 group 46 fieldbus scaling parameters # pp. 308-309 group 99 motor data # pp. 364-372 fault message table # # Drive-side setup (pp. 314-316) — without these the drive ACKs writes and then # ignores them: # 58.01 = Modbus RTU, 58.03 node address, 58.04 baud, 58.05 parity, # 58.25 = ABB Drives (default), 58.33 = Mode 0 (default), # then 58.06 = Refresh settings to apply. # 20.01 / 20.02 = Embedded fieldbus (command source) # 28.11 / 28.15 = EFB reference 1 (frequency reference source) # 96.07 = Save to persist fieldbus-written parameters. # 58.14 = Fault + 58.16 timeout, to trip on comm loss instead of running on. # # Addressing, 58.33 = Mode 0 (factory default), 16-bit parameters, p.280: # Modbus 1-based holding register = 400000 + 100*group + index # 0-based protocol address = that - 400001 = 100*group + index - 1 # worked: 01.06 Output frequency -> 100*1 + 6 - 1 = 105 (400106) # 04.01 Active fault -> 100*4 + 1 - 1 = 400 (400401) # 99.06 Motor nom current-> 100*99 + 6 - 1 = 9905 (409906) # 32-bit parameters use a DIFFERENT Mode 0 formula (420000 + 200*group + # 2*index, p.280). No point in this file uses it — every point here is 16-bit. # Registers 400001-400006 (0-based 0-5) are the fixed CW/REF/SW/ACT area, p.332. # # SCALING IS FIELDBUS (FbEq16), NOT PANEL DECIMALS, and several of these are # defined by group 46 parameters, so they are CONFIGURATION-DEPENDENT. The # values below assume the factory defaults 46.02 = 50.00 Hz, 46.03 = 100.0%, # 46.04 = 1000.0 kW, 46.05 = 10000 A (p.265-266). Confirm group 46 on the actual # unit before trusting any converted number. name = "ABB ACS530" vendor = "ABB" device_type = "vfd" verified = false probe_register = 3 # 400004 status word, readable whenever the fieldbus is alive # 58.04 default 19.2 kbps, 58.05 default "8 EVEN 1" (p.276). [serial] baudrate = 19200 parity = "E" stopbits = 1 [monitor] # Control word / status word bits per pp. 321-322, 325. control_word = { address = 0, bits = { 0 = "OFF1", 1 = "OFF2_N", 2 = "OFF3_N", 3 = "RUN", 4 = "RAMP_OUT_ZERO_N", 5 = "RAMP_HOLD_N", 6 = "RAMP_IN_ZERO_N", 7 = "RESET", 10 = "REMOTE_CMD", 11 = "EXT_CTRL_LOC" } } reference_1 = { address = 1, signed = true, scale = 0.005, unit = "%" } # 20000 = 46.02 (EFB references, p.330; 46.07 p.265 corroborates) 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" } } # 01.06, scaled by 46.02 (default 20000 = 50.00 Hz). CONFIG-DEPENDENT. output_frequency = { address = 105, signed = true, scale = 0.0025, unit = "Hz" } # 01.07 FbEq16 "1 = 1 A" (p.133), consistent with 46.05 default 10000 A = 10000. motor_current = { address = 106, scale = 1.0, unit = "A" } # 01.10, scaled by 46.03 (default 10000 = 100.0%). CONFIG-DEPENDENT. motor_torque = { address = 109, signed = true, scale = 0.01, unit = "%" } dc_voltage = { address = 110, scale = 0.1, unit = "V" } # 01.11, 10 = 1 V (p.133) output_voltage = { address = 112, unit = "V" } # 01.13, 1 = 1 V (p.133) # 01.14, scaled by 46.04 (default 10000 = 1000.0 kW). CONFIG-DEPENDENT, and # the unit is kW or hp per 96.16. The group-01 "1 = 1 unit" (p.133) is the # parameter's own unit resolution; 46.43 Power decimals states outright that # the 16-bit fieldbus scaling is 46.04 (p.266), which is what applies here. output_power = { address = 113, signed = true, scale = 0.1, unit = "kW" } # 06.16 Drive status word 1 (p.142) — bit 6 is the real "modulating" bit. drive_status_word_1 = { address = 615, bits = { 0 = "ENABLED", 1 = "INHIBITED", 2 = "DC_CHARGED", 3 = "READY_TO_START", 4 = "FOLLOWING_REF", 5 = "STARTED", 6 = "MODULATING", 7 = "LIMIT", 8 = "LOCAL", 9 = "NETWORK_CTRL", 10 = "EXT1_ACTIVE", 11 = "EXT2_ACTIVE", 13 = "START_REQUEST" } } # 04.01-04.03 are three CONCURRENT active faults, not a history (p.136). active_fault_2 = { address = 401 } active_fault_3 = { address = 402 } # ABB Drives profile (58.25 default). The master must keep refreshing the # control word or the drive trips 6681 once 58.16 expires. [control] command_register = 0 speed_register = 1 speed_scale = 0.005 # write %, 20000 raw = the value of 46.02 / 46.01 speed_signed = true # direction is the two's-complement sign of the reference (p.330) speed_unit = "%" # NOT Hz — percent of the group-46 scaled value max_ref = 100.0 step_delay = 0.05 # Derived from the state transition diagram, pp. 328-329. The manual gives bit # patterns, not literal constants: # READY TO SWITCH ON CW = xxxx x1xx xxxx x110 (OFF2, OFF3 held, OFF1 low) # READY TO OPERATE CW = xxxx x1xx xxxx x111 (bit0) # OPERATION ENABLED CW = xxxx x1xx xxxx 1111 (bit3), then bits 4,5,6 # with bit10 REMOTE_CMD set throughout. That is 0x0476 stopped and 0x047F # running — byte-identical to the already-shipped abb_acs580.toml sequences for # the same profile, which is the cross-check that these were held to. stop = [0x0476] run_fwd = [0x0476, 0x047F] # Reset is bit 7 rising ON TOP of the normal 0x0476 pattern (p.321). Do not use # a value that drives OFF1/OFF2/OFF3 low — the manual flags those as # Emergency-OFF / Emergency-stop, not as a reset. reset = [0x0476, 0x04F6, 0x0476] # run_rev is deliberately absent: the ABB Drives control word has no direction # bit (pp.321-322; the DCU CW bit 2 REVERSE is "Not yet implemented", p.322), # and references are signed 16-bit two's complement (p.330), so a "reverse" # control word would be byte-identical to forward. Reverse with a negative # reference. # 58.16 Communication loss time is stated inconsistently by this manual: 60.0 s # in the parameter table (p.279) and 30.0 s in the setup procedure (p.314). # Neither is a usable keepalive period; set 58.16 explicitly on the drive and # keep the control word refreshing far faster than it. [control.watchdog] interval_ms = 300 fault = "6681 EFB Communication loss" # 06.16 bit 6 "Modulating" (p.142). Status-word bit 8 AT_SETPOINT means "at # reference", not "running", and bit 2 means OPERATION ENABLED — neither one # proves the output stage is live. [running_check] register = 615 bit = 6 # 04.01 active fault; stored history is 04.11-04.13 (p.136-137). [faults] register = 400 history = [410, 411, 412] # Fault message table, pp. 364-372. ABB reports hex codes; TOML keys must be # numeric, so these are the decimal equivalents with the hex in the text. # Warning codes (Axxx / Bxxx, pp. 355-363) are deliberately not listed — they # appear in 04.06-04.08, not in 04.01. [faults.codes] 0 = "No fault" 4224 = "0x1080 Backup/Restore" 4225 = "0x1081 Rating ID fault" 8976 = "0x2310 Over current" 9008 = "0x2330 Earth leakage" 9024 = "0x2340 Short circuit" 9089 = "0x2381 IGBT overload" 12592 = "0x3130 Supply phase loss" 12673 = "0x3181 Cross connection" 12816 = "0x3210 DC bus overvoltage" 12832 = "0x3220 DC bus undervoltage" 12928 = "0x3280 Standby time-out" 13185 = "0x3381 Output phase loss" 16384 = "0x4000 Motor cable overload" 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" 17281 = "0x4381 PCB plate cooling" 18817 = "0x4981 Ext Tmp 1" 18818 = "0x4982 Ext Tmp 2" 20608 = "0x5080 Fan" 20609 = "0x5081 Auxiliary fan broken" 20624 = "0x5090 STO hardware failure" 20625 = "0x5091 Safe torque off" 20626 = "0x5092 PU logic error" 20627 = "0x5093 Rating ID mismatch" 20628 = "0x5094 Measurement circuit" 20629 = "0x5095 Redundant measurement" 20640 = "0x50A0 Fan" 22145 = "0x5681 PU communication" 22146 = "0x5682 Power unit lost" 22160 = "0x5690 PU internal communication" 22161 = "0x5691 Measurement circuit" 22162 = "0x5692 PU board powerfail" 22163 = "0x5693 Measurement circuit" 22166 = "0x5696 PU state feedback" 22167 = "0x5697 Charging feedback" 22168 = "0x5698 Unknown power fault" 24576 = "0x6000 Internal software error" 24961 = "0x6181 FPGA version" 25350 = "0x6306 FBA A mapping file" 25729 = "0x6481 Task overload" 25735 = "0x6487 Stack overflow" 25761 = "0x64A1 Internal file load" 25778 = "0x64B2 User group fault" 25779 = "0x64B3 Macro" 25825 = "0x64E1 Kernel overload" 25985 = "0x6581 Parameter system" 26017 = "0x65A1 FBA A parameter" 26241 = "0x6681 EFB Communication loss" 26242 = "0x6682 EFB profile" 26243 = "0x6683 EFB invalid configuration" 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 Expansion I/O" 28806 = "0x7086 AI overvoltage" 28961 = "0x7121 Motor stall" 29057 = "0x7181 Brake resistor" 29059 = "0x7183 Brake resistor overheated" 29060 = "0x7184 Brake resistor wiring" 29073 = "0x7191 Short circuit in brake chopper" 29074 = "0x7192 Brake chopper IGBT" 29105 = "0x71B1 Motor fan" 29616 = "0x73B0 Emergency ramp failed" 29968 = "0x7510 FBA A communication" 32769 = "0x8001 ULC underload fault" 32770 = "0x8002 ULC overload fault" 32928 = "0x80A0 AI supervision" 32944 = "0x80B0 Signal supervision" 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" 65409 = "0xFF81 FB A force trip" 65422 = "0xFF8E EFB force trip" # 99.06 Motor nominal current, 0-based 9905 (409906). # The two printed scalings are NOT a contradiction — they are different access # widths: p.308's "1 = 1 A" is the Def/FbEq16 column (this 16-bit register); # p.128's "10 = 1 A" is the FbEq32 column of the summary table, i.e. the # 32-bit address space this file does not use. 46.44 Current decimals (p.267, # default 1 decimal) reconciles them, and 46.05 (default 10000 A = 10000 # counts, p.266) agrees with the FbEq16 side. Reads whole amps only — a 4.5 A # motor reads 4. [rating] register = 9905 words = 1 scale = 1.0 unit = "A" label = "Motor nominal current" # No [parameters] ranges. The parameter-list group headers (p.133 group 01, # p.136 groups 03/04, p.144 group 07: "All parameters in this group are # read-only") mark groups 01/03/04/05/06/07 read-only and group 58 as the comm configuration that must # not be cloned, but it publishes no per-group writable index span, and the # ~250-page parameter list was not enumerated. A clone range is a guess until # that is read, so it is left out rather than invented. [connection] summary = "Use the ACS530 built-in Modbus RTU interface at X5 terminals 29-31." warnings = ["Enable termination at the two bus ends and bias at one device only."] [[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; S100 TERM and S200 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 S100 TERM at bus ends and S200 BIAS at one device.","Set 58.01 = Modbus RTU and match 58.03/58.04/58.05.","Select Embedded fieldbus for command/reference sources and refresh the settings."] warnings = [] source = "ABB ACS530 firmware manual, pp. 31-32 and 312-316." [[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"