# Property of PMA Electrical Solutions, LLC. # # Eaton PowerXL DG1 general-purpose VFD over the **on-board Modbus RTU** on the # control-board RS-485 terminals. No option card is required or assumed: # MN040010EN Table 5 (printed p. 5) lists Modbus RTU for the DG1 as "On Board", # and MN040004EN (printed p. 33) assigns terminal 25 = A/+ and terminal 26 = B/- # to "Fieldbus Communication (Modbus, BACnet)". # # CLAIMS THE DG1 ONLY. MN040010EN is a two-drive manual — every table carries a # DG1 column and a DH1 column, and they differ (the DH1 has no EtherNet/IP, no # CANopen, no SmartWire-DT, and a SEPARATE fault code list, Table 172). The # parameter IDs below come from Table 167 "DG1 Parameter ID list" and the fault # codes from Table 171 "DG1 fault code list". Nothing here is claimed for the # DH1, and nothing for the DM1/DA1/DB1/DC1/DE1 PowerXL families, which are # documented in entirely different manuals (MN040051EN, MN040018EN). # # SOURCES — Eaton primary documentation only: # MN040010EN (January 2023) "PowerXL Series VFD Communication manual" # printed p. 5 Table 5, protocol support per drive (DG1 Modbus RTU = On Board) # printed p. 6 Tables 6-7, RS-485 half duplex, baud list, addresses 1-247 # printed p. 8 Table 8, the Modbus RTU commissioning parameters and defaults # printed p. 10 Table 9, supported function codes # printed p. 12 Table 20 index table (the addressing rule), Tables 21-22 # printed p. 13 Tables 23-24, FB control word bits, speed reference scaling # printed p. 14 Tables 25-27, FB status word and FB general status word bits # printed p. 15 Tables 28-29 process data defaults, and the startup test # printed pp. 151-152 Table 167, DG1 Parameter ID list (IDs and display formats) # printed pp. 199-206 Table 171, DG1 fault code list # MN040004EN (January 2023) "PowerXL DG1 Series VFD Application manual", # firmware bundle DG1-V0037.04-ETN. NOTE the document number: eaton.com # serves this file under the slug "mz040004en", but the manual's own footer # and AP040086EN's reference list both call it MN040004EN. # printed p. 33 control terminals 25/26 = RS-485 A/B # printed p. 35 Table 21, Monitor M1-M52 with ID numbers and units # printed p. 36 Table 22, P1.10-P1.15 control place and reference place # printed pp. 38-39 Table 24, P3.2/P3.9 digital-input function enum # printed p. 45 P9.21 Fieldbus Fault Response # printed p. 51 Table 38, Modbus RTU P20.3.2 defaults # printed p. 252 ID 334 description # printed p. 289 ID 593 and ID 2516 descriptions # AP040086EN (September 2014) "PowerXL DG1 to XV HMI by Modbus TCP" # printed p. 11 the worked addressing example quoted below # # ######################## ADDRESSING — 0-BASED, CONFIRMED #################### # Eaton documents the DG1 map twice, in two different notations, and they agree. # # 1. MN040010EN Table 20 (printed p. 12) gives PLC-style 4xxxx references: # ID 1-98 -> 40001-40098 Actual Values # ID 100 -> 40099 Fault Code # ID 101-1999 -> 40101-41999 Parameters # ID 2004-2011 -> 42004-42011 Process Data In # ID 2104-2111 -> 42104-42111 Process Data Out # and Tables 21-22 extend it: ID 2001 -> 42001, ID 2003 -> 42003, # ID 2101 -> 42101. Applying the standard 4xxxx rule: # # 0-based protocol address = (4xxxx reference) - 40001 = ID - 1 # # 2. AP040086EN (printed p. 11) states the same thing as raw addresses, and this # is what removes the guesswork: # "the Status Word, General Status Word and Actual Speed begin at Modbus # data address 2100 decimal or 0834 Hexadecimal" <- IDs 2101/2102/2103 # "the Control Word, the General Control Word and the Speed Reference. The # starting Modbus data address is 2000 decimal or 07D0 hexadecimal" # <- IDs 2001/2002/2003 # ID 2101 -> 2100 and ID 2001 -> 2000. ID - 1, in decimal AND in hex, from # Eaton. Every address in this file is therefore (ID - 1). # # The ONE documented exception is the Fault Code group: Table 20 maps ID 100 to # 40099, i.e. address 98, not 99. That entry is not used here — this profile # reads Latest Fault Code from ID 28 instead (see [faults]). # # FC03 IS SUFFICIENT. MN040010EN printed p. 12: "All values can be read with # function codes 3 and 4 (all registers are 3X and 4X reference)." Table 20's # parenthesised 3xxxx column is the same data through FC04, not an offset and # not a separate map. vfd-core reads holding registers with FC03 only, and on # this drive that reaches everything below — nothing in this profile is # FC04-only. Do not subtract or add anything for the 3xxxx column. # ############################################################################# # # SCALING IS THE "DISPLAY FORMAT" COLUMN OF TABLE 167, NOT THE PANEL DECIMALS. # Table 167 tags each ID x0 / x10 / x100 / x1000 / x10000 and MN040010EN # printed p. 12 warns "The parameter value shall be given without decimals." # The two anchor on each other at ID 2003: Table 167 lists it x100, Table 24 # says the reference "has 2 decimal places in it", and Table 29 gives scale # 0.01. So x100 -> scale 0.01, x10 -> 0.1, x0 -> 1. Applied that way below. # None of these is a 32-bit REAL — Table 167's data-type column reads INTEGER # with length 2 bytes for every point used here, so no `float` point exists in # this profile. # # DRIVE-SIDE SETUP — without these the drive ACKs writes and ignores them: # P1.11 Remote 1 Control Place (ID 135) = 1 (Fieldbus). Default is 0, I/O # Terminal Start 1, which ignores the fieldbus run command entirely. # P1.15 Remote 1 Reference (ID 137) = 7 (Fieldbus Ref). Default is 0, AI1. # (The enum lives at ID 136 / P1.14; MN040004EN printed p. 36.) # For LOCAL mode the equivalents are P1.12 Local Control Place = 3 (Fieldbus) # and P1.14 Local Reference = 7 (Fieldbus Ref). # Control word bits 8 (FB Control On) and 9 (FB Reference On) must also be set # on every write — they are baked into every sequence below rather than being # a separate step, exactly as Eaton's own startup test does it. # P20.3.1.1 RS485 Comm Set (ID 586) = 0 (Modbus RTU). Default is already 0, # but 1 selects BACnet MS/TP on the same terminals and there is only one # RS-485 port, so a BACnet-commissioned drive will not answer Modbus. # P3.9 Run Enable (ID 194) default is 1 = DigIN:NormallyClose, i.e. forced # closed, so no physical enable input is needed out of the box. If it has # been reassigned to a real digital input, that input must be closed or the # drive will not run no matter what the control word says. name = "Eaton PowerXL DG1" vendor = "Eaton" device_type = "vfd" verified = false probe_register = 2100 # FB Status Word (ID 2101) — valid whenever the link is up [connection] summary = "DG1 supports direct on-board Modbus over either the RS-485 A/B terminals or the dedicated RJ45 Ethernet port." warnings = ["Isolate and discharge the VFD before accessing control terminals.", "Never plug the Ethernet cable into the service connector under the keypad; Eaton warns this can damage the computer."] [[connection.methods]] id = "onboard_rs485" title = "On-board RS-485 Modbus RTU" transport = "serial" hardware = "built_in" port = "Control terminal 25 A/+ and terminal 26 B/-" connector = "Control terminal block" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded RS-485 twisted pair" parts = ["Small insulated screwdriver", "Endpoint termination"] wiring = [{ adapter = "D+ / B+", device = "25, A/+", signal = "RS-485 positive" }, { adapter = "D- / A-", device = "26, B/-", signal = "RS-485 negative" }] steps = ["Isolate the VFD and locate control terminals 25 and 26.", "Land positive on 25 A/+ and negative on 26 B/-.", "Route the shielded cable separately from power wiring and terminate only bus endpoints.", "Close the drive, restore power, and select the serial adapter."] setup = ["Set P20.3.1.1 RS485 Comm Set = 0 Modbus RTU and configure P20.3.2 address/baud/framing/timeout.", "Set the active control place/reference to Fieldbus and retain control-word fieldbus request bits."] warnings = ["The same terminals can be commissioned for BACnet MS/TP; a BACnet-selected drive will not answer Modbus."] source = "Eaton MN040004EN, printed pp. 33 and 51; MN040010EN, printed pp. 5-8" [[connection.methods]] id = "onboard_modbus_tcp" title = "On-board RJ45 Modbus TCP" transport = "tcp" hardware = "built_in" port = "Dedicated RJ45 Ethernet port, not the connector under the keypad" connector = "10/100 Mb RJ45 Ethernet socket" adapter = "Computer Ethernet port or USB-to-Ethernet adapter" cable = "CAT5e-or-better Ethernet patch cable" parts = ["Ethernet switch only if required by topology"] steps = ["Identify the dedicated RJ45 Ethernet port by the application-manual drawing; do not use the under-keypad service connector.", "Connect CAT5e-or-better cable between that port and the computer or common switch.", "Power the drive and put the computer interface on the same subnet.", "Select the drive IP and Modbus TCP port 502 in PMA-VFD."] setup = ["Configure P20.4 IP mode/address, mask, and gateway and P20.5 Modbus TCP unit ID/timeout.", "Set the active control place/reference to Fieldbus and retain the fieldbus request bits in the control word."] warnings = ["A link light proves Ethernet only; fieldbus source selection is still required for commands."] source = "Eaton MN040004EN, printed pp. 34 and 51; MN040010EN, printed pp. 40-42; AP040086EN, printed p. 11" # MN040010EN Table 8 (printed p. 8) — these are the DG1's FACTORY defaults, and # they are NOT 9600 8N1. Baud rate (ID 584) default 1 = 19200; Parity type # (ID 585) default 2 = "Even, 1 Stop Bit"; Slave address (ID 587) default 1. # MN040004EN Table 38 (printed p. 51) prints the identical defaults and adds a # fourth parity option (3 = None and 1 stop bit) that MN040010EN omits. [serial] baudrate = 19200 parity = "E" stopbits = 1 [monitor] # FB Status Word, ID 2101. MN040010EN Table 26 (printed p. 14). Bits 8-15 are # printed as "Not in use" and are deliberately unnamed. # Bit 2: 0 = Clockwise, 1 = Counterclockwise. Bit 7 is an ENABLE indication # ("Run disable" / "Run Enable"), not a running indication — that is bit 1. status_word = { address = 2100, bits = { 0 = "Ready", 1 = "Running", 2 = "DirectionCCW", 3 = "Faulted", 4 = "Warning", 5 = "AtReference", 6 = "BypassActive", 7 = "RunEnable" } } # FB General Status Word, ID 2102. MN040010EN Table 27 (printed p. 14). Bits # 7, 8, 9, 10 and 15 carry the "the bit is not used" footnote on this drive and # are left unnamed. Bit 6 is inverted relative to its neighbours — the table # reads "Ref > 0 Speed" for 0 and "Ref = 0 speed" for 1 — so it is named for # what a SET bit means. general_status_word = { address = 2101, bits = { 0 = "Ready", 1 = "Running", 2 = "DirectionCCW", 3 = "Faulted", 4 = "Warning", 5 = "AtReference", 6 = "ReferenceIsZeroSpeed", 11 = "DCBrakeOn", 12 = "FBReferenceEnabled", 13 = "MotorStartDelayOn", 14 = "RemoteEnabled" } } # FB Actual Speed, ID 2103. MN040010EN Tables 21 and 25 give this as a # percentage, 0-100.00%, and printed p. 14 repeats "This value comes back in # the form of %". CONFLICT WORTH KNOWING: AP040086EN printed p. 12 describes # the same register as "a 16-bit decimal value for the scaled speed in Hz x # 100". Both are Eaton, nine years apart, and this profile follows the newer # and more specific communication manual. Use output_frequency below when you # need Hz that nothing disputes. actual_speed = { address = 2102, scale = 0.01, unit = "%" } # # Direct actual-value IDs from MN040004EN Table 21 (printed p. 35) with the # display formats from MN040010EN Table 167 (printed p. 151). Address = ID - 1. output_frequency = { address = 0, scale = 0.01, unit = "Hz" } # ID 1, x100 frequency_reference = { address = 23, scale = 0.01, unit = "Hz" } # ID 24, x100 motor_speed = { address = 1, unit = "rpm" } # ID 2, x0 motor_current = { address = 2, scale = 0.1, unit = "A" } # ID 3, x10 motor_torque = { address = 3, scale = 0.1, signed = true, unit = "%" } # ID 4, x10 motor_power = { address = 4, scale = 0.1, signed = true, unit = "%" } # ID 5, x10 motor_voltage = { address = 5, scale = 0.1, unit = "V" } # ID 6, x10 dc_link_voltage = { address = 6, unit = "V" } # ID 7, x0 unit_temperature = { address = 7, scale = 0.1, signed = true, unit = "C" } # ID 8, x10 motor_temperature = { address = 8, scale = 0.1, unit = "%" } # ID 9, x10 application_status_word = { address = 28 } # ID 29, x0 # # SIGNEDNESS IS INFERRED, NOT PRINTED. Table 167's data-type column says # INTEGER for all of these and Table 21 publishes no min/max, so Eaton never # states which are two's complement. Torque, power and unit temperature are # marked signed because the drive plainly produces negative values for them # (regeneration; fault 90 discusses heatsink temperatures down to -30 C). # output_frequency is deliberately left UNSIGNED even though reverse running is # possible: P1.2 Max Frequency (MN040004EN printed p. 36) accepts up to 400.00 # Hz, which at x100 is 40000 and overflows the signed range, so on a # high-frequency drive `signed = true` would report -255.36 Hz for 400 Hz. # Direction comes from status_word bit 2, not from the sign here. Motor speed # tops out at 24000 rpm (P1.6) and fits either way. # FB Control Word, ID 2001 -> address 2000. MN040010EN Table 24 (printed p. 13): # 0 Run (1 = Drive Output On) 1 Reverse (1 = Counter Clockwise) # 2 Fault Reset 3-6 FB INDATA1-4 # 7 Bypass Relay Enable 8 FB Control On 9 FB Reference On # 10-15 Not in use # Every sequence carries 0x0300 = bit 9 | bit 8, the two fieldbus-ownership # bits. Dropping them hands command and reference back to the terminal block # mid-run. Bits 3-7 are never touched here — bit 7 in particular energises the # bypass relay. # # These values are Eaton's own, not derived: the startup test on printed p. 15 # writes 0x301 to run and 0x300 to stop. [control] command_register = 2000 step_delay = 0.05 stop = [0x0300] # ownership held, Run bit clear run_fwd = [0x0300, 0x0301] # + bit 0 Run, Reverse bit clear = clockwise # Direction on this drive IS a control-word bit, not the sign of the reference # (the reference is an unsigned 0-100.00%), so run_rev is genuinely distinct # from run_fwd rather than a duplicate. Requires P1.16 Reverse Enable (ID 1679), # which defaults to 1 = Enabled. run_rev = [0x0300, 0x0303] # + bit 1 Reverse # Bit 2 pulsed. Bit 0 Run is CLEAR in all three steps, so this reset value is # not also a run command and needs no separate reset_register. reset = [0x0300, 0x0304, 0x0300] # # FB Speed Reference, ID 2003 -> address 2002. # MN040010EN printed p. 13: "The scaling on this value is 0-100.00% of the # Maximum Frequency. The 0 to 100.00% is represented by 0 to 10,000 value # indicating 0 or 0% as Minimum Frequency and 10,000 or %100.00 as Maximum # Frequency." # # THE SCALE IS NOT FIXED IN Hz — IT IS A SPAN BETWEEN TWO PARAMETERS. 0% is # P1.1 Min Frequency and 100% is P1.2 Max Frequency (IDs 101 and 102), both # settable per drive. On a drive with a non-zero Min Frequency, writing 0 still # turns the motor. Table 29 muddies this by tagging ID 2003 "Hz, scale 0.01", # but the startup test settles it: write 5000, and Eaton describes the result # as "the output frequency is 50.00%", not 50.00 Hz. speed_register = 2002 speed_scale = 0.01 speed_unit = "%" max_ref = 100.0 # GOING QUIET FAULTS THIS DRIVE AND STOPS THE MOTOR — but only under the # default control-place configuration, so read both halves. # P20.3.2.5 Comm Timeout Modbus RTU (ID 593), default 10000 ms, range 0-60000 # — "Selects the time to wait before a communication fault occurs over # Modbus RTU if a message is not received" (MN040004EN printed p. 289). # P9.21 Fieldbus Fault Response (ID 334), default 2 = Fault (0 = No Action, # 1 = Warning, 3 = Fault Coast, 4 = Warning Coast, 5/6 = Warning + auto # switch to Local / Preset Speed 1). MN040004EN printed p. 45. # P20.3.2.6 Modbus RTU Fault Response (ID 2516), default 0 = "Only in # Fieldbus control mode - When Fieldbus is the control place and Fieldbus # fault is active drive will fault on loss of coms., if not in Fieldbus # control place will not fault." 1 = in all control modes. # MN040004EN printed p. 289. # So with factory defaults AND fieldbus set as the control place (which this # profile requires anyway), 10 s of silence latches fault 83 and the drive # stops — the ATS48 direction, not the Danfoss direction. If the drive is left # on I/O-terminal control and used only for monitoring, ID 2516 = 0 means the # same silence produces nothing at all. Setting P9.21 = 0 disables the fault # outright, in which case the motor keeps running; do not do that on a drive # being commanded over this profile. # 500 ms keeps a wide margin under the 10 s default and under any shortened # timeout an integrator is likely to pick. [control.watchdog] interval_ms = 500 fault = "83 FieldBus RTU Fault (P20.3.2.5 Comm Timeout Modbus RTU, default 10000 ms)" # FB Status Word bit 1 — MN040010EN Table 26: 0 = STOP, 1 = RUN. [running_check] register = 2100 bit = 1 # ID 28 "Latest Fault Code" -> address 27. MN040004EN Table 21 (printed p. 35) # names it; MN040010EN Table 167 confirms ID 28, and Table 28 (printed p. 15) # corroborates by making ID 28 the factory default source for FB Process Data # Out 8. Table 20 additionally lists a "Fault Code" group at ID 100 -> 40099 # (address 98); what distinguishes it from ID 28 is not explained in either # manual, so it is left alone rather than guessed at. [faults] register = 27 # MN040010EN Table 171, DG1 fault code list, printed pp. 199-206. Transcribed # from the "Fault description" column of the DG1 table only — Table 172 on # printed pp. 207-212 is the DH1 list and was excluded. # # GAPS ARE REAL, NOT OMISSIONS: codes 4, 8, 23, 24, 27, 28, 30, 31, 33, 34, 35, # 42, 43, 53, 59, 62, 72-81, 96, 116, 117, 119 and 125-132 are not printed in # Eaton's DG1 table at all. They are left out rather than back-filled from the # DH1 table or from the Vacon lineage this drive descends from. [faults.codes] 1 = "Over Current" 2 = "Over Voltage" 3 = "Earth Fault" 5 = "Charging Switch" 6 = "Emergency Stop" 7 = "Saturation Trip" 9 = "UnderVoltage" 10 = "Input Phase Supervision" 11 = "Output Phase Supervision" 12 = "Brake Chopper Supervision" 13 = "Drive UnderTemp" 14 = "Drive OverTemp" 15 = "Motor Stalled" 16 = "Motor OverTemp" 17 = "Motor UnderLoad" 18 = "IP conflict" 19 = "Power board EEPROM Fault" 20 = "FRAM/MCU eeprom Fault" 21 = "Serial Flash Fault" 22 = "Speed Deviation" 25 = "MCU WatchDog Fault" 26 = "Start-up Prevent" 29 = "Thermistor Fault" 32 = "Fan Cooling" 36 = "Compatibility Fault" 37 = "Device Change" 38 = "Device Added" 39 = "Device Removed" 40 = "Device Unknown" 41 = "IGBT Temperature" 44 = "Intercom Status Not Synchronized" 45 = "Power Base Not Connected" 46 = "Overload Device" 47 = "Current Class" 48 = "Other GX Faults" 49 = "GX Not Configured" 50 = "Analog input below 4 mA" 51 = "External Fault" 52 = "Keypad Comm" 54 = "OPT Card Fault" 55 = "Real time clock fault" 56 = "PT100 Fault" 57 = "Motor ID fault" 58 = "Current Measure" 60 = "Control Board" 61 = "Internal-ctrl Supply" 63 = "Current Unbalance" 64 = "Replace Battery" 65 = "Replace Fan" 66 = "Safety Torque Off" 67 = "Current limit control" 68 = "Over voltage control" 69 = "Thermistor spi fault" 70 = "DSP parameter fault" 71 = "Intercom fault" 82 = "Bypass OverLoad" 83 = "FieldBus RTU Fault" 84 = "FieldBus TCP Fault" 85 = "FieldBus MSTP Fault" 86 = "FieldBus EIP Fault" 87 = "FieldBus SlotA Fault" 88 = "FieldBus SlotB Fault" 89 = "Under Voltage Stop" 90 = "Cold Weather Drive Under Temp" 91 = "Device Net External Power Fail Fault" 92 = "External Fault 2" 93 = "External Fault 3" 94 = "Pump Lost" 95 = "Need Alternation" 97 = "Prime Loss" 98 = "PID1 Feedback" 99 = "PID2 Feedback" 100 = "FieldBus SMDT Fault" 101 = "SMDT card fault" 102 = "External Fault from SWD" 103 = "Drive OverTemp (warning)" 104 = "DSP Compatibility" 105 = "Keypad Compatibility" 106 = "IO1 Compatibility" 107 = "IO2 Compatibility" 108 = "IO3 Compatibility" 109 = "IO4 Compatibility" 110 = "IO5 Compatibility" 111 = "PROFIBUS Compatibility" 112 = "DEVICENET Compatibility" 113 = "CANOPEN Compatibility" 114 = "SWD Compatibility" 115 = "FieldBus EIP Idle" 118 = "Broken Pipe" 120 = "PID1 Low Feedback" 121 = "PID1 High Feedback" 122 = "PID2 Low Feedback" 123 = "PID2 High Feedback" 124 = "Op Cont Interlock" 133 = "FieldBus Web UI" 134 = "Bumpless Transfer" 135 = "CP Interlock Fault" 136 = "CP Interlock Fault (warning)" # NO [parameters] BLOCK, DELIBERATELY. Table 20 (printed p. 12) makes ID # 101-1999 -> addresses 100-1998 look like one contiguous writable block, and # it is not. MN040010EN printed p. 12 states "The parameter addresses are # determined in the application", and the DG1 ships four of them — Standard, # Multi-Purpose, PID and Multi-Pump, each with its own parameter table in # MN040004EN. Table 167's rightmost column tags every ID with which of those # applications it exists in (values like "1, 2, 3, 4" or "2, 3, 4"), so the # valid set genuinely changes with P0's application selection. A restore that # walked 100-1998 blindly would write into read-only monitor IDs, into IDs # absent from the loaded application, and into the gaps between them. Building # this block means enumerating Table 167's RW rows for one specific # application, which is a separate job against a known drive. # # NO [rating] BLOCK: the DG1 expresses its frame rating through manufacturing # defaults (P1.5 Motor Nom Current defaults to "DriveNomCurrCT", P1.2 Max # Frequency to "MaxFreqMFG"), and neither manual publishes an ID that reads the # drive's own nominal current or frame size back. Nothing was found to point at, # so nothing is claimed.