# Property of PMA Electrical Solutions, LLC. # # ABB ACH550-01 / -02 / -U1 / -U2 ONLY — the HVAC application program. # Embedded fieldbus (EFB), Modbus RTU on the control-board RS-485 terminals # X1:28…32. No option module and no firmware level is called out; the EFB is # built into the control board (EFB p. 6). # # The four variants above are claimed because the source document's own title # page reads "Modbus, Metasys N2 and APOGEE FLN Protocols for ACH550-01/02/ # U1/U2 Drives". Nothing else is claimed. # # NOT CLAIMED: ACS550, ACQ550, ACH400, ACH580, ACH480. The ACS550 shares this # generation's EFB hardware but ships a different application program and a # different fault/parameter set — this file was built from the ACH550 documents # only, and the differences are real (the ACH550's group-10xx faults are PFA/ # OVERRIDE, the ACS550's are PFC). ACH400 and ACH600/800 are named here only # because parameter 5305 borrows their control-word dialects (EFB p. 8, 27), # not because this map applies to them. # # Sources, both cached: # manuals/abb_ach550_efb_3AFE68320658.pdf # "Embedded Fieldbus (EFB) Control", doc 3AFE68320658 (62 pp.) # p. 6 RS-485 terminals X1:28…32, Belden 9842, bus termination # pp. 7- 8 group 53 EFB parameters and their Modbus defaults # pp. 9- 11 1001/1002/1102/1103/1601/1604 fieldbus source parameters # p. 13 3018/3019 communication-fault response # p. 15 Actual Value Scaling (resolution x 100%-reference) # p. 16 fault queue -> Modbus registers # pp. 20- 21 Modbus addressing statement, profiles, coil map # pp. 23- 26 4xxxx register map, actual values, exception codes # pp. 27- 31 ABB Drives profile CONTROL WORD and STATUS WORD bit tables # pp. 34- 35 state diagram and the literal start sequence used below # p. 36 REF1/REF2 scaling # pp. 41- 42 N2 analog-input objects — the per-parameter scale factors # manuals/abb_ach550_user_3AUA0000004092.pdf # "ACH550-01 User's Manual", doc 3AFE68258537 Rev G (EN, 2014-07-03). # FILENAME MISMATCH, deliberate note: the cached file's name carries # 3AUA0000004092, but that number belongs to the ACH550-UH manual (this # document's own p. 7 says so); the PDF's back cover identifies itself as # 3AFE68258537 Rev G. Do not go looking for 3AUA0000004092 to verify the # page citations below. # pp. 165-172 (printed) group 99 and group 01 parameter descriptions # p. 159 (printed) 3018 COMM FAULT FUNC / 3019 COMM FAULT TIME # pp. 328-350 (printed) complete parameter list with per-macro defaults # pp. 371-380 (printed) fault listing # # COVERAGE SCOPE: the register map, control word, addressing and serial # defaults are claimed for ACH550-01/-02/-U1/-U2 on the EFB manual's title # page. [faults.codes], the group 01/99 ranges and the 1003/3018/3019 # defaults are sourced from the ACH550-01 user's manual specifically (its # p. 7 scopes it to -01) and have not been confirmed for -02/-U1/-U2. # # Drive-side setup — without these the drive ACKs writes and ignores them # (EFB pp. 7-11, 27): # 9802 COMM PROTOCOL SEL = 1 (STD MODBUS) enable EFB Modbus # 5302 EFB STATION ID = node address default 1; 0 disables the port # 5303 EFB BAUD RATE default 9.6 kbit/s # 5304 EFB PARITY = 1 (8N2) MODBUS DEFAULT IS 8N2, NOT 8N1. # The N2/FLN default is 0 (8N1) — # different column, same table # (EFB p. 8). Do not carry the # ACS550's 8N1 default across. # 5305 EFB CTRL PROFILE = 0 (ABB DRV LIM) default; see below # 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) required for reverse-by-sign # (EFB p. 9). FACTORY DEFAULT IS # FORWARD in all 14 macros # (printed pp. 334-335) — see the # reverse note below. # 3018 COMM FAULT FUNC = 1 (FAULT) trip on comm loss. # DEFAULT IS 0 NOT SEL — out of the # box this drive keeps running on a # dead bus (complete list, printed # p. 346). # 3019 COMM FAULT TIME default 10.0 s # The drive must also be in REMOTE (REM), not panel LOCAL (EFB p. 27). # Modbus parameter writes are VOLATILE (EFB p. 25): "modified values are not # automatically stored to permanent memory. Use parameter 1607 PARAM. SAVE." # A clone/restore that skips 1607 reverts on the next power cycle. # # CONTROL PROFILE. 5305 selects the semantics of 40001/40004. This file targets # 5305 = 0 ABB DRV LIM, the factory default for Modbus (EFB p. 8). Bits 4 and # 10 are Unused in DRV LIM, so the words below leave them clear. # * With 5305 = 2 ABB DRV FULL those bits become RAMP_OUT_ZERO and # REMOTE_CMD and must be SET to run (EFB pp. 28-29). This profile will not # start a DRV FULL drive — it will sit in RFG OUT ZERO. That is a safe # failure, not a silent one; do not "fix" it by setting the bits without # confirming 5305 on the unit. # * With 5305 = 1 DCU PROFILE, 40001 and 40004 are not supported at all # (EFB p. 24) and control moves to 40031…40034. This profile does not apply. # # ADDRESSING — 0-based, stated by ABB: "The ACH550 supports the zero-based # addressing of the Modbus specification. Holding register 40002 is addressed # as 0001 in a Modbus message." (EFB p. 20) # 0-based address = 4xxxx register number - 40001 # and parameters map one-for-one, "e.g. 40102 is parameter 0102" (EFB p. 24), # i.e. 0-based address = parameter number - 1. # Worked examples: # 40001 CONTROL WORD -> 40001 - 40001 = 0 # 40004 STATUS WORD -> 40004 - 40001 = 3 # par 0103 OUTPUT FREQ -> 40103 -> 40103 - 40001 = 102 (= 103 - 1) # par 9906 MOTOR NOM CURR -> 49906 -> 49906 - 40001 = 9905 (= 9906 - 1) # 3xxxx here is a DIFFERENT space (FC04) holding only AI1 and AI2 (EFB p. 23), # and 0xxxx coils are a bit-wise alias of the control word (EFB p. 21). # # SCALING. EFB p. 15 gives the general rule: scaled value = feedback integer x # the parameter's resolution, and for percent-type parameters additionally x # (value of the 100% reference parameter) / 100%. The ACH550 User's Manual # prints ranges but no resolution column, so the resolutions below are taken # from the N2 analog-input table (EFB pp. 41-42), which lists a scale factor # per drive parameter and which the manual states matches the Modbus scaling: # "Although Actual Value scaling could differ from the above for the N2 and FLN # protocols, it currently does not" (EFB p. 15). Negative actuals are two's # complement (EFB p. 26). # # The monitor points below read the PARAMETER registers (40101+) rather than # 40005…40012 Actual 1…8. Actual 1 and 2 default to 0103 and 0104 but are # re-pointable with 5310/5311, and Actual 3…8 are empty until someone sets # 5312…5317 — a site can silently change what those registers mean. The # parameter registers cannot be re-pointed. # # verified = false — documentation only, never bench-confirmed. name = "ABB ACH550" vendor = "ABB" device_type = "vfd" verified = false probe_register = 3 # 40004 status word, present whenever 5305 = 0 or 2 [serial] baudrate = 9600 parity = "N" stopbits = 2 # 5304 = 1 (8N2) is the Modbus factory default — EFB p. 8 [monitor] # 40001, ABB DRV LIM names (EFB pp. 21, 28-29). Bits 0,1,2,5,6 are ACTIVE LOW # (starred in the coil table, EFB p. 21). Bits 4, 8, 9, 10, 12-15 are Unused. 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 (EFB p. 36). reference_1 = { address = 1, signed = true, scale = 0.005, unit = "%" } # 40004 (EFB p. 31). Bits 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: integer rpm, signed, user manual printed p. 172 (the N2 table's scale-1 rpm row is 0102, not 0101) output_frequency = { address = 102, scale = 0.1, unit = "Hz" } # 0103, N2 AI1 scale 10 motor_current = { address = 103, scale = 0.1, unit = "A" } # 0104, N2 AI4 scale 10 motor_torque = { address = 104, signed = true, scale = 0.1, unit = "%" } # 0105; 0.1 from the N2 table — the user manual's own range (printed p. 172) shows no decimal, so a bench may show 1%/count # 0106 POWER. N2 AI6 scale 10, units kW, range 0…9999 — listed unsigned there, # so no sign is claimed. -02/-U2 units in an NEC market may display hp on the # panel; the fieldbus unit is the one the N2 table names. output_power = { address = 105, scale = 0.1, unit = "kW" } dc_voltage = { address = 106, unit = "V" } # 0107, N2 AI11 scale 1 output_voltage = { address = 108, unit = "V" } # 0109, N2 AI12 scale 1 drive_temp = { address = 109, scale = 0.1, unit = "C" } # 0110; 0.1 from the N2 table — user manual range (p. 172) shows no decimal, bench may show 1 C/count # ABB Drives profile, DRV LIM. These are the manual's own literal control-word # values from the worked start example (EFB p. 34, steps 1-6), transcribed from # its binary column, not reconstructed from the bit table: # 0000 0000 0000 0110 -> READY TO SWITCH ON # 0000 0000 0000 0111 -> READY TO OPERATE # 0000 0000 0000 1111 -> OPERATION ENABLED (drive starts, does not accelerate) # 0000 0000 0010 1111 -> RFG: ACCELERATOR ENABLED # 0000 0000 0110 1111 -> OPERATING (follows the reference) [control] command_register = 0 speed_register = 1 speed_scale = 0.005 # write %, 20000 raw = 100% of 1105 REF1 MAX (EFB p. 36) 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" # (EFB p. 34); 150 ms gives that with margin on every step. step_delay = 0.15 # Clear OFF1 only: ramp stop on 2203/2205 (EFB p. 28). 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. stop = [0x006E] run_fwd = [0x0006, 0x0007, 0x000F, 0x002F, 0x006F] # Bit 7 is edge sensitive (0=>1) and effective only if 1604 = COMM (EFB p. 29). # Raised on top of the STOPPED word and 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: the ABB Drives profile has no REVERSE bit (the DCU profile's # bit 2 is, and that is a different profile and a different register set). # Reverse with a negative reference — CONDITIONAL ON 1003 DIRECTION = 3 # (REQUEST). With the factory default 1003 = FORWARD the resultant reference # is the ABSOLUTE value (EFB p. 38 reference-handling diagram): a -50% # command runs the motor FORWARD at 50%, not reverse and not nothing. [control.watchdog] # 3018 = 1 FAULT trips 28 SERIAL 1 ERR after 3019 COMM FAULT TIME, default # 10.0 s (complete parameter list, printed p. 346). 500 ms keeps a wide margin # under that default and under any shorter time a site configures. interval_ms = 500 fault = "28 SERIAL 1 ERR" # GAP: the ABB Drives profile status word has no bit named RUNNING (EFB p. 31) # — the DCU profile does, at bit 3, but that needs 5305 = 1 and registers # 40033/40034. Bit 2 RDY_REF / OPERATION ENABLED is the state the drive holds # from OPERATION ENABLED through OPERATING on the state diagram (EFB p. 35), so # it is the closest available indicator. That is an inference from the diagram, # not a labelled running bit. Bit 8 AT_SETPOINT is NOT a substitute even though # the diagram tags OPERATING with it: it drops whenever the actual value leaves # the tolerance band, including through every ramp. [running_check] register = 3 bit = 2 # 0401 LAST FAULT -> 40401 -> address 400. # CONFLICT INSIDE THE MANUAL, resolved deliberately. EFB p. 16 (and, # independently, the N2 table on EFB p. 42: AI17/18/19 = 0401/0402/0403) # tabulates # "0412 Previous Fault 1 -> 40402" and "0413 Previous Fault 2 -> 40403", which # contradicts the general mapping stated three times over (EFB pp. 23, 24, 14: # "any parameter can be accessed using the format: 4 followed by the parameter # number"). The user manual's parameter list confirms 0402 and 0403 are FAULT # TIME 1 and FAULT TIME 2, not fault codes, and that 0412/0413 are PREVIOUS # FAULT 1/2 (printed p. 334). The general rule is therefore used: 0412 -> 411, # 0413 -> 412. If a bench reads timestamps there, p. 16 is the correct table # and these become 401/402. This is monitoring only — no control depends on it. [faults] register = 400 history = [411, 412] # Decimal codes exactly as the panel reports them (printed pp. 371-380). Codes # 5, 13, 17, 23, 25 and 1002/1015 are listed by the drive as RESERVED/OBSOLETE # "Not used" and are omitted. 101…199 and 201…299 are SYSTEM ERROR ranges, not # enumerable here. Note the 10xx names are the ACH550's PFA/OVERRIDE HVAC set, # not the ACS550's PFC set. [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" 24 = "OVERSPEED" 26 = "DRIVE ID" 27 = "CONFIG FILE" 28 = "SERIAL 1 ERR" 29 = "EFB CON FILE" 30 = "FORCE TRIP" 31 = "EFB 1" 32 = "EFB 2" 33 = "EFB 3" 34 = "MOTOR PHASE" 35 = "OUTP WIRING" 36 = "INCOMPATIBLE SW" 37 = "CB OVERTEMP" 38 = "USER LOAD CURVE" 1000 = "PAR HZRPM" 1001 = "PAR PFA REF NEG" 1003 = "PAR AI SCALE" 1004 = "PAR AO SCALE" 1005 = "PAR PCU 2" 1006 = "PAR EXT RO" 1007 = "PAR FIELDBUS MISSING" 1008 = "PAR PFA MODE" 1009 = "PAR PCU 1" 1010 = "PAR PFA & OVERRIDE" 1011 = "PAR OVERRIDE" 1012 = "PAR PFA IO 1" 1013 = "PAR PFA IO 2" 1014 = "PAR PFA IO 3" 1016 = "PAR USER LOAD C" # 9906 MOTOR NOM CURR -> 49906 -> address 9905. Range "(0.2…2.0) x IN, where IN # is drive current" (printed p. 169). This guards a restore by comparing the # CONFIGURED motor current between source and target, not the frame size. A # drive-side rating candidate DOES exist — 3304 DRIVE RATING, group 33 # INFORMATION (printed p. 256), reachable at address 3303 — but its XXXY # format packs an alpha decimal point ("8A8" = 8.8 A) and the Modbus wire # encoding is undocumented, so it needs a bench read before it can guard # anything. The choice of 9906 is because 3304 is unverified, not because no # rating register exists. # SCALE IS AN INFERENCE: the manual prints no resolution for 9906. 0.1 A is # taken from the drive's current resolution elsewhere (0104 CURRENT, N2 scale # factor 10, EFB p. 41). Confirm on hardware before trusting the displayed # number; the comparison the guard performs is unaffected by the scale. [rating] register = 9905 scale = 0.1 unit = "A" label = "Motor nominal current (9906)" # No [parameters] section. EFB p. 25 says "except where restricted by the # drive, all parameters are available for both reading and writing" but prints # no table of writable ranges, and the 4xxxx parameter space is sparse: # "Register addresses that do not correspond to drive parameters are invalid" # and answer exception 02 ILLEGAL DATA ADDRESS (EFB p. 23), while read-only # group 01 addresses and writes attempted while the drive is running answer # exception 03 (EFB p. 26). A clone/restore range here needs a verified # parameter list, not an address sweep — and every write must be followed by # 1607 PARAM. SAVE or it is lost at the next power cycle. [connection] summary = "Connect to the ACH550 built-in RS-485 interface on control-board terminals X1:28-32; no option module is required." warnings = ["Use Belden 9842 or an equivalent 120-ohm dual twisted shielded pair.","Do not directly earth the RS-485 signal network; earth each drive through its designated protective connection."] [[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 commands/reference/reset and set a deliberate 3018/3019 communication-loss action."] warnings = [] source = "ABB 3AFE68320658, pp. 6-8." [[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 cable shield" device = "X1:28 Screen" signal = "Shield continuity" required = false [[connection.methods.wiring]] adapter = "Outgoing cable shield" device = "X1:32 Screen" signal = "Shield continuity" required = false