# Property of PMA Electrical Solutions, LLC. # # Delta MS300. # # COVERAGE — the MS300 series only. MH300 IS NOT CLAIMED: it has its own user # manual (DELTA_IA-MDS_MH300_UM_EN_20260514, 1116 pp, cached as # manuals/delta_mh300_user.pdf) and nothing here was read out of it. A previous # header line read "Delta MS300 / MH300", which was an unsourced cross-family # claim of exactly the kind the next paragraph says was removed. # # Verified against the Delta MS300 User Manual, issued edition 06, firmware # V2.03, IA-MDS_MS300_UM_EN_20260417 (808 pp, cached as # manuals/delta_ms300_user.pdf). Printed page = PDF page - 9. Pages used: # p. 280 Pr.00-20 / Pr.00-21 command and frequency source settings # p. 289 Pr.01-00 Maximum Operation Frequency 0.00-599.00 Hz -> max_ref # p. 416 Pr.09-00 / 09-01 / 09-02 / 09-03 / 09-04 communications # pp. 224-233 Chapter 11 parameter summary, groups 01 and 02 # pp. 547-548 Chapter 14 fault code summary -> the whole [faults.codes] table # pp. 792-793 Appendix A-4, 2000h/2001h/2002h control words # pp. 793-794 Appendix A-4, 21xx read-only status monitor # p. 797 Appendix A-5 exception response # An earlier revision of this profile was built from secondary web sources and # had the fault table of an older Delta family, a reset that STARTED the motor, # and three misidentified registers. This pass replaced every fault string with # Delta's own wording and tightened the [parameters] ranges; see the notes at # each section. # # Cross-family claims (C2000, VFD-M, VFD-E) have been REMOVED: the fault code # numbering demonstrably differs between Delta families, which is exactly the # assumption that produced the bad table. # # Drive-side setup: 00-20 Frequency source = 1 (RS-485), 00-21 Operation source # = 2 (RS-485), 09-00 node address, 09-01 baud, 09-04 protocol (12 = 8N1 RTU). # NOTE p. 792 prints "Pr.00-03=2" beside the 2000h operation command; that is a # typo in the manual. The Operation Command Source parameter is Pr.00-21 (p. # 280) and 2 is its RS-485 setting. 00-03 does not select a command source. # # NO COMM-LOSS WATCHDOG IS DECLARED, and that is a hazard, not an omission. # Pr.09-03 Modbus Time-Out Detection defaults to 0.0 s (disabled) and Pr.09-02 # Transmission Fault Treatment defaults to 3, "no warning, no fault, and # continue operation" (p. 416). A factory-configured MS300 that loses the bus # mid-run KEEPS RUNNING at the last commanded speed. The CE10 fault exists but # only fires once someone sets 09-03 > 0, so no interval_ms can be honestly # claimed here. # # Delta documents these as hex addresses that are already 0-based. name = "Delta MS300" 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; explicitly commission 09-02 and 09-03 for communication loss."] 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 MS300 User Manual, PDF p. 61 (SG terminals and RJ45 pinout), pp. 280 and 416 (setup and comm-loss defaults)" [[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; explicitly commission 09-02 and 09-03 for communication loss."] 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 MS300 User Manual, PDF p. 61 (SG terminals and RJ45 pinout), pp. 280 and 416 (setup and comm-loss defaults)" [[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 [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # Bits 1-0 are a 2-bit run 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 decodes as an independent flag. # Read this register as hex. p. 793. drive_status = { address = 0x2101, bits = { 2 = "Jog", 8 = "FreqFromComm", 10 = "CmdFromComm", 11 = "ParamLocked" } } frequency_command = { address = 0x2102, scale = 0.01, unit = "Hz" } output_frequency = { address = 0x2103, scale = 0.01, unit = "Hz" } # p. 794 prints (XX.XX A) but adds "decimal places can be referred by the high # byte of 211F". No MS300 frame is rated near the 655.35 A rollover, so 0.01 # holds across the range; read 211Fh if a reading ever comes back 100x low. 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" } # 0x2107 is the multi-step-speed STEP NUMBER, not speed (0 is main speed). # Actual rpm is 0x210C. p. 794. multistep_step = { address = 0x2107 } motor_speed = { address = 0x210C, unit = "rpm" } # 0x210A 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" } # SCALE CONFIRMED. p. 794 prints 210Fh "Power output — Drive's output power # (XXXX.X kW)", so 0.1 is right for the MS300. The 0.001 that the CP2000 and # CFP2000 manuals print for the same address is a 2000-series reading and does # not apply here; that was the open question and the MS300's own manual settles # it against the sibling. output_power = { address = 0x210F, scale = 0.1, unit = "kW" } [control] command_register = 0x2000 # Fault reset is a DIFFERENT register. On 0x2000, bits 1-0 = 10B is RUN, so # writing 0x0002 there commands an unexpected start in the last direction. # 0x2002 bit 1 is Reset; its other bits are External Fault (0), Base Block (2) # and Fire Mode (5), none of which we touch. pp. 792-793. reset_register = 0x2002 speed_register = 0x2001 speed_scale = 0.01 speed_unit = "Hz" max_ref = 599.0 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 0x2002 # BLIND SPOT — by the manual's own 2101h table (p. 793), bits 1-0 = 10B is # standby: the run command is held and the drive is armed to accelerate, yet # bit 0 is CLEAR, so this check reports NOT RUNNING. A single-bit test cannot # see it, and bit 1 would only move the blind spot to the stopping ramp. Treat # "not running" from this profile as "shaft not turning", never as "safe". [running_check] register = 0x2101 bit = 0 # p. 793: 2100h bit7-0 is the FAULT code and bit15-8 the WARNING code; without # the mask an active warning corrupts the fault lookup. [faults] register = 0x2100 mask = 0x00FF # Delta's own fault names, transcribed from the Chapter 14 summary on pp. # 547-548. The previous table gave 54-57 generic Modbus-exception phrasing # ("slave device failure" for 57); Delta's 57 is CE4 "Data is written to # read-only address", which is a different failure and would have sent a # technician looking at the wrong thing. [faults.codes] 0 = "No fault record" 1 = "Over-current during acceleration (ocA)" 2 = "Over-current during deceleration (ocd)" 3 = "Over-current during steady operation (ocn)" 4 = "Ground fault (GFF)" 6 = "Over-current at stop (ocS)" 7 = "Over-voltage during acceleration (ovA)" 8 = "Over-voltage during deceleration (ovd)" 9 = "Over-voltage at constant speed (ovn)" 10 = "Over-voltage at stop (ovS)" 11 = "Low-voltage during acceleration (LvA)" 12 = "Low-voltage during deceleration (Lvd)" 13 = "Low-voltage at constant speed (Lvn)" 14 = "Low-voltage at stop (LvS)" 15 = "Phase loss protection (OrP)" 16 = "IGBT overheating (oH1)" 18 = "IGBT temperature detection failure (tH1o)" 21 = "Over load (oL)" 22 = "Electronic thermal relay 1 protection (EoL1)" 23 = "Electric thermal relay 2 protection (EoL2)" 24 = "Motor overheating (oH3) PTC / PT100" 26 = "Over torque 1 (ot1)" 27 = "Over torque 2 (ot2)" 28 = "Under current (uC)" 31 = "EEPROM read error (cF2)" 33 = "U-phase error (cd1)" 34 = "V-phase error (cd2)" 35 = "W-phase error (cd3)" 36 = "cc hardware failure (Hd0)" 37 = "oc hardware error (Hd1)" 40 = "Auto-tuning error (AUE)" 41 = "PID loss ACI (AFE)" 43 = "PG feedback loss (PGF2)" 44 = "PG feedback stall (PGF3)" 45 = "PG slip error (PGF4)" 48 = "ACI loss (ACE)" 49 = "External fault (EF)" 50 = "Emergency stop (EF1)" 51 = "External base block (bb)" 52 = "Password is locked (Pcod)" 54 = "Illegal command (CE1)" 55 = "Illegal data address (CE2)" 56 = "Illegal data value (CE3)" 57 = "Data is written to read-only address (CE4)" 58 = "Modbus transmission time-out (CE10)" 61 = "Y-connection / delta-connection switch fault (ydc)" 62 = "Deceleration energy backup fault (dEb)" 63 = "Over slip error (oSL)" 68 = "Reverse direction of the speed feedback (SdRv)" 69 = "Over speed rotation feedback (SdOr)" 70 = "Large deviation of speed feedback (SdDe)" 72 = "STO loss 1 (STL1)" 76 = "STO (STO)" 77 = "STO loss 2 (STL2)" 78 = "STO loss 3 (STL3)" 79 = "U-phase over-current before run (Aoc)" 80 = "V-phase over-current before run (boc)" 81 = "W-phase over-current before run (coc)" 82 = "Output phase loss U phase (OPHL)" 83 = "Output phase loss V phase (OPHL)" 84 = "Output phase loss W phase (OPHL)" 87 = "Overload protection at low frequency (oL3)" 89 = "Rotor position detection error (RoPd)" 101 = "CANopen guarding fault (CGdE)" 102 = "CANopen heartbeat fault (CHbE)" 104 = "CANopen bus off fault (CbFE)" 105 = "CANopen index error (CIdE)" 106 = "CANopen station address error (CAdE)" 107 = "CANopen memory error (CFrE)" 121 = "Internal communication error (CP20)" 123 = "Internal communication error (CP22)" 124 = "Internal communication error (CP30)" 126 = "Internal communication error (CP32)" 127 = "Internal communication error (CP33)" 128 = "Over-torque 3 (ot3)" 129 = "Over-torque 4 (ot4)" 134 = "Internal communication error (EoL3)" 135 = "Internal communication error (EoL4)" 140 = "oc hardware error (Hd6)" 141 = "GFF occurs before run (b4GFF)" 142 = "Auto-tune error 1 (AuE1)" 143 = "Auto-tune error 2 (AuE2)" 144 = "Auto-tune error 3 (AuE3)" 149 = "Auto-tune error 5 (AuE5)" # 01-xx and 02-xx configuration groups, in Delta's GGnnH layout (GG = group, # nn = the parameter number in hex, so Pr.04-10 is 040Ah — p. 792). # # SWEPT FOR READ-ONLY PARAMETERS against the Chapter 11 summary, pp. 224-233. # Group 01 has none. Group 02's read-only block is 02-50 (input terminal # status), 02-51 (output terminal status), 02-52 and 02-53 (PLC terminals used) # and 02-54 (frequency command executed by external terminal) — the MS300 # equivalents of the CP2000/CFP2000 offenders, and all of them sit ABOVE the # 02-47 upper bound below, so a restore never queues a write the drive will # NAK. Do not raise that bound to reach 02-55+ without re-splitting around # 02-50…02-54. # # The ranges are also split around the gaps in the parameter list, because # `dump` records every unreadable address and `is_complete()` then reports the # backup as partial. Group 01 stops at 01-70 and skips 01-47, 01-48, 01-50 and # 01-51; group 02 skips 02-08, 02-14, 02-15, 02-26–02-33, 02-36–02-38 and # 02-40–02-46. The previous [[0x0100, 0x0163]] claimed up to Pr.01-99, which # does not exist — 29 phantom addresses on every backup. # # 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. [parameters] ranges = [ [0x0100, 0x012E], # 01-00 … 01-46 [0x0131, 0x0131], # 01-49 [0x0134, 0x0146], # 01-52 … 01-70 [0x0200, 0x0207], # 02-00 … 02-07 [0x0209, 0x020D], # 02-09 … 02-13 [0x0210, 0x0219], # 02-16 … 02-25 [0x0222, 0x0223], # 02-34, 02-35 [0x0227, 0x0227], # 02-39 [0x022F, 0x022F], # 02-47 ]