# Property of PMA Electrical Solutions, LLC. # # AutomationDirect DURApulse GS10 AC drive over Modbus RTU on the embedded # RS-485 port (RJ45, pins 5/4/3 = SG+/SG-/SGND). Covers the GS10 only. The # GS10 has no communication option card and no STO input, and its fault table # is materially different from the other DURApulse models — GS30, GS20 and GS4 # each ship their own manual and none of this map is shared with them. # # Sources — "DURApulse GS10 AC Drive User Manual", 1st Ed., Rev B: # Chapter 5, Serial Communications (automationdirect_gs10_ch5_serial_comms.pdf) # P09.xx communication parameter summary ............ pp. 5-2 to 5-3 # Status addresses 0611h and 2100h-210Ch, fault codes pp. 5-4 to 5-5 # Command addresses 2000h / 2001h / 2002h ........... p. 5-6 # Minimum parameter settings for serial control ..... p. 5-7 # RTU framing, FC03 / FC06 / FC16 examples .......... pp. 5-11 to 5-14 # Chapter 4, AC Drive Parameters (automationdirect_gs10_ch4_parameters.pdf) # P00.xx summary — the addressing proof ............. p. 4-2 # P00.20 / P00.21 command sources ................... p. 4-4 # P00.30 / P00.31 local command sources ............. p. 4-6 # P01.00 maximum output frequency ................... p. 4-8 # P00.00 model ID, P00.01 rated amps, P00.02 restore p. 4-47 # P05.00 auto-tuning (moves the motor) .............. p. 4-129 # P06.17-P06.22 fault records and the code table .... pp. 4-143 to 4-145 # Group summaries used for the clone ranges ......... pp. 4-2 to 4-45 # # 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-2) 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-129) 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-7): # 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 # A drive left in the wrong LOCAL/REMOTE state obeys the source pair that was # not configured. name = "AutomationDirect DURApulse GS10" vendor = "AutomationDirect" device_type = "vfd" verified = false probe_register = 0x2101 # status monitor 2, readable whenever the port is up [connection] summary = "The GS10 has one built-in two-wire Modbus RTU port; no communication option card is required." warnings = [] [[connection.methods]] id = "rj45_rs485" title = "Built-in RJ45 Modbus RTU" transport = "serial" hardware = "built_in" port = "GS10 RJ45 Serial Comm Port" connector = "RJ45 wired as RS-485, not Ethernet" adapter = "Isolated USB-to-RS-485 adapter, 2-wire half-duplex" cable = "Standard straight-through RJ45 patch cable to a breakout, or Belden 9842/Q8304-1 equivalent RS-485 cable" parts = ["Isolated two-wire RS-485 adapter", "Standard straight-through RJ45 patch cable to a breakout, or Belden 9842/Q8304-1 equivalent RS-485 cable", "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 for frequency source, P00.21/P00.31=2 for run source as applicable, then set P09.00 node, P09.01 baud, and P09.04 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.", "Fit a 120 ohm external terminator at the drive end; another may be required at the master end.", "Do not use a crossover cable."] source = "AutomationDirect DURApulse GS10 User Manual, chapter 5 pp. 5-6 to 5-11 (RJ45 RS-485 port, pins 5/4/3, cable, termination and setup)" [[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 # P09.01 defaults to 38.4 Kbps and P09.04 defaults to 13 = 8 data / NO parity / # 2 stop, RTU (p. 5-2). Both differ from the GS30, which ships at 9.6 Kbps and # odd parity — a master configured for one will not talk to the other out of # the box. P09.01 tops out at 38.4 Kbps on the GS10. [serial] baudrate = 38400 parity = "N" stopbits = 2 # 2101h status monitor 2 (p. 5-5). 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-5). 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 GS10 is 10 HP at # 460 V, so this map never reaches the shift. 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-6): # 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.0 Hz # (p. 4-8). 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-14) # 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-6). 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 GS10 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 GS10 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-4); P06.18-P06.22 are the five older records (p. 4-143). Codes below # are the Chapter 4 detail table, pp. 4-143 to 4-145. Where Chapter 5 and # Chapter 4 word a code differently (Chapter 5 calls 82/83/84 "U/V/W Phase # Loss (UPHL/VPHL/WPHL)") the Chapter 4 wording is used, because it carries the # mnemonic the drive actually displays. The code numbers agree in both. # 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" 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" 18 = "tH1o — IGBT temperature detection failure" 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" 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 AI-C" 48 = "ACE — AI-C 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" 63 = "oSL — over slip error" 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" 140 = "Hd6 — over-current hardware error" 141 = "b4GF — 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" 149 = "AUE5 — total resistance measurement fault" 150 = "AUE6 — no-load current I0 measurement fault" 151 = "AUE7 — dq axis inductance measurement fault" 152 = "AUE8 — high frequency injection measurement fault" 157 = "dEv — pump PID feedback error" 159 = "Hd7 — gate driver error" # P00.00 GS10 Model ID (p. 4-47): an enumerated code carrying voltage, phase # and horsepower — 102 is 120 V 1-phase 0.25 HP, 409 is 460 V 3-phase 10 HP. # Cloning a 10 HP configuration onto a 0.25 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 = "GS10 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-2 to 4-45). The GS10's groups # are shorter than the GS30's in P01, P03, P04, P05, P09, P12 and P14, so # these bounds are NOT interchangeable between the two profiles. 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 that spins the motor # (p. 4-129). 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 # 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, 0x0134], # P01.00-P01.52 [0x0200, 0x0253], # P02.00-P02.83 [0x0300, 0x0344], # P03.00-P03.68 [0x0400, 0x040E], # P04.00-P04.14 [0x0501, 0x052B], # P05.01-P05.43 [0x0600, 0x0610], [0x0617, 0x063E], # P06.00-P06.16, P06.23-P06.62 [0x0700, 0x0755], # P07.00-P07.85 [0x0800, 0x084E], # P08.00-P08.78 [0x0905, 0x091F], # P09.05-P09.31 [0x1000, 0x1035], # P10.00-P10.53 [0x1100, 0x112A], # P11.00-P11.42 [0x1200, 0x1234], # P12.00-P12.52 [0x1300, 0x1332], # P13.00-P13.50 [0x1400, 0x1445], # P14.00-P14.69 ]