# Property of PMA Electrical Solutions, LLC. # # Danfoss VLT SOFT STARTER MCD 500 — not a VFD. No speed reference, no reverse. # # COMMUNICATION PATH THIS PROFILE ASSUMES: the clip-on **MCD Modbus Module, # order code 175G9000**, which snaps onto the starter's comms port. Modbus is # NOT on the bare MCD 500 — the module carries the RS-485 port (terminals # B8 +, B7 GND, B6 -) and the register map below is the MODULE's map, not a # map of starter parameters. # # The other MCD 500 serial options are DIFFERENT maps and are NOT covered here. # The Modbus TCP Module 175G9914 (AN428736661763) adds a model-ID register at # 40601 that the clip-on module marks Reserved, and in its STANDARD Mode table # (§7.4.1) marks 40004 Reserved where the clip-on module has the trip code — # though its LEGACY Mode table (§7.5.1) puts the trip code back at 40004, so the # difference is mode-specific, not absolute. Note the order code: that document # states it "is suitable for use with 175G9914" and that "the register addresses # for status reporting differ for 175G9904 and 175G9914", referring you to the # local supplier for the 175G9904 manual — so 175G9904 is NOT described by any # document cited here. Do not use this profile with either TCP module. # # Sources — Danfoss primary only: # MG17F702 rev AQ265936451199en-000401 "MCD Modbus Module Instructions": # p.3 connection, Auto On / Hand On, par 3-2 Comms in Remote # p.3 comms-inactive trip behaviour (module Timeout) # p.4 supported function codes, readable/writable ranges # pp.5-7 register table 40002-40008 and 40600-40618 # p.8 trip code table with the MCD 201/202/500 applicability columns # p.9 worked examples (command, status, trip code, parameter access) # p.10 Modbus error codes # p.12 module settings: address, baud, parity, timeout ranges # MG17K802 "Operating Guide VLT Soft Starter MCD 500" (03/2018): # p.62 parameter list — the ORDER that fixes the parameter register map # pp.63+ parameter descriptions # # ADDRESSING. Danfoss prints these as Modicon 4xxxx holding-register numbers. # 0-based protocol address = number - 40001: # 40002 Command -> 1 # 40003 Status -> 2 # 40009 1st param -> 8 # 40604 Starter state-> 603 # MG17F702 never states the conversion outright. The ground for it is Danfoss's # own newer card: AQ277154312778 §5.2/§5.5.1 says Standard Mode "uses registers # defined in the Modbus Protocol Specification" and puts Command at 40001 — # and in that specification 40001 IS the first holding register, protocol # address 0. VERIFY THIS ON A BENCH BEFORE ARMING. It fails safe in both # directions: one high lands the command write on 40003 (read-only status, # Modbus error 03) and one low lands it on an unlisted register (error 02). # Neither is a start. # # DRIVE-SIDE SETUP — without these the starter monitors but will not run: # - Starter in AUTO ON mode. In Hand On it accepts no serial command, though # status monitoring still works. # - Links fitted on terminals 17-18 (Stop) and 25-18 (Reset). # - Parameter 3-2 Comms in Remote must NOT be "Disable Comms in Remote"; # with it disabled the starter rejects start/stop with error code 09 and # accepts only reset and monitoring. # - Module DIP switches set address, baud rate, parity and timeout. # # READ BOUNDARY: a multiple read that spans 40008/40009 returns Modbus error 05 # (MG17F702 p.4). This app reads points one or two registers at a time, so it # never spans it — but a hand-written batch read would. # # RESERVED HIGH BITS: the wide values in the 40600 block are 14-bit (currents, # voltage) or 10-bit (% FLC) with the top bits marked Reserved. This app has no # per-point mask, so those points are exposed raw. They read correctly while # the reserved bits are 0. name = "Danfoss VLT MCD 500 (soft starter)" vendor = "Danfoss" device_type = "soft_starter" verified = false probe_register = 2 # 40003 starter status — readable whenever the module is alive [connection] summary = "Fit the clip-on MCD Modbus Module 175G9000; the bare MCD 500 has no direct Modbus connection." warnings = ["Isolate line and control power before installing the communication module or wiring terminals.", "This profile does not match the MCD Modbus TCP modules, whose status register layout differs."] [[connection.methods]] id = "modbus_module_175g9000" title = "MCD Modbus Module 175G9000" transport = "serial" hardware = "option" port = "Module terminals B8 (+), B7 (GND), B6 (-)" connector = "Clip-on module screw terminals" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded RS-485 twisted pair with optional reference conductor" parts = ["Danfoss MCD Modbus Module 175G9000", "Insulated screwdriver", "Links for 17-18 Stop and 25-18 Reset"] wiring = [{ adapter = "D+ / B+", device = "B8 (+)", signal = "RS-485 positive" }, { adapter = "D- / A-", device = "B6 (-)", signal = "RS-485 negative" }, { adapter = "COM/GND", device = "B7 (GND)", signal = "RS-485 reference", required = false }] steps = ["Isolate the starter and snap module 175G9000 onto its communication port.", "Fit links 17-18 (Stop) and 25-18 (Reset) unless equivalent external contacts are correctly wired.", "Land the pair on B8/B6 with the shown polarity and the optional reference on B7.", "Set the module switches, restore power, put the starter in Auto On, and select the computer serial port."] setup = ["Set module DIP switches for address, baud, parity, and timeout.", "Set parameter 3-2 Comms in Remote so serial start/stop is accepted, and use Auto On mode."] warnings = ["Hand On mode permits monitoring but rejects serial commands.", "A missing Stop or Reset link prevents operation even when Modbus is healthy."] source = "Danfoss AQ265936451199en-000401 (MG17F702), pp. 3 and 12; MG17K802, pp. 62-80" # NOT SOURCED. The module is configured by DIP switch and MG17F702 p.12 gives # only the RANGES: 4800/9600/19200/38400, parity None/Odd/Even/10-bit, address # 0-31. No factory default is stated anywhere in the document. Read the DIP # switches off the module. The stop-bit count below is NOT a guess: p.2 states # the master must use 2 stop bits with no parity, 1 stop bit with odd or even. [serial] baudrate = 9600 parity = "N" stopbits = 2 [monitor] # 40003. Bits 0-3 are a STATE VALUE, not flags: 1 Ready, 2 Starting, 3 Running, # 4 Stopping (incl. braking), 5 Restart delay, 6 Tripped, 7 Programming mode, # 8 Jog forward, 9 Jog reverse. Only bits 4-7 are true flags, so only those are # named — decoding bits 0-3 as flags would report "Running" during a trip. starter_status = { address = 2, bits = { 4 = "PositivePhaseSeq (only valid if bit 6)", 5 = "CurrentExceedsFLC", 6 = "Initialised", 7 = "RemoteOperator/CommsDeviceFault" } } trip_code = { address = 3 } # 40005 is 8-bit and therefore saturates at 255 A; the MCD 500 range runs to # 1600 A. Use current_avg (40605, 14-bit) as the real reading. motor_current_8bit = { address = 4, unit = "A" } motor_temperature = { address = 5, unit = "%" } # 40006, motor 1 thermal model # 40007 bits 0-2 parameter list version, bits 3-7 product type code (7 = MCD 500). product_info = { address = 6 } protocol_version = { address = 7 } # 40008 # --- 40600 extended block (MCD 500 only; not present on MCD 200) --- # 40600 bits 0-5 binary protocol version, 6-8 parameter list version, # 9-15 product type code (7 = MCD 500). version = { address = 599 } # 40604. Again bits 0-4 are a state VALUE, so only the flag bits are named. # Bits 10-15 carry a 6-bit trip/warning code, which cannot represent 255 "no # trip" — that is why [faults] reads 40004 instead. starter_state = { address = 603, bits = { 5 = "Warning", 6 = "Initialised", 7 = "RemoteControl", 8 = "NoParametersChanged", 9 = "PositivePhaseSeq" } } current_avg = { address = 604, unit = "A" } # 40605, average rms, bits 0-13 current_pct_flc = { address = 605, unit = "%" } # 40606, bits 0-9 power_factor_pct = { address = 608, unit = "%" } # 40609, 100 = pf 1.00 voltage_avg = { address = 609, unit = "V" } # 40610, average rms, bits 0-13 phase1_current = { address = 610, unit = "A" } # 40611 phase2_current = { address = 611, unit = "A" } # 40612 phase3_current = { address = 612, unit = "A" } # 40613 param_list_version = { address = 616 } # 40617 # 40602 high byte = total number of parameters actually in this starter. The # CHECK BEFORE RESTORING note on [parameters] below tells the operator to # compare it against 106, so it has to be readable from this app — it was # named as a gate that nothing could actually perform. Reading 40602 is safe: # MG17F702 footnote 5 says only a read of 40603 resets 40602/40604, and this # profile deliberately does not map 40603. changed_param = { address = 601 } # 40602, high byte = param count digital_input_state = { address = 617, bits = { 0 = "Start", 1 = "Stop", 2 = "Reset", 3 = "InputA" } } # 40618 # # 40608 Power is deliberately absent. It packs a 2-bit exponent into bits 12-13 # (0 = x10 W, 1 = x100 W, 2 = kW, 3 = x10 kW) alongside a 12-bit mantissa, and # a fixed `scale` cannot decode that. A raw read would be off by up to 100x. # # 40607 is deliberately absent too: it packs motor 1 thermal model into the low # byte and motor 2 into the high byte. Motor 1 alone is already at 40006. # # SMALL FRAMES READ 10x HIGH: MG17F702 note 2 — on MCD5-0053B and smaller, the # AMPERE current registers report ten times the value shown on the LCP. Note 2 # is attached to 40005, 40605 and 40611-40613 only; 40606 is % FLC and is NOT # affected. There is no register that says which frame you are on, so this # cannot be corrected here. Divide by 10 by eye on those units. # 40002 Command. The whole register is a VALUE, not a bit mask: # 1 Start, 2 Stop, 3 Reset, 4 Quick stop (coast), 5 Forced communication trip, # 6 Start using Parameter Set 1, 7 Start using Parameter Set 2. # Reset is 3 and start is 1, so the reset value CANNOT be read as a start and # reset can safely share the command register. # 6/7 are deliberately unused: MG17F702 warns they misbehave unless the # programmable input is set away from Motor Set Select. # # A soft starter has no speed reference and no reverse: neither speed_register # nor run_rev is defined, so `control speed` and `control run_rev` refuse # rather than writing somewhere harmless-looking. [control] command_register = 1 step_delay = 0.05 stop = [2] run_fwd = [1] reset = [3] # The module has a Timeout DIP switch (None / 10 s / 60 s / 100 s). With a # timeout set, silence longer than it trips the starter on trip code 16 # "Network communication" and the starter then REQUIRES A RESET before it will # run again (MG17F702 p.3). With the switch on None there is no trip at all — # which is the worse case for control: a running motor keeps running with no # master attached. The DIP default is not documented, so keep the link fed. [control.watchdog] interval_ms = 1000 fault = "trip code 16 Network communication (module Timeout DIP; disabled when set to None)" # 40004 trip code, bits 0-7. Masked so a non-zero high byte cannot corrupt the # lookup. 255 means no trip — this map has no 0 = healthy. # Codes are the MG17F702 p.8 table filtered to the MCD 500 column. [faults] register = 3 mask = 0x00FF [faults.codes] 1 = "Excess start time" 2 = "Motor overload (thermal model)" 3 = "Motor thermistor" 4 = "Current imbalance" 5 = "Frequency (mains supply)" 6 = "Phase sequence" 7 = "Instantaneous overcurrent" 8 = "Power loss / power circuit" 9 = "Undercurrent" 10 = "Heatsink overtemperature" 11 = "Motor connection" 12 = "Input A trip" 13 = "FLC too high (FLC out of range)" 14 = "Unsupported option (not available in inside delta)" 15 = "Starter communication (module to soft starter)" 16 = "Network communication (module to network)" 17 = "Internal fault x — read the code at the LCP (70-72 current read err Lx, 73 power on in simulation, 74-76 motor connection Tx, 77-79 firing fail SCRx, 80-82 VZC fail Px, 83 low control volts, 84-98 internal fault X)" 26 = "L1 phase loss" 27 = "L2 phase loss" 28 = "L3 phase loss" 29 = "L1-T1 shorted" 30 = "L2-T2 shorted" 31 = "L3-T3 shorted" 33 = "Time-overcurrent (bypass overload) — internally bypassed models only" 35 = "Battery/clock" 36 = "Thermistor circuit" 255 = "No trip" # Parameters 40009 onwards. The FIRST product parameter is always 40009 # (protocol 8) and they run in MG17K802 p.62 list order, confirmed by the # module's own worked example: parameter 4 = 1-4 Current Limit at 40012. # That list is 106 parameters (16+12+8+16+4+4+16+9+8+13), so the block ends at # 40114 = protocol 113. # # CHECK BEFORE RESTORING: register 40602 high byte reports the total number of # parameters actually in the starter, and 40007 bits 0-2 / 40617 report the # parameter list version. If that count is not 106 this firmware has a # different list and every address below is shifted — do not restore. # # Deliberate holes: # protocol 36-37 = 3-1 Local/Remote and 3-2 Comms in Remote. Writing # "Disable Comms in Remote" mid-restore severs the link the restore is # running over, and the starter answers further commands with error 09. # protocol 93-100 = group 15 Restricted Parameters: 15-1 Access Code and # 15-2 Adjustment Lock would lock the panel out, and 15-4 Current # Calibration is a PER-UNIT calibration that must never be cloned. # # NO [rating] IS POSSIBLE. This map exposes no frame-size or rated-current # register — 40601 is Reserved on the clip-on module, and 40007/40600 give only # the product FAMILY code (7 = MCD 500), not the frame. Nothing here can catch # a 1600 A starter's configuration being pushed onto a 24 A unit. Read the type # label by eye before restoring. [parameters] ranges = [[8, 35], [38, 92], [101, 113]] # No [running_check]. "Running" on this starter is the VALUE 3 in bits 0-3 of # 40003, not a bit: bit 1 alone is also set by Starting (2), Tripped (6) and # Programming mode (7), so no single bit means running. Commands therefore come # back marked unverified, which is the honest answer. Read starter_status and # compare the low nibble to 3 by eye.