# Property of PMA Electrical Solutions, LLC. # # Danfoss VLT HVAC Basic Drive FC 101. # # FC 111 COVERAGE: the VLT HVAC Basic Drive FC 111 (marketed as VLT Flow Drive # FC 111; it is the FC 101 platform with the built-in cascade controller) has # no register documentation of its own. Its Operating Guide # AQ304735638503en-0001 / 130R0265, 2020.02, software 4.4x, §1.3.1 p. 6 states # outright that "The VLT HVAC Basic Drive FC 101 Programming Guide provides # information on how to program and includes complete parameter descriptions" # and that the FC 101 Design Guide "provides all technical information". Its # own parameter list (group 8 on p. 46, group 16 on p. 47) carries the same # parameters used below. That vendor statement is the only basis for the FC 111 # claim here — no FC 111 register table was found, and none appears to exist. # # ONE CAVEAT ON THE FC 111 HALF: its parameter list is a SUPERSET, adding 16-97 # Alarm Word 3, 16-98 Warning Word 3, 15-31 InternalFaultReason and 16-26/16-27 # Power Filtered, none of which exist in MG18B522. So the FC 111 runs newer # firmware (4.4x) than the programming guide this profile's bit tables come from # (4.2x). Nothing shipped below is FC 101-only — the cascade group 25 and the # BACnet 8-7* group are pure additions — but the 16-90 alarm-word bit table was # verified against the FC 101 only. Bits 30 and 31 being unassigned on 4.2x is # not proof they are unassigned on 4.4x. # # Sources (primary vendor documentation only): # MG18B522 VLT HVAC Basic Drive FC 101 Programming Guide, 05/2018. # pp. 64-65 (8-30/8-32/8-33 descriptions and protocol defaults), # 103-104 (alarm/warning code list), 106 (Table 4.3 alarm words), # 111 (conversion-index table), 117 (group 8 defaults), # 121-122 (group 16 parameter list with type + conversion index). # AJ275648114271en-001201 / 130R0222 VLT HVAC Basic Drive FC 101 Design # Guide, 2025.07. pp. 116-117 (coil map, FC-profile control and # status word), 117-118 (Address/Registers, the -1 footnote), # 119 (PCD write/read register map), 120 (par*10 rule), # 128-132 (FC profile control word and status word bit meanings), # 132 (bus speed reference scaling). # # Drive-side setup: 8-30 Protocol = [2] Modbus RTU (factory default is [0] FC). # Then 8-31 Address, 8-32 Baud Rate, 8-33 Parity. 8-01 Control Site defaults to # [0] Digital and ctrl.word and 8-02 Control Source to [1] FC Port, so the port # already accepts a bus control word. There is NO 8-10 on this drive — the FC # control profile is the only profile, so nothing selects it. # # SERIAL DEFAULTS ARE NOT 9600 LIKE THE FC 202. MG18B522 p. 64 lists 8-32 # "[3] 19200 Baud — Default setting for Modbus RTU", under the note "Default # refers to the FC protocol. Changing the protocol in parameter 8-30 may change # the baud rate." The 9600 figure people quote is the FC-protocol default. # # PARITY IS ASSUMED, NOT SOURCED. MG18B522 p. 65 lists 8-33's options with NO # default asterisk and the parameter list on p. 117 gives it as ExpressionLimit, # so this drive's books state no 8-33 default at all. Even/1 stop below is the # Danfoss family convention (the FC 51 marks "[0] * Even Parity" explicitly). # Wrong parity means no comms rather than a wrong write, and the value is # overridable at connect time, but it is an assumption — read 8-33 on the unit. # # ADDRESSING: parameter registers follow the classic FC rule. Design guide # p. 120: "The parameter number is translated to Modbus as (10 x parameter # number) decimal ... holding register 3120 holds [par 3-12]", and the # Address/Registers footnote on p. 118: "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. Plain register # table, not 4xxxx PLC notation. # # THE CONTROL WORD IS NOT AT 50000 ON THIS DRIVE. Neither FC 101 design guide # revision documents the FC 202's 50000/50010/50200/50210 block. What the # current design guide documents (Figure 114, p. 119) is the PCD area: holding # register 2810 = CTW, 2811 = REF, 2910 = STW, 2911 = MAV, with those four # fixed (shown grey, "not changeable, they are default values") regardless of # 8-42/8-43. The numbers in that figure are register NUMBERS, not wire # addresses — same document, Table 58 pp. 117-118, columns "Bus address 0 | # Bus register 1 | PLC register 40001" with the footnote "Value written in the # Modbus RTU telegram must be 1 or less than the register number." Minus one, # that is wire 2809/2810/2909/2910 — which is what [control] uses below. Do not # substitute 49999 on the strength of the FC 202 profile; it is undocumented # here. # # THIS IS SINGLE-SOURCED WITHIN FC 101 DOCUMENTATION, and it is the top item to # confirm on hardware. MG18B522 has no Modbus chapter at all — its contents jump # from group 30 to the parameter lists — so Figure 114 in the 2025 design guide # is the only FC 101 statement of the process-data block. Outside FC 101 # documentation it is corroborated twice: MG92B102 §5.1 lists "2810 Control # word / 2811 Reference" as a supported Modbus control method for the FC # platform and recommends it over the 50000 block, and the FC 51 design guide # MG02K402 p. 82 prints the identical figure under the heading "Lower Register # Numbers". If the off-by-one were wrong in the other direction, 0x043C would # land in REF and the speed raw in CTW, where 0x4000 has bit 3 = 0 (coast) and # bit 10 = 0 (data invalid) — so the drive coasts or ignores rather than running # away, and command read-back verification catches it. # # WIDTH IS PER PARAMETER and the FC 101 widths DIFFER FROM BOTH the FC 202 AND # the FC 51. Here 16-12 Motor Voltage, 16-13 Frequency and 16-30 DC Link # Voltage are Uint32 while 16-14 Motor Current and 16-22 Torque % are 16-bit # (MG18B522 pp. 121-122) — the FC 202 has that split the other way round. # Scales come from the conversion-index column against the table on p. 111 # (index 100 = factor 1, -1 = 0.1, -2 = 0.01, -3 = 0.001). name = "Danfoss VLT HVAC Basic FC 101 / FC 111" vendor = "Danfoss" device_type = "vfd" verified = false probe_register = 16029 # 16-03 status word [connection] summary = "Use the built-in FC-port RS-485 terminals; no communication option card is required." warnings = ["Isolate mains and DC-link power and prove the drive dead before opening the control-terminal cover.", "Keep the RS-485 cable away from motor and mains conductors; terminate only the two physical ends of the bus."] [[connection.methods]] id = "built_in_rs485" title = "Built-in RS-485 (terminals 68/69)" transport = "serial" hardware = "built_in" port = "Main control board terminals 68 (P, TX+/RX+), 69 (N, TX-/RX-), and optional 61 common/screen" connector = "Drive control-terminal block" adapter = "Isolated USB-to-RS-485 adapter with D+/D- terminals" cable = "Shielded RS-485 twisted pair; add a reference conductor only when required" parts = ["Small insulated screwdriver", "120 ohm end termination when this drive is at a bus end"] wiring = [{ adapter = "D+ / B+", device = "68 (P, TX+/RX+)", signal = "RS-485 positive" }, { adapter = "D- / A-", device = "69 (N, TX-/RX-)", signal = "RS-485 negative" }, { adapter = "COM/GND", device = "61", signal = "Optional RS-485 reference/screen point", required = false }] steps = ["With power isolated, open the control-terminal cover and locate 68, 69, and 61 by their printed markings.", "Land the positive and negative pair exactly as shown; connect the optional reference only when the installation requires it.", "Route the shielded pair separately from power wiring, then close the cover before restoring power.", "Connect the USB adapter to the computer and select its serial port in PMA-VFD."] setup = ["Set 8-30 Protocol = 2 (Modbus RTU), then set 8-31 Address, 8-32 Baud Rate, and 8-33 Parity/Stop Bits.", "For command control, set 8-01 Control Site and 8-02 Control Source to accept the FC port; this profile uses the FC control profile."] warnings = ["The FC 101 manual does not publish an 8-33 factory default; confirm parity on the keypad instead of assuming it.", "A drive can answer reads while ignoring commands when its control source is not the FC port."] source = "Danfoss AJ275648114271en-001201, pp. 103 and 116-120; MG18B522, pp. 64-65" [serial] baudrate = 19200 parity = "E" stopbits = 1 [monitor] # --- 16-bit parameters (words = 1) --- 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, design guide Table 79 pp. 130-131. 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" } } motor_current = { address = 16139, scale = 0.01, unit = "A" } # 16-14 Uint16, conv -2 motor_thermal = { address = 16179, unit = "%" } # 16-18 Uint8 torque_pct = { address = 16219, signed = true, unit = "%" } # 16-22 Int16 heatsink_temp = { address = 16339, signed = true, unit = "C" } # 16-34 Int8, conv 100 = factor 1 inverter_thermal = { address = 16349, unit = "%" } # 16-35 Uint8 # --- 32-bit parameters (words = 2) --- power_kw = { address = 16099, words = 2, scale = 0.001, unit = "kW" } # 16-10 Uint32, conv -3 motor_voltage = { address = 16119, words = 2, scale = 0.1, unit = "V" } # 16-12 Uint32, conv -1 output_frequency = { address = 16129, words = 2, scale = 0.1, unit = "Hz" } # 16-13 Uint32, conv -1 # 16-16 is torque in Nm at conversion index 0 — whole Nm on this drive, not the # FC 202's 0.1 Nm. Percent is 16-22 above. torque_nm = { address = 16159, words = 2, signed = true, unit = "Nm" } # 16-16 Int32 motor_speed = { address = 16169, words = 2, signed = true, unit = "rpm" } # 16-17 Int32 dc_link_voltage = { address = 16299, words = 2, unit = "V" } # 16-30 Uint32 [control] command_register = 2809 # holding register 2810, CTW (design guide p. 119) speed_register = 2810 # holding register 2811, REF # Design guide p. 132: 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, design guide Table 76 p. 128. 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 deliberately absent. Design guide p. 130: bit 15 reverses only # when 8-54 Reversing Select is set to serial, and MG18B522 p. 117 gives 8-54 a # factory default of [0] Digital input — so on a default FC 101 a "reverse" # command silently runs the motor FORWARD. (The FC 51 differs: its 8-54 # defaults to Logic OR.) Set 8-54 and add run_rev = [1084, 33916] if needed. # Alarm 17 "Control word time-out" (MG18B522 p. 103) fires only when 8-04 # Control Timeout Function is NOT [0] Off — and [0] Off is the factory default # (MG18B522 p. 117), 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, MG18B522 p. 122), not an enum # — several bits can be set at once, so there is no code table to look up. # # The FC 101 layout is NOT the FC 202 layout and NOT the FC 51 layout: bit 0, # 3, 6, 13, 18, 22, 24, 26, 27, 30 and 31 are unassigned here, bit 23 is a # control-voltage fault and bit 25 a VDD1 supply fault. Copying either sibling # profile's names would mislabel those. # # 16-92 Warning Word is deliberately not decoded with these names: MG18B522 # p. 106 shows it diverging at bits 12, 15, 17, 23, 25, 26 and 28 (bit 15 is # "No Motor" as a warning vs "AMA Not OK" as an alarm). [faults] register = 16899 # 16-90 alarm word words = 2 bitfield = true bits = { 1 = "PowerCardTemp", 2 = "EarthFault", 4 = "CtrlWordTimeout", 5 = "OverCurrent", 7 = "MotorThermistorOverTemp", 8 = "MotorETR_OverTemp", 9 = "InverterOverloaded", 10 = "DCUnderVoltage", 11 = "DCOverVoltage", 12 = "ShortCircuit", 14 = "MainsPhaseLoss", 15 = "AMA_NotOK", 16 = "LiveZeroError", 17 = "InternalFault", 19 = "U_PhaseLoss", 20 = "V_PhaseLoss", 21 = "W_PhaseLoss", 23 = "ControlVoltageFault", 25 = "VDD1SupplyLow", 28 = "EarthFault2", 29 = "DriveInitialized" } # 16-36 Inverter nominal current, Uint16, conversion index -2 (MG18B522 p. 122). [rating] register = 16359 scale = 0.01 unit = "A" label = "Inverter nominal current (16-36)"