# Property of PMA Electrical Solutions, LLC. # # Delta VFD-E (Sensorless Vector Control Compact Drive), built-in RS-485 on the # RJ-45 next to the control terminals. # # COVERAGE — VFD-E only. NOT CLAIMED: VFD-EL, VFD-EL-W, VFD-EL-C, VFD-ED, # VFD-S, VFD-M, MS300. Each has its own profile from its own manual. The # VFD*E*C (CANopen) models use a different RJ-45 pinout (manual ch. E.1.2) and # are not claimed here either. # # SOURCES — Delta VFD-E User Manual, file DELTA_IA-MDS_VFD-E_UM_EN_20160516.pdf # from downloadcenter.deltaww.com (doc 20160516 revision; the PDF's internal # document name is "VFD-E Manual_EN_Printable_eng coverB6_20160302"). PDF page # numbers below, not the printed 4-nnn folio: # pp. 200-202 3.5 Address list — 2000H/2001H/2002H command, 2100H/2101H # status, 2102H-210AH monitor, 2116H/2117H user-defined # p. 203 exception codes, cE10 comm timeout # p. 104 01.00 Maximum Output Frequency 50.00-599.00 Hz (fact. 60.00) # p. 116 02.00 frequency source (3 = RS-485) # p. 117 02.01 operation source (3/4 = RS-485) # pp. 168-169 06.08-06.12 fault record enumeration (transcribed below) # pp. 190-192 09.00-09.04 node/baud/fault treatment/timeout/protocol # p. 264 Frequency Setting Resolution 0.01 Hz # p. 98 00.00 Identity Code, 00.01 Rated Current Display # # 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-E does not speak RTU at all. # # ADDRESSING: Delta documents these as hex protocol addresses that are already # 0-based. Parameters are GGnnH, so Pr.04.01 is 0x0401 (manual p. 200). # # 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 # (pp. 190-191). Until 09.02 is set 0-2 and 09.03 to a non-zero time, the drive # KEEPS RUNNING when the master goes quiet. The keepalive below proves our end # of the link, not the drive's. # # FAULT ENUMERATION CAVEAT — THE WEAKEST PART OF THIS FILE. The address list # (p. 201) says only "2100H Fault code: low byte / Warning code: high byte" # and does not enumerate the codes. The table below is the Pr.06.08 Fault # Record enumeration (pp. 168-169) from the same manual. On the sibling VFD-EL, # Delta prints both lists and they agree, which is why this mapping is used — # but it is an inference within the document, not a printed 2100H table. # # AND THIS MANUAL CARRIES A SECOND, DIFFERENT NUMBERING. Appendix E.1.4.4, the # CANopen EMCY table (p. 410), lists "Controller Fault Code" 000DH = low # voltage and 000FH = external Base Block where Pr.06.08 marks 13 and 15 # Reserved, and from 0013H upward it runs one ahead of Pr.06.08 throughout # (0013H EEPROM-write vs 18 cF1.0 write, 0015H CC vs 20 HPF1 CC/OC, and so on). # That table is the CANopen card's own map, not Modbus 2100H, so it does not # overturn the choice below — but it proves Delta ships more than one fault # enumeration for this drive, so treat every code here as unconfirmed until a # bench forces a known fault and reads 2100H. name = "Delta VFD-E" 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.", "This pinout explicitly excludes VFD*E*C CANopen models. Pins 1 and 2 include reserved/accessory power functions; do not connect them."] source = "Delta VFD-E User Manual, PDF p. 190 (non-CANopen pinout) and pp. 190-191 (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 (GND)" signal = "Signal reference or shield drain" required = false # 09.01 default is 1 = 9600 bps (p. 190). 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. 202 prints "Output current (AXXX.X)" — ONE decimal, 0.1 A per count. This # is NOT the MS300's 0.01 A; do not carry that scale across. output_current = { address = 0x2104, scale = 0.1, unit = "A" } # 2105H-2107H are Reserved on VFD-E. DC bus is at 2108H, not 2105H as on the # MS300 — the whole monitor block below 2108H is shifted between families. 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) and bit 2 is external # Base Block, so only bit 1 may be raised. reset_register = 0x2002 speed_register = 0x2001 speed_scale = 0.01 speed_unit = "Hz" max_ref = 599.0 # 01.00 upper limit, p. 104 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. 201 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 # High byte carries the WARNING code and the low byte the FAULT code (p. 201); # without the mask an active warning corrupts the fault lookup. # History is Pr.06.08-06.12, the five most recent faults (pp. 168-169). [faults] register = 0x2100 mask = 0x00FF history = [0x0608, 0x0609, 0x060A, 0x060B, 0x060C] # Pr.06.08-06.12 Fault Record, pp. 168-169, transcribed complete. Entries the # manual marks Reserved (4, 13, 15, 29, 33, 36-39) are omitted rather than # guessed. This numbering is VFD-E's; it differs from VFD-S, VFD-EL-W and # MS300 at several codes. [faults.codes] 0 = "No fault" 1 = "oc Over-current" 2 = "ov Over-voltage" 3 = "oH1 IGBT overheat" 5 = "oL Overload" 6 = "oL1 Overload" 7 = "oL2 Motor overload" 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 fault" 25 = "cF3.1 V-phase fault" 26 = "cF3.2 W-phase fault" 27 = "cF3.3 DC bus fault" 28 = "cF3.4 IGBT overheat" 30 = "cF1.1 Control board CPU WRITE failure" 31 = "cF2.1 Control board CPU READ failure" 32 = "AErr ACI signal fault" 34 = "PtC1 Motor PTC overheat protection" 35 = "PGEr PG feedback signal fault" 40 = "CP10 Control/power board comm time-out" 41 = "dEb fault" 42 = "ACL Abnormal communication loop" 66 = "oPHL1 U-phase output phase loss" 67 = "oPHL2 V-phase output phase loss" 68 = "oPHL3 W-phase output phase loss" # Pr.00.00, p. 98. An INTEGER frame identity (0.4 kW/230 V = 2, 0.4 kW/460 V = # 3): even codes are the 115 V and 230 V series, odd the 460 V series. Two # frames of the same kW in the 115 V and 230 V series share a code, so this # narrows a restore mismatch, it does not prove identity. Pr.00.01 Rated # Current Display (0x0001, 0.1 A) is the alternative and has the same gap. [rating] register = 0x0000 words = 1 scale = 1.0 label = "Drive identity code (Pr.00.00)" # Group 1 (Basic, 01.00-01.43) and group 2 (Operation Method, 02.00-02.19), # in Delta's GGnnH layout, per the parameter summary pp. 56-95. # 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. Groups 11-13 are excluded because they belong to # extension cards that may not be fitted on the target drive. # 02.16 (0x0210) and 02.17 (0x0211) are cut out of the group 2 span: both are # "Settings: Read Only" display registers reporting which source currently # owns frequency and operation (pp. 122, 126). 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. [parameters] ranges = [[0x0100, 0x012B], [0x0200, 0x020F], [0x0212, 0x0213]]