# Property of PMA Electrical Solutions, LLC. # # Danfoss iC7-Automation running the INDUSTRY application software, over # Modbus TCP. This is a new platform: nothing here is carried over from # profiles/danfoss_fc202.toml. # # Sources (primary vendor documentation only): # AQ456329149698en-010201 "iC7-Automation Modbus — Modbus TCP OS7MT", # Operating Guide, 2026.05, 48 pp. # pp. 10-12 iC Speed profile control word and status word bit tables # pp. 17-19 PROFIdrive standard telegram 1 words (not used here) # pp. 24-26 Modbus data mapping — the fixed holding registers # pp. 32-33 fieldbus protection / process data timeout parameters # p. 36 reference handling, N2 scaling # p. 45 supported function codes and address ranges # AB480436531518en-011001 "iC7 Series Industry — Software version 26A", # Application Guide, pp. 326-334 (group 10.3 Connectivity/Modbus), # pp. 360-370 (event codes). # # APPLICATION SOFTWARE VERSION: Industry 26A. The iC7 parameter set is # versioned by application software, so a map taken from one version can be # wrong on another. The five registers below are defined by the Modbus # interface rather than the application and have been identical across both # revisions of the Modbus guide (2023.09 and 2026.05), but re-check the # mapping table if you meet a different application package. # # MODBUS TCP ONLY on this configuration. Fieldbuses run on communication # interfaces X1/X2 on the control board (AQ456329149698en-010201 p. 9); # there is no RS-485 Modbus RTU on the Ethernet control boards. Danfoss does # sell an RS-485 control board (B5S/A5S) with Modbus RTU as option +BAMR / # OC7MR — the iC7-Aqua design guide AJ491231549263en-000301 pp. 24-25 and # 187 lists it, and the Industry application guide has "No Modbus RTU # Connection" (event 4282) — but no public iC7 Modbus RTU operating guide # could be sourced, so the RTU register mapping is NOT claimed here. # # ADDRESSING: there is no parameter*10-1 formula on this platform. Danfoss # gives a table of holding register "locations"; the wire address is # location - 1. No revision prints a worked telegram, so this is an inference # chain rather than a quoted example — but it is corroborated four times, with # nothing pointing the other way: # 1. 2023 revision (AQ456329149698en-000101) p. 24, Table 15: "Location — # Refers to the REGISTER NUMBER. Registers are mapped from address # 40000-4FFFF." The 2026 revision regressed this row into a copy of the # coil row ("Coils are mapped from address 00000-0FFFF"), which is why the # newer book alone looks unresolvable. # 2. 2023 revision p. 25, Table 18 (input registers): "Registers are mapped # from address 30001-39999" — the 1-based Modicon reference space, in # which the first register (location 1) is 30001, i.e. wire address 0. # 3. Function-code table, BOTH revisions (2026 p. 45 Table 35, 2023 p. 45 # Table 29): holding registers 40001-49999. The lowest holding-register # reference is 40001 and the lowest location is 1. # 4. Danfoss's house convention stated verbatim in the same-era iC2 book # (AB413939445838en-000401 p. 81): "Holding register 40001 is addressed as # register 0000 in the data address field of the telegram." # So location 1 -> reference 40001 -> wire address 0. # # Corroborated on paper, still unconfirmed on hardware. Read location 1 # (Fieldbus Profile) at address 0 and confirm it returns the profile selection # BEFORE arming anything — an off-by-one would put the control word into the # Fieldbus Profile register. # # location 1 -> address 0 Fieldbus Profile (param 1301) # location 2 -> address 1 Fieldbus Control Word (param 1335) # location 3 -> address 2 Fieldbus Main Reference (param 1339) # location 10 -> address 9 Fieldbus Status Word (param 1307) # location 11 -> address 10 Fieldbus Main Actual (param 1308) # # EVERYTHING ELSE IS USER-MAPPED. Locations 4-9 and 12-19 are reserved, and # from location 20 on the map is empty until someone builds it in MyDrive # Insight (guide pp. 24-26). So there is no factory register for motor # current, DC-link voltage, heatsink temperature or the active fault code, # and none is invented here. Map them yourself from location 20 up and add # monitor points to a local override; note that a 32-bit REAL parameter # occupies two consecutive registers and that word order defaults to LITTLE # endian (param 7063). # # Drive-side setup: Fieldbus Profile (param 1301) must be iC Speed Profile — it # is the default. THREE other selections exist and NONE of them takes the # control words below: # - PROFIdrive standard telegram 1: a state-machine-driven control word. # - 302 CiA402 Velocity Mode (Industry AG P 10.3.1.2). # - the iC Active Front End profile (Modbus guide Table 12, p. 16), where # START IS BIT 3, NOT BIT 6 — a drive running the AFE package would read # run_fwd = 0x0478 as pre-charge and nothing else. # The control place must include fieldbus. The Modbus unit identifier must be # 255 (0xFF) (guide p. 40). # # PER-REGISTER WRITE PERMISSION: Modbus guide §3.4 p. 27 — read/write permission # is set per register in MyDrive Insight, and "Individual settings for each coil # or register overwrite the default selection ALL." A write to location 2 can be # refused by configuration even when the address is right. name = "Danfoss iC7-Automation (Industry)" vendor = "Danfoss" device_type = "vfd" verified = false probe_register = 9 # Fieldbus Status Word [connection] summary = "Use either X1 or X2 on an Ethernet control board; both RJ45 ports belong to one embedded switch and one IP address." warnings = ["Verify the installed control board has Ethernet X1/X2; B5S/A5S serial boards are a different, undocumented Modbus RTU path and are not supported by this profile.", "Inside-mounted ports require the enclosure to be opened only under the drive's lockout and discharge procedure."] [[connection.methods]] id = "built_in_ethernet" title = "X1/X2 Modbus TCP" transport = "tcp" hardware = "built_in" port = "Communication interface X1 or X2; location is frame-dependent" connector = "Industrial RJ45 Ethernet socket" adapter = "Computer Ethernet port or USB-to-Ethernet adapter" cable = "Industrial shielded Ethernet patch cable" parts = ["Ethernet switch only when the topology requires it"] steps = ["Identify the installed Ethernet control board and locate X1/X2: top-mounted on FA02-FA12, inside FB09-FB12/FK06-FK12, or bottom-facing on system modules.", "With any required enclosure access made safe, connect the shielded RJ45 cable to X1 or X2.", "Connect the other end directly to the computer or to the same Ethernet switch, then restore/close the enclosure.", "Set the computer interface to the same IP subnet and select the drive's IP address in PMA-VFD."] setup = ["Configure the Ethernet interface IP parameters, then use Modbus TCP port 502 and Unit Identifier 255.", "Confirm Fieldbus Profile parameter 1301 is iC Speed Profile and permit writes to the required registers in MyDrive Insight."] warnings = ["X1 and X2 are one device, not two independent Modbus endpoints.", "Do not create an unintended Ethernet loop by connecting both ports through a topology that is not configured for redundancy."] source = "Danfoss AQ456329149698en-010201, pp. 9, 20, 28-29, and 37-40" [monitor] fieldbus_profile = { address = 0 } control_word = { address = 1 } # iC Speed profile status word, guide pp. 11-12. Read the polarity column, # not the bit name: bit 2 = 1 means NOT coasting, bit 10 = 1 means WITHIN the # speed limits. Bits 4-6 are reserved, bits 14-15 are whatever the # application maps onto them. status_word = { address = 9, bits = { 0 = "CtrlReady", 1 = "DriveReady", 2 = "NotCoasting", 3 = "Fault", 7 = "Warning", 8 = "SpeedEqRef", 9 = "BusControl", 10 = "WithinSpeedLimits", 11 = "InOperation" } } # Main actual value. The guide states the N2 scaling for the reference # (p. 36) and not separately for the main actual value; it is read back here # on the same scale, which is the convention across the Danfoss profiles. main_actual_pct = { address = 10, signed = true, scale = 0.006103515625, unit = "%" } [control] command_register = 1 # Fieldbus Control Word speed_register = 2 # Fieldbus Main Reference # Guide p. 36: the speed reference is a normalized relative value in percent # (N2). 0% = 0x0000, 100% = 0x4000 = 16384, -100% = 0xC000. 100% is the # Positive Speed Limit (param 1729) in rpm, NOT the motor's nominal speed. speed_scale = 0.006103515625 speed_unit = "%" max_ref = 100.0 step_delay = 0.05 # iC Speed profile control word, guide p. 10. Bit 3 (no coast), bit 4 (no # quick stop), bit 5 (no hold) and bit 10 (data valid) must all be 1 or the # drive coasts, quick-stops, or ignores the word entirely. Bit 6 is start. # Bit 2 is RESERVED here and must stay 0 — that is where the FC control word # keeps its DC-brake/ramp bit, which is why these values are not the FC 202's. stop = [1080] # 0x0438 run_fwd = [1080, 1144] # 0x0438 then 0x0478, bit 6 start reset = [1208, 1080] # 0x04B8 — bit 7 is edge-triggered 0->1 — then stop # run_rev is deliberately absent. The iC Speed profile control word has no # reverse bit (bits 12-15 are application-defined); direction is the SIGN of # the reference, 0xC000 = -100%. A reverse control word would be # byte-identical to forward. # Process Data Timeout Time (param 1340) defaults to 1.00 s, but Process Data # Timeout Response (param 1341) defaults to [Info] in the Industry # application (guide pp. 32-33) — the drive only logs the loss and KEEPS # RUNNING. Set 1341 to Fault or Warning - Change Control Place if the motor # must not outlive the master. [control.watchdog] interval_ms = 400 fault = "process data timeout (param 1340, default 1.00 s; response 1341 defaults to Info)" [running_check] register = 9 bit = 11 # Operation # No [faults] section. iC7 reports diagnostics as numeric EVENT CODES from # the event log (Industry AG AB480436531518en-011001 pp. 360-370, e.g. 4270 # "No Modbus TCP Connection"), not as a fault bitfield, and no event register # exists until one is mapped: an event costs six consecutive holding # registers (timestamp, type, code) starting at a location the user chooses # (Modbus guide p. 26). Status word bit 3 is the only factory fault # indication. Map the event block and add [faults] locally if you need codes. # # No [rating] section either — the frame rating is not in the fixed register # block, so there is nothing to compare before a restore.