# Property of PMA Electrical Solutions, LLC. # # ABB ACS 400 (2.2 - 37 kW), EMBEDDED Modicon Modbus RTU on Channel 1. # # CLAIMED: ACS 400 only. # NOT CLAIMED: ACS 100 (no serial interface exists on that frame — see # docs/UNSUPPORTED.md), ACS 140, ACS 160, ACS 600, or any later ABB family. # The ACS 140 and ACS 160 share this control/status word layout and this # 4GGPP register mapping, but they reach the bus through an external adapter, # their fault-code lists are shorter and differently numbered, and their # parameter groups differ (the ACS 400 puts COMM FAULT TIME/FUNC in group 50, # the ACS 140/160 put them in group 52 — manuals/abb_acs140_rs485_rs232_ # adapter_guide.pdf p. 14 and the CFB-RS guide p. 3-2, both cached and indexed; # see profiles/abb_acs140.toml and abb_acs160.toml). Each family gets its own # file, sourced from its own manual. # # COMMUNICATION PATH — EMBEDDED, NO ADAPTER MODULE. # The ACS 400 has two serial channels: Channel 0 is the control panel, and # Channel 1 is a built-in RS-485 Standard Modbus port on the drive's own # terminals ([UM] p. 123 gives the termination and earthing rules). No option # module is required. The optional DDCS optical link with a fieldbus adapter # is a DIFFERENT path (5005 = 1 or 3) and is NOT what this file describes. # # CHANNEL 1 IS OFF AT THE FACTORY. "As a factory setting, Channel 1 is not # operational. To activate standard Modbus protocol for Channel 1, set # parameter 5005 PROTOCOL SEL to 2 (STD MODBUS)" ([UM] p. 124). Until that is # done the drive will not answer at all. # # SOURCE — primary ABB documentation only: # [UM] DriveIT Low Voltage AC Drives, User's Manual for type ACS 400 # frequency converters 2.2 to 37 kW, ACS400userman_revC. # manuals/abb_acs400_user_RevC.pdf # Page ranges each section came from (PRINTED page numbers; front matter # offsets the PDF index by 10 — printed p. 131 is PDF page 141): # [UM] p. 121 the two serial channels; Channel 0 is the panel port # [UM] p. 123 RS-485 wiring, termination # [UM] p. 124 activating Modbus, Table 18 default comm settings # [UM] p. 125 Table 19 group 52 / group 50 communication parameters # [UM] pp. 126-127 Table 20 control command source selection # [UM] p. 130 register read/write rules, volatility of fieldbus writes # [UM] p. 131 Table 24 register mapping 4GGPP # [UM] p. 132 Table 25 exception codes, Table 26 function codes # [UM] p. 133 Table 27 Control Word bits # [UM] p. 134 Table 28 worked start sequence # [UM] p. 135 Table 29 Status Word bits # [UM] p. 136 reference scaling # [UM] p. 138 Actual Value 1 / 2 scaling # [UM] p. 139 Figure 69 state machine # [UM] pp. 140-141 Table 31 fault/alarm words, Table 32, Table 33 # [UM] pp. 146-147 Table 35 numeric fault codes 1 - 26 # [UM] pp. 55-56 Table 12 full parameter set (groups 99, 01) # # DRIVE-SIDE SETUP. Without these the drive ACKs writes and ignores them # ([UM] Table 20, pp. 126-127): # 5005 PROTOCOL SEL = 2 (STD MODBUS) activates Channel 1 at all # 5006 COMM COMMAND = 1 (STD MODBUS) REQUIRED before ANY control # command is accepted over Modbus # 1001 EXT1 COMMANDS = 10 (COMM) enables the Control Word for EXT1 # 1002 EXT2 COMMANDS = 10 (COMM) enables the Control Word for EXT2 # 1003 DIRECTION = 3 (REQUEST) or reverse is refused # 1102 EXT1/EXT2 SEL = 8 (COMM) Control Word bit 11 picks EXT1/EXT2 # 1103 EXT REF1 SELECT = 8 (COMM) fieldbus REF1 becomes the reference # 1106 EXT REF2 SELECT = 8 (COMM) # 1601 RUN ENABLE = 6 (COMM) Control Word bit 3 drives Run Enable # 1604 FAULT RESET SEL = 7 (COMM) enables Control Word bit 7 reset # 5201 STATION NUMBER = 1..247 (default 1) # 5202 COMM SPEED = 3..192 (default 96 = 9600 bps) # 5203 PARITY = 0 NONE (default) / 1 EVEN / 2 ODD # 5003 COMM FAULT TIME / 5004 COMM FAULT FUNC — see the watchdog note below # "Protocol must be reactivated after the communication settings are changed" # ([UM] p. 124). # # FIELDBUS WRITES ARE VOLATILE. "Parameter writes through Channel 1 (Standard # Modbus) are always volatile i.e. modified values are not automatically # stored to permanent memory. Parameter 1607 PARAM. SAVE can be used to save # all altered values" ([UM] p. 130). Anything written over Modbus is lost on # the next power cycle unless 1607 is written afterwards. # # ADDRESSING FORMULA — 0-BASED PROTOCOL ADDRESSES THROUGHOUT, never 4xxxx. # [UM] p. 131 Table 24 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: # Control 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 # "The register addresses between the groups are invalid" and answer with # exception 02 ILLEGAL DATA ADDRESS ([UM] p. 131). Function codes 03, 06 and # 16 (0x10) only ([UM] p. 132). # # CONFIGURATION-DEPENDENT, do not treat any of this as fixed: # - Reference 1 scaling is 20000 = parameter 1105 EXT REF1 MAX, a Hz value # the site sets (default 50 Hz, range 0-250 Hz, [UM] pp. 56, 136). This # profile therefore writes PERCENT of 1105, which is what the register # actually takes. It is NOT Hz. # - If 1103 is set to 9 (COMM+AI1) or 10 (COMM*AI1), analogue input AI1 # CORRECTS the fieldbus reference ([UM] pp. 136-137, Table 30) — the # commanded value is then not the value the drive runs at. Use 8 (COMM) # for predictable remote control. # - Actual Value 1 / 2 (registers 4 and 5) are the one pair with a fixed # documented scaling: 5000 = 50 Hz and 10 = 1 A ([UM] p. 138). # - The group 01 monitor points below are read at the RESOLUTION printed in # [UM] p. 55 Table 12 (e.g. 0107 DC BUS VOLTAGE, 0.1 V). The manual states # the 4xxxx mapping "corresponds directly to the ACS 400 parameter # grouping" but publishes no separate fieldbus scaling column, so these # scales are INFERRED FROM THE PARAMETER RESOLUTION. Confirm on a bench; # the two fixed-scaling points above are safer. # - SIGNEDNESS is inferred on output_power too. Table 12 documents 0105 # TORQUE as -100...100 %, which is what justifies signed there, but leaves # 0106 POWER's Range column blank. signed = true is kept as the safe # reading (regenerative power is negative); it cannot misread a positive # value below 3276.7 kW, which no 37 kW frame reaches. name = "ABB ACS400" vendor = "ABB" device_type = "vfd" verified = false probe_register = 3 # 40004 Status Word, readable whenever Channel 1 is alive # [UM] p. 124 Table 18: station 1, 9600 bps, no parity, TWO stop bits, # 8 data bits. [serial] baudrate = 9600 parity = "N" stopbits = 2 [monitor] # Drive control registers, [UM] p. 131 Table 24. Bit names from Table 27 / 29. # Bit 10 REMOTE_CMD of the ABB Drives profile is explicitly NOT USED on this # drive ([UM] p. 133 note) and is deliberately not named. control_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, [UM] p. 138. 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. 55 Table 12 — 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, [UM] p. 140 Table 31. Bits from Table 32 # (FAULT WORD 1, sixteen named bits) and Table 33; rows printed "Reserved" or # left blank are omitted rather than named. # The manual notes that "both alarm words can be reset by writing a zero to # them" ([UM] p. 140). These points are DELIBERATELY left read-only anyway — # clearing an alarm word is an operator action, not a side effect of reading # the dashboard. Add writable = true if that ever becomes a wanted feature. main_command_word = { address = 300 } main_status_word = { address = 301 } fault_word_1 = { address = 304, bits = { 0 = "Overcurrent", 1 = "DC overvoltage", 2 = "ACS 400 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, bits = { 0 = "Underload", 2 = "DDCS link", 8 = "Hardware error" } } 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", 6 = "Analogue input 1 loss", 7 = "Analogue input 2 loss", 8 = "Panel loss", 9 = "ACS 400 overtemperature", 10 = "Motor overtemperature", 11 = "Underload", 12 = "Motor stall alarm", 13 = "DDCS link" } } alarm_word_2 = { address = 308, bits = { 0 = "Overload alarm", 1 = "Autoreset alarm", 2 = "PID sleep alarm", 3 = "PFC autochange alarm", 4 = "PFC interlock alarm" } } # ABB Drives profile, Control Word at 40001 -> 0-based 0 ([UM] p. 133). # The start sequence is printed LITERALLY in [UM] p. 134 Table 28: # Step 1 CW = 0000 0000 0000 0110 = 0x0006 -> READY TO SWITCH ON # Step 2 wait at least 100 ms # Step 3 CW = 0000 0000 0000 0111 = 0x0007 -> READY TO OPERATE # Step 4 CW = 0000 0000 0000 1111 = 0x000F -> OPERATION ENABLED (starts, # but does not accelerate) # Step 5 CW = 0000 0000 0010 1111 = 0x002F -> RFG: ACCELERATOR ENABLED # Step 6 CW = 0000 0000 0110 1111 = 0x006F -> OPERATING, follows reference # step_delay is 0.1 s to honour the manual's explicit "wait at least 100 ms". [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". Bits 1 and 2 stay HIGH, so this # is NOT the Emergency OFF coast-to-stop (bit 1 low) or the Emergency stop on # 2205 (bit 2 low) — [UM] p. 133. stop = [0x0006] run_fwd = [0x0006, 0x0007, 0x000F, 0x002F, 0x006F] # Reset is Control Word BIT 7 on a 0->1 EDGE ([UM] p. 133), 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. "A negative reference (indicating reversed # direction of rotation) is formed by calculating the two's complement" # ([UM] p. 136) — direction is the SIGN of the reference, so a "reverse" # control word would be byte-identical to forward. Reverse with a negative # reference and 1003 DIRECTION = 3 (REQUEST). # 5004 COMM FAULT FUNC DEFAULTS TO 0 (NOT SEL), so out of the box this drive # does NOT trip on comm loss. When 5004 is set to 1 (FAULT) it trips fault 13 # SERIAL COMM LOSS after 5003 COMM FAULT TIME (default 1.0 s), [UM] pp. 125, # 146. 300 ms is well inside that default; shorten it if the site has lowered # 5003. [control.watchdog] interval_ms = 300 fault = "13 SERIAL COMM LOSS (5004 COMM FAULT FUNC, timeout 5003)" # Status Word bit 2 OPERATION ENABLED — the bit the state machine # ([UM] p. 139, Figure 69) 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 (range 0-26), with 0129 PREVIOUS and 0130 OLDEST as the # history ([UM] p. 56). Codes are [UM] pp. 146-147 Table 35, which starts at # code 1 — the 0 = "No fault" entry below is INFERRED from the range's lower # bound, not printed anywhere in the manual. # The FAULT WORD 1 bitfield at 304 is the same information as concurrent bits; # the numeric register is used here because it names one fault unambiguously. [faults] register = 127 history = [128, 129] [faults.codes] 0 = "No fault" 1 = "OVERCURRENT" 2 = "DC OVERVOLTAGE" 3 = "ACS400 OVERTEMP" 4 = "SHORT CIRCUIT — power-cycle reset only" 5 = "OUTPUT OVERLOAD" 6 = "DC UNDERVOLTAGE" 7 = "ANALOGUE INPUT 1 loss" 8 = "ANALOGUE INPUT 2 loss" 9 = "MOTOR OVERTEMP" 10 = "PANEL LOSS" 11 = "PARAMETERING (parameter values inconsistent)" 12 = "MOTOR STALL" 13 = "SERIAL COMM LOSS" 14 = "EXTERNAL FAULT SIGNAL" 15 = "OUTPUT EARTH FAULT — power-cycle reset only" 16 = "DC BUS RIPPLE — power-cycle reset only" 17 = "UNDERLOAD" 18 = "Reserved" 19 = "DDCS LINK" 20 = "AI OUT OF RANGE" 21 = "HARDWARE ERROR — power-cycle reset only" 22 = "HARDWARE ERROR — power-cycle reset only" 23 = "HARDWARE ERROR — power-cycle reset only" 24 = "HARDWARE ERROR — power-cycle reset only" 25 = "HARDWARE ERROR — power-cycle reset only" 26 = "HARDWARE ERROR — power-cycle reset only" # 9906 MOTOR NOM CURR, range 0.5*IN - 1.5*IN of the ACS 400, resolution 0.1 A, # default 1.0*IN ([UM] p. 55 Table 12). 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 manual publishes over # Modbus. It still catches a clone across frame sizes, because a correctly # commissioned drive carries its own motor's value and the range is tied to # the converter's IN. [rating] register = 9905 words = 1 scale = 0.1 unit = "A" label = "9906 MOTOR NOM CURR" # NO [parameters] BLOCK, DELIBERATELY, for two reasons out of the manual: # 1. [UM] p. 130: fieldbus parameter writes are VOLATILE unless 1607 PARAM. # SAVE is written afterwards. A restore that swept a range would leave # the drive looking correct until the next power cycle — the worst # failure mode for a drive-replacement clone — and this profile format # has no place to put the trailing 1607 write. # 2. [UM] p. 131 prints only four example group rows and then "…"; the # addresses in the gaps between groups are invalid and answer with # exception 02, so a blind sweep stalls on the first gap. Group 01 actual # values never accept writes, group 01 fault memories accept only a zero, # and group 99 accepts writes only while stopped ([UM] p. 130) — the # ranges are not uniform. [connection] summary = "Use the ACS400 built-in Channel 1 RS-485 connector X3 for Standard Modbus." warnings = ["Channel 1 is disabled at the factory.","Parameter writes over this link are volatile until 1607 PARAM SAVE is issued."] [[connection.methods]] id = "built_in_rs485" title = "Built-in Modbus RTU" transport = "serial" hardware = "built_in" port = "RS-485 terminal X3" connector = "X3:1 Screen, 2 B, 3 A, 4 AGND, 5 Screen; termination DIP switch" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded twisted pair plus common; route at least 20 cm from mains and motor cables" parts = ["Isolated USB-to-RS-485 adapter","Shielded twisted pair plus common; route at least 20 cm from mains and motor cables","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 RS-485 terminal X3.","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 the X3 termination DIP switch on only at a physical bus end.","Set 5005 = STD MODBUS, 5006 = STD MODBUS and match 5201/5202/5203.","Set command/reference/reset sources to COMM and configure 5003/5004 communication-loss handling."] warnings = [] source = "ABB ACS400 User's Manual Rev C, pp. 21-22 and 121-127." [[connection.methods.wiring]] adapter = "Data B" device = "X3:2 B" signal = "RS-485 B" [[connection.methods.wiring]] adapter = "Data A" device = "X3:3 A" signal = "RS-485 A" [[connection.methods.wiring]] adapter = "COM / signal common" device = "X3:4 AGND" signal = "Signal reference" [[connection.methods.wiring]] adapter = "Incoming shield" device = "X3:1 Screen" signal = "Shield bond" required = false [[connection.methods.wiring]] adapter = "Outgoing shield" device = "X3:5 Screen" signal = "Shield continuity" required = false