# Property of PMA Electrical Solutions, LLC. # # Delta VFD-EL (Sensorless Vector Control Compact Drive), built-in RS-485 on # the RJ-45 next to the control terminals. # # COVERAGE — VFD-EL only. NOT CLAIMED: VFD-EL-W, VFD-EL-C, VFD-EL-D, VFD-EL-SP, # VFD-E, VFD-S, MS300. VFD-EL-W in particular ships its OWN user manual # (DELTA_IA-MDS_VFD-EL-W_UM_EN_20240904) whose 2100H fault enumeration DIFFERS # from this one — code 4 is Lv there and Reserved here, 22 is Reserved there # and HPF3 here, and 37/38 (oPHL, HotP) do not exist on the VFD-EL. Do not # point this profile at a -W. # # SOURCES — Delta VFD-EL User Manual, revision 2016/03, 6ELE, V1.14, file # DELTA_IA-MDS_VFD-EL_UM_EN_20160308.pdf from downloadcenter.deltaww.com. PDF # page numbers below, not the printed 4-nn folio: # pp. 108-110 3.5 Address list — 2000H/2001H/2002H command, 2100H error # code table (enumerated in full), 2101H status bits, # 2102H-210AH monitor, 2116H/2117H user-defined # p. 111 exception codes # p. 58 01.00 Maximum Output Frequency 50.00-599.0 Hz (fact. 60.00) # p. 65 02.00 frequency source (3 = RS-485), 02.01 operation source # (3/4 = RS-485) # pp. 90-91 06.08-06.12 fault record enumeration # pp. 102-103 09.00-09.04 node/baud/fault treatment/timeout/protocol # p. 153 Frequency Setting Resolution 0.01 Hz # pp. 32-48 parameter summary (group extents) # # DRIVE-SIDE SETUP: 02.00 = 3 (frequency from RS-485), 02.01 = 3 or 4 # (operation from RS-485), 09.00 node address, 09.01 = 1 (9600), and # 09.04 = 6 (Modbus RTU 8,N,1). THE FACTORY DEFAULT IS 09.04 = 0, WHICH IS # MODBUS *ASCII* 7,N,2 — an out-of-the-box VFD-EL does not speak RTU at all. # Note also p. 112: with a PU06 keypad attached, 09.01/09.04/09.08 are # DISABLED, and 09.08 = 1 forces 19200 RTU 8,N,2 and overrides 09.01/09.04. # # ADDRESSING: Delta documents these as hex protocol addresses that are already # 0-based. Parameters are GGnnH, so Pr.04.01 is 0x0401 (manual p. 108). # # WATCHDOG BACKSTOP IS OFF AT THE FACTORY: 09.02 defaults to 3 ("No warning and # keep operating") and 09.03 (Time-out Detection) defaults to 0.0 = disabled # (p. 102). Until 09.02 is set 0-2 and 09.03 to a non-zero time, the drive # KEEPS RUNNING when the master goes quiet. # # NO FAULT MASK HERE. Unlike the VFD-E and the MS300, which pack a warning # code into the high byte of 2100H, the VFD-EL manual documents 2100H as a # plain "Error code" with a single enumeration and says nothing about a high # byte (pp. 108-109). Masking is therefore NOT applied — adding one would # silently truncate a future code above 255 rather than fix anything. name = "Delta VFD-EL" vendor = "Delta Electronics" device_type = "vfd" verified = false probe_register = 0x2101 [connection] summary = "This drive has one built-in two-wire Modbus RTU path; no option card is required." warnings = [] [[connection.methods]] id = "built_in_rs485" title = "Built-in RS-485 on RJ45" transport = "serial" hardware = "built_in" port = "Communications RJ45 beside the control terminals" connector = "RJ45 modular jack (RS-485, not Ethernet/telephone)" 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 02.00=3, 02.01=3 or 4, 09.00=node, 09.01=1 for 9600, and 09.04=6 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.", "Pins 1 and 2 include accessory power. A connected PU06 can override/disable the normal serial format settings; verify 09.08."] source = "Delta VFD-EL User Manual, PDF p. 102 (pinout) and pp. 102, 112 (setup/PU06 override)" [[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 (GND)" signal = "Signal reference or shield drain" required = false # 09.01 default is 1 = 9600 bps (p. 102). Parity/stop below is the RTU 8,N,1 # that 09.04 = 6 selects, NOT the factory default (ASCII 7,N,2 — see header). [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # Bits 0-1 are a 2-bit run state (00 stop, 01 decelerating to stop, 10 standby, # 11 run) and bits 3-4 a 2-bit direction-transition field (00 FWD, 11 REV), so # neither decodes as an independent flag. Read this register as hex. drive_status = { address = 0x2101, bits = { 2 = "Jog", 8 = "FreqFromComm", 9 = "FreqFromAnalog", 10 = "OperFromComm" } } frequency_command = { address = 0x2102, scale = 0.01, unit = "Hz" } output_frequency = { address = 0x2103, scale = 0.01, unit = "Hz" } # p. 110 prints "Output current (AXX.X)" — ONE decimal, 0.1 A per count, and # only two integer digits (VFD-EL tops out at 40 A). NOT the MS300's 0.01 A. output_current = { address = 0x2104, scale = 0.1, unit = "A" } # 2106H is the PID feedback analog input display; 2105H and 2107H are Reserved. pid_feedback = { address = 0x2106 } # DC bus is at 2108H, not 2105H as on the MS300. dc_bus_voltage = { address = 0x2108, scale = 0.1, unit = "V" } output_voltage = { address = 0x2109, scale = 0.1, unit = "V" } igbt_temperature = { address = 0x210A, unit = "degC" } [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; bit 0 is EF (external fault), so only bit 1 may rise. reset_register = 0x2002 speed_register = 0x2001 speed_scale = 0.01 speed_unit = "Hz" max_ref = 599.0 # 01.00 upper limit, p. 58 step_delay = 0.05 stop = [0x0001] run_fwd = [0x0012] run_rev = [0x0022] reset = [0x0002] [control.watchdog] interval_ms = 300 fault = "cE10 communication time-out (only when 09.02 = 0-2 AND 09.03 != 0.0; both factory defaults disable it)" backstop_requires_setup = true # BLIND SPOT — bits 0-1 are a 2-bit field and this check can only test one bit. # Bit 0 is set for 01B (decelerating to stop, motor still turning) and 11B # (running), so a spinning motor always reads Running. It is CLEAR for 10B, # which p. 109 calls "RUN LED is on, STOP LED blinks (When AC motor drive is # standby)" — a run command held at zero output. In that state this reports # Stopped, and a restore precondition would pass on a drive that is armed to # start. Watching bit 1 instead just swaps the blind spot onto deceleration. # Check 2101H by hand before a restore until the schema can express # "any of bits 0-1". [running_check] register = 0x2101 bit = 0 # History is Pr.06.08-06.12, the five most recent faults (pp. 90-91). [faults] register = 0x2100 history = [0x0608, 0x0609, 0x060A, 0x060B, 0x060C] # 2100H error code table, pp. 108-109, cross-checked against the Pr.06.08 # Fault Record list on pp. 90-91 (which adds 35 and 36). Codes the manual # marks Reserved (4, 13, 15, 29-31, 33, 37-40) are omitted rather than # guessed. This numbering is VFD-EL's and differs from VFD-E, VFD-S, # VFD-EL-W and MS300. [faults.codes] 0 = "No error occurred" 1 = "oc Over-current" 2 = "ov Over-voltage" 3 = "oH1 IGBT overheat" 5 = "oL Overload" 6 = "oL1 Overload1" 7 = "oL2 Overload2" 8 = "EF External fault" 9 = "ocA Over-current during accel (>2x rated)" 10 = "ocd Over-current during decel (>2x rated)" 11 = "ocn Over-current at steady state (>2x rated)" 12 = "GFF Ground fault" 14 = "PHL Phase loss" 16 = "cFA Auto accel/decel failure" 17 = "codE Software/password protection" 18 = "cF1.0 Power board CPU WRITE failure" 19 = "cF2.0 Power board CPU READ failure" 20 = "HPF1 CC/OC hardware protection failure" 21 = "HPF2 OV hardware protection failure" 22 = "HPF3 GFF hardware protection failure" 23 = "HPF4 OC hardware protection failure" 24 = "cF3.0 U-phase error" 25 = "cF3.1 V-phase error" 26 = "cF3.2 W-phase error" 27 = "cF3.3 DC bus error" 28 = "cF3.4 IGBT overheat" 32 = "AErr ACI signal error" 34 = "PtC1 Motor PTC overheat protection" 35 = "FbE PID feedback error" 36 = "dEv Unusual PID feedback deviation" # Pr.00.00, p. 31 (parameter summary). An INTEGER frame identity. As on the VFD-E, the # 115 V and 230 V series share codes for the same kW, so this narrows a # restore mismatch, it does not prove identity. [rating] register = 0x0000 words = 1 scale = 1.0 label = "Drive identity code (Pr.00.00)" # Group 1 (Basic, 01.00-01.35) and group 2 (Operation Method, 02.00-02.19), # in Delta's GGnnH layout, per the parameter summary pp. 32-48. # Group 9 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. # Group 0 is excluded because 00.00/00.01 are read-only drive identity and # 00.02 is Parameter Reset. # 02.16 (0x0210), 02.17 (0x0211) and 02.19 (0x0213) are cut out of the group 2 # span: all three are "Settings: Read Only" display registers — the active # frequency source, the active operation source, and User-defined Value 2 # (pp. 70-71). They differ between donor and target as a matter of course, so # a restore would plan a write to each, take a NAK, and report the whole clone # failed. 02.18 (0x0212) is the writable half of that pair and is kept. [parameters] ranges = [[0x0100, 0x0123], [0x0200, 0x020F], [0x0212, 0x0212]]