# Property of PMA Electrical Solutions, LLC. # # Delta MH300 — High Performance Compact Drive, built-in RS-485 Modbus. # # COVERAGE — the MH300 series only (115 V / 230 V / 460 V models, identity # codes per Pr.00-00). NOT CLAIMED: MH300-L (elevator) or MH300-HS # (high-speed) — Delta ships each of those as its OWN user manual # (DELTA_IA-MDS_MH300-L_UM_EN and DELTA_IA-MDS_MH300-HS_UM_EN), and this # document names neither variant anywhere, so neither is covered here. Also # NOT CLAIMED: ME300, MS300, MX300, CFP2000, CP2000, C2000 or any other Delta # family. Every value below was read out of the MH300's own manual; where it # differs from the ME300 file next to it (210Fh output-power decimals, the # group 01 extent, ~30 fault codes) this file follows the MH300 document. # # SOURCE — Delta MH300 Series User Manual DELTA_IA-MDS_MH300_UM_EN_20260514 # (EN, 1116 PDF pages), downloadcenter.deltaww.com. # The PRINTED page = PDF page - 1; citations below are PRINTED pages. # p. 334 Pr.00-00 identity code / Pr.00-01 rated current display, # and the 115 V / 230 V / 460 V identity-code tables # p. 348 Pr.00-20 Master Frequency Command Source, Pr.00-21 # Operation Command Source (AUTO, REMOTE) # p. 357 Pr.01-00 Motor 1 Maximum Operation Frequency, 0.00-599.00 Hz # p. 283 chapter 11 summary of group 02, incl. the "Read only" marks # on Pr.02-50 … 02-54 and Pr.02-70 # p. 296 Pr.06-17 … Pr.06-22 Fault Record 1-6 (chapter 11 summary) # pp. 501-503 Group 09 communication parameters and their DEFAULTS # (09-00 … 09-04, 09-09), and Pr.09-30 decoding method # pp. 799-800 Summary of Fault Codes (transcribed complete below) # p. 1105 parameter addressing GGnnH; 20xx control command table # p. 1106 2001h frequency command, 2002h fault/control command, # 2003h PID reference target # pp. 1107-1108 21xx status monitor table # pp. 1109-1111 22xx status monitor table # # ADDRESSING — Delta documents these as hex addresses that are ALREADY 0-based # protocol addresses (p. 1105: the RTU read is "01h + 03h + 00xxh-26xxh"; the # address in the table is the address on the wire). Parameters are GGnnH, GG = # group and nn = parameter number in hex — the manual's own worked example is # Pr.04-10 -> 040Ah (p. 1105). So Pr.06-17 -> 0611h. # # DRIVE-SIDE SETUP: # 00-20 = 1 Master Frequency Command Source (AUTO, REMOTE) = RS-485 # 00-21 = 2 Operation Command Source (AUTO, REMOTE) = RS-485 # (settings 6/8 and 3/5 point at CANopen or an option card # instead — this profile assumes the BUILT-IN RS-485 port) # 09-00 node address (1-254, default 1) # 09-01 baud (default 9.6 kbps; MH300 also offers 57.6 and 115.2) # 09-04 = 12 protocol 8,N,1 RTU — THE FACTORY DEFAULT IS 1 = 7,N,2 ASCII # (p. 502). Out of the box this drive does not speak Modbus RTU # at all; 09-04 must be changed on the panel first. # 09-30 Communication Decoding Method, default 1 (60xx). p. 503 states # "RS-485 controls the drive referring to index 2000h-20FFh" in # BOTH methods — only CANopen and the communication cards move to # 6000h. This profile therefore does not require 09-30 = 0. # The Modbus appendix's own note on 2000h says the control word is "valid only # when operation command source is set to communication (Pr.00-03=2)". # Pr.00-03 is not a command-source parameter in this manual's chapter 12; the # parameter that carries setting 2 = RS-485 is Pr.00-21 (p. 348). Treated as a # stale cross-reference in the appendix, and 00-21 is what is listed above. # AUTO vs HAND: 00-20/00-21 are the AUTO/REMOTE sources. Pr.00-29 plus a # multi-function input (MIx = 41/42/56) or the optional KPC-CC01 keypad # switches the drive to HAND/LOCAL, where Pr.00-30/00-31 take over and these # commands are ignored; the manual states the multi-function input has the # highest priority. # # COMM-LOSS DEFAULTS ARE PERMISSIVE: Pr.09-02 Modbus Transmission Fault # Treatment defaults to 3 = "No warning, no fault, and continue operation" and # Pr.09-03 Modbus Time-out Detection defaults to 0.0 s = detection off # (p. 501). The keepalive below proves the link from our side; the DRIVE only # trips CE10 (fault 58) on silence once 09-03 is non-zero and 09-02 is 1 or 2. # Note also that CE10 latches — p. 501: the error "remains even if the # transmission status returns to normal and does not clear automatically". name = "Delta MH300" vendor = "Delta Electronics" device_type = "vfd" verified = false probe_register = 0x2101 [connection] summary = "Built-in two-wire Modbus RTU is available without an option card." warnings = [] [[connection.methods]] id = "control_terminals_rs485" title = "Built-in RS-485 control terminals" transport = "serial" hardware = "built_in" port = "Control terminals SG+, SG-, SGND" connector = "Three control-terminal positions" adapter = "Isolated USB-to-RS-485 adapter, 2-wire half-duplex" cable = "Shielded twisted-pair RS-485 cable, 120 ohm nominal impedance" parts = ["Isolated two-wire RS-485 adapter", "Shielded twisted-pair RS-485 cable, 120 ohm nominal impedance"] 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 00-20=1, 00-21=2, 09-00=node, 09-01=baud, and 09-04=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 = "Delta MH300 User Manual, PDF p. 65 (SG terminals and RJ45 pinout), p. 502 (RTU setup)" [[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 RS-485 modular jack" transport = "serial" hardware = "built_in" port = "Drive RJ45 communications jack" connector = "RJ45 (RS-485, not Ethernet)" adapter = "Isolated USB-to-RS-485 adapter, 2-wire half-duplex" cable = "Shielded twisted-pair cable terminated to the documented modular-plug pins" parts = ["Isolated two-wire RS-485 adapter", "Shielded twisted-pair cable terminated to the documented modular-plug pins", "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 00-20=1, 00-21=2, 09-00=node, 09-01=baud, and 09-04=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.", "Pin 8 carries accessory/keypad power and must not be connected to an RS-485 adapter."] source = "Delta MH300 User Manual, PDF p. 65 (SG terminals and RJ45 pinout), p. 502 (RTU 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 or 7 (signal ground)" signal = "Signal reference or shield drain" required = false # Pr.09-01 default 9.6 kbps. Parity/stopbits below are the 09-04 = 12 # (8,N,1 RTU) setting the drive must be moved to; its factory 09-04 = 1 is # 7,N,2 ASCII framing. [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # p. 1107. bits 1-0 are a 2-bit RUN/STOP state (00 fully stopped, 01 stopping, # 10 standby, 11 running) and bits 4-3 a 2-bit direction/transition field # (00 FWD, 01 REV->FWD, 10 FWD->REV, 11 REV), so neither field decodes as a # set of independent flags. bits 15-13 are a 3-bit JOG status field for the # same reason. Only the single bits are named here; read this register as hex. drive_status = { address = 0x2101, bits = { 2 = "Jog", 8 = "FreqFromComm", 9 = "FreqFromAnalog", 10 = "CmdFromComm", 11 = "ParamsLocked" } } frequency_command = { address = 0x2102, scale = 0.01, unit = "Hz" } output_frequency = { address = 0x2103, scale = 0.01, unit = "Hz" } # CONFIG-DEPENDENT SCALE. p. 1107 gives "(XX.XX A)" and adds that the decimal # places "can be referred by the high byte of 211F"; p. 1109 repeats that the # sibling 2200h register shifts to XXX.X A above 655.35 A. 0.01 is the reading # for every MH300 frame, but confirm 211Fh on the unit before trusting it. output_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" } # 2107h is the multi-step-speed STEP NUMBER (0 = main speed), not a speed. multistep_step = { address = 0x2107 } # 210Ah is the power factor ANGLE in 0.1 degrees (0.0-180.0), not cos phi. power_factor_angle = { address = 0x210A, scale = 0.1, unit = "deg" } output_torque = { address = 0x210B, scale = 0.1, unit = "%" } motor_speed = { address = 0x210C, unit = "rpm" } # p. 1108: "Drive's output power (XXXX.X kW)" — ONE decimal. The ME300 manual # gives three decimals at this same 210Fh address; that is the ME300's figure # and does not apply here. output_power = { address = 0x210F, scale = 0.1, unit = "kW" } igbt_temperature = { address = 0x220E, scale = 0.1, unit = "degC" } # p. 1109 digital_input_status = { address = 0x2210 } # p. 1109 digital_output_status = { address = 0x2211 } # p. 1109 # p. 1110. bits 1-0 are a 2-bit direction field (00 no direction, 01 FWD, # 10 REV) and bits 3-2 a 2-bit ready/error field (01 ready, 10 error) — again # not independent flags. bit4 (drive is outputting) and bit5 (alarm) are. drive_status_2 = { address = 0x2226, bits = { 4 = "Output", 5 = "Alarm" } } [control] command_register = 0x2000 # Fault reset is a DIFFERENT register. On 2000h bits 1-0 = 10b is RUN, so # writing 0x0002 there commands an unexpected start in the last direction. # 2002h bit1 = Reset (p. 1106). reset_register = 0x2002 speed_register = 0x2001 speed_scale = 0.01 # p. 1106, "Frequency command (XXX.XX Hz)" speed_unit = "Hz" max_ref = 599.0 # Pr.01-00 upper limit, p. 357 step_delay = 0.05 stop = [0x0001] # bits 1-0 = 01b Stop run_fwd = [0x0012] # bits 1-0 = 10b Run, bits 5-4 = 01b FWD run_rev = [0x0022] # bits 1-0 = 10b Run, bits 5-4 = 10b REV reset = [0x0002] # bit 1 of 2002h [control.watchdog] interval_ms = 300 fault = "CE10 Modbus transmission time-out (fault 58) — only once Pr.09-03 is non-zero and Pr.09-02 is 1 or 2; the factory defaults (09-03 = 0.0 s, 09-02 = 3) leave the drive running on silence" # 2101h bits 1-0 are a 2-bit state, not a flag (p. 1107): 00b fully stopped, # 01b stopping, 10b STANDBY, 11b running. Bit 0 is set by 01b and 11b — the two # states where the shaft is still turning — so it never reports "stopped" while # the motor is moving. That is why bit 0 and not bit 1: bit 1 covers 10b + 11b # ("a RUN command is latched") and CLEARS during 01b, which would report a # decelerating, still-spinning motor as stopped. Bit 0 fails safe, bit 1 does # not. # # KNOWN BLIND SPOT, needs the bench. Bit 0 is CLEAR in standby (10b), which the # manual defines as "RUN indicator is ON / STOP indicator flashes" — a run # command is latched and the drive is simply at zero output. running_state() # is a single-bit test, so it reports Stopped there, and a restore precondition # that only requires "stopped" will pass on a drive armed to start the instant # the reference leaves zero. Fully covering this needs a 2-bit decode of # 2101h bits 1-0 (unsafe only for 10b), which the single-bit schema cannot # express. Until then: confirm the drive is not in standby before restoring. [running_check] register = 0x2101 bit = 0 # p. 1107: "bit7-0: Fault code, bit15-8: Warning code". Without the mask an # active warning corrupts the fault lookup. [faults] register = 0x2100 mask = 0x00FF # Pr.06-17 … Pr.06-22, Fault Record 1-6 -> 0611h … 0616h (p. 296). history = [0x0611, 0x0612, 0x0613, 0x0614, 0x0615, 0x0616] # Transcribed complete from the MH300 "Summary of Fault Codes" table, printed # pp. 799-800 — the same ID numbering Pr.06-17 and 2100h report. MH300 # numbering only; it is NOT the ME300 table sitting next to it, which lacks # code 5 (occ), the PG faults 42-45/65/68-70, the CANopen faults 101-107 and # the internal-communication faults 121-128, and which names 79-81 Aoc/boc/coc # where the MH300 names them Uoc/Voc/Woc. [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" 5 = "occ IGBT short circuit between upper and lower bridge" 6 = "ocS over-current at stop" 7 = "ovA over-voltage during acceleration" 8 = "ovd over-voltage during deceleration" 9 = "ovn over-voltage at constant speed" 10 = "ovS over-voltage at stop" 11 = "LvA low-voltage during acceleration" 12 = "Lvd low-voltage during deceleration" 13 = "Lvn low-voltage at constant speed" 14 = "LvS low-voltage at stop" 15 = "OrP phase loss protection" 16 = "oH1 IGBT overheating" 17 = "oH2 internal key parts overheating" 18 = "tH1o IGBT temperature detection failure" 19 = "tH2o capacitor hardware error" 21 = "oL over load" 22 = "EoL1 electronic thermal relay 1 protection" 23 = "EoL2 electronic thermal relay 2 protection" 24 = "oH3 motor overheating (PTC / PT100)" 26 = "ot1 over torque 1" 27 = "ot2 over torque 2" 28 = "uC under current" 29 = "LiT limit error" 31 = "cF2 EEPROM read error" 33 = "cd1 U-phase error" 34 = "cd2 V-phase error" 35 = "cd3 W-phase error" 36 = "Hd0 cc hardware failure" 37 = "Hd1 oc hardware error" 40 = "AUE auto-tuning error" 41 = "AFE PID loss ACI" 42 = "PGF1 PG feedback error" 43 = "PGF2 PG feedback loss" 44 = "PGF3 PG feedback stall" 45 = "PGF4 PG slip error" 48 = "ACE ACI 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 read-only address" 58 = "CE10 Modbus transmission time-out" 61 = "ydc Y-connection / delta-connection switch fault" 62 = "dEb deceleration energy backup fault" 63 = "oSL over slip error" 65 = "PGF5 hardware error of PG card" 68 = "SdRv reverse direction of the speed feedback" 69 = "SdOr over speed rotation feedback" 70 = "SdDe large deviation of speed feedback" 72 = "STL1 S1 internal circuit detection error" 76 = "STO safe torque off" 77 = "STL2 S2 internal circuit detection error" 78 = "STL3 internal circuit detection error" 79 = "Uoc U-phase over-current before run" 80 = "Voc V-phase over-current before run" 81 = "Woc W-phase over-current before run" 82 = "OPHL output phase loss U phase" 83 = "OPHL output phase loss V phase" 84 = "OPHL output phase loss W phase" 87 = "oL3 overload protection at low frequency" 89 = "RoPd rotor position detection error" 101 = "CGdE CANopen guarding fault" 102 = "CHbE CANopen heartbeat fault" 104 = "CbFE CANopen bus off fault" 105 = "CIdE CANopen index error" 106 = "CAdE CANopen station address error" 107 = "CFrE CANopen memory error" 121 = "CP20 internal communication error" 123 = "CP22 internal communication error" 124 = "CP30 internal communication error" 126 = "CP32 internal communication error" 127 = "CP33 internal communication error" 128 = "ot3 over-torque 3" 129 = "ot4 over-torque 4" 134 = "EoL3 electronic thermal relay 3 protection" 135 = "EoL4 electronic thermal relay 4 protection" 140 = "Hd6 oc hardware error" 141 = "b4GFF GFF occurs before run" 142 = "AUE1 auto-tune error 1" 143 = "AUE2 auto-tune error 2" 144 = "AUE3 auto-tune error 3" 148 = "AUE4 auto-tune error 4" 171 = "oPEE over position error" # Pr.00-00 AC Motor Drive Identity Code, read-only (p. 334): an enumerated # voltage-class/kW code, so it is a real drive identity rather than a # motor-nameplate guard. Raw code, no scale. [rating] register = 0x0000 words = 1 scale = 1.0 label = "Drive identity code (00-00)" # Group 01 (basic: frequencies, accel/decel, V/F) and group 02 (digital I/O), # in Delta's GGnnH layout. Bounded by the highest index that actually exists # in each group in the chapter 11 summary: 01-00…01-77 -> 0100h-014Dh, # 02-00…02-83 -> 0200h-0253h. Group 01 runs further here than on the ME300 # (01-52) because the MH300 carries four motor parameter sets. # Group 09 (communications) is DELIBERATELY EXCLUDED: it holds 09-00 node # address, 09-01 baud and 09-04 protocol. Cloning those onto a replacement # drive changes its address to the donor's — which either kills the link # mid-restore or puts two nodes at the same address on the plant's bus. # # The group 02 sweep is SPLIT around 0232h-0236h and 0246h. Pr.02-50 … 02-54 # and Pr.02-70 are marked "Read only" in the chapter 11 summary (p. 283): # 02-50/02-51 are the live multi-function I/O terminal status, 02-52/02-53 the # live PLC I/O status, 02-54 the frequency command currently coming from the # external terminals, and 02-70 the fitted IO card type. Those are machine # state and hardware inventory, not configuration, so a donor and a target # essentially never read the same value — the restore planner would queue a # write for each one on every clone, the drive would refuse it (p. 503: "if the # data is written to read-only parameters from the upper unit, a communication # error may occur", and CE4 is "data written to read-only address", fault 57), # and an otherwise-perfect restore would report failure. 02-70 is worse than # noise: if it ever took, it would tell the drive it has hardware it does not. # Group 01 was swept for the same marking and has none. [parameters] ranges = [[0x0100, 0x014D], [0x0200, 0x0231], [0x0237, 0x0245], [0x0247, 0x0253]]