# Property of PMA Electrical Solutions, LLC. # # ABB ACS550-01 / ACS550-U1 ONLY. Embedded fieldbus (EFB), Modbus RTU on the # control-board RS-485 terminals X1:28…32. No option module is required. # # NOT CLAIMED: ACH550, ACQ550, ACS400, ACS600, ACS800, ACS580. The ACH550 and # ACQ550 are separate manuals with their own application parameter sets — an # ACQ550 manual was mistaken for this one during research and discarded. The # ACS400/600/800 are named here only because parameter 5305 borrows their # control-word dialects, not because this map applies to them. # # Source: ABB ACS550-01/U1 User's Manual, "EN_ACS550_01_UM_H" (rev H, English), # cached as manuals/abb_acs550_user_EN_ACS550_01_UM_H.pdf. # pp. 215-223 Modbus technical data, function codes, 4xxxx register map # pp. 224-232 ABB Drives profile control word, status word, state diagram # pp. 207-212 fieldbus source parameters, comm-fault, feedback registers # pp. 183-185 Group 53 EFB PROTOCOL; p. 103 its defaults # pp. 91- 92 Group 01 / Group 99 ranges and resolutions # pp. 260-265 fault listing (codes 1…38 and the 1000-series PAR faults) # # CONTROL PROFILE. Parameter 5305 EFB CTRL PROFILE selects the semantics of # registers 40001/40004. This file targets 5305 = 0 ABB DRV LIM, the FACTORY # DEFAULT (p. 103), and the only variant for which the manual prints a literal # start sequence (p. 231). Bits 4 and 10 are N/A in DRV LIM, so the words below # leave them clear. # * With 5305 = 2 ABB DRV FULL those two bits become RAMP_OUT_ZERO and # REMOTE_CMD and must be SET to run (p. 226). This profile will not start a # drive configured for DRV FULL — it will sit in RFG OUT ZERO. That is a # safe failure, not a silent one, but do not "fix" it by adding the bits # without confirming 5305 on the unit. # * With 5305 = 1 DCU PROFILE registers 40001 and 40004 read back EMPTY # (p. 220) and control moves to 40031-40034. This profile does not apply. # # Drive-side setup — without these the drive ACKs writes and ignores them # (pp. 207-208, 224): # 9802 COMM PROT SEL = 1 (STD MODBUS) enable EFB Modbus # 5302 EFB STATION ID = node address default 1 # 5303 EFB BAUD RATE default 9.6 kbit/s # 5304 EFB PARITY = 0 (8 NONE 1) DEFAULT IS 8N1, not 8N2 # 5305 EFB CTRL PROFILE= 0 (ABB DRV LIM) default; see above # 1001 EXT1 COMMANDS = 10 (COMM) start/stop from 40001 bits 0…3 # 1102 EXT1/EXT2 SEL = 8 (COMM) control-word bit 11 selects EXT # 1103 REF1 SELECT = 8 (COMM) reference from 40002 # 1601 RUN ENABLE = 7 (COMM) control-word bit 3 gates the run # 1604 FAULT RESET SEL = 8 (COMM) control-word bit 7 resets faults # 1003 DIRECTION = 3 (REQUEST) reverse via a negative reference # (factory default, p. 93/207 — a # drive set to 1 FORWARD silently # ignores the negative reference) # 3018 COMM FAULT FUNC = 1 (FAULT) trip on comm loss (default: OFF) # 3019 COMM FAULT TIME default 3.0 s # Modbus parameter writes are VOLATILE (p. 222). Write 1607 PARAM SAVE = 1 # after a restore or the drive reverts on the next power cycle. # # ADDRESSING — 0-based, stated explicitly by ABB: "The ACS550 supports the # zero-based addressing of the Modbus specification. Holding register 40002 is # addressed as 0001 in a Modbus message." (p. 216) # 0-based address = 4xxxx register - 40001 # and parameters map as "40102 is parameter 0102" (p. 220), i.e. # 0-based address = parameter number - 1 # Worked examples: # 40001 CONTROL WORD -> 40001 - 40001 = 0 # par 0103 OUTPUT FREQ -> 40103 -> 40103 - 40001 = 102 (= 103 - 1) # par 9906 MOTOR NOM CURR -> 49906 - 40001 = 9905 (= 9906 - 1) # 3xxxx here is a different space entirely (FC04, the two analog inputs only). # # SCALING. Unlike the ACS580 generation there is no FbEq/group-46 indirection # on the parameter block: "for Actual Values, scale the feedback integer using # the parameter's resolution" (p. 211), so the scales below are the Group 01 # resolutions from p. 91 and are NOT drive-configuration dependent. The two # exceptions are noted inline. Negative actuals are two's complement (p. 223). # # verified = false — documentation only, never bench-confirmed. name = "ABB ACS550" vendor = "ABB" device_type = "vfd" verified = false probe_register = 3 # 40004 status word, readable whenever 5305 = 0 or 2 [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # 40001, ABB DRV LIM names (p. 217, 225-226). Bits 0,1,2,5,6 are ACTIVE LOW. control_word = { address = 0, bits = { 0 = "OFF1", 1 = "OFF2_N", 2 = "OFF3_N", 3 = "START", 5 = "RAMP_HOLD_N", 6 = "RAMP_IN_ZERO_N", 7 = "RESET", 11 = "EXT_CTRL_LOC" } } # 40002, ±20000 = ±(1105 REF1 MAX). Percent of REF1 MAX, not Hz. reference_1 = { address = 1, signed = true, scale = 0.005, unit = "%" } # 40004 (p. 228). Bit 12 EXT RUN ENABLE exists in DRV LIM/FULL; 13-15 unused. 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" } } motor_speed = { address = 100, signed = true, unit = "rpm" } # 0101 SPEED & DIR output_frequency = { address = 102, scale = 0.1, unit = "Hz" } # 0103 motor_current = { address = 103, scale = 0.1, unit = "A" } # 0104 motor_torque = { address = 104, signed = true, scale = 0.1, unit = "%" } # 0105 # 0106 POWER. Resolution is 0.1 kW on -01 units; -U1 (NEMA) units are scaled in # hp per the same construction split ABB applies to 9909 (p. 91). Unit shown # here is the IEC one — check the type designation before trusting the label. output_power = { address = 105, signed = true, scale = 0.1, unit = "kW" } dc_voltage = { address = 106, unit = "V" } # 0107, 1 V output_voltage = { address = 108, unit = "V" } # 0109, 1 V drive_temp = { address = 109, scale = 0.1, unit = "C" } # 0110 control_location = { address = 112 } # 0113 0=LOC 1=EXT1 2=EXT2 # ABB Drives profile, DRV LIM. The words below are the manual's own literal # start sequence (p. 231, steps 1-6), not a reconstruction. [control] command_register = 0 speed_register = 1 speed_scale = 0.005 # write %, 20000 raw = 100% of 1105 REF1 MAX speed_signed = true # direction IS the sign of the reference speed_unit = "%" # NOT Hz — percent of REF1 MAX max_ref = 100.0 # Step 2 of the documented sequence is "wait at least 100 ms before # proceeding" (p. 231); 150 ms gives that with margin on every step. step_delay = 0.15 # Clear OFF1 only: ramp stop on 2203/2205. Bits 1 and 2 stay HIGH on purpose — # driving them low is EMERGENCY OFF (coast) and EMERGENCY STOP, and the manual # carries an explicit WARNING against routine use of OFF3 (p. 225). stop = [0x006E] run_fwd = [0x0006, 0x0007, 0x000F, 0x002F, 0x006F] # Bit 7 is edge sensitive (0=>1) and effective only if 1604 = COMM (p. 226). # Raised on top of the stopped word, then dropped, so the reset never doubles # as a start: OFF1 stays low throughout. reset = [0x006E, 0x00EE, 0x006E] # No reset_register: reset is a bit inside 40001, not a separate register. # No run_rev: on the ABB Drives profile there is no REVERSE bit (the DCU # profile has one, this profile is not that) — reverse with a negative # reference. [control.watchdog] # 3018 COMM FAULT FUNC = 1 trips on silence after 3019 COMM FAULT TIME # (default 3.0 s, p. 97). 500 ms keeps a wide margin under that default. interval_ms = 500 fault = "28 SERIAL 1 ERR" # GAP: the ABB Drives profile status word has no bit named RUNNING (p. 228) — # the DCU profile does (bit 3), but that needs 5305 = 1 and a different # register set. Bit 2 RDY_REF / OPERATION ENABLED is the state-diagram state # the drive holds from OPERATION ENABLED through OPERATING (p. 232), so it is # the closest available indicator. It is an inference from the state diagram, # not a labelled running bit. Bit 8 AT_SETPOINT is NOT a substitute: it drops # whenever the actual value is outside tolerance, including during every ramp. [running_check] register = 3 bit = 2 # 0401 LAST FAULT -> 400; 0412/0413 PREVIOUS FAULT 1/2 -> 411/412 (p. 212). [faults] register = 400 history = [411, 412] # Decimal codes exactly as the panel reports them (pp. 261-265). Codes 31…33 # are listed by the drive but explicitly "not used" (p. 214), so they are # omitted. 101…199 and 201…299 are SYSTEM ERROR ranges, not enumerable here. [faults.codes] 0 = "No fault" 1 = "OVERCURRENT" 2 = "DC OVERVOLT" 3 = "DEV OVERTEMP" 4 = "SHORT CIRC" 6 = "DC UNDERVOLT" 7 = "AI1 LOSS" 8 = "AI2 LOSS" 9 = "MOT OVERTEMP" 10 = "PANEL LOSS" 11 = "ID RUN FAIL" 12 = "MOTOR STALL" 14 = "EXT FAULT 1" 15 = "EXT FAULT 2" 16 = "EARTH FAULT" 18 = "THERM FAIL" 19 = "OPEX LINK" 20 = "OPEX PWR" 21 = "CURR MEAS" 22 = "SUPPLY PHASE" 23 = "ENCODER ERR" 24 = "OVERSPEED" 26 = "DRIVE ID" 27 = "CONFIG FILE" 28 = "SERIAL 1 ERR" 29 = "EFB CON FILE" 30 = "FORCE TRIP" 34 = "MOTOR PHASE" 35 = "OUTP WIRING" 36 = "INCOMPATIBLE SW" 37 = "CB OVERTEMP" 38 = "USER LOAD CURVE" 1000 = "PAR HZRPM" 1001 = "PAR PFC REF NEG" 1003 = "PAR AI SCALE" 1004 = "PAR AO SCALE" 1005 = "PAR PCU 2" 1006 = "PAR EXT RO" 1007 = "PAR FIELDBUS MISSING" 1008 = "PAR PFC MODE" 1009 = "PAR PCU 1" 1012 = "PAR PFC IO 1" 1013 = "PAR PFC IO 2" 1014 = "PAR PFC IO 3" 1016 = "PAR USER LOAD C" # 9906 MOTOR NOM CURR -> 49906 -> address 9905. Range 0.2…2.0 × I2hd, 0.1 A # (p. 91). This guards a restore by comparing the CONFIGURED motor current # between source and target, not the frame size. The drive-side rating DOES # exist — 3304 DRIVE RATING (p. 155), read-only at address 3303 — but the # manual specifies only the panel's alphanumeric XXXY display format (an "A" # marks the decimal point) and no numeric register encoding, so it cannot be # used until decoded on a bench. [rating] register = 9905 scale = 0.1 unit = "A" label = "Motor nominal current (9906)" # No [parameters] section. The manual says "except where restricted by the # drive, all parameters are available for both reading and writing" (p. 222) # but prints no table of writable ranges, and the 4xxxx parameter space is # sparse — undefined addresses inside any swept range answer exception 02 # ILLEGAL DATA ADDRESS, and read-only Group 01 addresses answer exception 03. # A clone/restore range here needs a verified parameter list, not a sweep. [connection] summary = "Connect to the ACS550 built-in RS-485 interface at X1:28-32." warnings = ["Use Belden 9842 or equivalent and do not directly earth the RS-485 signal network.","The default communication-loss action is disabled; configure it deliberately before remote control."] [[connection.methods]] id = "built_in_rs485" title = "Built-in Modbus RTU" transport = "serial" hardware = "built_in" port = "control-board terminal block X1:28-32" connector = "X1:28 Screen, 29 B positive, 30 A negative, 31 AGND, 32 Screen" adapter = "Isolated USB-to-RS-485 adapter" cable = "Belden 9842 or equivalent 120-ohm dual twisted shielded pair" parts = ["Isolated USB-to-RS-485 adapter","Belden 9842 or equivalent 120-ohm dual twisted shielded pair","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-board terminal block X1:28-32.","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 = ["Use the drive termination switch only at a physical bus end.","Set 9802 = STD MODBUS; set 5302 node, 5303 baud, 5304 frame and 5305 = ABB DRV LIM.","Select COMM for command/reference/reset sources and configure 3018/3019."] warnings = [] source = "ABB ACS550-01/U1 User's Manual Rev H, pp. 203-205 and 207-208." [[connection.methods.wiring]] adapter = "D+ / B / positive" device = "X1:29 B" signal = "RS-485 positive" [[connection.methods.wiring]] adapter = "D- / A / negative" device = "X1:30 A" signal = "RS-485 negative" [[connection.methods.wiring]] adapter = "COM / signal common" device = "X1:31 AGND" signal = "Logical ground" [[connection.methods.wiring]] adapter = "Incoming shield" device = "X1:28 Screen" signal = "Shield continuity" required = false [[connection.methods.wiring]] adapter = "Outgoing shield" device = "X1:32 Screen" signal = "Shield continuity" required = false