# Property of PMA Electrical Solutions, LLC. # # ABB ACS800 running the STANDARD CONTROL PROGRAM 7.x, controlled through an # RMBA-01 Modbus Adapter module. # # NOT CLAIMED: the ACS800 System Application Program, the Pump Control / # Master-Follower / Crane / any other ACS800 application program, and no other # ABB family (ACS600, ACS550, ACS580, ACS880). The ABB Drives profile control # and status word LAYOUT is shared across ABB's portfolio, but the actual # signal indexes, the fault-word bit names, the group 52 defaults and the # rating parameter in this file were read out of the ACS800 Standard Control # Program manual and are claimed for that program alone. The RMBA-01 manual # states its own compatibility limit: "The RMBA-01 is compatible with ACS 800 # Standard Application Program version ASXR7000 or later" (RMBA-01 manual # p. 2-3). Below ASXR7000 nothing in this file applies. # # COMMUNICATION PATH — OPTION MODULE, NOT EMBEDDED. # The ACS800 has no built-in Modbus port. An RMBA-01 Modbus Adapter installed # in SLOT 1 or 2 of the drive's RMIO board forms the "Standard Modbus Link" # (firmware manual p. 195). RTU ONLY — "The RMBA-01 supports the RTU protocol # only" (RMBA-01 manual p. 2-1). Two-wire shielded RS-485, built-in active # termination, up to 247 stations (RMBA-01 manual p. A-2, Appendix A - # Technical data). NOTE the two PDFs number pages differently: the firmware # manual's PDF index equals the printed page, but the RMBA-01 manual's printed # pages are chapter-relative (2-1, 5-1, A-2). # # SOURCES — primary ABB documentation only: # [FW] ACS800 Standard Control Program 7.x Firmware Manual, # 3AFE64527592 REV L EN, effective 2011-08-25. # manuals/abb_acs800_std_ctrl_program_firmware_3AFE64527592.pdf # [RMBA] RMBA-01 Modbus Adapter Module User's Manual, # 3AFE 64498851 REV A EN, effective 1.3.2002. # manuals/abb_acs800_rmba01_modbus_3AFE64498851.pdf # Page ranges each section came from (PRINTED pages; front matter offset is 0 # in these two files — the PDF page index equals the printed page): # [FW] p. 195 Standard Modbus Link setup, group 52 parameters # [FW] p. 196 fixed Control/Status/Reference/Actual register map # [FW] pp. 199-201 drive control parameters (10.xx, 11.xx, 16.xx, 30.xx, 92.xx) # [FW] p. 202 data set structure and 6 ms / 100 ms update rates # [FW] pp. 210-214 ABB Drives profile: 03.01 CW, 03.02 SW, state machine, # reference scaling # [FW] pp. 220-221 03.05 FAULT WORD 1 / 03.06 FAULT WORD 2 bit tables # [FW] p. 233, 241 COMM MODULE (7510) fault-tracing entry # [FW] p. 129 16.07 PARAMETER SAVE (fieldbus writes are volatile) # [FW] p. 188 99.06 MOTOR NOM CURRENT # [FW] pp. 255 group 01 actual signals with the FbEq scaling column # [FW] pp. 263 factory-default table for group 52 # [RMBA] pp. 5-1..5-3 4xxxx register mapping, exception codes, function codes # # DRIVE-SIDE SETUP. Without these the drive ACKs writes and ignores them: # 98.02 COMM PROT SEL = STD MODBUS activates the Standard Modbus Link and # the group 52 parameters ([FW] p. 195) # 98.07 COMM PROFILE = ABB DRIVES REQUIRED for this profile. The control # words below are the ABB Drives profile; # under GENERIC or CSA 2.8/3.0 they are # wrong ([FW] p. 195, p. 210). # 52.01 STATION NUMBER = 1..247 (default 1) # 52.02 BAUDRATE = 600..19200 (default 9600) # 52.03 PARITY = ODD/EVEN/NONE1STOPBIT/NONE2STOPBIT (default ODD) # 10.01 EXT1 (or 10.02 EXT2) = COMM.CW fieldbus Control Word commands # 11.02 EXT1/EXT2 SEL = COMM.CW only if CW bit 11 is to pick EXT1/EXT2 # 11.03 REF1 SELECT = COMM.REF1 fieldbus REF1 becomes the reference # 16.01 RUN ENABLE = COMM.CW so CW bit 3 also drives Run Enable # 16.04 FAULT RESET SEL= COMM.CW enables CW bit 7 reset (automatic when # 10.01/10.02 = COMM.CW, [FW] p. 200) # 30.18 COMM FLT FUNC / 30.19 MAIN REF DS T-OUT — see the watchdog note below # # ADDRESSING FORMULA — 0-BASED PROTOCOL ADDRESSES THROUGHOUT, never 4xxxx. # [RMBA] p. 5-1 publishes the Modicon 4xxxx mapping and [RMBA] Table 5-1 gives # the layout: registers are 4GGPP, where GG is the drive parameter group and PP # the parameter index within it; 40001-40096 are the data sets and 40101-49999 # the parameters. Modbus holding-register 40001 is protocol address 0, so: # 0-based = (4xxxx number) - 40001 = 100 * group + index - 1 # Worked examples: # 01.04 CURRENT -> 40104 - 40001 = 100*1 + 4 - 1 = 103 # 03.05 FAULT WORD 1 -> 40305 - 40001 = 100*3 + 5 - 1 = 304 # 99.06 MOTOR NOM CURRENT -> 49906 - 40001 = 100*99 + 6 - 1 = 9905 # The fixed fast data sets are the GG=00 case of the same table ([FW] p. 196): # 40001 Control Word -> 0 40004 Status Word -> 3 # 40002 Reference 1 -> 1 40005 Actual 1 -> 4 (selected by 92.02) # 40003 Reference 2 -> 2 40006 Actual 2 -> 5 (selected by 92.03) # Addresses with no matching parameter are invalid; the RMBA-01 answers with a # Modbus exception ([RMBA] p. 5-2, Table 5-2: 02 ILLEGAL DATA ADDRESS for a # non-existent or write-protected address, 03 ILLEGAL DATA VALUE for a # read-only parameter or an out-of-limits value). Supported function codes are # 03, 06 and 16 on the 4x holding space ([RMBA] p. 5-3, Table 5-3). # # CONFIGURATION-DEPENDENT, do not treat any of this as fixed: # - REF1 scaling is 20000 = parameter 11.05 EXT REF1 MAXIMUM ([FW] p. 214), # and the final reference is then limited by 20.01/20.02 (speed) or # 20.07/20.08 (frequency). This profile therefore writes PERCENT, which is # what the register actually takes; it is NOT Hz, and a commanded 100% is # not necessarily 100% of the motor's capability. # - 01.02 SPEED is scaled 20000 = 100% of the motor's absolute maximum speed # ([FW] p. 255), which comes from the group 99 motor data. 01.05 TORQUE and # 01.06 POWER are percent of motor NOMINAL torque/power, same origin. These # are fieldbus (FbEq) scalings, not panel decimals. # - Registers 4 and 5 (Actual 1 / Actual 2) carry whatever parameters 92.02 # and 92.03 point at. Factory defaults ARE published ([FW] p. 265, all # five macros): 92.02 = 102 (01.02 SPEED) and 92.03 = 105 (01.05 TORQUE). # They are still DELIBERATELY ABSENT from [monitor] because a commissioned # site can repoint them — the monitor points below address the group 01 # actual signals directly through the 40101-49999 mapping, which cannot be # repointed. Trade-off: registers 0-5 update every 6 ms while the # parameter addresses are on the slower parameter update interval # ([FW] p. 202; [RMBA] p. 5-3). name = "ABB ACS800" vendor = "ABB" device_type = "vfd" verified = false probe_register = 3 # 40004 Status Word, readable whenever the link is alive # Group 52 factory defaults, [FW] p. 263. 52.03 ODD = "Odd parity indication # bit, one stop bit" ([FW] p. 166). [serial] baudrate = 9600 parity = "O" stopbits = 1 [monitor] # Fixed data set registers, [FW] p. 196; bit names from [FW] pp. 211-212. 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 = "INCHING_1", 9 = "INCHING_2", 10 = "REMOTE_CMD", 11 = "EXT_CTRL_LOC" } } reference_1 = { address = 1, signed = true, scale = 0.005, unit = "%" } # 20000 = par 11.05 # 20000 = par 11.08 ONLY under the FACTORY / HAND-AUTO / SEQ CTRL macros; a # T-CTRL, M/F or PID-CTRL drive scales REF2 as a torque/PID reference at # 10000 = par 11.08 (scale 0.01) instead ([FW] p. 214). reference_2 = { address = 2, signed = true, scale = 0.005, unit = "%" } 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", 11 = "EXT_CTRL_LOC", 12 = "EXT_RUN_ENABLE", 15 = "CH0_COMM_ERR" } } # Bit 15 reports a communication error on fibre optic channel CH0 (the # RDCO/DDCS Nxxx-adapter channel, [FW] p. 212) — NOT the RMBA-01 Standard # Modbus Link this profile uses. A Modbus timeout surfaces as 03.06 FAULT # WORD 2 bit 12 COMM MODULE (7510) instead ([FW] p. 241); a clean bit 15 says # nothing about the Modbus link. # Group 01 ACTUAL SIGNALS, addressed as parameters. Index and FbEq scaling from # the actual-signal table, [FW] p. 255. motor_speed = { address = 101, signed = true, scale = 0.005, unit = "%" } # 01.02, 20000 = 100% of motor abs. max speed output_frequency = { address = 102, signed = true, scale = 0.01, unit = "Hz" } # 01.03, 100 = 1 Hz motor_current = { address = 103, scale = 0.1, unit = "A" } # 01.04, 10 = 1 A motor_torque = { address = 104, signed = true, scale = 0.01, unit = "%" } # 01.05, 10000 = 100% of motor nom. torque output_power = { address = 105, signed = true, scale = 0.1, unit = "%" } # 01.06, 1000 = 100% of motor nom. power dc_voltage = { address = 106, scale = 1.0, unit = "V" } # 01.07, 1 = 1 V mains_voltage = { address = 107, scale = 1.0, unit = "V" } # 01.08, 1 = 1 V output_voltage = { address = 108, scale = 1.0, unit = "V" } # 01.09, 1 = 1 V drive_temp = { address = 109, scale = 0.1, unit = "%" } # 01.10 ACS800 TEMP, 10 = 1% — PERCENT of the # trip limit, not degrees # Numeric fieldbus fault codes, [FW] p. 103 (additional data p. 257): latest_fault = { address = 319 } # 03.20 LATEST FAULT fault_2 = { address = 320 } # 03.21 2. LATEST FAULT fault_3 = { address = 321 } # 03.22 3. LATEST FAULT fault_4 = { address = 322 } # 03.23 4. LATEST FAULT fault_5 = { address = 323 } # 03.24 5. LATEST FAULT latest_warning = { address = 324 } # 03.25 LATEST WARNING # 03.06 FAULT WORD 2, [FW] p. 221. Bit 3 is reserved and is omitted. fault_word_2 = { address = 305, bits = { 0 = "SUPPLY PHASE", 1 = "NO MOT DATA", 2 = "DC UNDERVOLT", 4 = "RUN ENABLE", 5 = "ENCODER ERR", 6 = "I/O COMM", 7 = "CTRL B TEMP", 8 = "EXTERNAL FLT", 9 = "OVER SWFREQ", 10 = "AI < MIN FUNC", 11 = "PPCC LINK", 12 = "COMM MODULE", 13 = "PANEL LOSS", 14 = "MOTOR STALL", 15 = "MOTOR PHASE" } } # 03.07 SYSTEM FAULT WORD and 03.08 ALARM WORD 1, [FW] pp. 222. Read as raw # words; bit 7 SYSTEM_FAULT of FAULT WORD 1 points at 03.07. system_fault_word = { address = 306 } alarm_word_1 = { address = 307 } # ABB Drives profile, Control Word at 40001 -> 0-based 0 ([FW] p. 196, p. 210). # The state machine ([FW] p. 213, Figure 1) prints the transitions literally: # READY TO SWITCH ON needs CW = xxxx x1xx xxxx x110 # READY TO OPERATE needs CW = xxxx x1xx xxxx x111 # OPERATION ENABLED needs CW = xxxx x1xx xxx1 1111 and SW bit 12 = 1 # OPERATING needs CW = xxxx x1xx x111 1111 # 0x0476 = bits 1,2,4,5,6,10 — every interlock released, OFF1 (bit 0) low, so # the drive sits in READY TO SWITCH ON. 0x047F adds bits 0 and 3, which is the # full OPERATING word. NOTE: the manual does not print these as literal hex; # they are the sum of the documented per-bit meanings on [FW] p. 211 and the # bit patterns on p. 213. VERIFY ON A BENCH BEFORE TRUSTING THEM. # Bit 10 REMOTE_CMD must be 1 or the drive retains the last Control Word and # reference instead of taking the new one ([FW] p. 211). [control] command_register = 0 speed_register = 1 speed_scale = 0.005 # write %, 20000 raw = 100% of par 11.05 ([FW] p. 214) speed_signed = true # direction IS the sign of the reference speed_unit = "%" # NOT Hz — percent of 11.05, whatever the site set it to max_ref = 100.0 step_delay = 0.05 stop = [0x0476] # OFF1 low -> ramp stop on 22.03/22.05, [FW] p. 211 run_fwd = [0x0476, 0x047F] # Reset is control-word BIT 7 on a 0->1 EDGE ([FW] p. 211), not a separate # register, so there is no reset_register here. The edge is raised on top of # the normal 0x0476 idle word: 0x04F6 sets bit 7 while OFF1/OFF2/OFF3 stay # released. A "reset value" that dropped bit 1 or bit 2 would be an Emergency # OFF (coast to stop) or an Emergency stop, which [FW] p. 211 carries an # explicit Warning against. reset = [0x0476, 0x04F6, 0x0476] # run_rev is deliberately absent. On the ABB Drives profile direction comes # from the SIGN OF THE REFERENCE ([FW] p. 214 reference scaling, -20000 = # -[par 11.05]; direction control is gated by 10.03 FORWARD/REVERSE/REQUEST, # [FW] p. 199), so a "reverse" control word would be byte-identical to forward. # Reverse with a negative reference and 10.03 set to REVERSE or REQUEST. # 30.18 COMM FLT FUNC DEFAULTS TO FAULT and 30.19 MAIN REF DS T-OUT to 3.00 s # ([FW] p. 261 default table), so out of the box this drive DOES trip on comm # loss — the master must keep refreshing the Main Reference data set. The fault # is COMM MODULE, fieldbus code 7510, also 03.06 FAULT WORD 2 bit 12 # ([FW] p. 241). 500 ms is well inside the 3 s window; shorten it if the site # has lowered 30.19. [control.watchdog] interval_ms = 500 fault = "7510 COMM MODULE (30.18 COMM FLT FUNC, timeout 30.19)" # Status word bit 2 RDY_REF = OPERATION ENABLED — the bit the state machine # ([FW] p. 213) sets on the run transition and clears on OFF1/OFF2/OFF3 # ([FW] p. 212). Bit 8 AT_SETPOINT is stricter ("actual equals reference within # 10% of nominal motor speed") and would read false during acceleration. # BLIND SPOT: an accepted stop word clears CW bit 3, which forces OPERATION # INHIBITED and drops SW bit 2 immediately — the read-back reports STOPPED # while the motor may still be decelerating on a long 22.03/22.05 ramp. The # guard's purpose (catching a drive that ignores the serial port, where bit 2 # stays 1) is unaffected. No MAIN STATUS WORD bit reports shaft motion; the # nearest, 03.03 bit 11 ZERO SPEED, is inverted and the schema has no invert. [running_check] register = 3 bit = 2 # NUMERIC FAULT CODES exist as parameters: 03.20 LATEST FAULT ("Fieldbus code # of the latest fault") through 03.24, plus 03.25 LATEST WARNING ([FW] p. 103, # confirmed in the additional-data table p. 257). They are mapped as MONITOR # points above, NOT as [faults].history — with bitfield = true every history # target would be decoded with FAULT WORD 1's bit names, turning code 7510 # into a list of unrelated fault flags. The honest remaining gap is the CODES # table: the fault tracing chapter ([FW] pp. 232-246) prints the 4-digit codes # only alongside panel message text and was not transcribed into a numeric # table here; do not fill one in from memory. # # 03.05 FAULT WORD 1 -> 100*3 + 5 - 1 = 304. Bits 10-15 are reserved. # Bit 7 SYSTEM_FAULT means "a fault is indicated by 03.07 SYSTEM FAULT WORD" # ([FW] p. 220) — read the system_fault_word monitor point for the detail. [faults] register = 304 bitfield = true bits = { 0 = "SHORT CIRC", 1 = "OVERCURRENT", 2 = "DC OVERVOLT", 3 = "ACS800 TEMP", 4 = "EARTH FAULT", 5 = "THERMISTOR", 6 = "MOTOR TEMP", 7 = "SYSTEM_FAULT (see 03.07)", 8 = "UNDERLOAD", 9 = "OVERFREQ" } # 99.06 MOTOR NOM CURRENT, "Defines the nominal motor current. Must be equal to # the value on the motor rating plate", FbEq "1 = 0.1 A" ([FW] p. 188). # Address 100*99 + 6 - 1 = 9905 by the [RMBA] p. 5-1 mapping. [rating] register = 9905 words = 1 scale = 0.1 unit = "A" label = "99.06 MOTOR NOM CURRENT" # NO [parameters] BLOCK, DELIBERATELY, even though [RMBA] p. 5-1 documents the # address mapping for every group 01-99 / index 01-99. Two reasons out of the # manuals themselves: # 1. [FW] p. 129, parameter 16.07 PARAMETER SAVE: "A new parameter value of a # standard macro is saved automatically when changed from the panel but # NOT when altered through a fieldbus connection." A restore that swept a # range would leave the drive looking correct until the next power cycle — # the worst possible failure mode for a drive-replacement clone. Doing # this safely needs a 16.07 = SAVE write inside the restore sequence, and # this profile format has no place for one. # 2. [RMBA] p. 5-1 states only that "some parameters never allow writing # (e.g. actual values), some parameters allow writing only when the drive # is stopped". Neither manual publishes a group-by-group writable/ # read-only table, and groups 01/03/04 are read-only actual signals living # inside the same address mapping. A blind range sweep would write into # read-only addresses and stall on exception 03. Enumerating the valid # indexes means transcribing the whole parameter chapter and verifying # each on a bench; that has not been done. [connection] summary = "The ACS800 requires an RMBA-01 Modbus adapter installed in RMIO slot 1 or 2." warnings = ["The RMBA built-in termination is active and works only while the module is powered.","Correct installation of the module screws is required for EMC and proper operation."] [[connection.methods]] id = "rmba_01_rs485" title = "RMBA-01 Standard Modbus Link" transport = "serial" hardware = "option" port = "RMBA-01 terminal block X1 in RMIO slot 1 or 2" connector = "X1:1 A data negative, 2 B data positive, 3 DG data ground, 4 SHLD; S1 termination" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded twisted pair; a third DG conductor is strongly recommended" parts = ["ABB RMBA-01","Isolated USB-to-RS-485 adapter","Shielded twisted pair plus data ground"] steps = ["Lock out the drive and wait for the DC bus to discharge.","Insert RMBA-01 into RMIO slot 1 or 2 and fasten both supplied screws.","Land X1 exactly as shown below and route the bus away from motor cables.","Set S1 on only if this module is at a physical bus end.","Restore power with the motor inhibited and verify a read."] setup = ["Set 98.02 = STD MODBUS and 98.07 = ABB DRIVES.","Set 52.01 station, 52.02 baud and 52.03 parity.","Select COMM.CW/COMM.REF1 for command/reference sources and configure 30.18/30.19."] warnings = ["If the end module can be powered down while the network remains live, follow ABB's external-termination instructions."] source = "ABB RMBA-01 manual 3AFE64498851 Rev A, pp. 3-1 through 3-4; ACS800 firmware 3AFE64527592 Rev L, pp. 195-201." [[connection.methods.wiring]] adapter = "D- / A / negative" device = "X1:1 A" signal = "RS-485 negative" [[connection.methods.wiring]] adapter = "D+ / B / positive" device = "X1:2 B" signal = "RS-485 positive" [[connection.methods.wiring]] adapter = "COM / data ground" device = "X1:3 DG" signal = "Data reference" [[connection.methods.wiring]] adapter = "Cable shield" device = "X1:4 SHLD" signal = "Shield through RC bond" required = false