# Property of PMA Electrical Solutions, LLC. # # Danfoss iC2-Micro (iC2-30, order code 130R1254) — the current-generation # replacement for the VLT Micro Drive FC 51. # # Source: Danfoss iC2-Micro Frequency Converters APPLICATION GUIDE, # AB413939445838en-000401 (2025.12), the only book that carries the register # map. Sections used: # pp. 78-89 Modbus RTU, telegram structure, coil/register addressing # pp. 90-95 FC control profile: CTW/STW bit tables, bus reference scaling # pp. 100-133 readout parameter descriptions (units and decimals) # pp. 240-243 warning/fault event list and the fault-word bit table # pp. 253-266 parameter-number (PNU) appendix — the PNU for every point here # # EMBEDDED MODBUS RTU over the built-in RS-485 port (AG p. 79). No option card # is required. There is no Modbus TCP on this drive. # # Drive-side setup: P 10.1.1 Protocol = Modbus, P 10.1.2 Address, # P 10.1.3 Baud Rate, P 10.1.4 Parity/Stop Bits (AG p. 79, Table 30). # For bus control also set P 5.5.1.1 Control Place Selection (default # [0] Digital and Ctrl. word) and P 5.5.1.2 Control Source (default [1] FC # Port). # # THE SPEED REFERENCE IS SUMMED, AND THE BUS TERM IS ALREADY LIVE. The factory # defaults of the three reference sources (group 5.5.3, PNUs 315/316/317) are # Ref 1 = [1] Analog Input 33, Ref 2 = [2] Analog Input 34, and Ref 3 = # [11] Local bus reference — and the AG's own parameter descriptions state "The # sum of these reference signals defines the actual reference." So the bus # reference is NOT ignored out of the box, but `speed_register` commands # bus% + AI33 + AI34, not bus%. Writing 20% does not produce 20% unless AI33 and # AI34 happen to read zero, and an unterminated analog input rarely does. Set # P 5.5.3.7 and P 5.5.3.8 to [0] No function before treating the speed reference # as deterministic. # # ADDRESSING: register = PNU * 10 - 1, and that result is the 0-based wire # address, not a 4xxxx number. Confirmed by the AG's own worked example # (p. 85): P 5.5.3.3 Reference Maximum, PNU 303, is read at starting address # 0x0BD5 = 3029. The PNU is NOT the menu index — P 4.1.1 Motor Current is # PNU 1614, not 411. Every PNU below is from the appendix on pp. 253-266. # # The CTW/REF/STW/MAV process data live at holding register NUMBERS # 50000/50010/50200/50210 (AG p. 90, Table 50), and holding register numbers # carry the usual -1 offset to the wire (AG p. 85 NOTICE), hence 49999/50009/ # 50199/50209 below. # # WIDTH IS PER PARAMETER. The iC2 widths are NOT the FC 202 widths: motor # current is uint16 here and 32-bit on the FC 202, motor voltage and output # frequency are uint32 here and 16-bit on the FC 202. Reading a point at the # wrong width splices in a neighbouring parameter. name = "Danfoss iC2-Micro" vendor = "Danfoss" device_type = "vfd" verified = false probe_register = 16029 # P 5.1.8 Drive Status Word, PNU 1603 [connection] summary = "Connect to the iC2-Micro's built-in RS-485 control terminals 68/69; no option card is used." warnings = ["Isolate power and verify the DC link is discharged before opening the control cover.", "The front RJ45 service connection is not the Modbus RTU fieldbus connection described by this profile."] [[connection.methods]] id = "built_in_rs485" title = "Built-in RS-485 (68/69)" transport = "serial" hardware = "built_in" port = "Main control board terminals 68 (P+), 69 (N-), optional 61 reference" connector = "Control-terminal block" adapter = "Isolated USB-to-RS-485 adapter" cable = "Shielded twisted-pair RS-485 cable" parts = ["Small insulated screwdriver", "Main-board terminator switch when 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", signal = "Optional RS-485 reference", required = false }] steps = ["De-energize the drive and locate main-board terminals 68 and 69.", "Connect the positive/negative twisted pair exactly as marked; add the optional reference only if needed.", "Use the main-board terminator only at a physical bus end and route the cable away from power conductors.", "Close the cover, restore power, and select the computer's serial adapter."] setup = ["Set P 10.1.1 Protocol = Modbus, then configure P 10.1.2 Address, P 10.1.3 Baud Rate, and P 10.1.4 Parity/Stop Bits.", "For control, set P 5.5.1.1/P 5.5.1.2 for the FC port and disable unwanted summed analog references."] warnings = ["The factory reference is a sum of bus and analog sources; bus percentage alone may not equal the commanded speed."] source = "Danfoss AB413939445838en-000401, pp. 68-69 and 78-79" # AG p. 236: P 10.1.3 Baud Rate default [2] 9600, P 10.1.4 Parity/Stop Bits # default [0] Even Parity, 1 Stop Bit. [serial] baudrate = 9600 parity = "E" stopbits = 1 [monitor] # --- 16-bit parameters (words = 1) --- control_word = { address = 15999 } # P 5.1.7 PNU 1600 # P 5.1.8 Drive Status Word, PNU 1603. Bit polarity per AG p. 93, Table 55: # bit 2 = 1 means ENABLED (0 = coasting) and bit 10 = 1 means WITHIN the # frequency limits (0 = outside). Bits 14/15 are named from Table 55 and differ # from the FC 202 labels. Note the book disagrees with itself on bit 14: Table 55 # calls it "Torque exceeded" (the name used here) while §6.1.8.4 p. 94 explains # it as "the current limit in P 2.7.1 Output Current Limit % is exceeded". 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 = "InOperation", 12 = "StoppedAutoStart", 13 = "VoltageExceeded", 14 = "TorqueExceeded", 15 = "TimerExceeded" } } reference_pct = { address = 16019, signed = true, scale = 0.1, unit = "%" } # P 5.1.17 PNU 1602 # P 5.1.19 Main Actual Value [%], PNU 1605: AG p. 133 gives Default 0.00 and # Range (-200.00-200.00), i.e. TWO decimals, so scale = 0.01. It shipped at 0.1 # and read 10x high. Contrast P 5.1.17 Reference [%] on the same page — Default # 0.0, Range (-200.0-200.0), one decimal — which is correctly 0.1 above. main_actual_pct = { address = 16049, signed = true, scale = 0.01, unit = "%" } # P 5.1.19 PNU 1605 motor_current = { address = 16139, scale = 0.01, unit = "A" } # P 4.1.1 PNU 1614, uint16 motor_thermal = { address = 16179, unit = "%" } # P 4.1.5 PNU 1618 frequency_pct = { address = 16149, scale = 0.1, unit = "%" } # P 4.1.7 PNU 1615 torque_pct = { address = 16219, signed = true, unit = "%" } # P 4.1.11 PNU 1622 heatsink_temp = { address = 16339, signed = true, unit = "C" } # P 2.1.9 PNU 1634, int8 # P 5.1.11/5.1.12 are ARRAYS of up to 20 entries. Modbus has no array # addressing, so the read returns the entry that holding register 9 (the IND # index pointer, AG p. 84) currently points at — index 0, the first active # event, unless something has written that pointer. 0 means none active; the # numbers are the Warning/Fault event numbers in AG Table 70, pp. 240-242. active_fault_number = { address = 18549 } # P 5.1.11 PNU 1855 active_warning_number = { address = 18559 } # P 5.1.12 PNU 1856 # --- 32-bit parameters (words = 2) --- motor_voltage = { address = 16119, words = 2, unit = "V" } # P 4.1.2 PNU 1612 output_frequency = { address = 16129, words = 2, scale = 0.1, unit = "Hz" } # P 4.1.6 PNU 1613 power_kw = { address = 16099, words = 2, scale = 0.001, unit = "kW" } # P 4.1.3 PNU 1610 # P 4.1.8 Motor Shaft Speed, PNU 1617: the AG's own columns disagree — Default # value "0" (no decimals, the reading used here) against Range # (-30000.0-30000.0) (one decimal). Neighbouring P 4.1.10 prints Default "0.0" # with the same range and is correctly scaled 0.1. This is the only point in the # file where the two columns conflict and no worked example uses this parameter, # so it cannot be settled on paper. If the Range column is the right one, rpm # reads 10x high — check against the LCP before trusting it. motor_speed = { address = 16169, words = 2, signed = true, unit = "rpm" } # P 4.1.8 PNU 1617 torque_nm = { address = 16159, words = 2, signed = true, scale = 0.1, unit = "Nm" } # P 4.1.10 PNU 1616 dc_link_voltage = { address = 16299, words = 2, unit = "V" } # P 2.1.1 PNU 1630 [control] command_register = 49999 # CTW, holding register number 50000 speed_register = 50009 # REF, holding register number 50010 # AG p. 95: the bus reference is a relative value in percent, 16384 (0x4000) # = 100%, negatives in two's complement. NOT Hz. speed_scale = 0.006103515625 speed_unit = "%" max_ref = 100.0 step_delay = 0.05 # FC-profile control word, AG p. 90 Table 52. Bits 2 (ramp, not DC brake), # 3 (no coast), 4 (no quick stop), 5 (use ramp) and 10 (data valid) must all # be 1 for the drive to accept the word at all; bit 6 is start. stop = [1084] # 0x043C run_fwd = [1084, 1148] # 0x043C then 0x047C, bit 6 start reset = [1212, 1084] # 0x04BC — bit 7 is edge-triggered — then back to stop # run_rev is deliberately absent, but NOT for the reason the FC 202 profile # gives — that justification does not survive this drive's own parameter list. # AG p. 92 does print "In the default setting, reversing is set to [0] Digital # input", near-verbatim the FC 202 wording, but P 5.5.2.5 Reversing Select # (PNU 854) is documented in the same book with default [3] Logic OR: "The # fieldbus/serial communication port OR a digital input triggers the reversing # function." The p. 92 sentence is legacy FC boilerplate contradicted by the # parameter list. So bit 15 DOES reverse from the bus out of the box on this # drive. It stays out because reverse remains unverified on hardware and this # profile is verified = false, not because the command would run forward. # To use it, confirm PNU 854 on the unit and add run_rev = [1084, 33916]. # P 5.2.16 Watchdog Response (PNU 804) defaults to [0] Off and P 5.2.17 # Watchdog Delay (PNU 803) to 1.0 s, so out of the box a run command followed # by silence leaves the motor running with no master attached. [control.watchdog] interval_ms = 500 fault = "17 Control Word Timeout (needs P 5.2.16 Watchdog Response != Off)" [running_check] register = 16029 # status word, 16-bit bit = 11 # In operation # P 5.1.1 Fault Word 1 (PNU 1690) is a 32-bit BITFIELD — several bits can be # set at once, so there is no code to look up. Bit names from AG Table 71, # pp. 242-243, "Fault word" column ONLY. # # Fault Word 2 (PNU 1691) and Fault Word 3 (PNU 1697) carry a DIFFERENT set # of causes at the same bit positions (bit 1 is "gate drive fault" there, not # "power card temp"), and the Warning Word columns diverge again — decoding # any of them with these names would mislabel them, so they are left out. # # This layout is NOT the FC 202 alarm word: bits 1, 3, 13, 22, 25 and 28 name # different faults or are reserved here. [faults] register = 16899 # P 5.1.1 Fault Word 1 words = 2 bitfield = true bits = { 0 = "BrakeCheck", 1 = "PowerCardTemp", 2 = "EarthFault", 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", 23 = "Supply24V_Low", 24 = "MainsFailure", 26 = "BrakeResistorShort", 27 = "BrakeChopperFault", 29 = "DriveInitialized", 31 = "MechBrakeLow" } # P 2.1.3 Unit Nominal Current (PNU 1636, uint16, 0.00-655.35 A) — the # inverter's own rating, so a restore onto a different frame is caught. [rating] register = 16359 scale = 0.01 unit = "A" label = "Unit nominal current"