# Property of PMA Electrical Solutions, LLC. # # Eaton H-Max (HMX) HVAC drive — BUILT-IN RS-485 port, Modbus RTU. No option # board. The same drive also speaks Modbus TCP, BACnet MS/TP and Metasys N2; # this profile is the RS-485 Modbus RTU path only. # # Source: Eaton MN04008006E, "H-Max Variable Frequency Drive Application # Manual", January 2012, 144 pp. # p. 58 P4.7.1.1 Protocol select (1 = Modbus RTU) # pp. 99, 101 Modbus RTU parameters and their descriptions # pp. 103-104 data addressing rule, supported function codes, memory map # pp. 105-106 process data IN/OUT, control word bits, status word bits # pp. 107-108 ID map, fault-history registers # pp. 108-109 worked FC16/FC04 examples — the addressing proof # p. 114 default Process Data OUT contents and their scales # p. 21 P2.1.6/P2.1.7 start source and reference source # p. 39 P2.8.1.12 FieldbusComm Flt response # pp. 72-75 fault code table # # CLAIMS ONLY THE H-MAX. Do not carry this map to the M-Max or the 9000X # family: the ID 2001/2101 process-data layout looks alike across Eaton # drives, but the bit assignments, the scales and the fault numbering are not # the same map. # # ADDRESSING. Eaton documents PLC-style addresses (40001, 42001, 40401) and # states the rule on p. 103: "Holding register 40001 is addressed as register # 0000". The wire address is the documented address - 1: # 0-based register = documented address - 1 # 42001 FB control word -> 2000 (0x07D0, the manual's own FC16 example) # 42103 FB actual speed -> 2102 (0x0836, the manual's own FC04 example) # Application parameter/monitor IDs 1-2000 occupy addresses 0000-1999 by the # same rule. Every register here answers FC03 as well as FC04 (p. 104: "All # values can be read with function codes 3 and 4"), so FC03 is sufficient. # # DRIVE-SIDE SETUP: # P4.7.1.1 Protocol = 1 (Modbus RTU) ID 2208 # P4.7.3.1.1 Slave address 1-247 # P4.7.3.1.2 Baud rate, default 6 = 9600 ID 2236 # P4.7.3.1.3 Parity type, default 0 = None ID 2239 # P4.7.3.1.4 Communication time-out, default 10 s # P2.1.6 Start Srce Auto = 3 (FieldbusCTRL) ID 1302 # P2.1.7 Speed Setpt Auto = 3 (Fieldbus) ID 1303 # The HOA switch must be in AUTO: the Hand control place is always the keypad, # so a drive left in Hand acknowledges the writes and ignores them. # # SCALING IS FIELDBUS, NOT PANEL DECIMALS. The speed reference and actual # speed are PERCENT (0-10000 = 0-100.00%), not Hz. Motor current is 0.1 A per # count on the H-Max Process Data OUT table — the M-Max reports 0.01 A on the # same-looking register, which is exactly why these maps are kept apart. name = "Eaton H-Max" vendor = "Eaton" device_type = "vfd" verified = false probe_register = 2100 # FB status word, live whenever the fieldbus is up [connection] summary = "H-Max has both direct Modbus RTU on the standard A/B terminals and direct Modbus TCP on its shielded RJ45 Ethernet port." warnings = ["Isolate and discharge the drive before opening its cover; relay and other I/O terminals may still carry external dangerous voltage.", "Do not plug Ethernet into the connector under the keypad; Eaton warns this can damage the computer."] [[connection.methods]] id = "built_in_rs485" title = "Built-in A/B Modbus RTU" transport = "serial" hardware = "built_in" port = "Standard terminal block A (Data-), B (Data+)" connector = "2.5 mm² control terminals A/B" adapter = "Isolated USB-to-RS-485 adapter" cable = "Belden 9841 or similar shielded twisted pair" parts = ["Small insulated screwdriver", "Built-in RS-485 termination DIP at a bus end"] wiring = [{ adapter = "D- / A-", device = "A, Data-", signal = "RS-485 negative" }, { adapter = "D+ / B+", device = "B, Data+", signal = "RS-485 positive" }] steps = ["Isolate the drive, open the cover, and locate A/B on the standard terminal block.", "Strip and clamp the shield as shown in the manual, then land negative on A and positive on B.", "Turn the RS-485 termination DIP on only if this is the last device; keep at least 30 cm from motor cable.", "Remount the cover, restore power, and select the serial adapter."] setup = ["Set P4.7.1.1 Protocol = 1 Modbus RTU and configure P4.7.3.1 address/baud/parity/timeout.", "Put the HOA switch in AUTO and set P2.1.6/P2.1.7 to Fieldbus control/reference."] warnings = ["A drive left in Hand ignores bus commands."] source = "Eaton MN04008006E, printed pp. 94-101" [[connection.methods]] id = "built_in_modbus_tcp" title = "Built-in Modbus TCP" transport = "tcp" hardware = "built_in" port = "Shielded RJ45 Ethernet connector shown in the Modbus component diagram" connector = "100BaseTX shielded RJ45" adapter = "Computer Ethernet port or USB-to-Ethernet adapter" cable = "CAT5e shielded twisted-pair Ethernet cable" parts = ["Ethernet switch only when required"] steps = ["Identify the dedicated Ethernet connector from the H-Max Modbus component drawing, not the under-keypad connector.", "Connect shielded CAT5e cable and route it at least 30 cm from the motor cable.", "Connect the computer directly or through the same switch, remount the cover, and restore power.", "Put the computer on the same subnet and select the drive IP."] setup = ["Select Modbus TCP in Ethernet Common Settings and configure fixed IP or DHCP/AutoIP plus Modbus settings.", "Put the HOA switch in AUTO and select Fieldbus for start and speed reference."] warnings = ["This profile's register map must be used with the Modbus TCP endpoint, not EtherNet/IP."] source = "Eaton MN04008006E, printed pp. 94-98 and 103-109" # P4.7.3.1.2 default 6 = 9600 baud; P4.7.3.1.3 default 0 = None, and the # manual's parity table (p. 101) pairs None with 2 stop bits. [serial] baudrate = 9600 parity = "N" stopbits = 2 [monitor] # The H-Max control and status words are 32 bits; only the first 16 are # reachable in the 16-bit register area (p. 105). Every defined bit except the # status-word control-place bits B29-B31 lives in the low 16. control_word = { address = 2000, bits = { 0 = "START", 1 = "REVERSE", 2 = "FAULT_RESET" } } status_word = { address = 2100, bits = { 0 = "READY", 1 = "RUN", 2 = "REVERSE", 3 = "FAULT", 4 = "ALARM", 5 = "AT_REFERENCE", 6 = "ZERO_SPEED", 7 = "FLUX_READY" } } actual_speed = { address = 2102, scale = 0.01, unit = "%" } # 42103, 10000 = 100% # 42104-42111 are the eight Process Data OUT slots. These are the DEFAULT # contents and scales from p. 114; each slot is re-pointable with the # P2.14.x "FB Data Out Sel" parameters, so confirm the mapping on a drive # that has been commissioned by someone else before trusting these names. # MN04008006E gives units but not signedness; the quantities that can go # negative are marked signed here. output_frequency = { address = 2103, signed = true, scale = 0.01, unit = "Hz" } motor_speed = { address = 2104, signed = true, unit = "RPM" } motor_current = { address = 2105, scale = 0.1, unit = "A" } motor_torque = { address = 2106, signed = true, scale = 0.1, unit = "%" } motor_power = { address = 2107, signed = true, scale = 0.1, unit = "%" } output_voltage = { address = 2108, scale = 0.1, unit = "V" } dc_voltage = { address = 2109, unit = "V" } # V1.1.24 Last Active Fault, application ID 37 — fixed, unlike PD Out 8. last_fault = { address = 36 } [control] command_register = 2000 speed_register = 2002 # 42003 FB speed reference speed_scale = 0.01 # 10000 raw = 100.00% speed_unit = "%" # NOT Hz — percent of max frequency max_ref = 100.0 step_delay = 0.05 stop = [0x0000] run_fwd = [0x0001] run_rev = [0x0003] # direction is control-word B1, not the reference sign # B2 is a command bit, held with B0 low so the word that carries the reset is # a STOP word and can never start the motor. reset = [0x0000, 0x0004, 0x0000] # P4.7.3.1.4 Communication time-out defaults to 10 s and P2.8.1.12 # FieldbusComm Flt defaults to 3 = Fault, so a stock H-Max DOES trip and stop # on 10 s of silence. That default can be set to 0 = No Action, in which case # the motor keeps running — check P2.8.1.12 on the actual unit. [control.watchdog] interval_ms = 1000 fault = "53 Fieldbus communication fault" [running_check] register = 2100 bit = 1 # Application ID 37, the last active fault that has not been reset. The # default Process Data OUT 8 (42111 -> 2110) carries the same number, but that # slot is re-pointable, so the fixed ID is used here. # Fault history 40401-40429 -> 40400-40428, newest first (p. 108). [faults] register = 36 history = [40400, 40401, 40402] # MN04008006E pp. 72-75, the "Fault Code" column. Each code also carries a # finer "Fault ID" sub-code (e.g. code 1 = ID 1 hardware / ID 2 software # overcurrent) that this register does not report. [faults.codes] 0 = "No fault" 1 = "Overcurrent" 2 = "Overvoltage" 3 = "Earth fault" 5 = "Charging switch" 7 = "Saturation" 8 = "System fault" 9 = "Undervoltage" 10 = "Input phase" 11 = "Output phase supervision" 12 = "Brake chopper supervision" 13 = "AC drive undertemperature" 14 = "AC drive overtemperature" 15 = "Motor stalled" 16 = "Motor overtemperature" 17 = "Motor underload" 19 = "Power overload" 25 = "Motor control fault" 32 = "Fan cooling" 33 = "Fire mode enabled" 37 = "Device changed (same type)" 38 = "Device added (same type)" 39 = "Device removed" 40 = "Device unknown" 41 = "IGBT temperature" 43 = "Encoder fault" 44 = "Device changed (different type)" 45 = "Device added (different type)" 51 = "External fault" 52 = "Keypad communication fault" 53 = "Fieldbus communication fault" 54 = "Slot fault" 65 = "PC communication fault" 66 = "Thermistor fault" 69 = "Fieldbus mapping error" 101 = "Process supervision fault (PID1)" 105 = "Process supervision fault (PID2)"