# Property of PMA Electrical Solutions, LLC. # # Delta C2000 Plus (High Performance Vector Control Drive), embedded RS-485 # (COM1). # # COVERAGE — the C2000 Plus series only. NOT the C2000, C2000-HS, C2000-R, # CP2000, CH2000, CT2000, C200, MS300 or VFD-M. This is a SEPARATE profile # from delta_c2000.toml on the strength of two documented differences, not on # a naming assumption: # 1. Decoding method. On the C2000 the RS-485 source of operation control # follows Pr.09-30 (2000h-20FFh under method 1, 6000h-60FFh under method # 2) and 09-30 defaults to the SETTING 1, which is decoding method 2 — # i.e. a factory-default C2000 takes operation commands on 60xx, not # 20xx. On the C2000 Plus the same table reads # "The address for reference is 2000h-20FFh regardless of decoding # method 1 or 2" (p. 658), so the 20xx map is live at the factory # default. # 2. Fault table. The Plus adds codes 25, 164, 165 and 174-195 that do not # exist in the C2000 list, and 0x2101 differs (bit 7 external-terminal # source and a 3-bit HOA / LOC-REM field at bits 15-13, where the C2000 # has a keypad-copy flag at bit 12). # # SOURCE — Delta C2000 Plus Series User Manual, document # DELTA_IA-MDS_C2000 Plus_UM_EN_20250522, downloadcenter.deltaww.com # (1282 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. 397, 459 Pr.00-00 AC Motor Drive Identity Code (read-only) # p. 402 Pr.00-20 Master Frequency Command Source (1 = RS-485) # p. 403 Pr.00-21 Operation Command Source (2 = RS-485) # p. 406 Pr.01-00 Maximum Operation Frequency 0.00-599.00 Hz # pp. 406-415 extent of groups 01 (to 01-54) and 02 (to 02-75), including # the read-only members 02-50-02-54 and 02-70 on p. 414 # pp. 439-440 group 09 summary: 09-01 baud (default 9.6), 09-02 fault # treatment (default 3), 09-03 time-out (default 0.0), # 09-04 protocol (DEFAULT 1 = 7,N,2 ASCII) all on p. 439; # 09-30 (default 1) on p. 440 # pp. 600-607 Pr.06-17 fault record code list (transcribed below) # p. 658 Pr.09-30 Communication Decoding Method table # pp. 1262-1265 Appendix A: ASCII/RTU frames, function codes, checksums # pp. 1267-1274 Appendix A-4 address list: 20xx control, 21xx/22xx monitor # # DRIVE-SIDE SETUP: 00-20 = 1 (RS-485 frequency source), 00-21 = 2 (RS-485 # operation source) — both default to 0 (digital keypad); 09-00 node address; # 09-01 baud; and 09-04 = 12 (8,N,1 RTU) — THE FACTORY DEFAULT IS 1, which is # 7,N,2 ASCII, so an untouched drive will not answer an RTU master at all # (p. 439). Pr.09-30 does NOT need changing for RS-485 on this model (p. 658), # which is the opposite of the C2000. # # NOTE the manual's own footnote on 0x2000 (p. 1267) says the operation # command is "Valid only when operation command source is set to # communication (Pr.00-03=2)". Pr.00-03 on this drive is Start-up Display; # the operation command source is Pr.00-21 (p. 403). Treated as a typo for # 00-21 in the Delta document, but worth confirming on a bench. # # Delta documents these as hex Modbus addresses that go on the wire as-is # (p. 1267: "01h (station address 01) + 03h (function code 03h) + 00xxh-26xxh # (Modbus address)") — they are already 0-based protocol addresses. name = "Delta C2000 Plus" 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, and 09-04=12 for RTU 8N1; 09-30 need not change for built-in RS-485."] 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 C2000 Plus User Manual DELTA_IA-MDS_C2000 Plus_UM_EN_20250522, PDF pp. 107-108 (SG+/SG- and RJ45 pinout), pp. 439-440 and 658 (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, and 09-04=12 for RTU 8N1; 09-30 need not change for built-in RS-485."] 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, 2, 7, and 8 are reserved or accessory power depending on model revision. Do not connect them."] source = "Delta C2000 Plus User Manual DELTA_IA-MDS_C2000 Plus_UM_EN_20250522, PDF pp. 107-108 (SG+/SG- and RJ45 pinout), pp. 439-440 and 658 (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 6 (SGND)" 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 fully stopped, 01 stopping, 10 standby, # 11 running), bits 4-3 a 2-bit direction-transition field (00 FWD, 01 # REV->FWD, 10 FWD->REV, 11 REV) and bits 15-13 a 3-bit HOA / LOC-REM mode # field, so none of those decodes as an independent flag. Only the genuinely # independent bits are named here. drive_status = { address = 0x2101, bits = { 2 = "Jog", 7 = "CmdFromExtTerminal", 8 = "FreqFromComm", 9 = "FreqFromAnalog", 10 = "CmdFromComm", 11 = "ParamLocked" } } frequency_command = { address = 0x2102, scale = 0.01, unit = "Hz" } output_frequency = { address = 0x2103, scale = 0.01, unit = "Hz" } # p. 1270: "Drive's output current (XX.XX A). Decimal places can be referred # by the high byte of 211F." So this scale is FRAME-DEPENDENT — read 0x211F # bits 9-8 (number of decimal places) before trusting the value. output_current = { address = 0x2104, scale = 0.01, unit = "A" } current_decimal_attr = { address = 0x211F } 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 (0 = main speed). multistep_step = { address = 0x2107 } # 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" } output_torque = { address = 0x210B, scale = 0.1, unit = "%" } motor_speed = { address = 0x210C, unit = "rpm" } output_power = { address = 0x210F, scale = 0.001, unit = "kW" } igbt_temperature = { address = 0x220E, scale = 0.1, unit = "degC" } capacitor_temperature = { address = 0x220F, scale = 0.1, unit = "degC" } # 0x2226 (p. 1273) is a second, cleaner status word: bits 1-0 direction, bits # 3-2 ready/error, bit 4 output active, bit 5 alarm. Only bits 4 and 5 are # independent flags; the two 2-bit fields are not. drive_status_2 = { address = 0x2226, bits = { 4 = "Output", 5 = "Alarm" } } kwh = { address = 0x2229, scale = 0.1, unit = "kWh" } [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 = 599.0 # Pr.01-00 range, p. 406 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 COM1 Modbus Transmission Fault Treatment default is 3 = "No warning, # no fault and continue operation" and 09-03 time-out detection default is # 0.0 = disabled, so a factory-default C2000 Plus 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 # 0x2226 bit 4 is the manual's own "Motor drive did output" flag (p. 1273) — # an unambiguous single bit, unlike 0x2101 whose bits 1-0 are a 2-bit state # where no single bit means "running". [running_check] register = 0x2226 bit = 4 # p. 1268 states 0x2100 explicitly: "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 code list, pp. 600-607, transcribed complete. Codes the manual # leaves unlisted 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 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 heatsink 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)" 25 = "INTR interrupt error" 26 = "ot1 over torque 1" 27 = "ot2 over torque 2" 28 = "uC under current" 29 = "LiT limit error" 30 = "cF1 EEPROM write error" 31 = "cF2 EEPROM read error" 33 = "cd1 U-phase error" 34 = "cd2 V-phase error" 35 = "cd3 W-phase error" 36 = "Hd0 current clamp hardware error" 37 = "Hd1 over-current hardware error" 38 = "Hd2 over-voltage hardware error" 39 = "Hd3 occ 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 wrong password entered three times, locked" 53 = "ccod SW code error" 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" 60 = "bF brake transistor error" 61 = "ydc Y-connection / delta-connection switch error" 62 = "dEb deceleration energy backup error" 63 = "oSL over slip error" 64 = "ryF electric valve switch 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" 71 = "WDTT watchdog" 72 = "STL1 STO loss 1" 73 = "S1 emergency stop for external safety" 75 = "Brk external brake error" 76 = "STO safe torque off" 77 = "STL2 STO loss 2" 78 = "STL3 STO loss 3" 82 = "OPHL output phase loss U phase" 83 = "OPHL output phase loss V phase" 84 = "OPHL output phase loss W phase" 85 = "AboF PG ABZ line off (PG-02U)" 86 = "UvoF PG UVW line off (PG-02U)" 87 = "oL3 overload protection at low frequency" 89 = "RoPd rotor position detection error" 90 = "FStp force to stop" 92 = "LEr pulse tuning Ld / Lq error" 93 = "TRAP CPU error 0" 101 = "CGdE CANopen guarding error" 102 = "CHbE CANopen heartbeat error" 104 = "CbFE CANopen bus off error" 105 = "CidE CANopen index error" 106 = "CAdE CANopen station address error" 107 = "CFrE CANopen memory error" 111 = "ictE InrCOM time-out error" 112 = "SfLK PM sensorless shaft lock error" 142 = "AUE1 auto-tune error 1 (no feedback current)" 143 = "AUE2 auto-tune error 2 (motor phase loss)" 144 = "AUE3 auto-tune error 3 (no-load current I0 measuring)" 148 = "AUE4 auto-tune error 4 (leakage inductance Lsigma measuring)" 164 = "Communication timeout between communication card and controller" 165 = "ECcb communication card disconnected" 171 = "oPEE over position error" 174 = "EcEr encoder error" 175 = "EcCe encoder communication error" 176 = "EcOF encoder multi-turn overflow" 177 = "EcNP encoder power off" 178 = "EcMc encoder multi-turn error" 179 = "PgMr PG multi-turn read error" 180 = "EcSc encoder single-turn error" 181 = "PgCe PG command error" 182 = "IPTE interpolation time error" 183 = "IPCM interpolation command failure" 184 = "NoMo no motion control" 185 = "MoTo motor code error" 187 = "FobF flux linkage observer failure" 188 = "TLAT load estimation error" 189 = "JsAT inertia estimation error" 190 = "BWAT bandwidth estimation error" 191 = "ATPF positioning failure during estimation" 192 = "HmOE homing deviation is too large" 193 = "CMTE cleaning multi-turn data failure" 195 = "ATTv ASR AT process is too short" # Pr.00-00 AC Motor Drive Identity Code (pp. 397, 459), read-only, an # enumeration of voltage class and kW — 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-54 = 0x0136) and 02 (digital I/O, up to 02-75 = # 0x024B) in Delta's GGnn hex layout (p. 1267: "the Modbus address of Pr.04-10 # is 040AH"). # # The group 02 range is SPLIT around the read-only members. Pr.02-50-02-54 # (0x0232-0x0236, terminal-status monitors) and Pr.02-70 (0x0246, IO Card # Types) are marked "Read only" on p. 414. 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, # "Data is written to read-only address") is for. The manual gives the same # warning itself on p. 657: "If the data is written to read-only parameters # from the upper unit, a communication error may occur." # # 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, 0x0136], [0x0200, 0x0231], [0x0237, 0x0245], [0x0247, 0x024B]]