# Property of PMA Electrical Solutions, LLC. # # Danfoss VLT AutomationDrive FC 360 (0.37-75 kW). Claims the FC 360 only — # the manuals below cover no sibling model. MG06B402 covers frames J1-J7, # 0.37-75 kW; 90 kW appears only as a motor-power selection option value # ([25] 90 kW - 120 hp) in MG06C802, not as a documented FC 360 frame. # # Sources (printed page numbers, not PDF page index): # MG06C802 VLT AutomationDrive FC 360 Programming Guide, 12/2018 # pp. 78-80 parameters 8-3*/8-4*/8-5* and their defaults # pp. 121 data types and the conversion-index table # pp. 131-137 parameter list — the per-parameter WIDTH and # conversion index used by every point below # pp. 146-147 Table 6.3, alarm/warning/ext-status word bit layout # MG06B402 VLT AutomationDrive FC 360 Design Guide, 09/2014 # pp. 61-62 RS485 setup, FC and Modbus parameter settings # p. 68 the "-1" rule (40001 -> register 0000) # p. 69 address table, Bus address / Bus register / PLC # register columns and the "one or less than register # number" footnote # pp. 70-71 the "10 x parameter number" PNU rule # p. 74 Table 5.34, FC control profile control word # pp. 75-76 Table 5.37 status word and its per-bit explanations # p. 77 bus reference scaling, 16384 = 100% # MG92B102 FC-series Modbus RTU Operating Instructions (software 6.4x — # does NOT name the FC 360; used ONLY to disambiguate Danfoss's # register-number notation, never for an FC 360 register value) # §4.1.12 "Holding registers / Modbus Register Number" table # §5.2.3 artwork 130BC048, "Holding Register 2810 CTW" # # FIELDBUS: Modbus RTU and the Danfoss FC protocol are BOTH embedded on the # RS485 port (terminals 68 +P / 69 -N; switch S801 terminates the bus). No # option card is needed for either. Par 8-30 Protocol default is [0] FC, NOT # Modbus — this profile assumes 8-30 = [2] Modbus RTU, which must be set from # the LCP before the drive answers a Modbus master. (MG06C802 pp. 78, 131.) # # ADDRESSING: register = parameter_number * 10 - 1, where par 16-03 is the # integer 1603, so 1603 * 10 - 1 = 16029. MG06B402 pp. 70-71 state the PNU rule # ("translated to Modbus as (10 x parameter number) decimal") and p. 68 # states the -1 ("holding register 40001 is addressed as register 0000 ... # holding register 40108 is addressed as register 006Bhex (107 decimal)"), # with the address table on p. 69 tying bus address 9 to par 0-01. Same # formula as the classic FC 102/202/301/302, confirmed here from the FC 360's # own book rather than carried over. # # WIDTH IS PER PARAMETER — see `words` on each point. The FC 360 widths are # NOT the FC 202's: 16-12 Motor Voltage and 16-13 Frequency are Uint32 here # (16-bit on the FC 202), while 16-14 Motor current and 16-22 Torque [%] are # 16-bit here (32-bit on the FC 202). Reading either at the wrong width # splices in the neighbouring parameter. All widths below are from the # MG06C802 parameter list, pp. 136-137. # # CONTROL: the CTW/REF pair is at wire 2809/2810, NOT the classic FC family's # 50000/50010. That block comes from MG92B102, an operating instruction for # software 6.4x which does not name the FC 360, and is not claimed here. # # MG06B402 documents the control word and speed setpoint as a COIL map # (pp. 67-69, Tables 5.15-5.17): coils 1-16 control word, 17-32 setpoint, # 33-48 status word. This schema writes holding registers, not coils, so that # path is unusable. The holding-register path is par 8-42/8-43 PCD Write/Read # Configuration. MG06C802 p. 78: "If this parameter is active, addresses # 2810-2825 represent values of the 16 parameters. If this parameter is not # active, addresses 2810 and 2811 are used as input-data-drive control word # and bus reference." p. 81 gives the mirror: 2910 STW / 2911 MAV. # # THE ONE AMBIGUITY, AND HOW IT WAS RESOLVED. Danfoss writes "address" for # both the 1-based register number and the 0-based wire address, so that # sentence alone does not distinguish wire 2809/2810 from 2810/2811. An # off-by-one here would write the control word into the reference register. # Three Danfoss documents state that these particular numbers are holding # register NUMBERS: # - MG92B102 §4.1.12, table headed "Holding registers / Modbus Register # Number", lists 02810-02873 and 02910-02973 in the same column as the # 1-based 00010-00099 parameter group and 50000. # - MG92B102 §5.2.3 artwork 130BC048 labels the column "Holding Register — # 2810 CTW 8-42[0], 2811 REF 8-42[1]". # - FC 51 design guide MG02K402 p. 82, Table 8.35 "Lower Register Numbers": # "Modbus Holding Register numbers for Input data ... 02810 input data — # control word register (CTW), 02811 — bus reference (REF)". # The FC 360's OWN book then supplies the -1: MG06B402 p. 68 (40001 -> 0000) # and the p. 69 address table footnote, "Value written in Modbus RTU telegram # must be one or less than register number". Register 2810 -> wire 2809. # The cross-document step is deliberately confined to Danfoss's NOTATION; every # FC 360 register value below comes from the FC 360's own manuals. # # PRECONDITIONS. 8-42 and 8-43 must be INACTIVE — if either is configured for # PCD parameter mapping, 2810-2825 become those parameters and a control write # lands on whatever is mapped at index 0. MG92B102 §5.1 lists this block as one # of the three sanctioned Modbus RTU control methods and Danfoss recommends # 2810-2873/2910-2973 over 50000, so the FC-MC heading on group 8-4* does not # confine it to the FC protocol. # # READ-BACK CHECK BEFORE ARMING, and it costs nothing: whatever lands at the # CTW register is mirrored into 16-85 FC Port CTW at address 16849 (MG92B102 # §5.2.3; also 8-42 option [15] FC Port CTW). Write 0x043C to 2809 and read # 16849 — if it reads back 0x043C the address is right, and a stop word has # moved nothing. Do this before any run command. Still verified = false. # # REVERSE IS ABSENT. Control word bit 15 reverses only when par 8-54 Reversing # Select routes reversing to the bus, and the two primary books DISAGREE on its # default — MG06C802 p. 132 lists [3] Logic OR (bus reverse works), MG06B402 # p. 75 says "in the default setting, reversing is set to digital". Both pages # were re-checked; the contradiction is real. A reverse command is therefore # capable of silently running the motor FORWARD, which is the failure this repo # refuses to ship. Settle 8-54 on the unit, then add # run_rev = [1084, 33916] (0x847C) if it routes to serial. # # WATCHDOG: par 8-04 Control Timeout Function defaults to [0] Off # (MG06C802 p. 131), so a running drive that loses its master keeps running. # [control.watchdog] below keeps the link fed regardless; set 8-04 = [2] Stop # or [5] Stop and trip with 8-03 Control Timeout Time for a drive-side stop. name = "Danfoss VLT AutomationDrive FC 360" vendor = "Danfoss" device_type = "vfd" verified = false probe_register = 16029 # 16-03 status word [connection] summary = "Use the embedded RS-485 FC port at terminals 68/69; no option card is required." warnings = ["Isolate mains and DC-link power before working inside the drive.", "Keep the serial cable separated from motor and line cables."] [[connection.methods]] id = "built_in_rs485" title = "Built-in RS-485 (68/69)" transport = "serial" hardware = "built_in" port = "Terminals 68 (+P), 69 (-N), optional 61 common; termination switch S801" connector = "Control-terminal RS-485 plug" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded twisted-pair RS-485 cable" parts = ["Small insulated screwdriver", "S801 end termination when this is a bus endpoint"] 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", signal = "Optional RS-485 common", required = false }] steps = ["With the drive de-energized, locate the 68/69 RS-485 terminals and S801.", "Connect positive to 68 and negative to 69; add the optional common only when needed.", "Turn S801 on only if this drive is at a physical bus end.", "Close the drive, restore power, and connect/select the computer adapter."] setup = ["Set 8-30 = 2 Modbus RTU, then set 8-31 Address, 8-32 Baud Rate, and 8-33 framing.", "Before control, confirm 8-42/8-43 are inactive and route control to the FC port."] warnings = ["Factory protocol is FC, not Modbus.", "Mapped 8-42/8-43 process data can redirect writes away from the expected control word."] source = "Danfoss MG06B402, pp. 61-63; MG06C802, pp. 78-81" # MG06B402 p. 62: 8-33 default "Even parity, 1 stop bit". 8-32 Baud Rate has no # fixed default and is documented as VARIABLE: MG06B402 p. 61 states outright # "The default baud rate depends on the protocol selected in parameter 8-30 # Protocol", and MG06C802 p. 131 lists 8-32 as ExpressionLimit with no starred # option. So 9600 below is the FC-family convention, not a sourced default, and # on this drive it is documented as protocol-dependent — the FC 51 and FC 101 # resolve the same wording to 19200 under Modbus RTU. Read 8-32 on the unit. [serial] baudrate = 9600 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, Uint16. Polarity is from MG06B402 pp. 75-76, read off the # Bit=0/Bit=1 columns rather than inferred from the names: bit 2 = 1 means the # drive will START on a start command (0 = coasting), and bit 10 = 1 means the # output frequency is WITHIN 4-12/4-14 (0 = outside). Bit 5 is reserved. # Bit 14 is named "Torque OK/limit exceeded" but its own explanation is the # par 4-18 Current Limit; bit 15 is one of the thermal timers past 100%. 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 = "VoltageWarn", 14 = "CurrentLimit", 15 = "ThermalWarn" } } motor_current = { address = 16139, scale = 0.01, unit = "A" } # 16-14 Uint16, conv -2 # 16-16 Torque [Nm] is OMITTED on the FC 360. MG06C802 p. 136 types it Uint16 — # one register and UNSIGNED — where the same readout is Int32 on the FC 280. # Transcribed at the book's own width it would read a regenerating load as # roughly +6500 Nm instead of a negative number, and a plausible-looking wrong # number is worse than an absent one. 16-22 below is signed and gives torque in # percent, so nothing is lost. This smells like a doc error; if a bench shows # 16-16 is really Int16, add it back as # torque_nm = { address = 16159, signed = true, scale = 0.1, unit = "Nm" } 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 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 # CTW register 2810 -> wire 2809, REF register 2811 -> wire 2810. See the # ADDRESSING and CONTROL notes in the header for the three-document chain that # fixes these as register NUMBERS, and for the 16-849 read-back check to run # before arming. Requires 8-30 = [2] Modbus RTU and 8-42/8-43 inactive. [control] command_register = 2809 speed_register = 2810 # Reference is % of par 3-03 Maximum Reference, NOT Hz. MG06B402 p. 77: # 16384 (0x4000) = 100%, two's complement. raw = value / scale, so 100% -> 16384. speed_scale = 0.006103515625 speed_unit = "%" max_ref = 100.0 step_delay = 0.05 # Control word bits from MG06B402 p. 74, Table 5.34. 0x043C = bits 2 (ramp, not # DC brake) + 3 (no coasting) + 4 (no quick stop) + 5 (hold/use ramp) + 10 (data # valid), bit 6 clear = ramp stop. 0x047C adds bit 6 start. 0x04BC is the stop # word plus bit 7 reset — bit 6 stays CLEAR, so the reset value cannot decode as # a run command and reset correctly stays on the command register. stop = [1084] # 0x043C run_fwd = [1084, 1148] # 0x043C then 0x047C reset = [1212, 1084] # 0x04BC rising edge, then back to stop # run_rev deliberately absent — see REVERSE in the header. The two primary # manuals disagree on par 8-54's default, so a reverse command may run FORWARD. # 8-04 Control Timeout Function defaults to [0] Off (MG06C802 p. 131): a running # drive that loses its master keeps running, with 8-03 Control Timeout Time at # 1.0 s doing nothing. Keep the link fed. [control.watchdog] interval_ms = 500 fault = "control word timeout (8-04, default Off — set [2] Stop or [5] Stop and trip)" [running_check] register = 16029 # 16-03 status word, 16-bit bit = 11 # "No operation / In operation" # 16-90 Alarm Word is a 32-bit BITFIELD, not an enum: several bits can be set # at once, so there is no code table to look up. Bit names are the FC 360's # own, from MG06C802 Table 6.3 (pp. 146-147) — they are NOT the FC 202's: # bit 1 is the POWER CARD temperature here (heatsink on the FC 202), bit 25 is # reserved (1.8 V supply low on the FC 202), and bit 30 is RESERVED on the # FC 360 where both the FC 202 and the FC 280 carry Safe Torque Off. # # 16-91 Alarm Word 2 (register 16909) and 16-97 Alarm Word 3 (register 16969) # are not decoded here because they carry a different bit layout again. # # 16-92 Warning Word is NOT included: despite the similar name its layout # diverges from the alarm word at bits 0, 2, 12, 15, 17-21, 25-29 and 31 # (bit 25 is "current limit" as a warning but reserved in the alarm word, # bit 28 is "encoder loss" vs "option change"), so decoding it with these # names would mislabel every one of those. [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 = "MotorThermistor", 8 = "MotorETR_OverTemp", 9 = "InverterOverloaded", 10 = "DCUnderVoltage", 11 = "DCOverVoltage", 12 = "ShortCircuit", 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", 26 = "BrakeResistor", 27 = "BrakeIGBT", 28 = "OptionChange", 29 = "DriveInitialized", 31 = "MechBrakeLow" } # 16-36 Inv. Nom. Current, Uint16, conversion index -2 (MG06C802 p. 136). # Frame identity in amps; 90 kW is the largest FC 360, so at 0.01 A/count the # largest frame is roughly 17700 counts and cannot overflow a single register. [rating] register = 16359 words = 1 scale = 0.01 unit = "A" label = "Inverter nominal current"