# Property of PMA Electrical Solutions, LLC. # # Delta CH2000 heavy-duty vector control drive, embedded RS-485 (COM1). # # COVERAGE — the VFD...CH23A / CH43A / CH4EA family only (frames A–H, # printed p. 9). NOT CLAIMED: C2000, C2000 Plus, C2000-HS, CP2000, MS300, # MH300, MX300. Delta fault numbering differs between families — the MS300 # profile header records what a cross-family fault table cost. Every code # below was transcribed from THIS manual's own Pr.06-17 table. # # SOURCES — Delta CH2000 Series User Manual, DELTA_IA-MDS_CH2000_UM_EN_20251030 # (downloadcenter.deltaww.com, Download Center DID 1185), 1260 pp. # PRINTED page = PDF page - 9. Citations below are PRINTED pages. # p. 358 Pr.00-00 AC Motor Drive Identity Code # p. 363 Pr.00-20 / Pr.00-21 command and frequency source lists # p. 389-392 Pr.06-17 Fault Record 1 — the complete fault code table # p. 401 Group 09 summary: 09-01 baud, 09-02/09-03 comm-loss, 09-04 # p. 461 Pr.01-00 Maximum Operation Frequency 0.00-599.00 Hz # p. 619 Pr.09-30 Communication Decoding Method # p. 1232-1233 Address list; control command block 20xx # p. 1234-1237 Status monitor 21xx / 22xx (220EH IGBT temperature is on 1237) # # DRIVE-SIDE SETUP: 00-20 Master Frequency Command Source = 1 (RS-485 comm # input), 00-21 Operation Command Source = 2 (RS-485 comm input), 09-00 node # address, 09-01 baud, 09-04 protocol = 12 (8,N,1 RTU). THE FACTORY DEFAULT # 09-04 IS 1 = 7,N,2 ASCII — the [serial] block below describes the drive # AFTER 09-04 has been set to 12, not as it ships (p. 401). # # Pr.09-30 Communication Decoding Method defaults to 1 (60xx), but that switch # only moves the COMMUNICATION CARD's addresses. The manual's own table spans # both columns for RS-485: "Control Source / RS-485 -> Refer to address: # 2000h-20FFh" (p. 619). The 20xx block below is therefore correct at either # setting of 09-30. # # Delta documents these as hex addresses that are already 0-based; parameter # Pr.GG-nn is register 0xGGnn (p. 1232, "the Modbus address of Pr.04-10 is # 040AH"). name = "Delta CH2000" 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 CH2000 User Manual, PDF p. 101 (SG+/SG- and RJ45 pinout), printed pp. 401 and 619 (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 CH2000 User Manual, PDF p. 101 (SG+/SG- and RJ45 pinout), printed pp. 401 and 619 (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 [serial] baudrate = 9600 parity = "N" stopbits = 1 [monitor] # p. 1234. Bits 1-0 are a 2-bit run state (00 stop, 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 decodes as an independent flag. # Bits 15-13 are a 3-bit HOA / LOC-REM field, likewise not flags. Only the # single bits are named here; read the register as hex for the rest. drive_status = { address = 0x2101, bits = { 2 = "Jog", 7 = "CtrlFromTerminals", 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. 1235: "XX.XX A. Decimal places can be referred by the high byte of 211F". # 211F itself is documented as bit9-8 = decimal point of the A page, and 2200H # shifts to XXX.X A above 655.35 A. CONFIG/FRAME-DEPENDENT on the large CH2000 # frames — confirm 211F on the unit before trusting 0.01. 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. Actual rpm is 0x210C. 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" } # The manual gives 210B as "XXX.X %" without stating a sign convention (the # signed torque it does document is 2208H). Left unsigned rather than guessed. output_torque = { address = 0x210B, scale = 0.1, unit = "%" } motor_speed = { address = 0x210C, unit = "rpm" } # p. 1235: 210F is "X.XXX kW" on this family — milliwatt-resolution, NOT the # 0.1 kW of the MS300/MX300. Copying that scale across would read 10000x low. output_power = { address = 0x210F, scale = 0.001, unit = "kW" } igbt_temperature = { address = 0x220E, scale = 0.1, unit = "degC" } [control] command_register = 0x2000 # p. 1233. 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 is bit 1 of 0x2002. reset_register = 0x2002 speed_register = 0x2001 speed_scale = 0.01 speed_unit = "Hz" # Pr.01-00 range (p. 461). The drive's own ceiling is whatever 01-00 is set to # (default 60.00 / 50.00), which is lower on any commissioned machine. max_ref = 599.0 step_delay = 0.05 stop = [0x0001] run_fwd = [0x0012] run_rev = [0x0022] reset = [0x0002] # bit 1 of 0x2002 # 09-03 COM1 Time-Out Detection defaults to 0.0 s (detection OFF) and 09-02 # COM1 Transmission Fault Treatment defaults to 3 = "No warning, no fault and # continue operation" (p. 401). At factory defaults the drive KEEPS RUNNING # when the master goes quiet; the keepalive below proves the link from this # side but is not a stop backstop until 09-02 and 09-03 are commissioned. [control.watchdog] interval_ms = 300 fault = "CE10 Modbus transmission time-out (fault 58) — only if 09-03 > 0.0 s and 09-02 = 1 or 2" backstop_requires_setup = true # Bit 0 of the 2-bit run state: set for 01b "stopping" (still decelerating, # motor turning) and 11b "running". Bit 0 is the conservative choice for "is # the shaft moving". # KNOWN BLIND SPOT — 2101H bits 1-0 are a 2-bit state and RunningCheck is a # SINGLE-BIT test, so no choice of bit covers all three non-stopped states. # Bit 0 reads 0 in 10b "standby" (run command held, RUN indicator ON, no # output). A drive sitting armed at zero output therefore reports Stopped, and # the restore precondition that consumes this will pass on it. Bit 1 would # swap the blind spot to 01b (motor still turning during decel), not remove it. # Do not treat a Stopped here as proof the drive is disarmed. OPEN FOR BENCH: # whether 2226H bit 4 ("motor drive did output", printed p. 1238) is set in # standby — if it is not either, the fix is a masked state test in core, not a # different bit in this file. [running_check] register = 0x2101 bit = 0 # p. 1234: bit7-0 is the FAULT code and bit15-8 the 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 -> 0x0611 - 0x0616. history = [0x0611, 0x0612, 0x0613, 0x0614, 0x0615, 0x0616] # Transcribed complete from the Pr.06-17 setting list, printed pp. 389-392. # Delta's numbering, not a sibling family's. [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 overload" 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 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" 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 = "PcodE wrong password entered three times, locked" 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 forced 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)" 171 = "oPEE over position error" 174 = "EcEr encoder error" 175 = "EcCe encoder communication error" 176 = "EcOF encoder multi-turn overflows" 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" 186 = "DDTO D2D communication time-out" 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" 196 = "EiTe encoder initialization error" 197 = "EiSe encoder signal error" 198 = "EpSe encoder power error" # Pr.00-00 AC Motor Drive Identity Code (read only, printed p. 358): a voltage # class and kW enumeration, so it is a genuine frame identity rather than a # motor-nameplate guard. Delta's own list is not contiguous (4, 5, ..., 55, # then 488-491), which is why the raw code is kept rather than a derived kW. [rating] register = 0x0000 words = 1 scale = 1.0 label = "AC motor drive identity code (Pr.00-00)" # 01-xx and 02-xx configuration groups, in Delta's 0xGGnn layout. Upper bounds # are the highest indices this manual's Chapter 11 summary documents: 01-54 # (0x0136) and 02-77 (0x024D). # 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. # THE GAPS IN 02-xx ARE READ-ONLY PARAMETERS, not oversights. Printed pp. # 503-508 mark 02-50, 02-51, 02-52, 02-53 and 02-54 "Default: Read only" # (02-54 additionally "0.00-599.00 Hz (Read only)") and 02-70 "Settings: Read # only". They report which source currently owns the terminals and the # frequency command, so they differ between donor and target on almost every # pair. Left in range they would read fine, plan a write, and NAK — landing in # RestoreResult::failed and reporting an otherwise-clean clone as a failure. # 0x0232-0x0236 = 02-50 - 02-54, 0x0246 = 02-70. [parameters] ranges = [[0x0100, 0x0136], [0x0200, 0x0231], [0x0237, 0x0245], [0x0247, 0x024D]]