# Property of PMA Electrical Solutions, LLC. # # Danfoss VLT Refrigeration Drive FC 103 — built-in RS-485 (FC port, terminals # 68/69), no option card. Covers the FC 103 only. It shares the FC 100 platform # with the FC 102 (HVAC) and FC 202 (AQUA), but the application software is a # refrigeration/pack controller and the readout set is NOT the same — see the # per-model notes below. # # SOURCES — every section below was taken from an FC 103 document: # * MG16G202, Design Guide VLT Refrigeration Drive FC 103 1.1-90 kW, 08/2015 # p. 72 RS-485 defaults: 8-30 = FC*, 8-31 = 1*, 8-32 = 9600* # p. 79 Table 3.31 Modbus RTU parameters, 8-33 default # "Even parity, 1 stop bit" # pp. 81-82 Table 3.37 holding registers (50000/50010/50200/50210) and # the PNU -> "10 x parameter number" translation # p. 83 Table 3.41 control word bits (FC profile) # pp. 84-85 Table 3.44 status word bits + per-bit polarity text # p. 85 bus speed reference scaling, 16384 (0x4000) = 100% # * MG16H202, Programming Guide VLT Refrigeration Drive FC 103, 05/2016 # (all FC 103 converters, software version 1.x) # pp. 219-221 Table 5.1 alarm/warning code list # p. 221 Table 5.3 alarm word / warning word / ext. status word # p. 222 Table 5.4 compressor-specific alarms (alarm word 2) # p. 210 18-** parameter list: data type and conversion index # p. 204 8-** parameter list (8-04 default [0] Off, 8-54 default # [0] Digital input) # pp. 208-209 16-** and 18-** parameter lists: data type and conversion # index per parameter — the source of every `words` below # * MG92B102, Modbus RTU Operating Instructions (Danfoss FC series) # pp. 16-17 register addressing and 32-bit register pairing # # WHAT DIFFERS FROM THE FC 102, checked parameter by parameter against the two # 16-** lists (MG16H202 pp. 208-209 vs MG11CE02 pp. 235-236): # FC 103 has and FC 102 does not: 16-24 Calibrated Stator Resistance, # 16-31 System Temp., 16-41 LCP Bottom Statusline, 16-78/16-79 Analog Out # X45, 16-99 Ext. Status Word 3, and the whole 18-7* Rectifier Status group # (18-70/18-71/18-72/18-75) plus 18-57 Air Pressure to Flow. # FC 102 has and FC 103 does not: 16-26/16-27 Power Filtered [kW]/[hp] and # 16-43 Timed Actions Status. # Alarm word: the FC 103 table stops at bit 30 — there is no bit 31 # "Mech. brake low" on this drive, and its alarm word 2 carries three # compressor alarms the FC 102 does not have (bit 9 Discharge Temperature # High, bit 10 Start Failed, bit 11 Speed Limit). # # Wiring: terminal 68 (+P / TX+ RX+), 69 (-N / TX- RX-). Terminal 61 is the # RC-filtered screen point; connect only if you have EMC trouble. # # Drive-side setup: 8-30 Protocol = [2] Modbus RTU (the factory default is # [0] FC, MG16G202 p. 72), 8-31 Address, 8-32 Baud Rate, 8-33 Parity/Stop Bits. # For bus control also set 8-01 Control Site and 8-02 Control Source to the FC # port, and leave 8-10 Control Profile at [0] FC profile — the words below are # the FC profile, not PROFIdrive. The drive ACKs control-word writes and # ignores them while 8-01/8-02 still point at the terminals. # # ADDRESSING: MG16G202 p. 82 gives holding register = 10 x parameter number, # and the Modbus register addresses start at zero. So the 0-BASED WIRE ADDRESS # = parameter_number * 10 - 1. Par 16-13 -> 1613 -> 16130 -> wire 16129. # # WIDTH IS PER PARAMETER — see `words` on each point. MG16H202 pp. 208-209 # lists Uint16/Int16/V2 (1 register) next to Int32/Uint32 (2 registers). # Reading a 16-bit parameter as 2 registers splices in the neighbour and # breaks the running-state interlock. # # SCALE: the conversion index converts the raw value to the SI BASE unit, not # to the displayed unit. 16-10 Power [kW] carries index 1 (x10) because the # base unit is watts, hence 0.01 kW/count; 16-17 Speed [RPM] carries index 67 # (1/60) because the base unit is rev/s, so the raw value is already RPM. name = "Danfoss VLT Refrigeration Drive FC 103" vendor = "Danfoss" device_type = "vfd" verified = false probe_register = 16029 # 16-03 status word [connection] summary = "Use the FC 103's built-in two-wire RS-485 FC port on terminals 68 and 69." warnings = ["De-energize and prove the DC link discharged before opening the control compartment.", "Keep RS-485 wiring separated from motor and line wiring."] [[connection.methods]] id = "built_in_rs485" title = "Built-in RS-485 (68/69)" transport = "serial" hardware = "built_in" port = "Control terminals 68 (+P/TX+/RX+), 69 (-N/TX-/RX-), optional 61 screen/reference" connector = "3-pole RS-485 control plug" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded twisted-pair RS-485 cable" parts = ["Small insulated screwdriver", "120 ohm end termination or S801 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 RC-filtered reference", required = false }] steps = ["With power isolated, locate the FC-port terminal plug by the 68/69 markings.", "Wire positive to 68 and negative to 69; connect the optional reference only when required by the installation.", "Enable termination only when this drive is one of the two physical bus ends.", "Close the enclosure, restore power, and select the computer adapter's serial port."] setup = ["Set 8-30 = 2 Modbus RTU, 8-31 Address, 8-32 Baud Rate, and 8-33 Parity/Stop Bits.", "For control, select the FC port in 8-01/8-02 and retain the FC profile in 8-10."] warnings = ["Factory protocol is FC, not Modbus RTU.", "A readable bus does not prove the drive is accepting commands from the FC port."] source = "Danfoss MG16G202, pp. 74 and 79; MG92B102, pp. 8-10" # MG16G202 p. 72 marks 8-32 = 9600 as the default; p. 79 marks 8-33 = Even # parity, 1 stop bit as the default. Not 8N1. [serial] baudrate = 9600 parity = "E" stopbits = 1 [monitor] # --- 16-bit parameters (words = 1) — MG16H202 pp. 208-209 --- control_word = { address = 15999 } # 16-00, V2 reference_pct = { address = 16019, signed = true, scale = 0.1, unit = "%" } # 16-02, Int16, idx -1 # 16-03 status word, V2 (16-bit). Polarity from MG16G202 pp. 84-85, read off # the polarity column: bit 2 = 1 means ENABLED (0 = coasting), bit 10 = 1 means # the output frequency is WITHIN the limits (0 = outside). 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 = "StoppedAutoStart", 13 = "VoltageExceeded", 14 = "TorqueExceeded", 15 = "TimerExceeded" } } motor_voltage = { address = 16119, scale = 0.1, unit = "V" } # 16-12, Uint16, idx -1 output_frequency = { address = 16129, scale = 0.1, unit = "Hz" } # 16-13, Uint16, idx -1 motor_thermal = { address = 16179, unit = "%" } # 16-18, Uint8, idx 0 torque_pct = { address = 16219, signed = true, unit = "%" } # 16-22, Int16, idx 0 dc_link_voltage = { address = 16299, unit = "V" } # 16-30, Uint16, idx 0 heatsink_temp = { address = 16339, unit = "C" } # 16-34, Uint8, idx 100 inverter_thermal = { address = 16349, unit = "%" } # 16-35, Uint8, idx 0 control_card_temp = { address = 16389, unit = "C" } # 16-39, Uint8, idx 100 # 18-7* Rectifier Status — FC 103 only, no equivalent in the FC 102 list. # # 18-70 Mains Voltage is OMITTED: it is an ARRAY parameter, not a scalar. # MG16H202 p. 126: "Array values: 0: Average, 1: Phase R to S, 2: Phase S to T, # 3: Phase T to R." A Danfoss Modbus telegram cannot carry an array index — both # MG16G202 §3.9.11.3 and MG92B102 §4.1.15 require WRITING the index to holding # register 9 first, and register 9 is bus-global state that resets only on a # power cycle. So this point usually returns the average, but any other master # on the segment (or an earlier indexed access by this one) silently leaves it # reading a single phase pair instead — a wrong number that looks right. This # schema has no way to express the index handshake. 18-71 and 18-72 below are # genuine scalars and are unaffected. mains_frequency = { address = 18709, signed = true, scale = 0.1, unit = "Hz" } # 18-71, Int16, idx -1 mains_imbalance = { address = 18719, scale = 0.1, unit = "%" } # 18-72, Uint16, idx -1 # --- 32-bit parameters (words = 2) — MG16H202 pp. 208-209 --- power_kw = { address = 16099, words = 2, scale = 0.01, unit = "kW" } # 16-10, Int32, idx 1 (base W) motor_current = { address = 16139, words = 2, scale = 0.01, unit = "A" } # 16-14, Int32, idx -2 torque_nm = { address = 16159, words = 2, signed = true, scale = 0.1, unit = "Nm" } # 16-16, Int32, idx -1 motor_speed = { address = 16169, words = 2, signed = true, unit = "rpm" } # 16-17, Int32, idx 67 (base rev/s) # 16-31 System Temp. is FC 103-specific and would be the obvious refrigeration # readout, but MG16H202 p. 208 types it Int8, and MG92B102 p. 17 maps a signed # 8-bit parameter into a register as 0x00 followed by the byte. A pack-side # temperature below 0 C therefore arrives as 0x00F5, which neither the signed # nor the unsigned decoder recovers. Omitted rather than shipped reading 245 C. # # 16-05 Main Actual Value [%] and 16-15 Frequency [%] are omitted for the same # reason as on the FC 102: both are type N2 (0x4000 = 100%), which contradicts # the conversion index printed beside them. [control] command_register = 49999 # holding register 50000 CTW, MG16G202 p. 81 speed_register = 50009 # holding register 50010 REF # MG16G202 p. 85: the reference is a relative value in %, 16384 (0x4000) = # 100% of par 3-03 Maximum Reference. It is NOT Hz. speed_scale = 0.006103515625 speed_unit = "%" max_ref = 100.0 step_delay = 0.05 # From Table 3.41 (MG16G202 p. 83): bit 2 Ramp, 3 No coasting, 4 Ramp (no quick # stop), 5 Use ramp, 10 Data valid = 0x043C. Bit 6 = Start. stop = [1084] # 0x043C run_fwd = [1084, 1148] # 0x043C then 0x047C # Bit 7 Reset is edge-triggered ("activated on the signal's leading edge", # MG16G202 p. 83), so reset is a rising edge and then back to the stop word. # 0x04BC is not a run command: bit 6 stays 0. reset = [1212, 1084] # 0x04BC then 0x043C # run_rev is deliberately absent. MG16G202 p. 84: "In the default setting, # reversing is set to digital in parameter 8-54 Reversing Select. Bit 15 causes # reversing only when [1] Bus, [2] Logic AND or [3] Logic OR is selected", and # MG16H202 p. 204 confirms the 8-54 factory default is [0] Digital input. A bus # "reverse" therefore runs the motor FORWARD. Set 8-54 = [1] Bus and add # run_rev = [1084, 33916] if you actually need it. # 8-04 Control Timeout Function defaults to [0] Off (MG16H202 p. 204), so a run # command followed by silence leaves the compressor running with no master # attached. Set 8-03 and 8-04 to get Alarm 17. [control.watchdog] interval_ms = 500 fault = "Alarm 17 Control word timeout (requires 8-04 to be configured; default Off)" [running_check] register = 16029 # 16-03 status word, V2 = 16-bit words = 1 bit = 11 # 11 = 1 -> In operation (MG16G202 p. 85) # 16-36 Inv. Nom. Current, Uint32, conversion index -2 (MG16H202 p. 209). # Read as 2 registers: a 32-bit rating read as one word returns the high half, # 0 on any small frame, which compares equal to every saved source and waves a # restore through. [rating] register = 16359 words = 2 scale = 0.01 unit = "A" label = "Inverter nominal current (16-36)" # 16-90 Alarm Word is Uint32 (MG16H202 p. 209) and a BITFIELD, not an enum. # # Bit names are Table 5.3, MG16H202 p. 221. That table ends at bit 30: unlike # the FC 102, the FC 103 documents no bit 31, so none is claimed here. # MG16H202 p. 222 Table 5.5 also claims to describe 16-90 and disagrees with # Table 5.3 at bit 23 ("Control voltage fault") and bit 28 ("Earth fault # DESAT"), and blanks bits 0/3/6/13/18. Table 5.3 is used because its names # line up with the alarm code list on pp. 219-221 (A47 24 V supply low, A67 # Option configuration has changed). Confirm bits 23 and 28 on hardware. # # 16-91 Alarm Word 2 is NOT decoded here. On this drive it carries the # compressor alarms (bit 9 Discharge Temperature High, bit 10 Start Failed, # bit 11 Speed Limit, MG16H202 p. 221 Table 5.4) plus the service-trip bits # from Table 5.6, and the two tables in the same book do not agree on the rest # of the word. A second bitfield register is not representable here anyway. # # 16-92 Warning Word is NOT included as history: its layout diverges from the # alarm word at bits 12, 13, 15, 17, 19-21 and 25-27 (bit 12 is "DC voltage # low" warning vs "short circuit" alarm), so these names would mislabel it. [faults] register = 16899 # 16-90 alarm word words = 2 bitfield = true bits = { 0 = "BrakeCheck", 1 = "PowerCardTemp", 2 = "EarthFault", 3 = "CtrlCardTemp", 4 = "CtrlWordTimeout", 5 = "OverCurrent", 6 = "TorqueLimit", 7 = "MotorThermistorOverTemp", 8 = "MotorETR_OverTemp", 9 = "InverterOverloaded", 10 = "DCUnderVoltage", 11 = "DCOverVoltage", 12 = "ShortCircuit", 13 = "InrushFault", 14 = "MainsPhaseLoss", 15 = "AMA_NotOK", 16 = "LiveZeroError", 17 = "InternalFault", 18 = "BrakeOverload", 19 = "U_PhaseLoss", 20 = "V_PhaseLoss", 21 = "W_PhaseLoss", 22 = "FieldbusFault", 23 = "Supply24V_Low", 24 = "MainsFailure", 25 = "Supply1V8_Low", 26 = "BrakeResistor", 27 = "BrakeIGBT", 28 = "OptionChange", 29 = "DriveInitialized", 30 = "SafeStop" }