# Property of PMA Electrical Solutions, LLC. # # Danfoss VLT Micro Drive FC 51 — the compact 0.18–22 kW drive. Claimed for the # FC 51 only; the FC 51 manuals cover no sibling model. # # Sources (primary vendor documentation only): # MG02C702 VLT Micro Drive FC 51 Programming Guide, 12/2014, software 3.1x. # pp. 37-40 (group 8 descriptions, incl. 8-54 option list and its # default asterisk on p. 39), 61 (group 8 defaults), # 62-63 (group 16 parameter list with type + conversion index), # 64-65 (alarm/warning code list), 66 (Table 6.3 alarm word bits). # MG02K402 VLT Micro Drive FC 51 Design Guide, 01/2016. # pp. 65 (RS485 terminals), 72-74 (Modbus config, coil map), # 75 (register addressing + par*10 rule), 80-82 (FC profile control # word and status word), 83 (bus speed reference scaling). # # Wiring: terminal 68 (P), 69 (N), 61 (COMM. GND). Bus termination is the S801 # DIP switch on the control card, not a parameter (MG02K402 p. 65). # # Drive-side setup: 8-30 Protocol = [2] Modbus RTU — the FACTORY DEFAULT IS # [0] FC, and MG02C702 p. 37 warns the change takes effect only after a power # cycle. Then 8-31 Address, 8-32 Baud Rate, 8-33 Parity. 8-02 Control Word # Source already defaults to [1] FC RS485 and 8-01 Control Site to [0] Digital # and ctrl.word, so no extra step is needed to accept a bus control word. # # SERIAL DEFAULTS ARE NOT 9600 LIKE THE FC 202. MG02C702 p. 37 lists 8-32 as # "[2] * 9600 Baud when choosing FC bus in 8-30" and "[3] * 19200 Baud when # choosing Modbus in 8-30" — selecting Modbus RTU moves the drive to 19200. # 8-33 defaults to [0] Even parity, 1 stop bit. Hence 19200 8E1 below. # # ADDRESSING: identical to the FC 202. MG02K402 p. 76: "The parameter number is # translated to Modbus as (10 x parameter number) decimal ... holding register # 3120 holds [par 3-12]", and the Address/Registers table footnote: "Value # written in the Modbus RTU telegram must be 1 or less than the register # number." So wire address = parameter_number * 10 - 1, e.g. 16-03 -> 1603 -> # 16029. This is a real register table, NOT 4xxxx PLC notation. # # WIDTH IS PER PARAMETER and the FC 51 widths DIFFER FROM THE FC 202. On the # FC 51, 16-10 Power, 16-12 Motor Voltage, 16-13 Frequency and 16-14 Motor # Current are all Uint16 (MG02C702 p. 62) where the FC 202 has 32-bit versions # of several of them. Reading these as 2 registers splices in the neighbouring # parameter. Widths and scales below come from the type and conversion-index # columns of that table (conversion index -2 means 0.01, -3 means 0.001). # # PROCESS DATA: the FC 51 documents CTW/REF/STW/MAV twice, and the choice below # is the weaker-supported of the two. The 50000 block is used because it needs # no software qualifier — but the table that carries it (MG02K402 Table 8.34) # sits inside §8.11.1, which opens "Set parameter 8-30 Protocol to [0] FC.", # while this profile's own setup note requires 8-30 = [2] Modbus RTU. The table # heading does say "Modbus Holding Register numbers", so it is ambiguous rather # than wrong. # # The 02810/02811/02910/02911 mirror is qualified "after software version 2.32" # (MG02K402 p. 80) — a qualifier already satisfied by the manual set cited here, # since MG02C702 is 12/2014 software 3.1x — and MG92B102 §5.1 states "Danfoss # recommends register 2810-2873 and 2910-2973 ... ensuring compatibility with # all controllers". On balance 2809/2810 is the better-supported path on any # unit running 2.32 or later; the FC 101 and FCP 106 profiles in this repo both # use it. Left at 50000 pending a bench check rather than swapped blind, since # an unresponsive control register is caught by read-back but a wrong one is # the failure this repo refuses. If 49999 does not answer, try 2809/2810. name = "Danfoss VLT Micro Drive FC 51" vendor = "Danfoss" device_type = "vfd" verified = false probe_register = 16029 # 16-03 status word [connection] summary = "Connect directly to the FC 51 control-card RS-485 terminals 68/69." warnings = ["Disconnect power and wait for the DC link to discharge before opening the terminal cover.", "Keep RS-485 cable apart from motor and mains wiring."] [[connection.methods]] id = "built_in_rs485" title = "Built-in RS-485 (68/69)" transport = "serial" hardware = "built_in" port = "Terminals 68 (P), 69 (N), 61 (COMM. GND); S801 termination" connector = "Control-card terminal plug" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded twisted-pair RS-485 cable with optional reference conductor" parts = ["Small insulated screwdriver", "S801 termination at a bus end"] wiring = [{ adapter = "D+ / B+", device = "68 (P)", signal = "RS-485 positive" }, { adapter = "D- / A-", device = "69 (N)", signal = "RS-485 negative" }, { adapter = "COM/GND", device = "61 (COMM. GND)", signal = "RS-485 reference", required = false }] steps = ["De-energize the drive and locate terminals 68, 69, 61, and switch S801.", "Land the pair on 68/69 with the shown polarity and use 61 only when a reference conductor is needed.", "Set S801 on only at one of the two trunk ends; its factory position is off.", "Close the cover, restore power, and select the USB-to-RS-485 serial port."] setup = ["Set 8-30 = 2 Modbus RTU and power-cycle; Modbus selection changes the default rate to 19200.", "Set 8-31 Address, 8-32 Baud, and 8-33 Parity; 8-02 defaults to FC RS485."] warnings = ["The protocol change takes effect only after a power cycle.", "Do not mistake the mini-USB-looking remote-keypad connector for a computer USB port."] source = "Danfoss MG02K402, pp. 65 and 67; MG02C702, pp. 37-40" [serial] baudrate = 19200 parity = "E" stopbits = 1 [monitor] # Every point here is a single 16-bit parameter — MG02C702 p. 62 lists no # 32-bit readout in group 16 on this drive except the alarm/warning words. control_word = { address = 15999 } # 16-00 Uint16 reference_pct = { address = 16019, signed = true, scale = 0.1, unit = "%" } # 16-02 Int16, conv -1 # 16-03 status word, Table 8.39 MG02K402 p. 82. Polarity is from the manual's # own bit-value columns: bit 2 = 1 means ENABLED (0 = coasting) and bit 10 = 1 # means the output frequency is WITHIN the 4-12/4-14 limits. status_word = { address = 16029, bits = { 0 = "CtrlReady", 1 = "DriveReady", 2 = "NotCoasting", 3 = "Trip", 4 = "ErrorNoTrip", 6 = "TripLock", 7 = "Warning", 8 = "SpeedEqRef", 9 = "BusControl", 10 = "WithinFreqLimits", 11 = "Running", 12 = "DriveOkStoppedAutoStart", 13 = "VoltageWarn", 14 = "CurrentLimit", 15 = "ThermalWarn" } } power_kw = { address = 16099, scale = 0.001, unit = "kW" } # 16-10 Uint16, conv -3 motor_voltage = { address = 16119, unit = "V" } # 16-12 Uint16, conv 0 — whole volts, not 0.1 V output_frequency = { address = 16129, scale = 0.1, unit = "Hz" } # 16-13 Uint16, conv -1 motor_current = { address = 16139, scale = 0.01, unit = "A" } # 16-14 Uint16, conv -2 motor_thermal = { address = 16179, unit = "%" } # 16-18 Uint8 dc_link_voltage = { address = 16299, unit = "V" } # 16-30 Uint16 heatsink_temp = { address = 16339, unit = "C" } # 16-34 Uint8 inverter_thermal = { address = 16349, unit = "%" } # 16-35 Uint8 [control] command_register = 49999 # holding register 50000, CTW (MG02K402 p. 80) speed_register = 50009 # holding register 50010, REF # MG02K402 p. 83: the reference is a relative value in %, 16384 (0x4000) = 100%. # It is NOT Hz. raw = value / scale, so 100% -> 16384. speed_scale = 0.006103515625 speed_unit = "%" max_ref = 100.0 step_delay = 0.05 # FC profile control word, MG02K402 p. 80 Table 8.36. 0x043C = bits 2,3,4,5 set # (no DC brake / no coast / no quick stop / use ramp) plus bit 10 (data valid). stop = [1084] # 0x043C run_fwd = [1084, 1148] # 0x043C then 0x047C (bit 6 start) reset = [1212, 1084] # 0x04BC bit 7 rising edge, then back to stop # run_rev is ABSENT, and the reason is a documented contradiction rather than a # settled default. It shipped as run_rev = [1084, 33916] on the strength of the # parameter list alone; that was not disclosed alongside the manual that says # the opposite, so it is withdrawn until a bench settles it. # # FOR bus reverse working out of the box: MG02C702 p. 39 lists 8-54 Reversing # Select as "[3] * LogicOr" (asterisk = default), and the parameter list on # p. 61 repeats [3] Logic OR. Corroborating, every 8-5x selector on the FC 51 # (8-50 through 8-56) defaults to [3] LogicOr, whereas the FC 101 singles 8-54 # out as [0] Digital input while its siblings are Logic OR — an asymmetry that # makes the FC 51 value look deliberate rather than a typo. # # AGAINST: MG02K402 p. 81, a page inside the range this profile already cites, # states "Bit 15=1: Reversing. In the default setting, reversing is set to # digital in parameter 8-54 Reversing Select. Bit 15 causes reversing only when # 1 of the following options is selected: [1] Bus, [2] Logic AND, [3] Logic OR." # # Weight of evidence is 2:1 for [3] LogicOr, but "reverse silently runs the # motor forward" is the specific failure this repo refuses to ship on a # verified = false map, and the iC2 profile has the identical conflict resolved # the same way. Read 8-54 on the unit; if it is [1], [2] or [3], add: # run_rev = [1084, 33916] # 0x043C then 0x847C (bit 15 reverse + bit 6 start) # Alarm 17 "Control word timeout" (MG02C702 p. 65) fires only when 8-04 Control # Word Timeout Function is NOT [0] Off — and [0] Off is the factory default # (MG02C702 p. 61), so a run command followed by silence leaves the motor # running with no master attached. [control.watchdog] interval_ms = 500 fault = "control word timeout (alarm 17, only if 8-04 is configured)" [running_check] register = 16029 # 16-03 status word, 16-bit bit = 11 # 16-90 Alarm Word is a 32-bit BITFIELD (Uint32, MG02C702 p. 63), not an enum — # several bits can be set at once, so there is no code table to look up. # # The FC 51 layout is NOT the FC 202 layout: bit 3 and bit 6 are unassigned # here, bit 28 is an M4/M5 desat earth fault rather than "option change", and # bits 22-25 and 30 are unused. Copying the FC 202 names would mislabel those. # # 16-92 Warning Word is deliberately not decoded with these names: MG02C702 # p. 66 shows it diverging at bits 0, 2, 6, 12, 15, 17, 19-21, 25-29 and 31 # (bit 6 is "Torque limit" as a warning, unassigned as an alarm). Bits 11 and 14 # are NOT divergent — Table 6.3 gives "DC over volt" and "Mains ph. loss" # identically in both words; they were listed here in error. [faults] register = 16899 # 16-90 alarm word words = 2 bitfield = true bits = { 0 = "BrakeCheck", 1 = "PowerCardTemp", 2 = "EarthFault", 4 = "CtrlWordTimeout", 5 = "OverCurrent", 7 = "MotorThermistorOverTemp", 8 = "MotorETR_OverTemp", 9 = "InverterOverloaded", 10 = "DCUnderVoltage", 11 = "DCOverVoltage", 12 = "ShortCircuit", 14 = "MainsPhaseLoss", 15 = "AMT_NotOK", 16 = "LiveZeroError", 17 = "InternalFault", 19 = "U_PhaseLoss", 20 = "V_PhaseLoss", 21 = "W_PhaseLoss", 26 = "BrakeResistorShort", 27 = "BrakeIGBT_Short", 28 = "EarthFaultDesat_M4M5", 29 = "DriveInitialized", 31 = "MechBrakeLow" } # 16-36 Inv. Nom. Current, Uint16, conversion index -2 (MG02C702 p. 62). [rating] register = 16359 scale = 0.01 unit = "A" label = "Inverter nominal current (16-36)"