# Property of PMA Electrical Solutions, LLC. # # Allen-Bradley PowerFlex 700S with **PHASE II CONTROL** only. # NOT claimed: Phase I control (a different parameter set, documented in # 20D-UM001), the PowerFlex 700 / 700VC / 700H / 700L (700S parameter numbering # is a different control platform entirely — nothing here was carried across # from rockwell_powerflex700.toml), the 700S on any adapter other than the # 20-COMM-H, and the 700S on Modbus/TCP. # # MODBUS PATH ASSUMED BY THIS PROFILE # The 700S has NO embedded serial port. It speaks DPI and needs a 20-COMM-x # module. This profile assumes the **20-COMM-H RS-485 adapter with its protocol # switch set to Modbus RTU**, in its default **16-bit parameter mode** (adapter # par 32 [RTU Param Mode] = 0). 20COMM-UM009D p. 1-2 "Compatible Products" # lists Modbus RTU as supported on the 700S column explicitly. No adapter or # drive firmware minimum is stated for that row. # # SOURCES — Rockwell primary documentation only: # 20COMM-UM009D-EN-P, 20-COMM-H RS-485 HVAC Adapter User Manual # p. 4-2 the "one less than the Modbus address" addressing rule # pp. 4-2…4-4 Table 4.B supported function codes, Table 4.C register map # pp. 4-5…4-7 Tables 4.D/4.E/4.F, Logic Command and Reference registers # p. 4-9 Drive Parameter Direct Access formula # p. 4-13 Table 4.L, adapter parameter registers (NOT a formula, see below) # pp. C-3…C-4 the PowerFlex 700S Phase II Logic Command / Logic Status words # pp. B-1…B-4 adapter parameter defaults, Network Timeout, Comm Flt Action # PFLEX-RM003E-EN-E, PowerFlex 700S AC Drives Phase II Control Reference # Manual (January 2011) # p. 28 Communications — DInt/Real parameter warning, DPI speed # reference scaling # pp. 30-31 the 16-bit (PLC-5/SLC) controller case # p. 48 Faults — parameters 323…325 [Fault Status 1…3], and the # deferral of the fault list to 20D-PM001 # p. 76 Output Display — parameters 297, 307, 308, 310, 311 # pp. 77-78 Owners, and the owner bit layout # p. 113/115 parameter 155 [Logic Status] bit 0 "Active" # p. 118 parameter 155 [Logic Status] bit 1 "Active" <- contradiction # p. 121 parameter 669 [Write Mask] / 712 [Write Mask Act] # p. 143 parameter 155 [Logic Status] bit 12 "Tach Loss Sw" # # NOT OBTAINED, AND THEREFORE NOT GUESSED AT: 20D-PM001, the PowerFlex 700S # Phase II Programming Manual. PFLEX-RM003 p. 3 records that 20D-UM006 was # retired and split into 20D-PM001 / 20D-IN024 / PFLEX-IN006; 20D-UM006 404s at # every literature.rockwellautomation.com pattern. 20D-PM001 is the only # document that carries the full parameter table (data type per parameter), the # fault code list (RM003 p. 48 says so outright), and any frame/rated-current # parameter. That is why there is no [faults.codes], no [rating] and no # [parameters] block below. # # 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", worked there as Logic Command 4x0001 -> data address # 0000. Two address spaces are in play: # # 1. DRIVE parameters, p. 4-9 / Table 4.C: "4x1000 + (Drive Parameter #)" in # 16-bit mode. Subtract the one: # 0-based address = 999 + drive parameter number # par 297 [Output Curr Disp] -> 999 + 297 = 1296 # par 323 [Fault Status 1] -> 999 + 323 = 1322 # CAUTION: p. 4-9 also writes the formula as "41000 + (Drive Parameter #)" # and then says parameter 1 is at 41000, one less than its own formula. # Table 4.C and the 4x1000 form agree on 999 + param#, so the worked # example is treated as the error — the same contradiction is already # flagged in rockwell_smcflex.toml and rockwell_smc50.toml. # # 2. ADAPTER parameters are NOT a formula. Table 4.L (p. 4-13) is a fixed # map, because the 32-bit adapter parameters occupy two registers each: # par 19 [Flt Cfg Ref] is 4x0119 Lo + 4x0120 Hi, and by par 30 the list # has drifted to 4x0140 [Stop Bits Cfg]. Do not compute 4x0100 + param# # past par 18. The addresses used below are read straight off Table 4.L. # Adapter par 32 [RTU Param Mode] is absent from Table 4.L (it postdates # it — see the manual's Summary of Changes), so its register is not known # and is not guessed here. # # 32-BIT PARAMETERS — THE DEFINING PROBLEM OF THIS DRIVE. # PFLEX-RM003 p. 28: "There are some special considerations for communicating # with a PowerFlex 700S drive through a 20-COMM module due to the use of DInt # (double integer) and Real (floating-point) type parameters." In the adapter's # 16-bit mode, a drive parameter is one register; what a DInt or Real parameter # returns through that single register is not stated in any document obtained. # RM003 names exactly ONE 16-bit-safe integer shadow: par 297 [Output Curr # Disp], "the integer equivalent of parameter 308 with a resolution of 1/10 # amperes" (p. 76). It names NO equivalent shadow for par 307 [Output Voltage], # 310 [Output Freq] or 311 [Output Power], so those three are deliberately # absent from [monitor] rather than mapped on a hopeful address. Establish # their data types from 20D-PM001 before adding them. # # ############ PARAMETER 151 IS NOT THE START/STOP WORD ############ # On a PowerFlex 70/700 the DPI Logic Command mirrors a drive parameter. On the # 700S it does not. Drive par 151 [Logic Command] is a *drive function* word: # RM003 documents its bit 1 "SpdRamp Dsbl", bit 2 "TachLoss Rst", bit 12 "PI # Trim En", bit 13 "Position En", bit 14 "I Gain" (pp. 57, 85, 88-89, 92, 118, # 142). Writing a DPI logic command value there would disable the speed ramp # and enable position mode, not start the motor. The DPI command from the # adapter is merged into par 152 [Applied LogicCmd] instead, which carries bits # 18 and 23 (p. 65) and is therefore wider than 16 bits. # THEREFORE [control] uses the ADAPTER's Product Logic Command register 4x0001 # -> 0-based 0, with the bit meanings from 20COMM-UM009D Appendix C p. C-3, # which is the 700S-specific table. The generic 7-Class table on p. C-1 is # labelled "except PowerFlex 700S" and must not be used here. # ################################################################## # # ############ NO speed_register, AND THAT IS NOT AN OVERSIGHT ############ # The reference is not a Hz or % value and it is not one register. # - Scale (RM003 p. 28): DPI reference = (Commanded RPM / BASE MOTOR SPEED) x # 32767. Base motor speed is entered at commissioning, so the engineering # meaning of a raw count differs per drive. It is not a fixed scale. # - Width: 20COMM-UM009D Table 4.F p. 4-7 splits the reference across 4x0002 # (Reference Lo, bits 0…15) and 4x0003 (Reference Hi, bits 16…31 *or* the # whole 16-bit reference), and footnote (1) says "the reference value is # sent only when accessing address 4x0003". Adapter par 12 [Ref/Fdbk Size] # is READ ONLY — "the drive determines the size" (p. B-2). Which size the # 700S negotiates is UNKNOWN from the documents. (RM003 pp. 30-31 is # about the PLC-5/SLC's SIGNED 16-bit limitation, not a wider reference — # do not read it as evidence either way.) If it negotiated 32-bit, a single # 16-bit write to 0-based 2 lands in bits 16…31 and commands roughly 65536x # the intended speed. vfd-core writes the reference as ONE register # (control.rs set_reference builds a default 1-word Point), so there is no # safe single-register mapping to make. Read [Ref/Fdbk Size] at 111 first; # if it reads 0 = 16-bit on a bench unit, 0-based 2 becomes usable and # speed_scale/max_ref can be derived from that drive's base motor speed. # Until then this profile is START/STOP + MONITOR: set the speed from the # drive's own reference source, the HIM, or a Datalink. # ######################################################################### # # DRIVE-SIDE SETUP — THE MASKS ARE THE ENABLE. RM003 p. 68 "Masks": # par 670 [Logic Mask] "determines which adapters can control the drive — # when the bit for a port is set to 0, the port will have no control # functions except for stop"; par 671 [Start Mask] gates start commands, 672 # [Jog Mask], 673 [Direction Mask] gates the bits 4-5 direction field, 674 # [Fault Clr Mask] gates the reset. All share the Owner bit layout below, and # bit 5 "Int DPI Comm" is the port the 20-COMM-H occupies. RM003 states NO # default values for the masks — read 670/671/673/674 bit 5 before arming; # with 670 or 671 bit 5 clear a Start is ACKed and silently ignored. They are # exposed as monitor points below. # The 700S also arbitrates by non-exclusive OWNERSHIP (RM003 pp. 77-78): # every port that asserts Start/Stop/Jog/Fault-Clear ORs into the matching # Owner parameter, and ANY port asserting Stop holds the drive stopped — a # maintained stop on the terminal block or a HIM makes the comm port's Start # do nothing, the first thing to check when a start is ACKed and ignored. # Owner bit layout: 0 Terminal Blk, # 1 Local HIM, 2 Ext DPI Conn, 3 Aux DPI Conn, 4 reserved, 5 Int DPI Comm # (this is DPI port 5, the internal port the 20-COMM-H occupies), 6 reserved, # 7 DriveLogix. The Owner parameters are exposed as monitor points below. # Write access is separately gated per port by par 669 [Write Mask], verified # at par 712 [Write Mask Act] (p. 121); factory default is every port # write-enabled, so nothing needs changing out of the box — confirm bit 5 of # 712 is 1 before arming. Also confirm the adapter's I/O is configured to carry # Logic Command/Reference (20COMM-UM009D "Setting the I/O Configuration", # p. 3-5): without it the adapter accepts writes the drive never sees. name = "Allen-Bradley PowerFlex 700S (Phase II Control)" vendor = "Allen-Bradley" device_type = "vfd" verified = false # Adapter par 01 [DPI Port], Table 4.L 4x0101 -> 0-based 100. Default 5. Chosen # over a drive parameter because it is guaranteed 16-bit and answers even while # the drive is faulted; it proves the ADAPTER, not the drive. Confirm the drive # behind it by reading output_current (1296) next. probe_register = 100 # 20-COMM-H defaults, 20COMM-UM009D Appendix B: 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 module actually installed. [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # --- drive parameters, 0-based = 999 + param# --- # par 297 [Output Curr Disp]. The ONLY drive parameter RM003 (p. 76) states is # an integer equivalent, resolution 1/10 A. Everything else on the Output # Display page (307 voltage, 310 freq, 311 power) is of unstated type on a # platform RM003 p. 28 says mixes DInt and Real — omitted rather than guessed. output_current = { address = 1296, scale = 0.1, unit = "A" } # par 155 [Logic Status]. Bit names are the 700S Logic Status Word from # 20COMM-UM009D p. C-4; RM003 independently confirms bit 0 "Active" (p. 113, # p. 115) and bit 12 "Tach Loss Sw" (p. 143) at the same indices, which is why # this parameter is believed to be the same word the adapter publishes at # 3x0001. CONFIRM ON HARDWARE: RM003 p. 118 calls bit 1 "Active" while p. 113 # and p. 115 call bit 0 "Active" — the primary source contradicts itself and # that is left unresolved here rather than papered over. Its width is also # unstated; if [Logic Status] is a DInt, a 16-bit-mode read may return only # half of it and every bit name below is off. logic_status = { address = 1154, bits = { 0 = "Active", 1 = "Running", 2 = "Cmd Direction Fwd", 3 = "Actual Direction Fwd", 4 = "Accel", 5 = "Decel", 6 = "Jogging", 7 = "Fault", 8 = "Alarm", 9 = "Flash Mode", 10 = "Run Ready", 11 = "At Limit", 12 = "Tach Loss Sw", 13 = "At Zero Spd", 14 = "At Setpt Spd", 15 = "Enable" } } # Owner parameters, RM003 pp. 77-78. Read stop_owner when a start is ACKed and # ignored: bit 0 set means the terminal block is holding a stop the comm port # cannot override. stop_owner = { address = 1676, bits = { 0 = "Terminal Blk", 1 = "Local HIM", 2 = "Ext DPI Conn", 3 = "Aux DPI Conn", 5 = "Int DPI Comm (port 5)", 7 = "DriveLogix" } } start_owner = { address = 1677, bits = { 0 = "Terminal Blk", 1 = "Local HIM", 2 = "Ext DPI Conn", 3 = "Aux DPI Conn", 5 = "Int DPI Comm (port 5)", 7 = "DriveLogix" } } direction_owner = { address = 1679, bits = { 0 = "Terminal Blk", 1 = "Local HIM", 2 = "Ext DPI Conn", 3 = "Aux DPI Conn", 5 = "Int DPI Comm (port 5)", 7 = "DriveLogix" } } # par 712 [Write Mask Act], RM003 p. 121. Bit 5 must be 1 for the 20-COMM-H's # port to have write access. Bit 15 "Security" is reserved for future use. # 324/325 [Fault Status 2/3] — live status bitfields whose bit meanings await # 20D-PM001; raw hex display only, deliberately no bit names. fault_status_2 = { address = 1323 } fault_status_3 = { address = 1324 } write_mask_act = { address = 1711, bits = { 0 = "Terminal Blk", 1 = "Local HIM", 2 = "Ext DPI Conn", 3 = "Aux DPI Conn", 5 = "Int DPI Comm (port 5)", 7 = "DriveLogix" } } # Mask parameters, RM003 p. 68, same 999+param# rule and the same bit layout # as the Owners. No factory defaults are published for these — read them. logic_mask = { address = 1669, bits = { 0 = "Terminal Blk", 1 = "Local HIM", 2 = "Ext DPI Conn", 3 = "Aux DPI Conn", 5 = "Int DPI Comm (port 5)", 7 = "DriveLogix" } } start_mask = { address = 1670, bits = { 0 = "Terminal Blk", 1 = "Local HIM", 2 = "Ext DPI Conn", 3 = "Aux DPI Conn", 5 = "Int DPI Comm (port 5)", 7 = "DriveLogix" } } jog_mask = { address = 1671, bits = { 0 = "Terminal Blk", 1 = "Local HIM", 2 = "Ext DPI Conn", 3 = "Aux DPI Conn", 5 = "Int DPI Comm (port 5)", 7 = "DriveLogix" } } direction_mask = { address = 1672, bits = { 0 = "Terminal Blk", 1 = "Local HIM", 2 = "Ext DPI Conn", 3 = "Aux DPI Conn", 5 = "Int DPI Comm (port 5)", 7 = "DriveLogix" } } fault_clr_mask = { address = 1673, bits = { 0 = "Terminal Blk", 1 = "Local HIM", 2 = "Ext DPI Conn", 3 = "Aux DPI Conn", 5 = "Int DPI Comm (port 5)", 7 = "DriveLogix" } } # # --- adapter parameters, fixed map from Table 4.L p. 4-13 --- adapter_dpi_port = { address = 100 } # par 01, default 5 # par 12, READ ONLY, set by the drive. 0 = 16-bit, 1 = 32-bit. READ THIS FIRST: # it decides whether a speed reference can ever be written as one register. adapter_ref_size = { address = 111 } adapter_net_timeout = { address = 110, unit = "s" } # par 11, default 10 s adapter_comm_flt_action = { address = 114 } # par 15, default 0 = Fault # par 18 [Flt Cfg Logic], default 0x0000. CHECK BEFORE ARMING: this is the # logic command the adapter sends the drive on a comm fault when par 15 = 4. # If somebody has set bit 1 in it, a comm loss becomes a START. adapter_flt_cfg_logic = { address = 117 } # Adapter Product Logic Command register, 4x0001 -> 0-based 0 (Table 4.C, # p. 4-4). Bit meanings are 20COMM-UM009D Appendix C p. C-3, the table headed # "PowerFlex 700S Drives — Logic Command Word (Phase II Control)": # 0 Normal Stop 1 Start 2 Jog 1 3 Clear Fault (edge) # 4-5 Unipolar Direction (00 none, 01 Fwd, 10 Rev, 11 hold) # 7 Jog 2 8 Current Limit Stop 9 Coast Stop 12-14 Spd Ref Sel # See the header: this is NOT drive parameter 151. # 20COMM-UM009D p. 4-5 also warns not to mix the discrete-coil command path # (0x000x) with this register path — pick one. This profile uses the register. [control] command_register = 0 step_delay = 0.05 # Bit 0 Normal Stop. Bits 8 (Current Limit Stop) and 9 (Coast Stop) are the # other two stop paths; a normal stop is the one that respects the configured # decel ramp. stop = [0x0001] # Appendix C footnote (1), verbatim: "A Not Stop condition (logic bit 0 = 0, # logic bit 8 = 0, and logic bit 9 = 0) must first be present before a 1 = # Start condition will start the drive." 0x0000 clears all three, then # 0x0012 = bit 1 Start + bits 4-5 = 01 Forward. run_fwd = [0x0000, 0x0012] # 0x0022 = bit 1 Start + bits 4-5 = 10 Reverse. Direction on the 700S is an # explicit command-word field, not the sign of the reference, so unlike the ABB # profiles this is a real separate sequence. Note par 680 [Direction Owner] is # EXCLUSIVE (RM003 p. 77): if another port holds direction, this is refused. run_rev = [0x0000, 0x0022] # Bit 3 Clear Fault, pulsed — Appendix C footnote (2) requires a 0->1 # transition. 0x0008 has bit 1 (Start) clear, so this reset value is not itself # a run command and no separate reset_register is needed. reset = [0x0000, 0x0008, 0x0000] # 20COMM-UM009D Appendix B: adapter par 11 [Network Timeout] defaults to 10 s # and par 15 [Comm Flt Action] defaults to 0 = Fault, so a master that goes # quiet faults the drive rather than leaving the motor running. 1 s keepalive # sits an order of magnitude inside the timeout. # The DRIVE-SIDE fault name this produces is NOT KNOWN: the 700S fault list is # only in 20D-PM001, which could not be obtained. Named, not guessed. [control.watchdog] interval_ms = 1000 fault = "comm loss on DPI port 5 — 20-COMM-H par 11 [Network Timeout] with par 15 [Comm Flt Action] = 0 Fault; the 700S-side fault name is not published in any obtained document" # NO [running_check], DELIBERATELY. # The adapter publishes the Logic Status word at 3x0001 — an INPUT register, # function code 04. vfd-core reads holding registers only and Point carries no # function-code field, so FC04 is unreachable (the same wall rockwell_smcflex. # toml documents). Drive par 155 [Logic Status] at 1154 is the FC03 candidate # and is mapped in [monitor] above, but two things are unresolved in the # primary source: whether bit 1 is "Running" (Appendix C) or "Active" (RM003 # p. 118), and whether a 16-bit-mode read returns the whole word. A # running_check on a half-read word or an off-by-one bit reports a spinning # motor as stopped, so it is left out until a bench settles both. # CONSEQUENCE: ops::running_state returns RunState::Unknown, and every control # command comes back unverified. Treat this profile as MONITOR-AND-COMMAND, not # as a verified control path. # Faults are a BITFIELD, not a code. RM003 p. 48: "Parameters 323 [Fault Status # 1] through 325 [Fault Status 3] indicated any faults that are active", with a # worked example that bit 10 of par 323 is "Mtr OL Trip". 0-based 999 + 323 = # 1322. # NO history: 324/325 [Fault Status 2/3] are additional LIVE status bitfields, # not a chronological history, and their bit meanings appear in no obtained # document — decoding them with 323's bit map would invent fault names, so # they are raw [monitor] points (fault_status_2/3) instead. # NO [faults.codes] AND ALMOST NO [faults.bits]: RM003 p. 48 defers the # complete list to the Troubleshooting chapter of 20D-PM001, which could not be # obtained. Bit 10 below is the one bit named in an obtained primary document. # The rest is a gap, not a table to fill from memory. Also unconfirmed: whether # [Fault Status 1] is 16 or 32 bits wide — if it is a DInt, a 16-bit-mode read # returns only half of it and even bit 10 may land elsewhere. [faults] register = 1322 bitfield = true [faults.bits] 10 = "Mtr OL Trip" # NO [rating] BLOCK. No frame-size or rated-current parameter for the 700S # appears in PFLEX-RM003 or in 20COMM-UM009D. Without one the pre-restore frame # comparison cannot be made, so a restore on this profile has nothing to check # against — do not clone between two 700S units on this profile alone. # # NO [parameters] BLOCK. PFLEX-RM003 is a functional reference, not a # parameter-by-parameter R/W table, so no writable range is known-safe. The # 700S interleaves read-only status parameters (152, 155, 323-325, 677-681, # 712) with settings across the same numbering, and DInt/Real parameters occupy # a different number of registers depending on adapter mode. Establish the # ranges and data types from 20D-PM001 before adding this block. [connection] summary = "The PowerFlex 700S Phase II 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 = "DPI port; Frame 0/1 and Frame 9+ mounting shown in adapter manual" 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 = ["Set the 20-COMM-H protocol switch to RTU and its unique node address.", "Set adapter par 16 bit 0 = 1, required parameter mode from the profile, and reset.", "Route reference and logic ownership to the installed DPI port and confirm masks."] 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 20COMM-UM009D-EN-P, pp. 1-2 and 2-1 to 2-7; PFLEX-RM003E-EN-E setup pages cited in profile." [[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