# Property of PMA Electrical Solutions, LLC. # # Allen-Bradley PowerFlex 400 (bulletin 22C) ONLY. # NOT claimed: PowerFlex 4, 4M, 40, 40P, 400P or 525. The PowerFlex 40 map was # deliberately NOT carried across — the 400 has its own parameter set (b-group # display, C-group communications, PID and aux-motor groups the 40 lacks) and # its own scaling (0.01 Hz reference, not 0.1). Every value below came from the # PowerFlex 400's own manual. # # Communication path: the drive's embedded RS-485 (DSI) RJ45 port, Modbus RTU. # No option module, no firmware level called out for Modbus. Only pins 4 and 5 # of the RJ45 are wired (p.143). Supported function codes: 03 read holding, # 06 write single, 16 write multiple (p.144). Metasys N2 and P1 FLN share the # same RS-485 (DSI) port and are selected by C102 (p.66); DeviceNet is a # separate adapter covered by its own manual (p.143). All out of scope here. # # Source: Rockwell Automation publication 22C-UM001K-EN-E, September 2025. # pp.143-147 Appendix E Modbus RTU: function codes, Logic Command 8192, # Reference 8193, Logic Status 8448, Drive Error Codes 8449, # Feedback 8451, and "register address equals the parameter number" # pp.47-48 Basic Display group b001-b015 (monitor scaling, "Display:" rows) # p.49 P033 [Motor OL Current], P035 [Maximum Freq] 0.0/320.0 Hz # pp.50-51 P036 [Start Source] / P038 [Speed Reference] option 5 "Comm Port" # p.66 C102-C106 comm format, data rate, node address, loss action/time # p.46 Parameter Organization table (group bounds for [parameters], # and d307/d308/d309 [Fault 1/2/3 Code] for the history) # # Drive-side setup before this profile can command anything (p.143): # P036 [Start Source] = 5 "Comm Port" -> Logic Command 8192 obeyed # P038 [Speed Reference] = 5 "Comm Port" -> register 8193 obeyed # C102 [Comm Format] 0 = RTU 8-N-1 (default) # C103 [Comm Data Rate] 3 = 9600 (default) # C104 [Comm Node Addr] default 100, range 1-247 # C105 [Comm Loss Action] default 0 "Fault"; C106 [Comm Loss Time] default 5.0 s # Power to the drive must be CYCLED after changing C102/C103/C104 (p.66). # Without P036/P038 the drive ACKs the writes and silently ignores them. # # ADDRESSING. No 4xxxx/PLC notation appears in this manual. The IMPORTANT note # on p.144 states the printed addresses are what a 0-based master puts on the # wire (its example: Logic Command is 8192 for a ProSoft 3150-MCM, 8193 for a # 1-based PanelView). Formula: 0-based address = the decimal number as printed; # for parameters, 0-based address = the parameter number (p.147). # worked example 1: Logic Status, printed 8448 -> address 8448 # worked example 2: b003 [Output Current], parameter 3 -> address 3 # (likewise P033 -> 33, P039 -> 39, C106 -> 106, d307 -> 307) # # SCALING is the manual's fixed decimal point (the "Display:" row of each # parameter), not a configurable fieldbus scale. Every point here is 16-bit # fixed point; the only 32-bit parameter in the display group is b008 # [Process Display], which is a user-scaled display value (A160 [Process # Factor]), not a raw measurement, so it is deliberately excluded. # # CONFIGURATION-DEPENDENT: b003/b013/P033 full scale is (Drive Rated Amps x 2), # so identical raw counts mean different amps on different frames; the 0.1 A # resolution itself is fixed. b001/b002 top out at P035 [Maximum Freq]. # # REVERSE is a discrete 2-bit field in the Logic Command (bits 5,4 = 10), NOT # the sign of the reference. run_rev is therefore populated and speed_signed is # false — do not copy the ABB sign-of-reference pattern onto this drive. # # RESET is bit 3 (Clear Faults) of the Logic Command itself, not a separate # register, so it is encoded as a sequence on command_register. # # GAPS, named rather than guessed: # - The manual prints only the Logic Command BITFIELD (p.144); it never prints # a worked start/stop/reset value. The values below are derived bit by bit # from that table, not quoted from an example. # - No Drive Rated Amps table was found in the pages read, so P033's numeric # default is not recorded here. # - No motor-torque-percent point exists in the display group; b013 [Torque # Current], in amps, is the closest documented value. # - Fault history beyond d307/d308/d309 (the chain runs to d336) is not mined. name = "Allen-Bradley PowerFlex 400" vendor = "Allen-Bradley" device_type = "vfd" verified = false probe_register = 8448 # Logic Status, readable whenever the DSI port is alive [serial] baudrate = 9600 parity = "N" stopbits = 1 # Appendix E fixed registers (pp.144-146) [monitor] logic_command = { address = 8192, bits = { 0 = "STOP", 1 = "START", 2 = "JOG", 3 = "CLEAR_FAULTS", 4 = "FORWARD", 5 = "REVERSE", 6 = "LOCAL_CONTROL", 7 = "MOP_INCREMENT", 15 = "MOP_DECREMENT" } } speed_reference = { address = 8193, scale = 0.01, unit = "Hz" } logic_status = { address = 8448, bits = { 0 = "READY", 1 = "ACTIVE", 2 = "CMD_FORWARD", 3 = "ROTATING_FORWARD", 4 = "ACCELERATING", 5 = "DECELERATING", 6 = "ALARM", 7 = "FAULTED", 8 = "AT_REFERENCE", 9 = "REF_BY_COMM", 10 = "CMD_BY_COMM", 11 = "PARAMS_LOCKED", 12 = "DIGITAL_IN_1", 13 = "DIGITAL_IN_2", 14 = "DIGITAL_IN_3", 15 = "DIGITAL_IN_4" } } feedback = { address = 8451, scale = 0.01, unit = "Hz" } # same data as b001 # Basic Display group, register = parameter number (pp.47-48) output_frequency = { address = 1, scale = 0.01, unit = "Hz" } # b001 commanded_frequency = { address = 2, scale = 0.01, unit = "Hz" } # b002 output_current = { address = 3, scale = 0.1, unit = "A" } # b003 output_voltage = { address = 4, unit = "V" } # b004, 1 VAC dc_bus_voltage = { address = 5, unit = "V" } # b005, 1 VDC # b006 [Drive Status] is a bitfield, but p.47 prints its bits as "Running - # Bit 1 ... Decelerating - Bit 4" without saying whether that numbering is # 0-based like the Logic Status word. Bit names are deliberately omitted rather # than guessed; use logic_status/running_check, which the manual numbers from 0. drive_status = { address = 6 } # b006 fault_1_code = { address = 7 } # b007 output_power = { address = 10, scale = 0.1, unit = "kW" } # b010 elapsed_run_time = { address = 12, scale = 10.0, unit = "h" } # b012, 1 = 10 Hrs torque_current = { address = 13, scale = 0.1, unit = "A" } # b013 drive_temp = { address = 14, unit = "C" } # b014, 1 degC # Logic Command word, p.144. Bit 0 Stop, bit 1 Start, bits 5,4 direction, # bit 3 Clear Faults. Bits 14-12 are left 000 "No Command" so the frequency # source stays as configured by P038 rather than being overridden per write. [control] command_register = 8192 speed_register = 8193 speed_scale = 0.01 # p.145: xxx.xx fixed point, decimal 543 = 5.43 Hz speed_signed = false # direction is bits 5,4, not the reference sign speed_unit = "Hz" max_ref = 320.0 # P035 [Maximum Freq] max, p.49 step_delay = 0.05 stop = [0x0001] # bit 0 Stop run_fwd = [0x0012] # bit 1 Start + bits 5,4 = 01 Forward run_rev = [0x0022] # bit 1 Start + bits 5,4 = 10 Reverse # reset_register is deliberately absent: Clear Faults is bit 3 of the SAME # register 8192, and validate() rejects reset_register == command_register. # Bit 3 alone leaves bit 1 (Start) at 0, so this is not a run command. reset = [0x0008, 0x0000] # C105 [Comm Loss Action] defaults to 0 "Fault": the drive trips F81 Comm Loss # and coasts after C106 [Comm Loss Time] (default 5.0 s, register 106, p.66). # Keep the keepalive well under whatever C106 is actually set to on the unit. [control.watchdog] interval_ms = 2000 fault = "F81 Comm Loss" [running_check] register = 8448 bit = 1 # Logic Status bit 1 = Active (Running) # 8449 Drive Error Codes (p.146). Stored history is the Advanced Display group # d307/d308/d309 [Fault 1/2/3 Code], d307 most recent (pp.46-47); the same code # space is also mirrored at b007, register 7. A197 [Fault Clear] clears them. # d330-d336 [Fault 4...10 Code] extend the chain on FRN 6.xx and later # (pp.46, 88); a pre-6.xx drive may not answer those addresses. [faults] register = 8449 history = [307, 308, 309, 330, 331, 332, 333, 334, 335, 336] # Codes from Table 26 "Fault Types, Descriptions and Actions" (p.97, the full # published list — the Appendix E table on p.146 is a subset of it), the code # space d307/b007 point at ("Min/Max 0/122, see Troubleshooting", pp.47/85). # F17 and F32 exist on FRN 6.xx and later only. Values absent from both # tables are not listed by Rockwell and are NOT invented here. [faults.codes] 0 = "No Fault" 2 = "Auxiliary Input" 3 = "Power Loss" 4 = "Undervoltage" 5 = "Overvoltage" 6 = "Motor Stalled" 7 = "Motor Overload" 8 = "Heatsink Overtemperature" 12 = "HW Overcurrent (300%)" 13 = "Ground Fault" 15 = "Load Loss" 17 = "Input Phase Loss" 29 = "Analog Input Loss" 32 = "Fan Fdbck Loss" 33 = "Auto Restart Tries" 38 = "Phase U to Ground Short" 39 = "Phase V to Ground Short" 40 = "Phase W to Ground Short" 41 = "Phase UV Short" 42 = "Phase UW Short" 43 = "Phase VW Short" 48 = "Params Defaulted" 63 = "Software Overcurrent" 64 = "Drive Overload" 70 = "Power Unit Fail" 71 = "Net Loss" 81 = "Communication Loss" 94 = "Function Loss" 100 = "Parameter Checksum Error" 122 = "I/O Board Fail" # P033 [Motor OL Current], register 33. p.49: Display 0.1 Amps, min/max # 0.0/(Drive Rated Amps x 2), default = Drive Rated Amps. The per-catalog # Drive Rated Amps figures are printed in Appendix A "Drive Ratings" (p.102); # the schema has nowhere to store a per-catalog table, so the guard compares # the drive's own configured value rather than a figure from this file. [rating] register = 33 words = 1 scale = 0.1 unit = "A" label = "Motor OL Current (P033)" # Writable configuration space, register = parameter number (p.46): # P031-P043 Basic Program, T051-T091 Terminal Block, C101-C109 Communications, # A141-A210 Advanced Program, R221-R254 Aux Relay Card. # Read-only groups b001-b015 and d301-d350 are deliberately excluded. # Numbers unused inside these spans (e.g. T057, T067, A161) do not exist. [parameters] ranges = [[31, 43], [51, 91], [101, 109], [141, 210], [221, 254]] [connection] summary = "Connect directly to the PowerFlex 400 built-in RS-485 DSI port using Modbus RTU; no network option module is required." warnings = ["Lock out and verify the drive is de-energized before opening its cover.", "Wire only RJ45 pins 4 and 5; Rockwell states the other pins carry power for peripherals.", "Keep the RS-485 cable at least 0.3 m (1 ft) from power conductors and cross at right angles.", "Rockwell notes that other manufacturers may interpret + and - differently; if a correctly configured two-wire link is silent, swap the pair at the master only."] [[connection.methods]] id = "built_in_dsi_rs485" title = "Built-in RS-485 DSI" transport = "serial" hardware = "built_in" port = "Drive RS-485 (DSI) RJ45" connector = "RJ45; pin 4 TxRxD+, pin 5 TxRxD-; all other RJ45 pins must remain disconnected" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded two-conductor RS-485 cable, optionally through Rockwell AK-U0-RJ45-TB2P breakout" parts = ["Isolated USB-to-RS-485 adapter", "Shielded two-conductor cable", "RJ45 plug wired only on pins 4/5 or AK-U0-RJ45-TB2P", "120 ohm terminators at the two bus ends"] steps = ["Lock out all power and verify the DC bus is discharged.", "Locate the RS-485 (DSI) RJ45 port.", "Wire TxRxD+ to pin 4 and TxRxD- to pin 5; leave every other RJ45 pin open.", "Connect the cable shield as specified below, at one end of each segment only, and install 120 ohm termination at both physical ends.", "Restore control power with the motor inhibited and verify a holding-register read before enabling control."] setup = ["P036 [Start Source] = 5 RS-485 (DSI) Port.", "P038 [Speed Reference] = 5 RS-485 (DSI) Port.", "Set C102 frame format, C103 data rate, C104 unique node, C105 loss action and C106 loss time."] warnings = ["Never connect Power over Ethernet to this port.", "Do not use an ordinary fully wired Ethernet patch lead between the drive and a serial adapter."] source = "Rockwell 22C-UM001K-EN-E (Sept 2025), pp. 143-145." [[connection.methods.wiring]] adapter = "TxRxD+" device = "RJ45 pin 4 — TxRxD+" signal = "RS-485 positive conductor" [[connection.methods.wiring]] adapter = "TxRxD-" device = "RJ45 pin 5 — TxRxD-" signal = "RS-485 negative conductor" [[connection.methods.wiring]] adapter = "Cable shield / PE" device = "RJ45 shield grounded at one point" signal = "Shield bond" required = false