# Property of PMA Electrical Solutions, LLC. # # ABB ACS 140 (0.12 - 2.2 kW), Modicon Modbus RTU through the external # RS485/RS232 Adapter module. # # CLAIMED: ACS 140 only. # NOT CLAIMED: ACS 100 (no serial interface of any kind exists on that frame — # see docs/UNSUPPORTED.md), ACS 160, ACS 400, ACS 600, or any later ABB family. # The ACS 160 and ACS 400 use the same ABB Drives profile and the same 4GGPP # mapping scheme, but they are separate documents with separate parameter # numbering and separate fault-code tables, so they get separate files. NOTE # that this similarity is an observation across the three cached adapter # guides, not a claim either manual makes: [ADP] p. 11's caption "Table 2 # ACS 140 (ACS 400) default communication settings" covers comm settings only # and does not mention the ACS 160. # ONE VALUE HERE IS BORROWED AND SAID SO: step_delay, sourced from the ACS 160 # guide because [ADP] prints no settle time — see the [control] note. # # COMMUNICATION PATH — OPTION MODULE, NOT EMBEDDED. # The ACS 140 has no built-in serial port. An RS485 and RS232 Adapter module # mounts on the drive's control-panel connector and is powered through it; # RS485 or RS232 is selected with jumper S4 ([ADP] p. 31 fault-tracing entry). # The drive's own User's Manual defers all serial detail to that adapter guide. # WITHOUT THE ADAPTER FITTED, NOTHING IN THIS FILE APPLIES. # # SOURCES — primary ABB documentation only: # [ADP] ACS 140 RS485 and RS232 Adapter Installation and Start-up Guide, # 3AFY 61492828 R0125 REV A EN, effective 1.10.1998. # manuals/abb_acs140_rs485_rs232_adapter_guide.pdf # [UM] User's Manual for type ACS140 frequency converters from 0.12 to # 2.2 kW, EN_ACS140_UM_C. # manuals/abb_acs140_user_UM_C.pdf # Page ranges each section came from (PRINTED page numbers — the PDF index is # printed page + 8; an earlier revision of this file cited PDF indexes here as # though they were printed pages, which is the offset trap the add-drive skill # warns about): # [ADP] p. 11 panel-detection override, Table 2 default comm settings # [ADP] pp. 12-13 Table 3 group 52 SERIAL COMM parameters, comm-loss # behaviour, stop-bit rule # [ADP] pp. 19-20 group 52 diagnostic counters 5206-5215 (not used here) # [ADP] p. 14 control locations (groups 10, 11, 16 of [UM]) # [ADP] p. 22 Table 5 register mapping 4GGPP # [ADP] p. 23 Table 6 exception codes, Table 7 function codes 03/06/16 # [ADP] p. 24 Table 8 Command Word bits # [ADP] p. 25 reference scaling # [ADP] p. 26 Table 9 Status Word bits # [ADP] p. 27 Actual Value 1 / 2 scaling # [ADP] p. 28 Figure 12 state machine # [ADP] pp. 29-30 Table 10 fault/alarm status words, Table 11 FAULT WORD 1 # [UM] p. 39 Table 1 full parameter set (group 01 and group 99) # [UM] p. 83 Table 7 numeric fault codes FL1 - FL22 # # DRIVE-SIDE SETUP. Without these the drive ACKs writes and ignores them # ([ADP] p. 14 points at groups 10, 11 and 16 of [UM]): # 1001 EXT1 COMMANDS = COMM start/stop/direction from the serial link # 1102 EXT1/EXT2 SEL = 6 (EXT1) bit 11 only selects EXT1/EXT2 when this # is 8 (COMM); the control words below all carry bit # 11 = 0, so this profile assumes EXT1 ([ADP] p. 16, # default 6 per [UM] p. 39 Table 1) # 1103 EXT REF1 SELECT = COMM fieldbus REF1 becomes the frequency ref # 1601 RUN ENABLE = 0 (NOT SEL) or 6 (COMM). 0 is "ready to start # without an external run enable signal"; 6 gives the # enable over serial as Command Word bit 3. Values 1-5 # demand a WIRED digital input, and then the start # sequence stalls at READY TO OPERATE because Figure 12 # gates OPERATION ENABLED on SW bit 12 ([ADP] p. 18). # 1604 FAULT RESET SEL = 7 (COMM). THE DEFAULT IS 6 (START/STOP) AND IT DOES # NOT WORK HERE. ABB's own note, [ADP] p. 18: "6 = # START/STOP — Fault reset is activated by Stop command. # Note! This setting should not be used when start, stop # and direction commands are given through serial # communication." At the default, the reset sequence # below is inert (bit 7 ignored) and `stop` silently # acquires a fault-reset side effect. Also [UM] p. 81: # "Warning! If an external source for start command is # selected and is still active, the ACS140 may start # immediately after fault reset." # 5201 STATION NUMBER = 1..247 (default 1) # 5202 COMM SPEED = 3..192 (default 96 = 9600 bps) # 5203 PARITY = 0 NONE / 1 EVEN / 2 ODD (default 0) # 5204 COMM FAULT TIME / 5205 COMM FAULT FUNC — see the watchdog note below # NOTE: 5201/5202/5203 changes "take effect only on the next power up" # ([ADP] pp. 11, 13). Group 52 is hidden until the full parameter set is made # visible with the panel's -LG- menu function ([ADP] p. 31). # # A CONNECTED CONTROL PANEL OVERRIDES 5201/5202/5203 ENTIRELY. [ADP] p. 11: # "When power is connected, the ACS 140 will automatically check for the # presence of the panel. If the panel is detected, the ACS 140 will set up the # Modbus communication using the default settings shown in Table 2. This # communication setting is then used until the next power down." Table 2 is # station 1, 9600 bps, no parity, two stop bits. So a drive configured as # station 5 for a multidrop bus answers at station 1 — an address collision on # a bus that commands motors — if the ACS 100-PAN was left plugged in at power # up. The panel must be disconnected at power-up for these three to take # effect. Matching symptom in the fault-tracing table, [ADP] p. 31. # # ADDRESSING FORMULA — 0-BASED PROTOCOL ADDRESSES THROUGHOUT, never 4xxxx. # [ADP] p. 22 publishes the Modicon mapping as 4GGPP, where GG is the drive # parameter group and PP the parameter index within it. Modbus holding # register 40001 is protocol address 0, so: # 0-based = (4xxxx number) - 40001 = 100 * group + index - 1 # Worked examples: # Command Word 40001 -> 40001 - 40001 = 0 # Status Word 40004 -> 40004 - 40001 = 3 # 0128 LAST FAULT -> 40128 - 40001 = 100*1 + 28 - 1 = 127 # 0305 FAULT WORD 1 -> 40305 - 40001 = 100*3 + 5 - 1 = 304 # 9906 MOTOR NOM CURR -> 49906 - 40001 = 100*99 + 6 - 1 = 9905 # Addresses in the gaps BETWEEN groups are invalid and answer with exception # 02 ILLEGAL DATA ADDRESS ([ADP] pp. 22-23). Function codes 03, 06 and 16 only. # # CONFIGURATION-DEPENDENT, do not treat any of this as fixed: # - REF1 scaling is 20000 = parameter 1105 EXT REF1 MAX, which is a Hz value # the site sets ([ADP] p. 25). This profile therefore writes PERCENT of # 1105, which is what the register actually takes. It is NOT Hz, and a # commanded 100% is 100% of whatever 1105 happens to be. # - Actual Value 1 / 2 (registers 4 and 5) are the one pair with a FIXED # documented scaling: 5000 = 50 Hz and 10 = 1 A ([ADP] p. 27). # - The group 01 monitor points below are read at the RESOLUTION printed in # [UM] p. 39 Table 1 (e.g. 0107 DC BUS VOLTAGE, 0.1 V). [ADP] states the # 4xxxx mapping "corresponds directly to the ACS 140 parameter grouping" # but does not separately publish a fieldbus scaling column, so these # scales are INFERRED FROM THE PARAMETER RESOLUTION. Confirm on a bench # before trusting the units; the two fixed-scaling points above are safer. name = "ABB ACS140" vendor = "ABB" device_type = "vfd" verified = false probe_register = 3 # 40004 Status Word, readable whenever the link is alive # [ADP] p. 11 Table 2: default 9600 bps, parity NONE. [ADP] p. 13, under 5203 # PARITY: "In Modbus communication, the number of stop bits is 2 with no parity # bit, and 1 with even or odd parity" — so the default combination is N,2. [serial] baudrate = 9600 parity = "N" stopbits = 2 [monitor] # Drive control registers, [ADP] p. 22. Bit MEANINGS are Table 8 / Table 9; the # short names below are the generic ABB Drives-profile mnemonics and are not # ABB's printed wording (Table 9 calls bit 2 "operation enabled", which is what # the [running_check] note uses). # Bit 10 REMOTE_CMD of the ABB Drives profile is UNUSED on this drive # ([ADP] p. 24 lists bits 8 to 10 as Unused) and is deliberately not named. command_word = { address = 0, bits = { 0 = "ON_OFF1", 1 = "OFF2_N", 2 = "OFF3_N", 3 = "START", 5 = "RAMP_HOLD_N", 6 = "RAMP_IN_ZERO_N", 7 = "RESET", 11 = "EXT_CTRL_LOC" } } reference_1 = { address = 1, signed = true, scale = 0.005, unit = "%" } # 20000 = par 1105 EXT REF1 MAX reference_2 = { address = 2, signed = true, scale = 0.01, unit = "%" } # 10000 = par 1108 EXT REF2 MAX 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 = "RUN_ENABLE" } } # Fixed fieldbus scaling, [ADP] p. 27. output_frequency = { address = 4, signed = true, scale = 0.01, unit = "Hz" } # 5000 = 50 Hz motor_current = { address = 5, signed = true, scale = 0.1, unit = "A" } # 10 = 1 A # Group 01 OPERATING DATA, scales inferred from the resolution column of # [UM] p. 39 Table 1 — see the header note. motor_speed = { address = 101, unit = "rpm" } # 0102, 1 rpm motor_torque = { address = 104, signed = true, scale = 0.1, unit = "%" } # 0105, 0.1 % output_power = { address = 105, signed = true, scale = 0.1, unit = "kW" } # 0106, 0.1 kW dc_voltage = { address = 106, scale = 0.1, unit = "V" } # 0107, 0.1 V output_voltage = { address = 108, scale = 0.1, unit = "V" } # 0109, 0.1 V drive_temp = { address = 109, scale = 0.1, unit = "C" } # 0110, 0.1 C # Group 3 fault/alarm status words, [ADP] pp. 29-30. Read-only, except that # writing 0 to an ALARM word clears it. NOTE the family difference: on the # ACS 140 there is no ALARM WORD 2 and FAULT WORD 2 is not a per-fault bit map # — "Bits 0 - 7 of this register may be set if there is a hardware error in # ACS 140 (fault codes 18 - 22)" ([ADP] p. 29). No bit names are invented for # it here. main_command_word = { address = 300 } main_status_word = { address = 301 } fault_word_1 = { address = 304, bits = { 0 = "Overcurrent", 1 = "DC overvoltage", 2 = "ACS140 overtemperature", 3 = "Fault current", 4 = "Output overload", 5 = "DC undervoltage", 6 = "Analogue input 1 fault", 7 = "Analogue input 2 fault", 8 = "Motor overtemperature", 9 = "Panel loss", 10 = "Parameters inconsistent", 11 = "DC bus ripple too large", 12 = "Motor stall", 13 = "Serial communication loss", 14 = "External fault", 15 = "Output earth fault" } } fault_word_2 = { address = 305 } # hardware error, fault codes 18-22 alarm_word_1 = { address = 307, bits = { 0 = "Overcurrent controller alarm", 1 = "Overvoltage controller alarm", 2 = "Undervoltage controller alarm", 3 = "Direction lock alarm", 4 = "Serial communication loss", 5 = "Modbus exception generated locally", 6 = "Analogue input 1 loss", 7 = "Analogue input 2 loss", 8 = "Panel loss", 9 = "ACS 140 overtemperature", 10 = "Motor overtemperature", 11 = "Motor stall alarm" } } # ABB Drives profile, Command Word at 40001 -> 0-based 0. # NOTE ON PROVENANCE: unlike the ACS 160 guide, [ADP] prints NO worked # start-sequence table for the ACS 140 (searched for "Example on Using", # "Wait at least" and the literal bit pattern — zero hits in the 50-page PDF). # The words below are the state machine of [ADP] p. 28 Figure 12, which does # print two of them literally, combined with the per-bit meanings of Table 8 # on p. 24: # CW = xxxx xxxx xxxx x110 -> READY TO SWITCH ON = 0x0006 (literal) # CW = xxxx xxxx xxxx x111 -> READY TO OPERATE = 0x0007 (literal) # CW bit 3 = 1 and SW bit 12 = 1 -> OPERATION ENABLED = 0x000F (derived) # CW bit 5 = 1 -> RFG: ACCELERATOR ENABLED = 0x002F (derived) # CW bit 6 = 1 -> OPERATING, follows the reference = 0x006F (derived) # The identical sequence IS printed literally, as exactly these five values, # in the ACS 160 CFB-RS guide Table 4-5 for the same profile — but that is a # different drive's document and is not treated as authority here. # VERIFY THE DERIVED WORDS ON A BENCH BEFORE TRUSTING THEM. # step_delay is 0.1 s because the ACS 160 twin of this state machine requires # a >= 100 ms settle after the first word; [ADP] does not contradict it. [control] command_register = 0 speed_register = 1 speed_scale = 0.005 # write %, 20000 raw = 100% of par 1105 speed_signed = true # direction IS the sign of the reference speed_unit = "%" # NOT Hz — percent of 1105, whatever the site set it to max_ref = 100.0 step_delay = 0.1 # Stop is the manual's own Step 1 word: bit 0 = 0 is OFF1, "Ramp to stop # according to parameter 2203 DECELER TIME 1", and bits 1 and 2 stay HIGH so # this is not the OFF2 coast or the OFF3 emergency stop ([ADP] p. 24). ABB # labels bit 0 = 0 "Emergency OFF" too, so the manual's own term does not # distinguish them — the ramp-vs-coast behaviour does. stop = [0x0006] run_fwd = [0x0006, 0x0007, 0x000F, 0x002F, 0x006F] # Reset is Command Word BIT 7 on a 0->1 EDGE ([ADP] p. 24), not a separate # register, so there is no reset_register. The edge is raised on top of the # idle word: 0x0086 sets bit 7 while OFF2/OFF3 (bits 1, 2) stay released. reset = [0x0006, 0x0086, 0x0006] # run_rev is deliberately absent. References are "16-bit words containing a # sign bit and a 15-bit integer. A negative reference (indicating reversed # direction of rotation) is formed by calculating the two's complement" # ([ADP] p. 25) — direction is the SIGN of the reference, so a "reverse" # command word would be byte-identical to forward. Reverse with a negative # reference, and check 1003 DIRECTION allows it. # 5205 COMM FAULT FUNC DEFAULTS TO 0 (NOT SEL), so out of the box this drive # does NOT trip on comm loss. When 5205 is set to 1 (FAULT) the drive coasts # to stop and raises FL13 SERIAL COMM LOSS after 5204 COMM FAULT TIME # (default 1.0 s). "The master device ... must signal its presence ... by # periodically writing Command Word, External Reference 1 or External # Reference 2" ([ADP] p. 13, under 5204 COMM FAULT TIME). 300 ms is well # inside the 1.0 s default; # shorten it if the site has lowered 5204. [control.watchdog] interval_ms = 300 fault = "FL13 Serial communication loss (ONLY if 5205 COMM FAULT FUNC = 1 Fault; the factory default is 0 NOT SEL and the drive keeps running), timeout 5204" # Status Word bit 2 OPERATION ENABLED — the bit the state machine # ([ADP] p. 28, Figure 12) sets on the run transition and clears on # OFF1/OFF2/OFF3. Bit 8 AT_SETPOINT is stricter and reads false while # accelerating. [running_check] register = 3 bit = 2 # 0128 LAST FAULT (0 = no fault), with 0129 PREVIOUS and 0130 OLDEST as the # history ([UM] p. 39, range 0-22). Codes are [UM] p. 83 Table 7. [faults] register = 127 history = [128, 129] [faults.codes] 0 = "No fault" 1 = "FL 1 Overcurrent" 2 = "FL 2 DC overvoltage" 3 = "FL 3 ACS140 overtemperature" 4 = "FL 4 Fault current (output earth fault 200 V units / short circuit) — power-cycle reset only" 5 = "FL 5 Output overload" 6 = "FL 6 DC undervoltage" 7 = "FL 7 Analogue input 1 fault" 8 = "FL 8 Analogue input 2 fault" 9 = "FL 9 Motor overtemperature" 10 = "FL10 Panel loss" 11 = "FL11 Parameters inconsistent" 12 = "FL12 Motor stall" 13 = "FL13 Serial communication loss" 14 = "FL14 External fault" 15 = "FL15 Output earth fault (400 V units)" 16 = "FL16 DC bus ripple too large — power-cycle reset only" 17 = "FL17 Analogue input out of range" 18 = "FL18 Hardware error — power-cycle reset only" 19 = "FL19 Hardware error — power-cycle reset only" 20 = "FL20 Hardware error — power-cycle reset only" 21 = "FL21 Hardware error — power-cycle reset only" 22 = "FL22 Hardware error — power-cycle reset only" # 9906 MOTOR NOM CURR, range 0.5*IN - 1.5*IN of the ACS 140, resolution 0.1 A # ([UM] p. 39 Table 1). Address 100*99 + 6 - 1 = 9905. # This is the MOTOR nameplate current, not the drive's own frame rating — it # is the only current-scaled identity register the two manuals publish. It # still catches a clone across frame sizes, because a correctly commissioned # drive carries its own motor's value. [rating] register = 9905 words = 1 scale = 0.1 unit = "A" label = "9906 MOTOR NOM CURR" # NO [parameters] BLOCK, DELIBERATELY. [ADP] p. 22 publishes the 4GGPP mapping # but prints only four example group rows and then "…"; the addresses in the # gaps between groups are invalid and answer with exception 02. A blind range # sweep for a clone/restore would stall on the first gap, and the full list of # valid group/index pairs has not been transcribed or bench-checked. Group 01 # actual values never accept writes and group 99 only accepts them while # stopped ([ADP] p. 21), so the ranges are not uniform either. [connection] summary = "The ACS140 has no built-in serial port; its panel-mounted ABB RS485/RS232 Adapter supports either a two-wire RS-485 bus or a point-to-point RS-232 link." warnings = ["Configure the drive with its control panel before replacing the panel with the adapter.","RS-232 must use a straight-through data cable, not a null-modem crossover."] [[connection.methods]] id = "adapter_rs485" title = "ABB RS485/RS232 Adapter in RS-485 mode" transport = "serial" hardware = "option" port = "adapter terminals X2 or X3 on the control-panel connector" connector = "X2/X3 (parallel): 1 B Data, 2 C Common, 3 A Data" adapter = "Isolated USB-to-RS-485 adapter" cable = "Belden 9841 or equivalent 120-ohm single shielded twisted pair" parts = ["ABB ACS140 RS485/RS232 Adapter","Isolated USB-to-RS-485 adapter","Belden 9841 or equivalent"] steps = ["With the ACS140 de-energized, use the control panel to configure group 52 if defaults are unsuitable.","Remove power, set S5 to RS485, set S1 to the selected baud, and set both S2/S3 termination jumpers for the bus position.","Mount the adapter in place of the panel and land X2 or X3 using the mapping below.","Restore power with the motor inhibited and verify a read."] setup = ["Set 5201 station, 5202 communication speed and 5203 parity; changes take effect at the next power-up.","Set command/reference/reset sources as documented in groups 10, 11 and 16.","Set 5204/5205 communication-loss handling deliberately."] warnings = ["The RS-485 network must not be directly earthed.","Both S2 and S3 are required to enable the built-in 120-ohm termination."] source = "ABB ACS140 RS485 and RS232 Adapter Installation and Start-up Guide, pp. 3-14." [[connection.methods.wiring]] adapter = "Data B" device = "X2/X3:1 B" signal = "RS-485 B data" [[connection.methods.wiring]] adapter = "COM / signal common" device = "X2/X3:2 C" signal = "Common" [[connection.methods.wiring]] adapter = "Data A" device = "X2/X3:3 A" signal = "RS-485 A data" [[connection.methods]] id = "adapter_rs232" title = "ABB RS485/RS232 Adapter in RS-232 mode" transport = "serial" hardware = "option" port = "adapter DB9 connector X4 on the control-panel connector" connector = "DB9 X4: 2 TxD, 3 RxD, 5 SGND; 1/9 NC; handshake pairs internally connected" adapter = "PC RS-232 port or isolated USB-to-RS-232 adapter" cable = "Straight-through DB9 serial cable, maximum 3 m" parts = ["ABB ACS140 RS485/RS232 Adapter","RS-232 port/adapter","Straight-through DB9 cable"] steps = ["Configure group 52 with the control panel while the drive is de-energized between wiring changes.","Remove power, set mode jumper S5 to RS232, and mount the adapter in place of the panel.","Connect a straight-through cable no longer than 3 m to X4.","Restore power with the motor inhibited and verify a read."] setup = ["Match the drive's 5201/5202/5203 settings.","Set command/reference/reset sources for serial control and configure 5204/5205."] warnings = ["Do not cross TxD and RxD; ABB explicitly specifies a non-crossed cable.","This is a single-master, single-drive point-to-point link."] source = "ABB ACS140 RS485 and RS232 Adapter Installation and Start-up Guide, pp. 8-14." [[connection.methods.wiring]] adapter = "DB9 pin 2 TxD" device = "X4 pin 2 TxD" signal = "Transmit data, straight through" [[connection.methods.wiring]] adapter = "DB9 pin 3 RxD" device = "X4 pin 3 RxD" signal = "Receive data, straight through" [[connection.methods.wiring]] adapter = "DB9 pin 5 signal ground" device = "X4 pin 5 SGND" signal = "Signal ground"