# Property of PMA Electrical Solutions, LLC. # # AutomationDirect DURApulse GS4, built-in Modbus RTU on the RS-485 port. # 1–300 hp. The optional GS4-CM-MODTCP path is also described below from the # same manual's Appendix B. The built-in serial port also speaks BACnet, but # only one serial protocol at a time. # # GS4 ONLY. GS10, GS20/GS20X and GS30 are separate manuals and separate # profiles, and the GS4 differs from them in ways that matter — see the scaling # and control notes below. Nothing here came from automationdirect_gs20.toml. # # SOURCE — AutomationDirect primary documentation only. automationdirect.com # and cdn.automationdirect.com are the vendor domain for the DURApulse brand. # "DURApulse GS4 AC Drive User Manual", 1st Ed. Rev N, 04/02/2025 # Chapter 5, Serial Communications # pp. 5-2 – 5-3 the P9.xx communication parameter table: every address, # default and value enumeration used below # pp. 5-6 – 5-7 status addresses and the full error code table # p. 5-8 minimum parameter settings for serial control # p. 5-15 the RTU worked example that pins the frequency scaling # # ADDRESSING — 0-BASED PROTOCOL ADDRESSES, AND THE "DEC" COLUMN IS A TRAP. # Every table prints Hex, Dec and Octal. The HEX column is the 0-based protocol # address; the DEC column is the PLC 4xxxx form, i.e. 40001 + hex. # P9.00 is printed as hex 0900, dec 42305. 0x0900 = 2304, and # 2304 + 40001 = 42305. Confirmed. # Parameter addresses derive from the parameter number: # 0-based protocol address = (group << 8) | index i.e. hex 0xGGII # P9.27 RS-485 RUN Command -> 0x091B = 2331 # P9.33 Drive Rated Amps -> 0x0921 = 2337 # # ############ SCALING: GS4 IS ONE DECIMAL, GS20 IS TWO ###################### # The GS4 status table prints its values as "F (xxx.x)", "H (xxx.x)", # "A (xxx.x)", "U (xxx.x)", "E (xxx.x)" — ONE decimal place, so scale 0.1. # The GS20 uses XXX.XX for the same quantities, i.e. 0.01. Carrying the GS20 # scale onto a GS4 would command and report every frequency ten times wrong. # # The manual's own RTU example on p. 5-15 settles it: it writes 0x2000 = 0x0002 # and 0x2001 = 0x0258. 0x0258 is 600 decimal, which at 0.1 Hz is 60.0 Hz — a # sensible reference. At 0.01 it would be 6.00 Hz, which is not what a worked # "run the drive" example would show. # # BUT NOTE THE PARAMETER-vs-FIELDBUS SPLIT: P9.26 [RS-485 Last Known Speed # Reference] is documented with the range "0.00~599.00 Hz", i.e. TWO decimals, # while the 0x2001 fieldbus reference is one. The panel/parameter format and # the fieldbus format genuinely differ on this drive. Do not reuse one scale # for the other. # ############################################################################# # # DRIVE-SIDE SETUP — without these the drive ACKs writes and ignores them # (manual p. 5-8): # P4.00 = 1 1st source of frequency command [Remote] = RS-485 # P4.01 = 1 2nd source of frequency command [Local] = RS-485 # P9.00 comm address, 1–254, default 1 # P9.01 baud rate, default 1 = 9.6k # P9.02 protocol/format, default 12 = 8N1 RTU # Note P0.04 [Drive Max Out Freq] is a hard ceiling: p. 5-15 states that if the # reference exceeds it the drive "goes up to Max Out Freq and remains there" # rather than faulting, so an over-range reference is silently clamped. name = "AutomationDirect DURApulse GS4" vendor = "AutomationDirect" device_type = "vfd" verified = false probe_register = 0x2101 # status monitor, readable whenever the port is alive [connection] summary = "The GS4 built-in RS-485 bus is available at screw terminals and two shared serial jacks; a separate option card provides Modbus TCP." warnings = ["Set the built-in termination DIP switch only when the GS4 is at the physical end of the RS-485 trunk."] [[connection.methods]] id = "control_terminals_rs485" title = "Built-in RS-485 screw terminals" transport = "serial" hardware = "built_in" port = "GS4 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 P4.00/P4.01=1 for RS-485 frequency sources, P9.00=node, P9.01=baud, and P9.02=12 for RTU 8N1."] 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 GS4 User Manual, 1st Ed. Rev N, chapter 5 pp. 5-7 to 5-12 (SG terminals, RJ45-1/RJ45-2 pins, termination and setup), Appendix B (Ethernet option cards)" [[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-1 / RJ45-2 Modbus RTU" transport = "serial" hardware = "built_in" port = "GS4 RJ45-1 or RJ45-2 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 P4.00/P4.01=1 for RS-485 frequency sources, P9.00=node, P9.01=baud, and P9.02=12 for RTU 8N1."] 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 GS4 User Manual, 1st Ed. Rev N, chapter 5 pp. 5-7 to 5-12 (SG terminals, RJ45-1/RJ45-2 pins, termination and setup), Appendix B (Ethernet option cards)" [[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 or 6 (GND)" signal = "Signal reference or shield drain" required = false [[connection.methods]] id = "gs4_modbus_tcp_card" title = "GS4-CM-MODTCP option card" transport = "tcp" hardware = "option" port = "Single RJ45 Ethernet port on the GS4-CM-MODTCP card" connector = "One RJ45 Ethernet jack with Auto MDI/MDIX" adapter = "10/100BASE-T Ethernet interface or Ethernet switch" cable = "Shielded Category 5e Ethernet patch cable rated for 100 MHz" parts = ["AutomationDirect GS4-CM-MODTCP communication card", "Shielded Category 5e Ethernet cable"] steps = ["Lock out input power, wait until every keypad display LED is off, and verify the DC link is de-energized before removing the keypad and drive cover.", "Install the supplied communication-card insulation spacer and the GS4-CM-MODTCP in Slot 1, seat the board under its retaining clip, and secure it with the two specified screws.", "Connect the shielded Cat5e cable to the card's single RJ45 port and the control-network switch or service computer.", "Restore control power with the motor area clear, configure a unique compatible IP address, subnet mask, and gateway, then write P9.64=2 to transfer the drive's P9 network values to the card.", "Verify the POWER and LINK LEDs and read identity/status registers before changing P3.00/P4.00 for network control."] setup = ["Set P9.48=0 and P9.49 through P9.60 for a static IP address, subnet mask, and gateway, or set P9.48=1 for DHCP. After changing P9 card parameters, set P9.64=2 to write them to the card.", "For remote control through the card, set P4.00=4 (frequency command from communication card) and P3.00=5 (operation command from communication card). Configure and test P9.93/P9.94/P9.95 communications-loss detection before operation."] warnings = ["The GS4-CM-MODTCP is a one-port Modbus TCP card. Do not substitute the visually similar GS4-CM-ENETIP card.", "Install a communication card only in Slot 1, and install only one communication card at a time.", "The base-drive RJ45-1 and RJ45-2 jacks are RS-485 serial, not Ethernet; connect the LAN cable only to the RJ45 on GS4-CM-MODTCP.", "Use RS-485 or Ethernet for control, not both simultaneously; Appendix B warns that concurrent RS-485 writes can make Ethernet control-word readback inaccurate."] source = "AutomationDirect DURApulse GS4 User Manual, 1st Ed. Rev N, Appendix B pp. B-2 to B-4 (GS4-CM-MODTCP part and Slot 1 installation), pp. B-8 to B-10 (one-port RJ45 pinout and card identification), pp. B-12 to B-18 (network setup, Cat5e specification, P3.00/P4.00, register access and concurrent-interface warning)" # P9.01 [Modbus Baud Rate] default 1 = 9.6k. P9.02 [Modbus Protocol] default 12, # which that parameter's own enumeration decodes as "8N1 (RTU)". # CAUTION, the manual contradicts itself here: the character-frame diagrams on # p. 5-12 illustrate "P9.02 = 03/04/05" as the 8-bit RTU formats, which does not # match the parameter table's enumeration on p. 5-2 where 12–17 are the RTU # formats. The parameter table is authoritative — it is the one that lists the # address and the factory default. The frame diagrams appear to use a stale # numbering. Confirm on the keypad if the link will not come up. [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # 0x2101, manual p. 5-7. Bits 1-0 are a two-bit run-status FIELD (00 Stop, # 11 Run) and bits 4-3 a two-bit direction FIELD (00 FWD, 01 REV->FWD, # 10 FWD->REV, 11 REV) — named individually so the UI can show them, but read # as pairs. The remaining bits of this register (a "master frequency controlled # by communication interface" flag, a "controlled by analog signal" flag and a # running-status flag) are documented on that page but their bit POSITIONS did # not extract legibly, so they are deliberately omitted rather than guessed. status_word = { address = 0x2101, bits = { 0 = "RunBit0", 1 = "RunBit1", 2 = "JogActive", 3 = "DirBit0", 4 = "DirBit1" } } frequency_command = { address = 0x2102, scale = 0.1, unit = "Hz" } output_frequency = { address = 0x2103, scale = 0.1, unit = "Hz" } motor_current = { address = 0x2104, scale = 0.1, unit = "A" } dc_bus_voltage = { address = 0x2105, scale = 0.1, unit = "V" } output_voltage = { address = 0x2106, scale = 0.1, unit = "V" } multi_step_speed_step = { address = 0x2107 } # GS4 keeps the warning code in its OWN register, unlike the GS20 which packs # warning and error into one. 0x2118 carries both (low byte error, high byte # warning) for anyone who wants a single read. active_warning = { address = 0x2108 } counter_value = { address = 0x2109 } power_factor_angle = { address = 0x210A } motor_speed = { address = 0x210C, unit = "rpm" } output_power = { address = 0x210F, unit = "kW" } error_and_warning = { address = 0x2118 } # 0x220B–0x220D, analog input display, 0.00–100.00%. AI3 is bipolar # (-100.00–100%) and therefore signed; AI1 and AI2 are not. analog_in_1 = { address = 0x220B, scale = 0.01, unit = "%" } analog_in_2 = { address = 0x220C, scale = 0.01, unit = "%" } analog_in_3 = { address = 0x220D, scale = 0.01, signed = true, unit = "%" } igbt_temperature = { address = 0x220E, scale = 0.1, unit = "C" } capacitor_temperature = { address = 0x220F, scale = 0.1, unit = "C" } # ############ WHY THE CONTROL REGISTER IS P9.27 AND NOT 0x2000 ############## # The GS4 offers two control surfaces and this profile deliberately uses the # fully documented one. # # (a) Dedicated RS-485 command parameters, manual p. 5-2 – 5-3, each with an # explicit value enumeration: # P9.27 RS-485 RUN Command 0x091B 0: Stop 1: Run # P9.28 RS-485 Direction Command 0x091C 0: Forward 1: Reverse # P9.29 RS-485 External Fault 0x091D 0: No Fault 1: External Fault # P9.30 RS-485 Fault Reset 0x091E 0: No Action 1: Fault Reset # P9.31 RS-485 JOG Command 0x091F 0: Stop 1: Jog # # (b) A packed command word at 0x2000 in the Delta style, which the p. 5-15 RTU # example exercises by writing 0x0002 to it. That value matches the GS20's # "bits 1-0 = 10B = Run" encoding, so the two drives almost certainly share # the layout — but the GS4 manual never prints a bit table for 0x2000, and # CLAUDE.md forbids carrying a register map across families on a likeness. # Path (a) is used because every value in it is quoted from the vendor. # # CONSEQUENCE: run_rev IS ABSENT, and not because direction is the sign of the # reference. Direction is a real, separate register (P9.28 @ 0x091C), and this # schema writes a sequence to ONE command register, so run-and-reverse cannot # be issued atomically. Reverse over Modbus therefore needs either a manual # write to 0x091C before the run, or the 0x2000 packed word once someone has # confirmed its bit table on hardware or found it in Chapter 4. # ############################################################################# [control] command_register = 0x091B # P9.30 RS-485 Fault Reset is its own register, so no reset value here can # reach the run register — the Delta/GS20 "reset is a start command" trap # cannot occur on this path. reset_register = 0x091E step_delay = 0.05 stop = [0] run_fwd = [1] reset = [1] # The fieldbus frequency reference, 0.1 Hz — see the scaling block in the # header. This is 0x2001, NOT P9.26. speed_register = 0x2001 speed_scale = 0.1 speed_unit = "Hz" # This is the REGISTER full-scale (P0.04's range tops out at 599.00 Hz), not a # policy limit — the same convention the other GS profiles and delta_ms300 use, # and what speed_scales_are_not_inverted expects. The operative ceiling is # whatever P0.04 [Drive Max Out Freq] is actually set to on the unit, and # p. 5-15 says a reference above it pins the drive at max output frequency # until a lower reference or a stop arrives, rather than faulting. If this # machine should never see more than 60 Hz, enforce that at P0.04 on the drive, # not here. max_ref = 599.0 # ############ THIS DRIVE KEEPS RUNNING WHEN THE MASTER GOES QUIET ########### # Manual p. 5-2: # P9.03 [Modbus Fault Select] 0 warn & continue, 1 warn & ramp to stop, # 2 warn & coast to stop, # 3 no warning & continue operation # FACTORY DEFAULT = 3 # P9.04 [Time Out Detection] 0 Disable / 1 Enable, FACTORY DEFAULT = 0 # P9.05 [Time Out Duration] 0.1–100.0 s, default 0.5 s # So a stock GS4 behaves like the Danfoss and the Eaton SVX9000, not like the # Schneider ATS48: lose the master mid-run and the motor keeps turning with no # fault raised. Set P9.04 = 1 and P9.03 to 1 or 2 before using this profile for # sustained control. # ############################################################################# # # ############ 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 GS4 does not fault on # silence out of the box (P9.04 = 0 Disable, P9.03 = 3, above), so there is # nothing to keep alive. # - Real hazard if the local STOP key is in play. On this family the keypad # STOP key is disabled by default whenever the command source is not the # keypad — the RS-485 setup this profile assumes. An installer who re-enables # it 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 here. # # So this profile ships without a watchdog, which sets no_watchdog_backstop in # ArmedInfo and tells the UI the truth: "stop refreshing and the drive stops # itself" DOES NOT hold for this drive. Disarm still sends a real stop first. # # IF you enable the drive-side timeout (P9.04 = 1 with P9.03 = 1 or 2), the # drive WILL trip on silence and a keepalive becomes necessary. Add it then, # and resolve the keypad-STOP interaction on the machine: # [control.watchdog] # interval_ms = 200 # inside even the 0.1 s minimum P9.05 # fault = "58 CE10 PC Communication Time Out" # ############################################################################# # 0x2101 bits 1-0 are documented as 00 Stop / 11 Run, so bit 0 is set exactly # when the drive is running. [running_check] register = 0x2101 bit = 0 # P9.33 [GS4 Drive Rated Amps], 0.00–655.34 A. The drive reports its own frame # rating, so compare it against the target before restoring a configuration — # cloning a 300 hp drive's settings onto a 5 hp unit is a fire. [rating] register = 0x0921 scale = 0.01 unit = "A" label = "drive rated amps" # 0x2100 is the ACTIVE ERROR on its own — 0x2118's description confirms it # ("2100h = Active Error/Fault") and the warning lives separately at 0x2108. # No mask is needed here, unlike the GS20 where both share one register. [faults] register = 0x2100 # Manual pp. 5-6 – 5-7, transcribed complete. Vendor-declared reserved codes # (25, 29, 32, 42-47, 65-71, 75, 85-89, 91-98, 100-110) are omitted. # NOTE this list is NOT identical to the GS20's: the GS4 adds 111 (ictE) and # does not define 97 (which is an Ethernet card timeout on the GS20). [faults.codes] 0 = "No Error" 1 = "ocA over-current during accel" 2 = "ocd over-current during decel" 3 = "ocn over-current during normal speed" 4 = "GFF ground fault" 5 = "occ IGBT short circuit" 6 = "ocS over-current during stop" 7 = "ovA over-voltage during accel" 8 = "ovd over-voltage during decel" 9 = "ovn over-voltage during normal speed" 10 = "ovS over-voltage during stop" 11 = "LvA low voltage during accel" 12 = "Lvd low voltage during decel" 13 = "Lvn low voltage during normal speed" 14 = "LvS low voltage during stop" 15 = "OrP input phase loss" 16 = "oH1 IGBT overheat 1" 17 = "oH2 capacitor overheat 2" 18 = "tH1o thermistor 1 open" 19 = "tH2o thermistor 2 open" 20 = "PWR power reset off" 21 = "oL overload, 150% for 1 min, inverter" 22 = "EoL1 motor 1 thermal overload" 23 = "EoL2 motor 2 thermal overload" 24 = "oH3 motor overheat, PTC" 26 = "ot1 over torque 1" 27 = "ot2 over torque 2" 28 = "uc under current" 30 = "cF1 EEPROM write error" 31 = "cF2 EEPROM read error" 33 = "cd1 U phase current sensor detection error" 34 = "cd2 V phase current sensor detection error" 35 = "cd3 W phase current sensor detection error" 36 = "Hd0 CC hardware logic error 0" 37 = "Hd1 OC hardware logic error 1" 38 = "Hd2 OV hardware logic error 2" 39 = "Hd3 OCC hardware logic error 3" 40 = "AuE motor auto tune error" 41 = "AFE PID feedback loss" 48 = "ACE analog input signal loss" 49 = "EF external fault" 50 = "EF1 emergency stop" 51 = "bb base block" 52 = "Pcod password error" 53 = "ccod software code lock" 54 = "CE1 PC command error" 55 = "CE2 PC address error" 56 = "CE3 PC data error" 57 = "CE4 PC slave error" 58 = "CE10 PC communication time out" 59 = "CP10 PC keypad time out" 60 = "bf braking transistor fault" 61 = "ydc Y-delta connection error" 62 = "dEb decel energy backup error" 63 = "oSL over slip error" 64 = "ryF electromagnet switch error" 72 = "STL1 STO loss 1, STO1~SCM1 internal hardware detect error" 73 = "S1 ES1 emergency stop" 74 = "Fire in fire mode" 76 = "STO safe torque off function active" 77 = "STL2 STO loss 2, STO2~SCM2 internal hardware detect error" 78 = "STL3 STO loss 3, both STO channels" 79 = "Uoc U phase short" 80 = "Voc V phase short" 81 = "Woc W phase short" 82 = "UPHL U phase loss" 83 = "VPHL V phase loss" 84 = "WPHL W phase loss" 90 = "FStp PLC force stop" 99 = "TRAP CPU command error" 111 = "ictE InrCom time out" # NO [parameters] BLOCK YET. The address space is contiguous by construction # ((group << 8) | index), but it interleaves read-only values — P9.33 rated # amps, P9.38 firmware date, P9.39 firmware version, P9.42 model ID all sit # inside group 9 alongside writable settings — with the settings a clone would # want. A restore that walked a whole group would NAK on those at best. # Chapter 4's per-parameter tables carry the R/W flags needed to draw safe # ranges; establish them from there before adding this block.