# Property of PMA Electrical Solutions, LLC. # # Allen-Bradley SMC-50 SOFT STARTER (Bulletin 150), low-voltage control module. # NOT a VFD, and NOT the SMC Flex, SMC-3 or the medium-voltage OneGear SMC-50 # (7760F-UM001) — those are different documents and are deliberately not # claimed here. # # MODBUS PATH ASSUMED BY THIS PROFILE # The SMC-50 has NO embedded Modbus. It speaks DPI internally and needs a # 20-COMM-x module in control-module hardware port 9 (which reports as DPI # port 4). This profile assumes the **20-COMM-H RS-485 HVAC adapter with its # protocol selector switch set to Modbus RTU**, in its default **16-bit # parameter mode** (adapter par 32 [RTU Param Mode] = 0). # - 150-UM011F p. 191 Table 116 names 20-COMM-H / 20COMM-UM009 as the # RS-485 (Modbus RTU) option for the SMC-50. # - 20COMM-UM009D's own compatibility table (p. 1-3) predates the SMC-50 and # lists SMC Flex, not SMC-50; its worked examples are PowerFlex 70/700. The # SMC-50's own Logic Command / Logic Status bit definitions (150-UM011F # p. 195 Tables 121-122) replace the PowerFlex ones used in that manual. # Nothing here applies to a 20-COMM-M (Modbus TCP) or to any other module. # # SOURCES # Rockwell 150-UM011F-EN-P, SMC-50 Soft Starters User Manual (Apr 2025) # pp. 191-196 communications, ports, Logic Mask, Logic Command/Status, # scale-factor rule, Datalinks # pp. 204-207 Tables 129/130, fault and alarm code cross-reference # pp. 217-240 Appendix A, parameter list (numbers, units, decimals, R/W) # Rockwell 20COMM-UM009D-EN-P, 20-COMM-H RS-485 HVAC Adapter User Manual # pp. 3-3…3-9 serial defaults, DPI I/O Cfg, Network Timeout, Comm Flt Action # pp. 4-2…4-9 Modbus register map, addressing rule, parameter direct access # p. B-4 par 32 [RTU Param Mode], default 16-bit # # ADDRESSING — 0-BASED PROTOCOL ADDRESSES, FC03/06/16 HOLDING REGISTERS. # 20COMM-UM009D p. 4-2: "you must address it to one less than the Modbus # address in the manual", e.g. Logic Command 4x0001 -> 0-based 0. # Drive parameter direct access (p. 4-4 Table 4.C, p. 4-9), 16-bit mode: # 0-based address = 999 + parameter number # par 5 [Current Phase Ave] -> 999 + 5 = 1004 # par 43 [Product Status] -> 999 + 43 = 1042 # CAUTION, off-by-one in the vendor manual: p. 4-9 states the formula # "41000 + (Drive Parameter #)" and then, in the same paragraph, says # parameter 1 is at 41000 — one less than its own formula gives. Both the # formula and Table 4.C ("4x1000 + param #") agree on 999 + param#, so that is # what is used here; the worked example is treated as the error. CONFIRM ON # HARDWARE by reading par 43 at 1042 and checking the bit pattern against a # known starter state before trusting any parameter address. # 32-bit parameters (Real Power, energies, elapsed times, peak currents) are # NOT reachable in 16-bit mode; adapter par 32 = 1 changes the formula to # 999 + 2*param# for everything, which this profile does not model. # The I/O image (3x / input registers, FC04) is a SEPARATE address space and is # deliberately unused — every monitor point below is a holding register. # # DRIVE-SIDE SETUP — without these the starter ACKs and ignores control writes. # SMC-50 par 148 [Logic Mask] bit 4 = 1 (DPI port 4 = internal comm module). # Default is 0: out of the box the SMC-50 accepts NO start/maneuver command # from the comm module. Stop and coast are always accepted from any port # regardless of the mask (150-UM011F p. 192). # SMC-50 par 150 [Write Mask Cfg] bit 4 = 1 to allow parameter writes from # port 4 (default already enables ports 1-4). # 20-COMM-H par 16 [DPI I/O Cfg] bit 0 = 1 (Cmd/Ref), the default. # 20-COMM-H node address: rotary switches, or switches at 00 and par 03. # Setting par 148 arms the starter for network control AND makes pulling the # module a fault ("Exp Removed", code x026). # # SCALING — 150-UM011F p. 196: values on the wire are unscaled integers; the # divisor is the parameter's own number of decimal places as printed in # Appendix A (par 17 [Power Factor] stores 85 for 0.85). It is NOT a fixed # fieldbus scale and it is NOT the HIM display format. # # NO SPEED REFERENCE. 150-UM011F p. 195: "The SMC-50 controller does not offer # the analog Reference feature." The adapter reserves 4x0002/4x0003 for a # reference the starter ignores, so [control] has no speed_register and there # is no run_rev — a soft starter does not reverse. Slow Speed 1/2 (command # bits 4 and 7) are separate maneuvers, not a speed reference. name = "Allen-Bradley SMC-50 (soft starter)" vendor = "Allen-Bradley" device_type = "soft_starter" verified = false probe_register = 1042 # par 43 Product Status, readable whenever DPI is alive # 20-COMM-H defaults: par 05 [Net Rate Cfg] = 1 (9600), par 07 [Net Parity Cfg] # = 0 (None), par 30 [Stop Bits Cfg] = 0 (1 bit). 4800/9600/19200/38400 and # N/O/E are all selectable, so confirm against the installed module. [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # par 43 [Product Status] — the DPI Logic Status word, 150-UM011F p. 195 # Table 121. Bits 12-13 are reserved and always 0. status_word = { address = 1042, bits = { 0 = "ENABLED_READY", 1 = "RUNNING", 2 = "PHASING_ABC", 3 = "PHASING_ACTIVE", 4 = "STARTING", 5 = "STOPPING", 6 = "ALARM", 7 = "FAULT", 8 = "AT_SPEED", 9 = "START_ISOLATION", 10 = "BYPASS", 11 = "READY", 14 = "INPUT_1", 15 = "INPUT_2" } } # par 5-8 Current Phase Ave/A/B/C. Appendix A prints 0/15000 with no decimal # place, so 1 count = 1 A. par 78 [Motor FLC] by contrast prints 1.0/2200.0 and # therefore carries one decimal — do not reuse this scale for it. motor_current = { address = 1004, unit = "A" } current_a = { address = 1005, unit = "A" } current_b = { address = 1006, unit = "A" } current_c = { address = 1007, unit = "A" } # par 1-4 Volts Phase Ave/A-B/B-C/C-A, 0/700, no decimals. line_voltage = { address = 1000, unit = "V" } voltage_ab = { address = 1001, unit = "V" } voltage_bc = { address = 1002, unit = "V" } voltage_ca = { address = 1003, unit = "V" } # par 17, -1.00/1.00 -> two decimals. Positive is LEADING, negative LAGGING. power_factor = { address = 1016, scale = 0.01, signed = true } motor_thermal = { address = 1017, unit = "%" } # par 18 Motor Therm Usage, 0/200 %MTU # par 34, only meaningful in linear-speed start/stop modes (par 49/65 = 3). motor_speed = { address = 1033, unit = "%" } line_frequency = { address = 1223, unit = "Hz" } # par 224, 0/100, no decimals board_temp = { address = 1215, unit = "C", signed = true } # par 216, -25/100 # DPI Logic Command word, adapter holding register 4x0001 -> 0-based 0 # (20COMM-UM009D p. 4-7 Table 4.F). Bit meanings are the SMC-50's own, # 150-UM011F p. 195 Table 122 — NOT the PowerFlex bits printed in the adapter # manual. Bits 8-10 are reserved and must always be written 0. # 0 Stop (Coast/Inhibit) 1 Start 2 Stop Option (stop maneuver) # 3 Clear Fault 4 Slow Speed 1 5 Emergency Run 6 Motor Winding Heater # 7 Slow Speed 2 11 Aux Enable 12-15 Network #1-#4 outputs [control] command_register = 0 step_delay = 0.05 # Bit 0 = Coast/Inhibit: power off the motor unconditionally, and it holds the # starter inhibited until cleared. Bit 2 [Stop Option] would instead run the # configured stop maneuver (par 65 [Stop Mode], default 0 = Coast anyway), which # is the gentler choice on a pump but depends on drive configuration to do # anything. The deterministic one is used here. stop = [0x0001] # 0x0000 first clears a latched Stop/Inhibit — Start is ignored while bit 0 is # held — then bit 1 issues the start. 0x0000 is the neutral word, so the # keepalive that follows re-asserts nothing. run_fwd = [0x0000, 0x0002] # Bit 3 [Clear Fault], pulsed. 0x0008 has bit 1 clear, so this reset value is # NOT a run command; the Delta MS300 trap does not apply. reset = [0x0000, 0x0008, 0x0000] # run_rev is deliberately absent: a soft starter has no reverse. Parameters 72 # and 350 allow a negative Slow Speed, but that is a maneuver on command bits # 4/7, not a direction for a normal start. # 20-COMM-H par 11 [Network Timeout] defaults to 10 s (range 0-180, 0 disables). # On expiry the module applies par 15 [Comm Flt Action], which DEFAULTS TO # "Fault" — the starter faults and stops. Other settings (Hold Last, Zero Data) # leave a running motor running, so the failure direction depends entirely on # how the module was commissioned. 1 s keepalive gives 10x margin at the # default timeout; shorten if par 11 was reduced. [control.watchdog] interval_ms = 1000 fault = "20-COMM-H Network Timeout (par 11) -> Comm Flt Action (par 15, default Fault)" [running_check] register = 1042 bit = 1 # Product Status bit 1 = Running (power applied to motor) # par 138 [Fault 1] is the newest entry in the five-deep fault buffer; # par 139-142 hold the older four (150-UM011F p. 201). # Codes from expansion modules and DPI peripherals are PREFIXED with the port # number, so "Exp Removed" (26) reads as 9026 from control-module port 9 and # 4026 from the comm module's DPI port. Strip the leading digit before matching # codes 26, 27, 28 and the TB Input codes 38-41. [faults] register = 1137 history = [1138, 1139, 1140, 1141] # 150-UM011F pp. 204-207, Table 129 cross-reference plus Table 130 descriptions. # Codes 71-77 are EVENT codes that land in the alarm buffer, not fault codes, # and are omitted. 78-99 are reserved. 100-199 are generic "System Faults" # (controller hardware, e.g. watchdog timeout) with no per-code table published. [faults.codes] 0 = "None" 1 = "Line Loss A" 2 = "Line Loss B" 3 = "Line Loss C" 4 = "Shorted SCR A" 5 = "Shorted SCR B" 6 = "Shorted SCR C" 7 = "Open Gate A" 8 = "Open Gate B" 9 = "Open Gate C" 10 = "SCR Overtemp" 11 = "Open Bypass A" 12 = "Open Bypass B" 13 = "Open Bypass C" 14 = "No Load" 15 = "Open Load A" 16 = "Open Load B" 17 = "Open Load C" 18 = "Voltage Unbalance" 19 = "Overvoltage" 20 = "Undervoltage" 21 = "Overload" 22 = "Underload" 23 = "Jam" 24 = "Stall" 25 = "Phase Reversal" 26 = "Exp Removed (port digit prefixes this code)" 27 = "Exp Incompat (port digit prefixes this code)" 28 = "Expansion (port digit prefixes this code)" 29 = "Excess Starts / Starts per Hour" 30 = "CT Loss A" 31 = "CT Loss B" 32 = "CT Loss C" 33 = "HAL ID" 34 = "NVS Error" 35 = "V24 Recovery (Table 129; Table 130 lists 35 as future use)" 36 = "V24 Loss" 37 = "VControl Loss" 38 = "TB Input 1" 39 = "TB Input 2" 40 = "TB Input 3" 41 = "TB Input 4" 42 = "Current Imbalance" 43 = "Under Power Real" 44 = "Over Power Real" 45 = "Under Power Reactive +" 46 = "Over Power Reactive +" 47 = "Under Power Apparent" 48 = "Over Power Apparent" 49 = "Frequency" 50 = "PM Hours" 51 = "PM Starts" 52 = "Power Quality A" 53 = "Power Quality B" 54 = "Power Quality C" 55 = "Power Quality THD V" 56 = "Power Quality THD I" 57 = "Config Change" 58 = "Ground Fault" 59 = "Motor PTC" 60 = "Power Pole PTC" 61 = "I/O Config" 62 = "Test Fault" 63 = "Under PF Lag" 64 = "Under PF Lead" 65 = "Over PF Lag" 66 = "Over PF Lead" 67 = "-MVAR Over" 68 = "-MVAR Under" 69 = "RTC Battery Low" 70 = "Locked Rotor" # Starter and motor configuration only — the block an electrician actually # clones. Ranges are parameter numbers mapped through 999 + param#: # par 46-73 (1045-1072) line voltage, motor data, start/stop modes, ramps, # kickstart, braking, slow speed, control inputs # par 75-137 (1074-1136) overload, FLC, and every protection level/delay # PARAMETER 74 DOES NOT EXIST (Appendix A jumps 73 -> 75) and the adapter # errors on a nonexistent parameter number, which is why this is two ranges. # Deliberately excluded: par 1-43 metering (read-only), par 44-45 motor # connection (45 is read-only), par 138-147 fault/alarm buffers (restoring them # would forge history), par 148-152 logic/write masks (restoring these changes # who is allowed to command the starter), par 153-168 Datalink pointers, par # 195-198 autotune results (read-only, and unit-specific), par 216-228 and # 265-296 metering (read-only), and everything on ports 7/8/9 — option-module # parameters are NOT reachable through 4x1000 + param#, which addresses the # control module only. [parameters] ranges = [[1045, 1072], [1074, 1136]] # No [rating] block. 150-UM011F Appendix A publishes no read-only parameter # carrying the starter's own frame/current rating — par 78 [Motor FLC] is a # writable nameplate entry, so it would be restored along with the clone and # could not catch a mismatched target. Compare catalog numbers by hand before # restoring a configuration onto a different unit. [connection] summary = "The SMC-50 has no compatible embedded Modbus port for this profile; install a Rockwell 20-COMM-H RS-485 adapter and connect it through DPI." warnings = ["Lock out the drive/starter, verify stored energy is discharged, and use ESD precautions before installing the adapter.", "The 20-COMM-H must be set to Modbus RTU, not N2 or P1.", "The optional 20-COMM-M Modbus TCP module is not this profile and is not interchangeable.", "Confirm parameter width/memory-map mode exactly as the profile requires before trusting an address."] [[connection.methods]] id = "20_comm_h_rs485" title = "20-COMM-H Modbus RTU option" transport = "serial" hardware = "option" port = "Control-module hardware port 9 (reported as DPI port 4)" connector = "20-COMM-H six-pin network plug: TERM, A, B, COM, SHIELD, GND" adapter = "Isolated USB-to-RS-485 adapter" cable = "Belden 3106A three-wire RS-485 cable or equivalent; Belden 3105A two-wire is allowed where COM is intentionally omitted" parts = ["Rockwell 20-COMM-H RS-485 HVAC adapter", "Drive-specific DPI internal interface cable/carrier", "Isolated USB-to-RS-485 adapter", "Belden 3106A or equivalent", "Six-pin linear plug supplied for the adapter"] steps = ["Remove drive/starter and network power and verify discharge.", "Set the 20-COMM-H node-address switches and the protocol selector to RTU before installation.", "Mount and ground the adapter, then connect its internal interface cable to the documented DPI port.", "Land A, B, COM and shield on the six-pin network plug exactly as shown below.", "At a bus end jumper TERM to A; at one network point only jumper SHIELD to GND.", "Restore control power with the motor inhibited, verify adapter status, and prove a read before enabling control."] setup = ["Install the 20-COMM-H in hardware port 9, select RTU and set a unique node.", "Keep adapter par 32 = 0 and par 16 bit 0 = 1.", "Set SMC-50 par 148 Logic Mask bit 4 and par 150 Write Mask bit 4.", "Configure Network Timeout and Comm Flt Action, then reset the adapter if required."] warnings = ["Do not install/remove the adapter with the drive energized.", "A = TxRxD- and B = TxRxD+ on this adapter; preserve those literal labels.", "Ground the shield at one point on the entire network."] source = "Rockwell 150-UM011F-EN-P pp. 191-196; 20COMM-UM009D-EN-P pp. 2-1 to 2-7 and 3-3 to 3-8." [[connection.methods.wiring]] adapter = "TxRxD- / A / -" device = "20-COMM-H A — TxRxD-" signal = "RS-485 A" [[connection.methods.wiring]] adapter = "TxRxD+ / B / +" device = "20-COMM-H B — TxRxD+" signal = "RS-485 B" [[connection.methods.wiring]] adapter = "COM / signal common" device = "20-COMM-H COM — Signal Common" signal = "Signal reference" [[connection.methods.wiring]] adapter = "Cable shield" device = "20-COMM-H SHIELD" signal = "Shield RC termination" required = false [[connection.methods.wiring]] adapter = "Protective earth at one network point" device = "20-COMM-H GND (jumper to SHIELD at one point only)" signal = "Shield earth bond" required = false