# Property of PMA Electrical Solutions, LLC. # # Allen-Bradley PowerFlex 700 VECTOR CONTROL (20B, Vector Control firmware # 4.001 and up) — Modbus RTU via a 20-COMM-H adapter. # # CLAIMED: PowerFlex 700 Vector Control only ("PowerFlex 700VC", the drive # 20B-UM002H is written for — its cover reads "Vector Control Firmware 4.001 # and Up" and p. 9 says "the PowerFlex 700 Adjustable Frequency AC Drive with # Vector Control"). NOT CLAIMED: # - PowerFlex 700 STANDARD CONTROL. That drive has its own manual # (20B-UM001, listed on 20B-UM002H p. 10 Additional Resources) whose # parameter set was not opened, and 20COMM-UM009D p. 7-1 shows the two # differ on the wire (the 16-bit-Datalink subsection covers "PowerFlex 70 # (SC or EC), PowerFlex 700 (SC), and PowerFlex 700H" — excluding the VC). # - PowerFlex 70. The adapter bit tables are shared, but the drive parameter # numbers below are cited from 20B-UM002H only; the 70 has its own profile. # - PowerFlex 700H (20C), 700L (20L), 700S (different control platforms). # - FVC Vector firmware ([Motor Cntl Sel] = 4). 20B-UM002H pp. 18-20 mark a # set of parameters "FV" as existing only in that mode; no parameter used # here is so marked, but the delta was not audited. # # EVERY PARAMETER ON THIS DRIVE IS 32-BIT. 20B-UM002H p. 16, legend item 3: # "No. - Parameter number. Note that all parameters in the PowerFlex 700VC are # 32 bit." A 16-bit-mode single-register read of a 32-bit parameter is # undocumented — which half arrives is stated nowhere — so this profile pins # the adapter to 32-bit parameter mode and reads every parameter as two # registers, exactly as profiles/rockwell_powerflex755.toml does for the # all-32-bit 750-Series. # # COMMUNICATION PATH # The PowerFlex 700's own terminal block is not Modbus. Modbus RTU requires a # 20-COMM-H RS-485 HVAC adapter in a DPI port (the manual's examples use # Port 5), protocol switch set to Modbus RTU. # - Adapter firmware 2.009 or later is REQUIRED for a 700VC: 20COMH-RN006B # p. 1, "Added support for PowerFlex 700VC drives in all three modes of # operation (Modbus RTU, FLN P1, and Metasys N2)". # - Adapter par 32 [RTU Param Mode] must be **1 "32-bit Mode"**. This is NOT # the default. In the default 16-bit mode the address formula halves and # every parameter address below is wrong (20COMM-UM009D p. B-4, p. 4-4). # - Adapter par 33 [RTU Memory Map] must be **0 "Legacy"** (the default). # Setting 1 "PF4-Class" swaps in the PowerFlex 4-class register map and # every address below becomes wrong (20COMH-RN006B p. 1). # # SOURCES — Rockwell primary documentation only: # 20B-UM002H-EN-P, PowerFlex 700 Vector Control User Manual (December 2022) # p. 16 legend item 3 — "all parameters in the PowerFlex 700VC are # 32 bit" # pp. 21-22 Metering / Drive Data parameters 001…029 and their units # p. 47 par 209 [Drive Status 1] bit map (status + running_check) # p. 52 par 243/245/…/257 [Fault 1…8 Code]; par 240 [Fault Clear] # p. 55 par 275 [DPI Port Value] (±32767) and par 298 # [DPI Ref Select] # p. 56 par 276 [Logic Mask] and its bit-to-port map # pp. 86-89 Table 2, the complete fault code table below # 20COMM-UM009D-EN-P, 20-COMM-H RS-485 HVAC Adapter User Manual # p. 3-3 par 05 [Net Rate Cfg], default 1 = 9600 # p. 3-4 par 07 [Net Parity Cfg] default 0 = None; # par 30 [Stop Bits Cfg] default 0 = 1-bit # p. 3-5 par 16 [DPI I/O Cfg] and the drive-side setup below # p. 3-6 par 11 [Network Timeout], default 10 s, range 0…180 # p. 3-7 par 15 [Comm Flt Action], default 0 = Fault # p. 4-2 the zero-basing rule # p. 4-4 Table 4.C, register map, 16- and 32-bit access formulas # pp. 4-5…4-7 Table 4.D reference scaling, 4.E logic command bits, # 4.F register outputs (Logic Command / Reference) # p. 4-9 32-bit mode worked example (parameter 1 at 41002) and the # "minimum of two registers" rule # p. B-2 par 12 [Ref/Fdbk Size], Read Only, drive-determined # p. B-4 par 32 [RTU Param Mode] # 20COMH-RN006B-EN-E, 20-COMM-H Firmware 2.009 Release Note (Sept 2012) # p. 1 700VC support, par 33 [RTU Memory Map] # p. 7 word ordering — see WORD ORDER below # # DRIVE-SIDE / ADAPTER SETUP (without these the drive ACKs and ignores): # - Adapter par 16 [DPI I/O Cfg] bit 0 = 1, "Logic Command/Reference" # (the default), then reset the adapter (20COMM-UM009D p. 3-5). # - Drive par 090 [Speed Ref A Sel] = 22 "DPI Port 5", so the reference comes # from the adapter (20COMM-UM009D p. 3-5, worked for a PF70/700). # - Drive par 276 [Logic Mask]: the bit for the adapter's port must be 1 or # that port "will have no control functions except for stop". The bit map # is printed on 20B-UM002H p. 56 (and again p. 59): bit 0 = Digital In, # bits 1…6 = DPI Ports 1…6 (bit 6 needs firmware 6.002+), factory default # bits 0-6 all 1 = Control Permitted. So the default already permits an # adapter in port 5; check it anyway — a site that locked control to the # host will have cleared the bit. # - Adapter par 12 [Ref/Fdbk Size] must READ 0 = 16-bit. It is Read Only — # "The drive determines the size of the Reference/Feedback" (20COMM-UM009D # p. B-2) — and is separate from par 32. The 16-bit expectation is backed # by 20B-UM002H p. 55: par 275 [DPI Port Value], "Value of the DPI # reference selected in [DPI Port Sel]", Min/Max -/+32767. If par 12 reads # 1 = 32-bit, a lone 16-bit write to address 2 lands in reference bits # 16…31 and this profile must NOT be armed. # # 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 -> 0000. # Table 4.C (p. 4-4) gives drive parameter direct access in 32-BIT mode as # "4x1000 + (param # x 2)", so with adapter par 32 = 1: # 0-based address = 999 + (2 * parameter number), two registers per read # par 001 [Output Freq] -> 4x1002 -> 0-based 1001 # par 028 [Rated Amps] -> 4x1056 -> 0-based 1055 # par 243 [Fault 1 Code]-> 4x1486 -> 0-based 1485 # Unlike the 16-bit mode (where p. 4-9's worked example contradicts the # formula by one), the 32-bit mode is internally consistent: p. 4-9 says # "In the 32-bit mode, Parameter 1 is accessed by Modbus Address 41002", # which is exactly what the formula gives. # p. 4-9 also: "The 32-bit adapter mode requires a minimum of two registers to # read or write" — every parameter point below carries words = 2. The 1-word # probe read below may draw an exception from the adapter; core counts a NAK # as the device being alive (scan treats a NAK as FOUND), so that is # acceptable for a liveness probe. # # WORD ORDER — QUOTED. 20COMH-RN006B p. 7, restrictions: "Direct DPI # parameters are mapped as Big Endian (that is, High/Low word ordering). ... # This mapping structure also applies to PowerFlex 700VC drives which use # 32-bit Datalinks." Every point in this file is drive parameter direct # access, so word_order = "high_first" throughout. BENCH CHECK: read par 012 # [DC Bus Volts] at 1023 — a 480 V drive should show roughly 650-680 V. A wild # number means the installed firmware does not behave as RN006B describes. # # THE STATUS WORD IS READ AS A DRIVE PARAMETER, NOT AS 3x0001. # The adapter's Product Status Word lives at 3x0001, which is INPUT register # space (FC04); this app reads holding registers (FC03) only, and 0-based # holding register 0 is the Logic COMMAND. Drive par 209 [Drive Status 1] # carries the identical bit layout (compare 20B-UM002H p. 47 with Table 4.G) # and is reachable at 999 + 2*209 = 1417. name = "Allen-Bradley PowerFlex 700 Vector Control" vendor = "Allen-Bradley" device_type = "vfd" verified = false probe_register = 1001 # par 001 [Output Freq]; a NAK on a 1-word read still proves the adapter is alive [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # Metering group, 20B-UM002H pp. 21-22. All 32-bit integers (p. 16 legend); # scale is the manual's "Units:" resolution with the decimal point removed. output_frequency = { address = 1001, words = 2, word_order = "high_first", signed = true, scale = 0.1, unit = "Hz" } # 001 commanded_speed = { address = 1003, words = 2, word_order = "high_first", signed = true, scale = 0.1, unit = "Hz" } # 002, Hz or RPM per par 079 [Speed Units] output_current = { address = 1005, words = 2, word_order = "high_first", scale = 0.1, unit = "A" } # 003 torque_current = { address = 1007, words = 2, word_order = "high_first", signed = true, scale = 0.1, unit = "A" } # 004 flux_current = { address = 1009, words = 2, word_order = "high_first", signed = true, scale = 0.1, unit = "A" } # 005 output_voltage = { address = 1011, words = 2, word_order = "high_first", scale = 0.1, unit = "V" } # 006 output_power = { address = 1013, words = 2, word_order = "high_first", scale = 0.1, unit = "kW" } # 007 dc_bus_voltage = { address = 1023, words = 2, word_order = "high_first", scale = 0.1, unit = "V" } # 012 rated_kw = { address = 1051, words = 2, word_order = "high_first", scale = 0.01, unit = "kW" } # 026 rated_volts = { address = 1053, words = 2, word_order = "high_first", scale = 0.1, unit = "V" } # 027 rated_amps = { address = 1055, words = 2, word_order = "high_first", scale = 0.1, unit = "A" } # 028 # par 209 [Drive Status 1], 20B-UM002H p. 47. Bits 9-11 encode the local # control port and 12-15 the reference source; they are multi-bit fields, not # flags, so they are left unnamed rather than mislabelled. The named bits all # sit in the low word, which the high_first decode places in bits 0-15. drive_status_1 = { address = 1417, words = 2, word_order = "high_first", bits = { 0 = "READY", 1 = "ACTIVE", 2 = "COMMAND_DIR_FWD", 3 = "ACTUAL_DIR_FWD", 4 = "ACCEL", 5 = "DECEL", 6 = "ALARM", 7 = "FAULTED", 8 = "AT_SPEED" } } last_fault = { address = 1485, words = 2, word_order = "high_first" } # 243 [Fault 1 Code] # Logic Command register output, 20COMM-UM009D Table 4.F p. 4-7; bit meanings # from Table 4.E p. 4-6 ("PowerFlex 70/700 Example" column). The Logic Command # I/O image register stays 16-bit regardless of par 32. # 0 Stop 1 Start 2 Jog 3 Clear Faults 4-5 Direction (01=Fwd, 10=Rev) # 6 Local 7 MOP Inc 8-9 Accel sel 10-11 Decel sel 12-14 Ref sel # 15 MOP Dec # Footnotes: a 0 = Not Stop condition must be present BEFORE a 1 = Start will # start the drive, and Start / Clear Faults act on a 0->1 transition. Hence the # leading 0x0000 in every sequence below. [control] command_register = 0 # Reference. 4x0002 is Reference Lo and 4x0003 is "the whole 16-bit reference"; # Table 4.F footnote 1: "The reference value is sent only when accessing # address 4x0003." A 16-bit reference must therefore be written to 4x0003 -> # 0-based 2. Writing 0-based 1 alone sends nothing. Valid only while adapter # par 12 [Ref/Fdbk Size] reads 0 = 16-bit — see the setup block. speed_register = 2 # THE REFERENCE IS A 32767-COUNT PERCENT, NOT Hz. Table 4.D p. 4-5: 32767 = # 100% of drive par 055 [Maximum Freq], clamped by par 082 [Maximum Speed] — # the manual's own example commands 130 Hz and the motor runs at 60 Hz. AND # par 298 [DPI Ref Select] (default 0 "Max Freq") can move the base to par 082 # instead (20B-UM002H p. 55; 20COMM-UM009D Table 5.K p. 5-4). Hz per count is # CONFIGURATION-DEPENDENT; read 055, 082 and 298 off the unit before # converting. speed_scale = 0.0030518509 # 100.0 / 32767 speed_signed = false # direction is control-word bits 4-5, not the sign speed_unit = "%" max_ref = 100.0 step_delay = 0.05 stop = [0x0001] # bit 0 Stop run_fwd = [0x0000, 0x0012] # Not Stop, then bit 1 Start 0->1 with bits 4-5 = 01 Forward run_rev = [0x0000, 0x0022] # same, bits 4-5 = 10 Reverse # Clear Faults is bit 3 on a 0->1 transition. 0x0008 leaves bit 0 = Not Stop # and bit 1 = 0, so it is not itself a run command on this map. reset = [0x0000, 0x0008, 0x0000] [control.watchdog] # Adapter par 11 [Network Timeout] defaults to 10 s; on expiry par 15 [Comm # Flt Action] (default 0 = Fault) faults and stops the drive. Keepalive well # inside that window. interval_ms = 1000 # GAP, NOT A GUESS: 20COMM-UM009D p. 3-7 says only "the drive is faulted" and # names no code for a network-side loss. "Port 1-6 DPI Loss" (81-86) is the # DIFFERENT failure of the adapter losing the drive's DPI port, and is not # reused here. fault = "adapter par 11 [Network Timeout] expiry -> par 15 [Comm Flt Action] = Fault (no drive fault code named in 20COMM-UM009D)" # par 209 [Drive Status 1] bit 1 "Active" — 20B-UM002H p. 47, and Table 4.G # p. 4-7 gives it as 0 = Not Running, 1 = Running. Low word of the 32-bit # parameter; high_first decode keeps it at bit 1. [running_check] register = 1417 words = 2 bit = 1 # par 243 [Fault 1 Code] is the most recent; 245/247/…/257 are Fault 2…8 Code # (the even numbers in between are [Fault x Time]). 20B-UM002H p. 52. # 32-bit mode: address = 999 + 2*param#. [faults] register = 1485 words = 2 history = [1489, 1493, 1497, 1501, 1505, 1509, 1513] # 20B-UM002H Table 2, pp. 86-89, transcribed in full. Codes 900-930 are a # RANGE ("Fatal Faults — diagnostic code indicating a drive malfunction") and # are not enumerable, so they are absent rather than invented. [faults.codes] 2 = "Auxiliary Input" 3 = "Power Loss" 4 = "UnderVoltage" 5 = "OverVoltage" 7 = "Motor Overload" 8 = "Heatsink OvrTemp" 9 = "Trnsistr OvrTemp" 10 = "Heatsink LowTemp" 12 = "HW OverCurrent" 13 = "Ground Fault" 15 = "Load Loss" 16 = "Motor Thermistor" 17 = "Input Phase Loss" 18 = "Hardware PTC" 20 = "TorqPrv Spd Band" 21 = "Output PhaseLoss" 24 = "Decel Inhibit" 25 = "OverSpeed Limit" 28 = "See Manual" 29 = "Analog In Loss" 33 = "Auto Rstrt Tries" 36 = "SW OverCurrent" 38 = "Phase U to Grnd" 39 = "Phase V to Grnd" 40 = "Phase W to Grnd" 41 = "Phase UV Short" 42 = "Phase VW Short" 43 = "Phase UW Short" 48 = "Params Defaulted" 49 = "Drive Powerup" 51 = "Flt QueueCleared" 52 = "Faults Cleared" 55 = "Cntl Bd Overtemp" 63 = "Shear Pin" 64 = "Drive OverLoad" 69 = "DB Resistance" 70 = "Power Unit" 71 = "Port 1 Adapter" 72 = "Port 2 Adapter" 73 = "Port 3 Adapter" 74 = "Port 4 Adapter" 75 = "Port 5 Adapter" 76 = "Port 6 Adapter" 77 = "IR Volts Range" 78 = "FluxAmpsRef Rang" 79 = "Excessive Load" 80 = "AutoTune Aborted" 81 = "Port 1 DPI Loss" 82 = "Port 2 DPI Loss" 83 = "Port 3 DPI Loss" 84 = "Port 4 DPI Loss" 85 = "Port 5 DPI Loss" 86 = "Port 6 DPI Loss" 87 = "IXo VoltageRange" 88 = "Software Fault" 89 = "Software Fault" 90 = "Encoder Quad Err" 91 = "Encoder Loss" 92 = "Pulse In Loss" 93 = "Hardware Fault" 100 = "Parameter Chksum" 101 = "UserSet1 Chksum" 102 = "UserSet2 Chksum" 103 = "UserSet3 Chksum" 104 = "Pwr Brd Chksum1" 105 = "Pwr Brd Chksum2" 106 = "Incompat MCB-PB" 107 = "Replaced MCB-PB" 108 = "Anlg Cal Chksum" 109 = "NVS I/O Checksum" 110 = "NVS I/O Failure" 111 = "Power Down Csum" 121 = "I/O Comm Loss" 122 = "I/O Failure" 130 = "Hardware Fault (gate array load error)" 131 = "Hardware Fault (dual port failure)" # par 028 [Rated Amps], 20B-UM002H p. 22: 0.0/65535.0 Amps in 0.1 A units — # 655,350 raw counts, which does NOT fit one 16-bit register (all 700VC # parameters are 32-bit, p. 16). Read as two registers, High/Low per RN006B # p. 7. CONFIRM this reads a sane amp figure before trusting the guard: a # mis-decoded rating fails OPEN. [rating] register = 1055 words = 2 word_order = "high_first" scale = 0.1 unit = "A" label = "Rated Amps" # [parameters] is deliberately ABSENT. 20B-UM002H Chapter 1 does list the # writable parameters, but the per-parameter Default/Min/Max entries were not # transcribed, and a clone/restore range guessed from the group index is # exactly the kind of guess that corrupts a replacement drive. Add the ranges # only after reading the parameter tables through. [connection] summary = "The PowerFlex 700 Vector Control 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 5 (documented example)" 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 and reset it.", "Set drive par 090 = 22 DPI Port 5 and enable that port in par 276 Logic Mask.", "Confirm adapter par 12 = 0 (16-bit reference) and par 32 = 1 (32-bit direct parameter mode)."] 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. 2-1 to 2-7 and 3-3 to 3-8; 20B-UM002H and 20COMH-RN006B 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