# Property of PMA Electrical Solutions, LLC. # # ABB ACS355 machinery drive ONLY. No sibling is claimed here: not ACS310, # ACS150, ACS355-in-a-cabinet variant, nor ACS380/ACS580. profiles/abb_acs580.toml # had an ACS355 claim REMOVED as unverified; this file is sourced independently # from the ACS355 manual and does not claim the 580 family back. # # COMMUNICATION PATH: the drive's EMBEDDED FIELDBUS (EFB) speaking Modbus RTU, # chapter 13 "Fieldbus control with embedded fieldbus", pp. 313-338. The EFB is # wired either through the optional FMBA-01 Modbus adapter module on drive # terminal X3 (EIA-485, multidrop) or RS-232 point-to-point on the panel # connector X2 (single master, cable <= 3 m), p. 313-314. Either way the # register map below is the same — it is the drive's own EFB map. # NOT this profile: chapter 14 "Fieldbus control with fieldbus adapter" # (p. 339+), the FPBA/FCAN/FENA/FSCA option-module path, which uses a 32-bit # DCU interface and the 54xx/55xx FBA groups. Different map entirely. # # Source: ABB machinery drives ACS355 User's Manual, 3AUA0000066143 Rev E # (EN_ACS355_UM_E_A5.pdf, 440 pp.), library.e.abb.com. # register map + addressing .......... pp. 325-326 # function / exception codes ......... pp. 324-327 # Control word ....................... pp. 329-330 # Status word ........................ pp. 330-331 # state diagram (start sequence) ..... p. 332 # reference scaling .................. p. 322 # direction handling ................. p. 323 # serial + profile defaults .......... pp. 290-291 # drive control parameters ........... pp. 316-318 # actual signals (group 01) .......... p. 183 # fault history (group 04) ........... pp. 189-190 # comm-loss 3018/3019 ................ p. 255 # 9906 MOTOR NOM CURR ................ p. 310 # fault codes ........................ pp. 359-368 # # DRIVE-SIDE SETUP. Without these the drive ACKs Modbus writes and ignores them: # 9802 COMM PROT SEL = STD MODBUS (EIA-485/FMBA-01) or MODBUS RS232 (X2) # 5302 EFB STATION ID = node 5303 EFB BAUD RATE 5304 EFB PARITY # 5305 EFB CTRL PROFILE = ABB DRV FULL <-- THIS PROFILE ASSUMES IT. # Factory default is ABB DRV LIM, which does NOT implement Control word # bit 4 (RAMP_OUT_ZERO) or bit 10 (REMOTE_CMD) used below (p. 328-330). # 1001 EXT1 COMMANDS = COMM (or 1002 for EXT2, whichever location is active) # 1103 REF1 SELECT = COMM (plain COMM — COMM+AI1 / COMM*AI1 correct the # reference with AI1 and break the scale, p. 320) # 1003 DIRECTION = REQUEST (see REVERSE below) # 1601 RUN ENABLE = COMM (else Control word bit 3 has no effect) # 1604 FAULT RESET SEL = COMM (else Control word bit 7 has no effect) # Parameter writes over Modbus are VOLATILE; write 1607 PARAM SAVE to persist # (p. 326). # # ADDRESSING. The manual maps everything into 4xxxx and then states "register # 4xxxx is addressed as xxxx-1" (p. 326). So: # 0-based protocol address = (4xxxx register number) - 40001 # and since drive parameter ppgg lives at register 40000 + ppgg (p. 325), that # collapses to the usual ABB form: # 0-based address = 100 * group + index - 1 # Worked: 0103 OUTPUT FREQ -> register 40103 -> 40103 - 40001 = 102 # -> 100*1 + 3 - 1 = 102. Same number, both ways. # 40004 Status word -> 40004 - 40001 = 3. # 9906 MOTOR NOM CURR -> 49906 - 40001 = 9905. # Nothing here is 4xxxx or 3xxxx notation. # # CONFIGURATION-DEPENDENT, stated rather than papered over: # - The monitor points below read GROUP 01 PARAMETERS DIRECTLY (40101+), whose # addresses are fixed. They deliberately do NOT use the 40005…40012 "Actual # 1…8" slots, because what lands in those is chosen by 5310…5317 EFB PAR # 10…17 and only 5310/5311 have vendor defaults (103, 104); 5312-5317 default # to 0 = unused (p. 291). Reading the parameters avoids that whole knob. # - speed_scale: 20000 raw = 100% of par 1105 REF1 MAX (p. 322). The Hz or rpm # that 100% means is 1105 on the actual drive, further clamped by 2001/2002 # or 2007/2008. Percent is therefore the only honest unit here. # - 3019 COMM FAULT TIME defaults to 3.0 s and 3018 COMM FAULT FUNC defaults to # NOT SEL (p. 255) — i.e. out of the box the drive does NOT stop on comm loss. # Set 3018 = FAULT on anything that must stop. name = "ABB ACS355" vendor = "ABB" device_type = "vfd" verified = false probe_register = 3 # 40004 Status word — readable whenever the EFB is alive # 5304 EFB PARITY default is "8 NONE 1", 5303 EFB BAUD RATE default 9.6 kbit/s # (p. 291). Note this differs from the 580-family default of even parity. [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] 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", 10 = "REMOTE_CMD", 11 = "EXT_CTRL_LOC" } } reference_1 = { address = 1, signed = true, scale = 0.005, unit = "%" } # 20000 = 100% of 1105 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" } } # Group 01 OPERATING DATA, read-only, all 16-bit, FbEq per p. 183. motor_speed = { address = 100, signed = true, unit = "rpm" } # 0101 SPEED & DIR, negative = reverse output_frequency = { address = 102, scale = 0.1, unit = "Hz" } # 0103, 1 = 0.1 Hz motor_current = { address = 103, scale = 0.1, unit = "A" } # 0104, 1 = 0.1 A # 0105 TORQUE is signed: the manual carries a separate 0172 ABS TORQUE signal # ("Calculated absolute value of the motor torque", 1 = 0.1%, p. 186), which # only exists because 0105 itself is signed. motor_torque = { address = 104, signed = true, scale = 0.1, unit = "%" } # 0105, % of nominal torque # 0106: p. 183 gives the scale but does NOT state signedness, and power can go # negative in regeneration. Signed is the safer read; confirm sign on a bench. motor_power = { address = 105, signed = true, scale = 0.1, unit = "kW" } # 0106 dc_bus_voltage = { address = 106, unit = "V" } # 0107, 1 = 1 V output_voltage = { address = 108, unit = "V" } # 0109, 1 = 1 V drive_temp = { address = 109, scale = 0.1, unit = "C" } # 0110 DRIVE TEMP (IGBT), 1 = 0.1 C motor_nom_current = { address = 9905, scale = 0.1, unit = "A" } # 9906 MOTOR NOM CURR, p. 310 # 0303 FB STS WORD 1, readable at 40303 -> address 302 by the same parameter # mapping as the group 01 points. p. 335 defines bit 3 RUNNING = "Drive is # modulating and following reference". The manual documents the bit lists under # the DCU profile; whether address 302 bit 3 is live under ABB DRV FULL needs # one bench read — if it is, it is the better running_check. fb_status_1 = { address = 302, bits = { 3 = "RUNNING" } } # ABB drives profile, Control word at 40004-3 ... i.e. register 40001 -> address 0. # The state diagram (p. 332) requires the sequence NOT READY -> READY TO SWITCH # ON -> READY TO OPERATE -> OPERATION ENABLED -> OPERATING, which is bits 0-6 # high. Bit 10 REMOTE_CMD is held high throughout to keep fieldbus control # enabled (ABB DRV FULL only, p. 330). # 0x0476 = bits 1,2,4,5,6,10 -> OFF1 low: stop on the active decel ramp # 0x047F = bits 0-6 + 10 -> OPERATING [control] command_register = 0 speed_register = 1 # 40002 Reference 1 speed_scale = 0.005 # 20000 raw = 100% of par 1105 REF1 MAX (p. 322) speed_signed = true speed_unit = "%" # percent of 1105, NOT Hz max_ref = 100.0 step_delay = 0.05 stop = [0x0476] run_fwd = [0x0476, 0x047F] # RESET IS A BIT, NOT A SEPARATE REGISTER on this drive — there is no distinct # reset register to declare, so reset_register is deliberately absent. Bit 7 is # edge-triggered (0=>1, p. 329) and is pulsed on top of the ramp-stop word, so # the drive is left stopped, not started, when the fault clears. Do NOT reset # with a bare 0x0080: that drives OFF1/OFF2/OFF3 low, which the manual defines # as Emergency OFF / Emergency stop (coast, or the 2208 ramp). reset = [0x0476, 0x04F6, 0x0476] # run_rev is deliberately absent. With 1003 DIRECTION = REQUEST the resultant # direction is the SIGN OF THE FIELDBUS REFERENCE (p. 323), so a "reverse" # Control word would be byte-identical to forward — reverse with a negative # reference. NOTE this is conditional on 1003 here, unlike the 580 family: # 1003 = FORWARD or REVERSE pins the direction and makes the sign inert. # 3018 COMM FAULT FUNC = FAULT trips 0028 SERIAL 1 ERR after 3019 COMM FAULT # TIME (default 3.0 s, range 0.0…600.0 s, p. 255). Keep the keepalive well under # whatever 3019 is set to on the unit. Protection is inactive for the first 60 s # after start-up. [control.watchdog] interval_ms = 500 fault = "0028 SERIAL 1 ERR" # Bit 2 RDY_REF = OPERATION ENABLED, held from OPERATION ENABLED through # OPERATING on the p. 332 state diagram — the same choice as abb_acs550 / # abb_acs310 / abb_acs580. Bit 8 AT_SETPOINT is NOT a substitute: p. 331 # defines it as actual within 4%/1% tolerance of reference, so it reads 0 # through every ramp while the motor is turning — fail-open for the restore # preconditions and a false "STOPPED" warning after every successful start. # The register 40033 RUNNING bit is DCU-profile-only (p. 325); see fb_status_1 # above for the parameter-mapped candidate worth one bench read. [running_check] register = 3 bit = 2 # 0401 LAST FAULT, then 0412 / 0413 PREVIOUS FAULT 1 / 2 (pp. 189-190). [faults] register = 400 history = [411, 412] # ACS355 fault codes are DECIMAL as displayed (0001 = 1), not hex, so these keys # are the codes themselves. pp. 359-368, transcribed COMPLETE — the table ends # at 1017 PAR SETUP 1 on p. 368. Codes 0101/0103/02xx are internal errors, # 1xxx are parameter-conflict faults. [faults.codes] 0 = "No fault (history clear)" 1 = "0001 OVERCURRENT" 2 = "0002 DC OVERVOLT" 3 = "0003 DEV OVERTEMP (IGBT)" 4 = "0004 SHORT CIRC" 6 = "0006 DC UNDERVOLT" 7 = "0007 AI1 LOSS" 8 = "0008 AI2 LOSS" 9 = "0009 MOT OVERTEMP" 10 = "0010 PANEL LOSS" 11 = "0011 ID RUN FAIL" 12 = "0012 MOTOR STALL" 14 = "0014 EXT FAULT 1" 15 = "0015 EXT FAULT 2" 16 = "0016 EARTH FAULT" 17 = "0017 UNDERLOAD" 18 = "0018 THERM FAIL" 21 = "0021 CURR MEAS" 22 = "0022 SUPPLY PHASE" 23 = "0023 ENCODER ERR" 24 = "0024 OVERSPEED" 27 = "0027 CONFIG FILE" 28 = "0028 SERIAL 1 ERR (fieldbus comm loss)" 29 = "0029 EFB CON FILE" 30 = "0030 FORCE TRIP (trip commanded over fieldbus)" 34 = "0034 MOTOR PHASE" 35 = "0035 OUTP WIRING" 36 = "0036 INCOMPATIBLE SW" 37 = "0037 CB OVERTEMP" 44 = "0044 SAFE TORQUE OFF" 45 = "0045 STO1 LOST" 46 = "0046 STO2 LOST" 101 = "0101 SERF CORRUPT" 103 = "0103 SERF MACRO" 201 = "0201 DSP T1" 202 = "0202 DSP T2" 203 = "0203 DSP T3" 204 = "0204 DSP STACK" 206 = "0206 CB ID ERROR" 1000 = "1000 PAR HZRPM" 1003 = "1003 PAR AI SCALE" 1004 = "1004 PAR AO SCALE" 1005 = "1005 PAR PCU 2" 1006 = "1006 PAR EXT RO" 1007 = "1007 PAR FBUSMISS" 1009 = "1009 PAR PCU 1" 1015 = "1015 PAR USER U/F" 1017 = "1017 PAR SETUP 1" # 3304 DRIVE RATING, group 33 INFORMATION, READ-ONLY (p. 261): "Displays the # drive current and voltage ratings", format XXXY hex where XXX is the drive's # own nominal current (an "A" marks the decimal point, e.g. 9A8 = 9.8 A) and # Y the voltage class. The restore guard only compares source and target for # equality, so this opaque frame-identity word is a strictly better guard than # a scaled amp figure: 9906 MOTOR NOM CURR is operator-entered MOTOR plate # data, would Match across two different frames sharing one motor value, and # would be rewritten by the very restore it guards. 9906 stays available as a # [monitor] point above for a human-readable current. [rating] register = 3303 words = 1 scale = 1.0 unit = "" label = "3304 DRIVE RATING (XXXY hex: nominal current + voltage class)" # NO [parameters] BLOCK, DELIBERATELY — same reason as profiles/abb_acs310.toml. # p. 326: "Parameter writes through standard Modbus are always volatile, ie, # modified values are not automatically stored to the permanent memory. Use # parameter 1607 PARAM SAVE to save all changed values." 1607 sits at register # 41607 -> 0-based 1606, but it reads DONE (0) on both source and target, so a # plan/restore diff never writes it: a restore would read-back-verify as fully # successful and then silently revert at the next power cycle — the worst # failure mode for a drive-replacement clone. A [parameters] block also has no # way to express the required exclusions the manual demands: par 5319 EFB PAR # 19 at address 5318 is a live copy of the ABB drives Control word (p. 292, # p. 325), and pars 5302-5305 / 9802 (addresses 5301-5304 / 9801) are the # link's own station ID, baud, parity and protocol select, whose restore would # re-address the target mid-burst (p. 315-316). Supporting restore here needs # a post-restore 1607 write the profile format cannot express. [connection] summary = "The ACS355 embedded Modbus map can be reached through an FMBA-01 EIA-485 module on X3 or through point-to-point RS-232 on panel connector X2." warnings = ["Choose STD MODBUS for FMBA-01 or MODBUS RS232 for X2.","The exact X2 conductor pinout is not published in the cached ACS355 manual; use a preterminated ABB panel cable."] [[connection.methods]] id = "fmba_01_eia485" title = "FMBA-01 EIA-485" transport = "serial" hardware = "option" port = "FMBA-01 connector X1, module installed on drive terminal X3" connector = "X1:1 SHLD, 2 DATA_B positive, 3 DATA_A negative, 4 GND_B" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded twisted pair plus isolated signal-ground conductor" parts = ["ABB FMBA-01","Isolated USB-to-RS-485 adapter","Shielded twisted pair plus common"] steps = ["Lock out the drive and wait for the DC bus to discharge.","Install FMBA-01 on drive connector X3 and secure it according to the module manual.","Land the bus on FMBA X1 exactly as shown below.","Set J1 termination on only at a physical bus end.","Restore power with the motor inhibited and verify a read."] setup = ["Set 9802 = STD MODBUS and configure 5302/5303/5304/5305 = ABB DRV FULL.","Select COMM for commands/reference/reset and configure 3018/3019."] warnings = ["FMBA-01 is the physical layer for the embedded map; do not configure it as the separate chapter-14 FBA interface."] source = "ABB FMBA-01 manual 3AFE68586704 Rev A, pp. 15-18; ACS355 manual 3AUA0000066143 Rev E, pp. 313-318." [[connection.methods.wiring]] adapter = "D+ / B / positive" device = "X1:2 DATA_B" signal = "RS-485 positive" [[connection.methods.wiring]] adapter = "D- / A / negative" device = "X1:3 DATA_A" signal = "RS-485 negative" [[connection.methods.wiring]] adapter = "COM / signal common" device = "X1:4 GND_B" signal = "Isolated signal ground" [[connection.methods.wiring]] adapter = "Cable shield" device = "X1:1 SHLD" signal = "Shield/chassis bond" required = false [[connection.methods]] id = "x2_rs232" title = "Panel connector X2 RS-232" transport = "serial" hardware = "built_in" port = "control-panel connector X2" connector = "RJ-45 control-panel connector; exact conductor pin assignment is not published in 3AUA0000066143" adapter = "PC RS-232 port or isolated USB-to-RS-232 adapter" cable = "ABB-approved preterminated RJ-45 control-panel cable, maximum 3 m" parts = ["RS-232 port/adapter","ABB-approved preterminated panel cable"] steps = ["Lock out the drive and remove the control panel.","Connect the preterminated ABB panel cable to X2 without repinning it.","Restore power with the motor inhibited and verify a point-to-point read."] setup = ["Set 9802 = MODBUS RS232 and configure 5302/5303/5304/5305 = ABB DRV FULL.","Select COMM for commands/reference/reset and configure communication-loss handling."] warnings = ["Do not fabricate an X2 lead from another product's pinout.","Point-to-point only; maximum cable length is 3 m."] source = "ABB 3AUA0000066143 Rev E, pp. 313-318." [[connection.methods.wiring]] adapter = "ABB preterminated RS-232 panel cable" device = "X2 panel connector" signal = "Complete point-to-point RS-232 path; exact X2 pins not published"