# Property of PMA Electrical Solutions, LLC. # # AutomationDirect DURApulse GS30 AC drive over Modbus RTU on the embedded # RS-485 port (RJ45 / SG+ SG- SGND terminals, shared pins). Covers the GS30 # only — GS31 and GS33 are the 230 V and 460 V catalogue prefixes of the same # series and read 30 in P00.18 "GS Series Number", so they are the same map. # No other DURApulse model is claimed: GS10, GS20 and GS4 each ship their own # manual with a different fault table and a different parameter census. # # Ethernet is an option card (GS30A-CM-EIP1 / -EIP2, Modbus TCP or # EtherNet/IP). This profile is the EMBEDDED SERIAL port; the card's own # parameters (P09.60-P09.95) are excluded from cloning. # # Sources — "DURApulse GS30 AC Drive User Manual", 1st Ed., Rev A: # Chapter 5, Serial Communications (automationdirect_gs30_ch5_serial_comms.pdf) # P09.xx communication parameter summary ............ pp. 5-2 to 5-4 # Status addresses 0611h and 2100h-210Ch, fault codes pp. 5-6 to 5-7 # Command addresses 2000h / 2001h / 2002h ........... p. 5-8 # Minimum parameter settings for serial control ..... p. 5-9 # RTU framing, FC03 / FC06 / FC16 examples .......... pp. 5-13 to 5-16 # Chapter 4, AC Drive Parameters (automationdirect_gs30_ch4_parameters.pdf) # P00.xx summary — the addressing proof ............. p. 4-3 # P00.20 / P00.21 command sources ................... p. 4-7 # P01.00 maximum output frequency ................... p. 4-11 # P00.00 model ID, P00.01 rated amps, P00.02 restore pp. 4-61 to 4-62 # P05.00 auto-tuning (moves the motor) .............. p. 4-156 # P06.17-P06.22 fault records and the code table .... pp. 4-173 to 4-177 # Group summaries used for the clone ranges ......... pp. 4-3 to 4-59 # # ADDRESSING — 0-based protocol addresses, as everywhere in this repo. # address = (parameter group << 8) | parameter index, both DECIMAL, # i.e. P09.30 -> (9 << 8) | 30 = 0x091E, P06.17 -> (6 << 8) | 17 = 0x0611. # The manual prints THREE columns for every parameter: "Hex", "Dec" and # "Octal". Only the HEX column is the protocol address. The Dec column is # 4x PLC notation and is EXACTLY ONE HIGHER than the protocol address plus # 40000 — P00.00 is Hex 0000 / Dec 40001 (p. 4-3) and P09.00 is Hex 0900 / # Dec 42305 (p. 5-2, 0x0900 = 2304, 2304 + 40001 = 42305). Feeding the Dec # column to a Modbus master that already adds the 4x base is the off-by-one # that costs the most hours in this repo. Everything below is the Hex column. # Manual defect to know about: the P05.00 detail block (p. 4-156) prints # "Hex Addr 0000" against "Dec Addr 41281" — 41281 - 40001 = 0x0500, so the # hex cell there is a typo. The formula above is the ground truth. # # Everything here is FC03/FC06/FC16 holding registers. The manual documents no # input-register (FC04) or coil space, so nothing is out of reach for vfd-core. # # DRIVE-SIDE SETUP — without these the drive ACKs the control word and ignores # it (Chapter 5, p. 5-9): # P00.21 = 2 operation command source [AUTO/REMOTE] = RS-485 # P00.20 = 1 master frequency command source [AUTO/REMOTE] = RS-485 # P00.31 = 2 operation command source [LOCAL] = RS-485 (keypad STOP still # live per P00.32) # P00.30 = 1 frequency command source [LOCAL] = RS-485 # P09.00 node address 1-254, P09.01 baud, P09.04 protocol/format # P00.29 selects which of the two source pairs is live; a drive left in the # wrong LOCAL/REMOTE state obeys the pair that was not configured. name = "AutomationDirect DURApulse GS30" vendor = "AutomationDirect" device_type = "vfd" verified = false probe_register = 0x2101 # status monitor 2, readable whenever the port is up [connection] summary = "Choose either access point to the built-in RS-485 bus, or install the documented Ethernet card for Modbus TCP." warnings = ["The screw terminals and serial RJ45 are the same RS-485 bus."] [[connection.methods]] id = "control_terminals_rs485" title = "Built-in RS-485 screw terminals" transport = "serial" hardware = "built_in" port = "GS30 control terminals SG+, SG-, and SGND" connector = "Three control-terminal positions" adapter = "Isolated USB-to-RS-485 adapter, 2-wire half-duplex" cable = "Belden 9842, AutomationDirect Q8304-1, or equivalent shielded RS-485 cable" parts = ["Isolated two-wire RS-485 adapter", "Belden 9842, AutomationDirect Q8304-1, or equivalent shielded RS-485 cable"] steps = ["Lock out line and control power, wait the vendor-specified discharge time, and verify the DC bus is de-energized before opening a cover or landing conductors.", "Land the positive and negative data conductors exactly as shown; connect the cable shield or signal common only where the method identifies it.", "Route the communications cable away from motor and mains conductors. Terminate the two physical ends of a long multidrop trunk only.", "Restore control power with the motor area clear, configure the drive from its keypad, then verify identity and read-only monitor data before enabling remote control."] setup = ["Set P00.20/P00.30=1, P00.21/P00.31=2, P09.00=node, P09.01=baud, and P09.04 to the selected RTU format."] warnings = ["RS-485 A/B naming is not consistent between manufacturers. Follow the + and - signal mapping in this guide, not the letter printed on an unfamiliar adapter.", "Do not use protective earth as the data return unless the vendor drawing explicitly calls for it."] source = "AutomationDirect DURApulse GS30 User Manual, chapter 5 pp. 5-8 to 5-13 (shared SG terminals/RJ45, pin mapping, cabling and setup), chapter 4/5 P09.74-P09.95 (GS30A-CM-EIP1/EIP2 Modbus TCP)" [[connection.methods.wiring]] adapter = "Adapter D+ / +" device = "SG+" signal = "RS-485 data positive" required = true [[connection.methods.wiring]] adapter = "Adapter D- / -" device = "SG-" signal = "RS-485 data negative" required = true [[connection.methods.wiring]] adapter = "Adapter signal ground / shield" device = "SGND" signal = "Signal reference or shield drain" required = false [[connection.methods]] id = "rj45_rs485" title = "Built-in RJ45 Modbus RTU" transport = "serial" hardware = "built_in" port = "GS30 RJ45 Serial Comm Port" connector = "RJ45 wired as RS-485, not Ethernet" adapter = "Isolated USB-to-RS-485 adapter, 2-wire half-duplex" cable = "Straight-through RJ45 patch cable to a breakout or another same-model drive" parts = ["Isolated two-wire RS-485 adapter", "Straight-through RJ45 patch cable to a breakout or another same-model drive", "Field-terminated modular plug or documented breakout adapter"] steps = ["Lock out line and control power, wait the vendor-specified discharge time, and verify the DC bus is de-energized before opening a cover or landing conductors.", "Land the positive and negative data conductors exactly as shown; connect the cable shield or signal common only where the method identifies it.", "Route the communications cable away from motor and mains conductors. Terminate the two physical ends of a long multidrop trunk only.", "Restore control power with the motor area clear, configure the drive from its keypad, then verify identity and read-only monitor data before enabling remote control."] setup = ["Set P00.20/P00.30=1, P00.21/P00.31=2, P09.00=node, P09.01=baud, and P09.04 to the selected RTU format."] warnings = ["A modular communications jack is not automatically Ethernet. Never connect it to a LAN switch unless this guide explicitly identifies a Modbus TCP method.", "RS-485 A/B naming is not consistent between manufacturers. Follow the + and - mapping shown here.", "Do not use a crossover cable."] source = "AutomationDirect DURApulse GS30 User Manual, chapter 5 pp. 5-8 to 5-13 (shared SG terminals/RJ45, pin mapping, cabling and setup), chapter 4/5 P09.74-P09.95 (GS30A-CM-EIP1/EIP2 Modbus TCP)" [[connection.methods.wiring]] adapter = "Adapter D+ / +" device = "RJ45 pin 5 (SG+)" signal = "RS-485 data positive" required = true [[connection.methods.wiring]] adapter = "Adapter D- / -" device = "RJ45 pin 4 (SG-)" signal = "RS-485 data negative" required = true [[connection.methods.wiring]] adapter = "Adapter signal ground / shield" device = "RJ45 pin 3 (SGND)" signal = "Signal reference or shield drain" required = false [[connection.methods]] id = "gs30_ethernet_card" title = "GS30A-CM-EIP1/EIP2 Modbus TCP option" transport = "tcp" hardware = "option" port = "RJ45 Ethernet port(s) on the installed GS30A communications card" connector = "RJ45 Ethernet" adapter = "Computer Ethernet interface or Ethernet switch" cable = "Category 5e or better Ethernet patch cable" parts = ["GS30A-CM-EIP1 or GS30A-CM-EIP2 communications card", "Ethernet patch cable"] steps = ["Lock out and isolate the equipment before fitting an option module or opening the enclosure.", "Install and fully seat the specified communications module according to its installation instructions.", "Connect the computer or switch with the specified Ethernet cable; keep it separated from motor and mains wiring.", "Restore control power, assign an IP address on the same subnet, discover the device, and verify read-only data before enabling network control."] setup = ["Install GS30A-CM-EIP1 or EIP2, set P09.74 to a mode that enables Modbus TCP, and configure the card IP parameters P09.76-P09.95."] warnings = ["An Ethernet link does not make remote motor control safe. Verify the drive-side communication-loss action and the independent hardwired stop circuit before commanding run.", "The Ethernet option is separate from the built-in serial RJ45."] source = "AutomationDirect DURApulse GS30 User Manual, chapter 5 pp. 5-8 to 5-13 (shared SG terminals/RJ45, pin mapping, cabling and setup), chapter 4/5 P09.74-P09.95 (GS30A-CM-EIP1/EIP2 Modbus TCP)" # P09.01 defaults to 9.6 Kbps and P09.04 defaults to 15 = 8 data / ODD parity / # 1 stop, RTU (p. 5-2). Not 8N1 — a master left at no-parity will not talk to a # factory-fresh GS30. P09.01 accepts up to 115.2 Kbps. [serial] baudrate = 9600 parity = "O" stopbits = 1 # 2101h status monitor 2 (p. 5-7). Bits 1-0 and 4-3 are two-bit FIELDS, not # flags, and are deliberately left unnamed here: # bits 1-0 operation status: 00 stopped, 01 decelerating, 10 standby, # 11 operating # bits 4-3 direction: 00 FWD, 01 REV->FWD, 10 FWD->REV, 11 REV # Naming either half as a flag would print nonsense for half the values. [monitor] status_word = { address = 0x2101, bits = { 2 = "JOG", 8 = "FreqFromComms", 9 = "FreqFromAnalogTerminal", 10 = "RunCmdFromComms", 11 = "ParametersLocked", 12 = "KeypadCopyEnabled" } } # 2100h packs the WARNING code in the high byte and the ERROR code in the low # byte (p. 5-7). Read raw here; [faults] uses P06.17 instead, which carries the # fault code alone and needs no mask. warning_and_fault_code = { address = 0x2100 } frequency_command = { address = 0x2102, scale = 0.01, unit = "Hz" } output_frequency = { address = 0x2103, scale = 0.01, unit = "Hz" } # XX.XX A. The manual notes the drive shifts to XXX.X A above 655.35 A and # reports the shift in the high byte of 211Fh — the largest GS30 is 100 HP at # 460 V, roughly 124 A, so this map never reaches the shift. Verify 211Fh # before trusting this on anything larger. motor_current = { address = 0x2104, scale = 0.01, unit = "A" } dc_bus_voltage = { address = 0x2105, scale = 0.1, unit = "V" } output_voltage = { address = 0x2106, scale = 0.1, unit = "V" } multi_step_step = { address = 0x2107 } counter_value = { address = 0x2109 } power_factor_angle = { address = 0x210A, scale = 0.1, unit = "deg" } # The manual prints "XXX.X %" with no sign convention for 210Bh, so this is # left unsigned. A regenerating motor may well read as a large positive here. output_torque = { address = 0x210B, scale = 0.1, unit = "%" } motor_speed = { address = 0x210C, unit = "rpm" } # 2000h command word (p. 5-8): # bits 1-0 00 no function, 01 STOP, 10 RUN, 11 JOG+RUN # bits 5-4 00 no function, 01 FWD, 10 REV, 11 change direction # bits 7-6 accel/decel pair, bits 11-8 multi-step speed, bit 12 enables 6-11 # bits 14-13 00 no function, 01 keypad, 10 per P00.21, 11 change source # Every value below leaves bit 12 clear (so the drive keeps its own ramp times # and follows master speed from 2001h) and bits 14-13 clear (so the command # source configured on the drive is not disturbed). # Direction is a COMMAND BIT here, not the sign of the reference, so run_rev # is a distinct word rather than a negative speed. [control] command_register = 0x2000 speed_register = 0x2001 speed_scale = 0.01 speed_unit = "Hz" # 2001h is XXX.XX Hz and P01.00 (max output frequency) spans 0.00-599.00 Hz # (p. 4-11). 599.0 is the register ceiling, NOT a safe operating limit — the # drive clamps at whatever P01.00 is actually set to, and Chapter 5 (p. 5-16) # warns that a reference above P01.00 pins the drive at max output frequency # until a lower reference or a stop arrives. max_ref = 599.0 step_delay = 0.05 stop = [0x0001] # bits 1-0 = 01B stop; direction field left alone run_fwd = [0x0012] # 10B run + 01B FWD run_rev = [0x0022] # 10B run + 10B REV # RESET IS ON A SEPARATE REGISTER AND MUST STAY THERE. On 2000h the value # 0x0002 is bits 1-0 = 10B, which is RUN — writing a reset value to the run # register on this family is an unexpected motor start, the same defect the # Delta MS300 profile carries a warning about. The real reset is 2002h bit 1 # (p. 5-8). 2002h has no run bits at all: bit 0 external fault, bit 1 reset, # bit 2 base block, bit 5 fire mode. Assert, then release the bit. reset_register = 0x2002 reset = [0x0002, 0x0000] # COMM LOSS FAILS OPEN AT FACTORY DEFAULT. P09.02 defaults to 3, "No warning, # no fault, and continue operation", and P09.03 (time-out detection) defaults # to 0.0 sec = disabled (p. 5-2). A GS30 commanded to run and then abandoned # BY DEFAULT KEEPS THE MOTOR TURNING with no master attached. To make this # keepalive mean anything, set P09.03 to a non-zero timeout and P09.02 to # 1 (fault and ramp to stop) or 2 (fault and coast to stop); the drive then # posts fault 58, CE10. # ############ NO [control.watchdog], AND THAT IS THE SAFE CHOICE ############ # Declaring a watchdog spawns the keepalive in control.rs, which periodically # re-writes the LAST COMMANDED control word. On this drive that is a hazard # with no matching benefit: # # - No benefit at factory defaults. The keepalive exists so a drive that # faults on silence does not trip mid-run. The GS30 does not fault on # silence out of the box (P09.03 = 0.0 disabled, P09.02 = 3), so there is # nothing to keep alive. # - Real hazard if the local STOP key is in play. P00.32 [Digital Keypad # STOP Function] defaults to 0 = "STOP key disabled" whenever the command # source is not the keypad, which is the RS-485 setup this profile assumes. # An installer who sets P00.32 = 1 to give the operator a working local # stop then gets a drive where a keepalive tick re-asserts the stale RUN # word over that stop. The GS1 manual warns about this interaction in terms # and the same refresh mechanism applies across the DURApulse family. # # Shipping without a watchdog sets no_watchdog_backstop in ArmedInfo, which # tells the UI the truth: "stop refreshing and the drive stops itself" DOES NOT # hold here. Disarm still sends a real stop first. # # IF you enable the drive-side timeout (P09.03 > 0 with P09.02 = 1 or 2), the # drive WILL trip CE10 on silence and a keepalive becomes necessary. Add it # then, and resolve the P00.32 interaction on the machine: # [control.watchdog] # interval_ms = 500 # fault = "CE10 Modbus transmission time-out (code 58)" # ############################################################################# # Bit 0 of the operation-status field, not bit 1. The field is 00 stopped / # 01 decelerating / 10 standby / 11 operating: bit 0 is set for decelerating # and operating, which are exactly the states where the shaft is still moving. # Bit 1 would read "stopped" through a deceleration ramp — a coasting motor # reported as safe to touch. Known ceiling: standby (10B) reads Stopped here, # which is true of the shaft but not of the drive being armed. [running_check] register = 0x2101 bit = 0 # P06.17 fault record 1 is the same register Chapter 5 calls "Status Monitor 1" # (p. 5-6); P06.18-P06.22 are the five older records (p. 4-173). Codes below # are the Chapter 4 detail table, pp. 4-173 to 4-177, which is a superset of # the Chapter 5 list — 5, 17, 19, 29, 42, 68, 69, 70, 174 and 175 appear only # there. P14.70-P14.73 hold records 7-10 at 0E46h-0E49h and are not read here. [faults] register = 0x0611 history = [0x0612, 0x0613, 0x0614, 0x0615, 0x0616] [faults.codes] 0 = "No fault record" 1 = "ocA — over-current during acceleration" 2 = "ocd — over-current during deceleration" 3 = "ocn — over-current during steady operation" 4 = "GFF — ground fault" 5 = "occ — IGBT short circuit between upper and lower bridge" 6 = "ocS — over-current at stop" 7 = "ovA — over-voltage during acceleration" 8 = "ovd — over-voltage during deceleration" 9 = "ovn — over-voltage during constant speed" 10 = "ovS — over-voltage at stop" 11 = "LvA — low-voltage during acceleration" 12 = "Lvd — low-voltage during deceleration" 13 = "Lvn — low-voltage during constant speed" 14 = "LvS — low-voltage at stop" 15 = "orP — input phase loss protection" 16 = "oH1 — IGBT overheating" 17 = "oH2 — heatsink overheating" 18 = "tH1o — IGBT temperature detection failure" 19 = "tH2o — capacitor hardware error" 21 = "oL — drive over load" 22 = "EoL1 — electronic thermal relay 1 protection (motor 1)" 23 = "EoL2 — electronic thermal relay 2 protection (motor 2)" 24 = "oH3 — motor PTC overheating" 26 = "ot1 — over torque 1" 27 = "ot2 — over torque 2" 28 = "uC — under current" 29 = "LiT — limit error" 31 = "cF2 — EEPROM read error" 33 = "cd1 — U-phase current sensor error" 34 = "cd2 — V-phase current sensor error" 35 = "cd3 — W-phase current sensor error" 36 = "Hd0 — current clamp hardware error" 37 = "Hd1 — over-current hardware error" 40 = "AUE — auto-tuning error" 41 = "AFE — PID feedback loss on AI2" 42 = "PGF1 — encoder feedback error" 43 = "PGF2 — encoder feedback loss" 44 = "PGF3 — encoder feedback stall" 45 = "PGF4 — encoder slip error" 48 = "ACE — AI2 analog input loss" 49 = "EF — external fault" 50 = "EF1 — emergency stop" 51 = "bb — external base block" 52 = "Pcod — password is locked" 54 = "CE1 — illegal command" 55 = "CE2 — illegal data address" 56 = "CE3 — illegal data value" 57 = "CE4 — data written to a read-only address" 58 = "CE10 — Modbus transmission time-out" 61 = "ydc — Y-connection / delta-connection switch error" 62 = "dEb — deceleration energy backup error" 63 = "oSL — over slip error" 68 = "Reverse direction of speed feedback" 69 = "Over speed rotation feedback" 70 = "Large deviation of speed feedback" 72 = "STL1 — STO loss 1" 76 = "STo — safe torque off" 77 = "STL2 — STO loss 2" 78 = "STL3 — STO loss 3" 79 = "Aoc — U-phase over-current before run" 80 = "boc — V-phase over-current before run" 81 = "coc — W-phase over-current before run" 82 = "oPL1 — output phase loss, U phase" 83 = "oPL2 — output phase loss, V phase" 84 = "oPL3 — output phase loss, W phase" 87 = "oL3 — low frequency overload protection" 89 = "roPd — rotor position detection error" 97 = "CD10 — Ethernet card timeout" 111 = "ictE — InrCOM time-out error" 121 = "CP20 — internal communication error" 123 = "CP22 — internal communication error" 124 = "CP30 — internal communication error" 126 = "CP32 — internal communication error" 127 = "CP33 — internal communication error" 128 = "ot3 — over-torque 3" 129 = "ot4 — over-torque 4" 134 = "EoL3 — internal communication error" 135 = "EoL4 — internal communication error" 140 = "Hd6 — over-current hardware error" 141 = "b4GFF — ground fault occurs before run" 142 = "AuE1 — auto-tune error 1 (DC test stage)" 143 = "AuE2 — auto-tune error 2 (high frequency test stage)" 144 = "AuE3 — auto-tune error 3 (rotary test stage)" 149 = "AuE5 — auto-tune error 5 (rotor resistance measure stage)" 174 = "CD12 — encoder card missing" 175 = "CD13 — I/O card missing" # P00.00 GS30 Model ID (p. 4-61): an enumerated code carrying voltage, phase # and horsepower — 207 is 230 V 3-phase 5 HP, 418 is 460 V 3-phase 100 HP. # Cloning a 100 HP configuration onto a 5 HP frame is caught by comparing this # one register. P00.01 also exists and reads rated amps, but the manual states # no decimal scale for it, so it is deliberately not used here. [rating] register = 0x0000 label = "GS30 Model ID (P00.00): voltage / phase / HP code" # Clone ranges, one per parameter group, bounded by the highest index that # actually exists in each group summary (pp. 4-3 to 4-59). Holes inside a range # are harmless — an absent parameter is recorded as unreadable rather than # guessed. The exclusions are not: # 0000h 0001h P00.00/P00.01 model ID and rated amps, read-only # 0002h P00.02 "Restore to Default" is a COMMAND — 9/10/11/12 factory # reset the drive. Cloning a captured value re-triggers it. # 0006h 0032h P00.06 / P00.50 firmware version, read-only # 0007h 0008h P00.07/P00.08 password — restoring these locks the # replacement drive with the donor's code # 0500h P05.00 motor auto-tuning is a COMMAND and the manual is # explicit that "drive motion will occur during these tests" # (p. 4-156). It must never be replayed by a restore. # 0611h-0616h P06.17-P06.22 fault records, read-only history # 063Fh-065Dh P06.63-P06.93 fault timestamps, read-only # 0900h-0904h P09.00-P09.04 node address, baud, fault treatment, timeout and # protocol — restoring these either duplicates a node address on # the plant bus or drops the link mid-restore # 0922h+ P09.34 upward: PLC address and the whole EtherNet/IP card # block (IP, mask, gateway, card password), same reasoning # 1446h-1449h P14.70-P14.73 fault records 7-10, read-only # 2000h-2002h and 2100h-210Ch are the command and status words and lie outside # every range below, so a restore can never write the control word. [parameters] ranges = [ [0x0003, 0x0005], [0x0009, 0x0031], # P00.03-P00.05, P00.09-P00.49 [0x0100, 0x0146], # P01.00-P01.70 [0x0200, 0x0253], # P02.00-P02.83 [0x0300, 0x034A], # P03.00-P03.74 [0x0400, 0x0445], # P04.00-P04.69 [0x0501, 0x054B], # P05.01-P05.75 [0x0600, 0x0610], [0x0617, 0x063E], # P06.00-P06.16, P06.23-P06.62 [0x0700, 0x074C], # P07.00-P07.76 [0x0800, 0x0852], # P08.00-P08.82 [0x0905, 0x0921], # P09.05-P09.33 [0x1000, 0x1035], # P10.00-P10.53 [0x1100, 0x112A], # P11.00-P11.42 [0x1200, 0x124D], # P12.00-P12.77 [0x1300, 0x1332], # P13.00-P13.50 [0x1400, 0x1445], [0x144A, 0x1453], # P14.00-P14.69, P14.74-P14.83 ]