# Property of PMA Electrical Solutions, LLC. # # Delta CP2000 — Fan/Pump Vector Control Drive, built-in RS-485 Modbus. # # COVERAGE — the CP2000 series only (VFD007CP23A/E … VFD6300CP63A; 230 V, 460 V, # 575 V and 690 V frames). NOT CLAIMED: C2000, C2000 Plus, CH2000, CT2000, # CFP2000, MS300, MH300, VFD-F, VFD-E, VFD-M. Delta's fault numbering and its # 21xx monitor layout differ between families — the MS300 profile's header # records what happened the last time a Delta map was carried across a family # boundary. Each family gets its own file, sourced from its own manual. # # SOURCE — Delta CP2000 User Manual DELTA_IA-MDS_CP2000_UM_EN_20250704 (EN, # 1106 PDF pages), downloadcenter.deltaww.com. In the parameter and appendix # chapters the PRINTED page = PDF page - 9; citations below are PRINTED pages. # p. 358 Pr.00-00 identity code / Pr.00-01 rated current display # p. 422 Pr.00-20 Master frequency source, Pr.00-21 Operation source # p. 431 Pr.01-00 Maximum Operation Frequency, 0.00-599.00 Hz # pp. 396-397 Group 09 setting summary and DEFAULTS (09-01 … 09-06, 09-30) # p. 584 Pr.09-30 decoding method table — RS-485 is always 20xx # pp. 525-528 fault-code table behind Pr.06-17 and 2100h (transcribed below) # p. 1081 parameter addressing GGnnH; 20xx control command table # p. 1082 2001h/2002h/2003h control registers # pp. 1083-1084 21xx status monitor table # pp. 1084-1087 22xx status monitor table (2226h Drive status is on p. 1086) # # ADDRESSING — Delta documents these as hex addresses that are ALREADY 0-based # protocol addresses (p. 1081: RTU read is "01h + 03h + 00xxh-26xxh"; the # address on the wire is the address in the table). Parameters are GGnnH, GG = # group and nn = the parameter number in hex — the manual's own worked example # is Pr.04-10 -> 040Ah (p. 1081). So Pr.06-17 -> 0611h. # # DRIVE-SIDE SETUP: # 00-20 = 1 Master frequency command source (AUTO) = RS-485 # 00-21 = 2 Operation command (AUTO) source = RS-485 # 09-00 node address (1-254, default 1) # 09-01 baud (default 9.6 kbps) # 09-04 = 12 protocol 8,N,1 RTU — THE FACTORY DEFAULT IS 1 = 7,N,2 ASCII # (p. 396). Out of the box this drive does not speak Modbus RTU # at all; 09-04 must be changed on the panel first. # 09-30 decoding method. Default is 1 (60xx), but p. 584 states the # RS-485 port uses 2000h-20FFh "regardless of decoding method 1 or # 2" — only CANopen and the option cards move to 60xx. This # profile therefore does not require 09-30 = 0. # AUTO vs HAND: 00-20/00-21 are the AUTO-mode sources. A multi-function input # or the KPC-CC01 keypad can switch the drive to HAND mode, where 00-30/00-31 # take over instead (p. 422) and this profile's commands are ignored. # # COMM-LOSS DEFAULTS ARE PERMISSIVE: 09-02 COM1 Modbus Transmission Fault # Treatment defaults to 3 = "No warning, no fault and continue operation", and # 09-03 Time-Out Detection defaults to 0.0 s = detection off (p. 396). The # keepalive below proves the link from our side; the DRIVE only trips CE10 # (fault 58) on silence once 09-03 is non-zero and 09-02 is 1 or 2. name = "Delta CP2000" 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."] 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 CP2000 User Manual, PDF p. 113 (SG+/SG- and RJ45 pinout), pp. 396 and 584 (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."] 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 CP2000 User Manual, PDF p. 113 (SG+/SG- and RJ45 pinout), pp. 396 and 584 (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/stopbits below are the 09-04 = 12 (8,N,1 RTU) # setting the drive must be moved to; its factory 09-04 = 1 is ASCII framing. [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # p. 1083. bits 1-0 are a 2-bit RUN/STOP 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 field decodes as a set # of independent flags. bits 15-13 are a 3-bit HOA / LOC-REM mode field for the # same reason. Only the single bits are named here; read this register as hex. drive_status = { address = 0x2101, bits = { 2 = "Jog", 7 = "CtrlByExtTerminals", 8 = "FreqFromComm", 9 = "FreqFromAnalog", 10 = "CmdFromComm", 11 = "ParamsLocked" } } frequency_command = { address = 0x2102, scale = 0.01, unit = "Hz" } output_frequency = { address = 0x2103, scale = 0.01, unit = "Hz" } # CONFIG-DEPENDENT SCALE. p. 1083: "Decimal places can be referred by the high # byte of 211Fh" (the field is 211Fh bits 9-8, p. 1084), and Pr.09-06 bit0 # (p. 396) selects between "decimal places depend on the size of the value" # (default) and "fixed 1 decimal place". 0.01 is the small-frame reading; on a # large CP2000 the same register reads XXX.X. Confirm 211Fh on the unit. 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" } # 2107h is the multi-step-speed STEP NUMBER (0 = main speed), not a speed. multistep_step = { address = 0x2107 } # 210Ah 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" } motor_speed = { address = 0x210C, unit = "rpm" } # p. 1084: "Drive's output power (X.XXX kW)" — three decimals. The M-series # documents one decimal at this same 210Fh address (the MH300 manual, its own # printed p. 1108, says XXXX.X kW), which is why each family is read out of its # own document. output_power = { address = 0x210F, scale = 0.001, unit = "kW" } igbt_temperature = { address = 0x220E, scale = 0.1, unit = "degC" } # p. 1085 digital_input_status = { address = 0x2210 } # p. 1085 digital_output_status = { address = 0x2211 } # p. 1085 # p. 1086. bits 1-0 are a 2-bit direction field (00 none, 01 FWD, 10 REV) and # bits 3-2 a 2-bit ready/error field (01 ready, 10 error) — again not # independent flags. bit4 (drive is outputting) and bit5 (alarm) are. drive_status_2 = { address = 0x2226, bits = { 4 = "Output", 5 = "Alarm" } } [control] command_register = 0x2000 # Fault reset is a DIFFERENT register. On 2000h bits 1-0 = 10b is RUN, so # writing 0x0002 there commands an unexpected start in the last direction. # 2002h bit1 = Reset (p. 1082). reset_register = 0x2002 speed_register = 0x2001 speed_scale = 0.01 # p. 1082, "XXX.XX Hz", two decimal places speed_unit = "Hz" max_ref = 599.0 # Pr.01-00 upper limit, p. 431 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 2002h [control.watchdog] interval_ms = 300 fault = "CE10 Modbus transmission time-out (fault 58) — only once Pr.09-03 is non-zero and Pr.09-02 is 1 or 2; the factory defaults (09-03 = 0.0 s, 09-02 = 3) leave the drive running on silence" # 2101h bits 1-0 = 01b (stopping/decelerating) or 11b (running) both set bit 0, # and both mean the motor is still turning. Standby (10b) and fully stopped # (00b) both clear it. This is the "shaft is moving" bit, not a clean run flag. # # BLIND SPOT — 10b "standby" reads as NOT RUNNING here, and p. 1083 defines it # as "RUN indicator is ON / STOP indicator flashes": the run command is held and # the drive is armed to accelerate the moment output is enabled. A single-bit # test cannot see that, so a restore precondition can pass on a drive that is # about to start. Bit 1 would only move the blind spot to deceleration. Treat # "not running" from this profile as "shaft not turning", never as "safe". [running_check] register = 0x2101 bit = 0 # p. 1083: "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 … Pr.06-22, Fault Record 1-6 -> 0611h … 0616h. history = [0x0611, 0x0612, 0x0613, 0x0614, 0x0615, 0x0616] # Transcribed complete from the Pr.06-23-06-26 fault-code table, printed # pp. 525-528 — the same numbering Pr.06-17 and 2100h report. CP2000 numbering # only; it is NOT the MS300 table (e.g. 5, 17, 19, 23, 24, 28 and everything # above 58 either do not exist there or mean something else). [faults.codes] 0 = "No fault" 1 = "ocA over-current during acceleration" 2 = "ocd over-current during deceleration" 3 = "ocn over-current during steady speed" 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)" 26 = "ot1 over torque 1" 27 = "ot2 over torque 2" 28 = "uC under current" 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 cc (current clamp) hardware error" 37 = "Hd1 oc (over-current) hardware error" 38 = "Hd2 ov (over-voltage) hardware error" 39 = "Hd3 occ hardware error" 40 = "AUE auto-tuning error" 41 = "AFE PID loss ACI" 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 firmware version 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 is not in the p. 525-528 table — Appendix B (printed p. 1096) records # "Delete fault codes 42-45 (PGFx), 62 (dEb)" from Chapter 14, yet Pr.06-17's # own description on printed p. 525 still says the drive "records fault code 62 # to Pr.06-17-Pr.06-22" when dEb executes. Kept so a 62 read is not blank; the # manual contradicts itself here and only a bench read settles it. 62 = "dEb deceleration energy backup (see note above)" 63 = "oSL over slip error" 64 = "ryF electric valve switch error" 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" 74 = "Fire FIRE mode output" 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" 87 = "oL3 overload protection at low frequency" 89 = "RoPd rotor position detection error" 90 = "FStp forced to stop" 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" 113 = "SWOC software over-current" 142 = "AUE1 auto-tuning error 1 (no feedback current)" 143 = "AUE2 auto-tuning error 2 (motor phase loss)" 144 = "AUE3 auto-tuning error 3 (no-load current I0 measuring)" 148 = "AUE4 auto-tuning error 4 (leakage inductance Lsigma measuring)" # Pr.00-00 AC Motor Drive Identity Code, read-only (p. 358): an enumerated # voltage-class/kW code (e.g. 621 = 690 V, 132 kW), so it is a real drive # identity rather than a motor-nameplate guard. Raw code, no scale. [rating] register = 0x0000 words = 1 scale = 1.0 label = "Drive identity code (00-00)" # Group 01 (basic: frequencies, accel/decel, V/F) and group 02 (digital I/O), # in Delta's GGnnH layout: 01-00…01-51 -> 0100h-0133h, 02-00…02-73 -> # 0200h-0249h. # 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. # READ-ONLY PARAMETERS ARE ALSO EXCLUDED. Printed p. 374 marks 02-50, 02-51, # 02-52, 02-53, 02-54 and 02-70 "Read only" — live MI/MO terminal state, the # PLC's terminal image, the external frequency command and the IO card type. # They read back fine, so a backup captures them, and they differ between donor # and target on nearly every clone; plan_restore would then queue a write the # drive NAKs and report a perfect restore as failed. Group 01 has no read-only # parameter. The gaps (02-36…02-49, 02-55…02-69, 02-71) simply do not exist. [parameters] ranges = [[0x0100, 0x0133], [0x0200, 0x0231], [0x0248, 0x0249]]