# Property of PMA Electrical Solutions, LLC. # # Eaton M-Max (MMX) series adjustable frequency drive — BUILT-IN RS-485 port, # Modbus RTU. No option board is involved: terminals A (negative) and B # (positive), termination by microswitch S4 on the drive. # # Source: Eaton MN04020003E, "M-Max Series Adjustable Frequency Drive User # Manual", October 2013, 204 pp. # pp. 131-133 serial interface, Modbus parameters S2.1-S2.8, P6.1/P6.2 # pp. 134-136 frame structure, supported function codes (03/04/06/16) # pp. 137-139 process data IDs, control word, status word # pp. 140-141 worked FC03/FC06/FC16 examples — the addressing proof # p. 127 operational data indicator IDs (M1.x) # pp. 57-58 fault (F) and warning (AL) code list # # CLAIMS ONLY THE M-MAX. The MMX register map is NOT the 9000X/SVX/HVX map and # NOT the H-Max map, even though all three use ID 2001/2101 process data — # the bit assignments and the scaling differ per family. # # ADDRESSING. Eaton documents ID numbers and the PLC-style 42xxx/32xxx # aliases. The wire address is ID - 1: # 0-based register = ID - 1 # ID 2001 control word -> 2000 (0x07D0, the manual's own FC06 example) # ID 2105 motor speed -> 2104 (0x0838, the manual's own FC03 example) # The same ID space answers FC03 (4xxxx) and FC04 (3xxxx); this profile uses # FC03 holding registers only, which the manual supports for every ID here. # # DRIVE-SIDE SETUP (MN04020003E p. 133, "For Modbus to function at least the # following parameters must be set"): # S2.2 = 1 fieldbus protocol = Modbus (ID 809) # S2.3 slave address 1-255 (ID 810) # S2.4 = 5 9600 baud (factory default) (ID 811) # S2.6 = 0 parity none + 2 stop bits (default) (ID 813) # P6.1 = 3 control place = interface (BUS) (ID 125) # P6.2 = 2 setpoint source = interface (BUS) (ID 117) # The keypad LOC/REM arrow must also point at BUS. Without P6.1/P6.2 the drive # acknowledges the writes and ignores them. # # SCALING IS FIELDBUS, NOT PANEL DECIMALS. The speed setpoint and actual speed # are PERCENT (0-10000 = 0-100.00%) of the span between the configured minimum # and maximum frequency — not Hz. Motor current is 0.01 A per count here # (manual's own example: raw 0024 = 0.24 A), which is NOT the 0.1 A of the # 9000X process data table. name = "Eaton M-Max" vendor = "Eaton" device_type = "vfd" verified = false probe_register = 2100 # ID 2101 status word, live whenever the fieldbus is up [connection] summary = "Connect directly to the built-in M-Max A/B RS-485 terminals; no option board is required." warnings = ["Isolate and discharge the drive before touching control terminals.", "Eaton defines A as negative and B as positive on this model; do not apply another vendor's A/B convention."] [[connection.methods]] id = "built_in_rs485" title = "Built-in A/B Modbus RTU" transport = "serial" hardware = "built_in" port = "Control terminals A (negative) and B (positive); termination microswitch S4" connector = "Control terminal block" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded RS-485 twisted pair" parts = ["Small insulated screwdriver", "Built-in S4 endpoint termination"] wiring = [{ adapter = "D- / A-", device = "A (negative)", signal = "RS-485 negative" }, { adapter = "D+ / B+", device = "B (positive)", signal = "RS-485 positive" }] steps = ["Isolate the drive and locate control terminals A and B.", "Land negative on A and positive on B.", "Turn S4 on only if this unit is at a physical end of the RS-485 trunk.", "Close the drive, restore power, and select the serial adapter."] setup = ["Set S2.2 = 1 Modbus, S2.3 address, S2.4 baud, and S2.6 parity/stop bits.", "Set P6.1 = 3 BUS and P6.2 = 2 BUS, then use LOC/REM until the display arrow points to BUS."] warnings = ["The drive can have correct communication settings while LOC/REM still leaves it under keypad/I/O control."] source = "Eaton MN04020003E, printed pp. 131-149" # S2.4 default 5 = 9600 baud; S2.6 default 0 = no parity, 2 stop bits. [serial] baudrate = 9600 parity = "N" stopbits = 2 [monitor] # ID 2001. Bits 8/9 force control place / setpoint source to fieldbus, # overriding P6.8 — this profile does not set them, see [control]. control_word = { address = 2000, bits = { 0 = "RUN", 1 = "REV", 2 = "RESET", 3 = "COAST", 4 = "RAMP", 5 = "RAMP_0P1S", 6 = "REF_LOCK", 7 = "REF_ZERO", 8 = "CTRL_FIELDBUS", 9 = "REF_FIELDBUS", 12 = "INVERTER_BLOCK", 13 = "DO_CONTROL" } } # ID 2101 status_word = { address = 2100, bits = { 0 = "READY", 1 = "RUN", 2 = "REV", 3 = "FAULT", 4 = "ALARM", 5 = "AT_SETPOINT", 6 = "ZERO_SPEED", 7 = "SPEED_CTRL_ACTIVE" } } # ID 2102 general status word general_status_word = { address = 2101, bits = { 0 = "CTRL_FIELDBUS", 1 = "REF_FIELDBUS", 11 = "REMOTE_INPUT", 12 = "P3_37_ACTIVE", 13 = "CTRL_IO", 14 = "CTRL_KEYPAD", 15 = "CTRL_BUS" } } actual_speed = { address = 2102, scale = 0.01, unit = "%" } # ID 2103, 10000 = 100% output_frequency = { address = 2103, signed = true, scale = 0.01, unit = "Hz" } # ID 2104 motor_speed = { address = 2104, signed = true, unit = "RPM" } # ID 2105, 1 RPM/count motor_current = { address = 2105, scale = 0.01, unit = "A" } # ID 2106, 0.01 A/count motor_torque = { address = 2106, signed = true, scale = 0.1, unit = "%" } # ID 2107, % of rated motor_power = { address = 2107, signed = true, scale = 0.1, unit = "%" } # ID 2108, % of rated output_voltage = { address = 2108, scale = 0.1, unit = "V" } # ID 2109 dc_voltage = { address = 2109, unit = "V" } # ID 2110, 1 V/count # Control word ID 2001 at 0-based 2000. Bit 0 = run, bit 1 = reverse, # bit 2 = reset on a rising edge. [control] command_register = 2000 speed_register = 2002 # ID 2003 fieldbus speed setpoint speed_scale = 0.01 # 10000 raw = 100.00% speed_unit = "%" # NOT Hz — percent of the min..max frequency span max_ref = 100.0 step_delay = 0.05 stop = [0x0000] run_fwd = [0x0001] run_rev = [0x0003] # direction is control-word bit 1, not the reference sign # Bit 2 is edge-triggered. Held low first so the value that carries the reset # is a STOP word (bit 0 = 0) and can never start the motor. reset = [0x0000, 0x0004, 0x0000] # S2.7 "Timeout up to fieldbus error" is 0 = NOT USED at the factory setting, # so a stock M-Max does NOT fault on silence — it keeps running at the last # commanded speed. Set S2.7 (ID 814) to 1-255 s to get fault 53; the finest # grain the drive offers is 1 s, so this keepalive runs at half of that. [control.watchdog] interval_ms = 500 fault = "53 Fieldbus error" [running_check] register = 2100 bit = 1 # ID 2111 "Current error", the active fault code. The keypad fault log (FLT, # F1-F9) has no documented Modbus ID, so there is no history list here. [faults] register = 2110 # MN04020003E pp. 57-58. The same numbers are used for faults (F) and for # warnings (AL). [faults.codes] 0 = "No fault" 1 = "Overcurrent" 2 = "Overvoltage" 3 = "Ground fault" 8 = "System fault" 9 = "Undervoltage" 13 = "Undertemperature" 14 = "Overtemperature" 15 = "Motor stalled" 16 = "Motor overtemperature" 17 = "Motor underload" 22 = "EEPROM checksum error" 25 = "Watchdog (API)" 27 = "Back EMF" 35 = "Application error" 41 = "IGBT overtemperature" 50 = "Live zero error (analog input)" 51 = "External fault" 53 = "Fieldbus error" 54 = "Fieldbus interface error"