# Property of PMA Electrical Solutions, LLC. # # Delta C200 (Economy Vector Control Drive), embedded RS-485 (COM1). # # COVERAGE — the C200 series only. NOT the C2000, C2000 Plus, C2000-HS, # C2000-R, CP2000, CH2000, MS300 or VFD-M: those are separate manuals with # separate fault tables, and Delta fault numbering demonstrably differs # between families. The C200 manual reuses C2000 boilerplate in places (its # protocol section literally says "A VFD-C2000 can be set up to..."), which is # exactly why the register and fault content below was taken from the C200 # tables themselves and nothing was carried across. # # SOURCE — Delta C200 Series User Manual, document DELTA_IA-MDS_C200_UM_EN_ # 20150821, downloadcenter.deltaww.com (376 pp). Citations are PDF page # numbers in that file, not the printed folio (the manual restarts numbering # per chapter, so the folio is not a usable citation). # p. 74 Pr.00-00 Identity Code of the AC Motor Drive (read-only) # p. 76 Pr.00-20 Source of Master Frequency Command (1 = RS-485), # Pr.00-21 Source of the Operation Command (2 = RS-485) # p. 79 Pr.01-00 Max. Operation Frequency 0.00-600.00 Hz # pp. 94-96 Pr.06-17 fault record code list (transcribed below) # p. 96 Pr.06-33/06-34 0.0-6553.5 V, Pr.06-35 0.00-655.35 Amp # (the resolution evidence for the voltage/current scales) # p. 103 group 09 summary: 09-00 address, 09-01 baud (default 9.6), # 09-02 fault treatment (default 3), 09-03 time-out (default # 0.0 = disabled), 09-04 protocol (DEFAULT 1 = 7,N,2 ASCII) # pp. 229-232 ASCII/RTU frame format, function codes 03/06/10, addressing # pp. 236-238 address list: 20xx control, 21xx/22xx status monitor # p. 240 Pr.09-30 Communication Decoding Method, FACTORY SETTING 0 # (Decoding Method 1, 20xx) # pp. 79-84 extent of groups 01 (to 01-46) and 02 (to 02-55), including # the read-only members 02-50-02-54 on p. 84 # p. 288 Ch.13 CANopen index table (2020H/2021H) — a CANopen-side # mirror of the control word and status bits, not a second # Modbus table; its display-format annotations are looser # # DRIVE-SIDE SETUP: 00-20 = 1 (RS-485 frequency source), 00-21 = 2 (RS-485 # operation source), 09-00 node address, 09-01 baud, and critically # 09-04 = 12 (8,N,1 RTU) — the FACTORY DEFAULT IS 1, which is 7,N,2 ASCII, # so an out-of-the-box C200 will not answer an RTU master at all (p. 103). # 09-30 Communication Decoding Method must be 0 so the 20xx control addresses # below are the operation source. p. 240 prints "Factory Setting: 0" for it, # so unlike the plain C2000 (whose 09-30 defaults to 60xx decoding) the 20xx # map here IS live out of the box. Still worth reading back on site: like the # C2000 the drive ACKs writes to 2000H and ignores them when 09-30 is 1. # # Delta documents these as hex Modbus addresses that go on the wire as-is # (pp. 232-233: "01H (address) 03H (function) 21H 02H (starting data # register)") — they are already 0-based protocol addresses. name = "Delta C200" vendor = "Delta Electronics" device_type = "vfd" verified = false probe_register = 0x2101 [connection] summary = "Use either of the two built-in electrical access points for the same two-wire Modbus RTU bus; no communications option card is required." warnings = ["Choose one physical access point per drive. The screw terminals and modular jack are electrically the same bus, not two independent ports."] [[connection.methods]] id = "control_terminals_rs485" title = "Built-in RS-485 screw terminals" transport = "serial" hardware = "built_in" port = "Control terminals SG+ and SG-" connector = "Two 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, 09-04=12 for RTU 8N1, and confirm 09-30=0."] 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.", "The factory communication format is Modbus ASCII on these families; set the documented RTU format from the keypad before expecting discovery."] source = "Delta C200 Series User Manual DELTA_IA-MDS_C200_UM_EN_20150821, PDF p. 36 (SG+/SG- and RJ45 pinout), pp. 103 and 240 (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]] 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, 09-04=12 for RTU 8N1, and confirm 09-30=0."] 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.", "The C200 terminal table assigns only RJ45 pin 3 (GND), pin 4 (SG-), and pin 5 (SG+). Do not connect the unassigned pins."] source = "Delta C200 Series User Manual DELTA_IA-MDS_C200_UM_EN_20150821, PDF p. 36 (SG+/SG- and RJ45 pinout), pp. 103 and 240 (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 9.6 kbps. Parity/stop below are what the drive must be SET to # (09-04 = 12); they are not the factory default, which is 7,N,2 ASCII. [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # Bits 1-0 are a 2-bit run state (00 stop, 01 decelerating, 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. Only the genuinely independent bits are named here. drive_status = { address = 0x2101, bits = { 2 = "Jog", 8 = "FreqFromComm", 9 = "FreqFromAnalog", 10 = "CmdFromComm", 11 = "ParamLocked", 12 = "KeypadCopyEnabled" } } frequency_command = { address = 0x2102, scale = 0.01, unit = "Hz" } output_frequency = { address = 0x2103, scale = 0.01, unit = "Hz" } # UNRESOLVED IN THE MANUAL. p. 237 prints 2104H as "Output current (AXX.X.X)" # — mangled and undecodable. p. 96 Pr.06-35 "Output Current at Malfunction # 0.00-655.35 Amp" is the same quantity snapshotted at trip, so two decimals, # and that is a real parameter range rather than a display glyph — hence 0.01. # The p. 288 CANopen index prints "(AXX.X)", one decimal, which contradicts # it. A 10x current error is a real misread. CONFIRM ON A BENCH. 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 a speed. multistep_step = { address = 0x2107 } # 0x210A is the power factor ANGLE in 0.1 degrees, not cos phi. power_factor_angle = { address = 0x210A, scale = 0.1, unit = "deg" } # NOT SOURCED: p. 237 prints 210BH only as "Output Torque (%)" with no decimal # format, and the C200's own two mentions elsewhere disagree — 2208H reads # "(t0.0: positive torque)" (one decimal) while Pr.00-04 setting 8 on p. 112 # reads "(t = 00: positive torque)" (none). 0.1 follows the 2208H form. Open # bench question; display-only, no control path depends on it. output_torque = { address = 0x210B, scale = 0.1, unit = "%" } motor_speed = { address = 0x210C, unit = "rpm" } # p. 237: "Power output (X.XXX)" — three decimals, so kW/1000 per count. output_power = { address = 0x210F, scale = 0.001, unit = "kW" } igbt_temperature = { address = 0x220E, scale = 0.1, 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. reset_register = 0x2002 speed_register = 0x2001 speed_scale = 0.01 speed_unit = "Hz" max_ref = 600.0 # Pr.01-00 range, p. 79 step_delay = 0.05 stop = [0x0001] # 2000H bits 1-0 = 01B 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 # 09-02 Transmission Fault Treatment default is 3 = "No warning and continue # operation" and 09-03 Time-out Detection default is 0.0 = disabled, so a # factory-default C200 KEEPS RUNNING when the master goes quiet. Both must be # set on the drive for this keepalive to have a drive-side consequence. [control.watchdog] interval_ms = 300 fault = "CE10 Modbus transmission time-out (code 58) — only if 09-03 time-out is non-zero and 09-02 is 1 or 2; the factory default is no detection and no action" backstop_requires_setup = true # The C200 has no 0x2226 drive-status word, so there is no single documented # "output active" bit. Bit 0 is the low bit of the 2-bit run state (p. 237): # 00b stops, 01b decelerating, 10b standby, 11b operating. Bit 0 is therefore # set for 01b and 11b and clear for 00b and 10b. # # KNOWN BLIND SPOT — 10b "Drive standby" means the run command is HELD but # output is zero, and it leaves bit 0 CLEAR. running_state() reads one bit, so # it reports Stopped for a drive that is armed to start the moment its # reference leaves zero, and a restore precondition that only checks "not # running" will pass on it. Read 0x2101 bits 1-0 as a pair, or confirm the # drive is genuinely stopped at the panel, before a restore. Fixing this # properly needs a 2-bit running_check in core, which the profile format # cannot express today. [running_check] register = 0x2101 bit = 0 # p. 237 documents 0x2100 only as "Error code: refer to Pr.06-17 to Pr.06-22"; # unlike the C2000/C2000 Plus manuals it does NOT state that the high byte # carries a warning code. The mask is defensive: every documented C200 fault # code is <= 111, so masking cannot lose information, and it protects the # lookup if the C200 shares the family's high-byte warning behaviour. [faults] register = 0x2100 mask = 0x00FF # Pr.06-17 code list, pp. 94-96, transcribed complete. Reserved codes and the # "Reserved" ranges are omitted rather than invented. [faults.codes] 0 = "No fault record" 1 = "ocA over-current during acceleration" 2 = "ocd over-current during deceleration" 3 = "ocn over-current during constant speed" 4 = "GFF ground fault" 5 = "occ IGBT short-circuit" 6 = "ocS over-current at stop" 7 = "ovA over-voltage during acceleration" 8 = "ovd over-voltage during deceleration" 9 = "ovn over-voltage during constant speed" 10 = "ovS over-voltage at stop" 11 = "LvA low-voltage during acceleration" 12 = "Lvd low-voltage during deceleration" 13 = "Lvn low-voltage during constant speed" 14 = "LvS stop mid-low voltage" 15 = "OrP phase loss protection" 16 = "oH1 IGBT over-heat" 17 = "oH2 capacitance over-heat" 18 = "tH1o TH1 open, IGBT over-heat protection error" 19 = "tH2o TH2 open, capacitance over-heat protection error" 21 = "oL drive over-load" 22 = "EoL1 electronic thermal relay 1" 23 = "EoL2 electronic thermal relay 2" 24 = "oH3 motor overheat (PTC)" 26 = "ot1 over-torque 1" 27 = "ot2 over-torque 2" 28 = "uC low current" 29 = "LMIT home limit error" 30 = "cF1 memory write-in error" 31 = "cF2 memory read-out error" 33 = "cd1 U-phase current detection error" 34 = "cd2 V-phase current detection error" 35 = "cd3 W-phase current detection error" 36 = "Hd0 clamp current detection error" 37 = "Hd1 over-current detection error" 38 = "Hd2 over-voltage detection error" 39 = "Hd3 ground current detection error" 40 = "AUE auto tuning error" 41 = "AFE PID feedback loss" 42 = "PGF1 PG feedback error" 43 = "PGF2 PG feedback loss" 44 = "PGF3 PG feedback stall" 45 = "PGF4 PG slip error" 48 = "ACE analog current input loss" 49 = "EF external fault input" 50 = "EF1 emergency stop" 51 = "bb external base block" 52 = "PcodE password error" 53 = "SW code error" 54 = "CE1 Modbus illegal command" 55 = "CE2 Modbus illegal data address" 56 = "CE3 Modbus illegal data value" 57 = "CE4 Modbus write to read-only address" 58 = "CE10 Modbus transmission time-out" 59 = "CP10 PU time-out" 61 = "ydc Y-connection / delta-connection switch error" 62 = "dEb decel. energy backup error" 63 = "oSL slip error" 66 = "Unknown over amp" 67 = "Unknown over vol" 68 = "Sensorless estimated speed has wrong direction" 69 = "Sensorless estimated speed over speed" 70 = "Sensorless estimated speed deviated" 73 = "S1 external safety gate" 79 = "Uocc U phase over current" 80 = "Vocc V phase over current" 81 = "Wocc W phase over current" 82 = "OPHL U phase output phase loss" 83 = "OPHL V phase output phase loss" 84 = "OPHL W phase output phase loss" 101 = "CGdE CANopen software disconnect 1" 102 = "CHbE CANopen software disconnect 2" 103 = "CSYE CANopen synchronous error" 104 = "CbFE CANopen hardware disconnect" 105 = "CIdE CANopen index setting error" 106 = "CAdE CANopen slave station number setting error" 107 = "CFrE CANopen index setting exceeds limit" 111 = "InrCOM internal communication overtime error" # Pr.00-00 AC Motor Drive Identity Code (p. 74), read-only, an enumeration of # voltage class and kW/HP — a real frame identity rather than a nameplate # guess. Values are Delta's identity numbers, not a physical unit. [rating] register = 0x0000 words = 1 scale = 1.0 label = "AC Motor Drive Identity Code (Pr.00-00)" # Groups 01 (basic, up to 01-46 = 0x012E) and 02 (digital I/O, up to 02-55 = # 0x0237) in Delta's GGnn hex layout (p. 236: "the address of Pr 4-01 is # 0401H"). # # The group 02 range is SPLIT around the read-only members. Pr.02-50-02-54 # (0x0232-0x0236, the terminal-status monitors) are marked "Read only" on # p. 84. They read back fine, so a dump captures them, and the restore then # plans a write the drive NAKs — which both fails an otherwise-perfect clone # and is exactly what fault 57 (CE4, "Modbus write to read-only address") is # for. # # Group 09 is DELIBERATELY EXCLUDED: it holds 09-00 node address, 09-01 baud, # 09-04 protocol and 09-30 decoding method. 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], [0x0200, 0x0231], [0x0237, 0x0237]]