{
 "manufacturer": "Invertek Drives",
 "manufacturer_slug": "invertek-drives",
 "model": "Optidrive Eco (built-in Modbus RTU)",
 "model_slug": "optidrive-eco",
 "short_model": "Optidrive Eco",
 "aliases": [
  "ODV-3",
  "Optidrive Eco HVAC",
  "Optidrive Eco IP20",
  "Optidrive Eco IP55",
  "Optidrive Eco IP66"
 ],
 "equipment_type": "Variable frequency drive",
 "applies_to": "Invertek Optidrive Eco drives using the built-in RJ45 RS-485 Modbus RTU port, per user guide 82-HEMAN-IN V3.13.",
 "summary": "Invertek's HVAC/pump variable frequency drive with Modbus RTU on its built-in RJ45 RS-485 port (the same port also offers BACnet MS/TP). Registers 1-4 take the control word, speed reference and ramp time; registers 6-35 report status, fault code, output values, I/O, energy and run time; and parameters P1-xx to P5-xx sit at register = parameter number (P1-01 = 101). This map covers the control/monitor block and the P1/P5 parameters a Modbus integration needs.",
 "transport": [
  "RTU"
 ],
 "defaults": {
  "unit_id": 1,
  "baud": 115200,
  "parity": "None",
  "data_bits": null,
  "stop_bits": 1,
  "tcp_port": null
 },
 "addressing": {
  "convention": "1-based",
  "note": "The guide numbers registers from 1 and says masters that count from 0 must subtract 1, so register 1 (control word) is wire address 0 and register 6 (status) is address 5. Parameters use register = parameter number (P1-01 = register 101 = address 100; P5-05 = 505 = address 504)."
 },
 "default_word_order": null,
 "firmware": null,
 "source": {
  "title": "Optidrive Eco User Guide",
  "doc_number": "82-HEMAN-IN V3.13",
  "revision_date": "2024-11",
  "url": "https://admin.invertekdrives.com/assets/56AFAD3C-CE1A-4D9D-A91D-F893F86B59D2/82-HEMAN-IN_V3.13%20Optidrive%20Eco%20User%20Guide.pdf",
  "pages": "Section 10.2 Modbus RTU pp. 70-71 (telegram structure, register table, parameter access); RJ45 pinout/wiring section 10.1 pp. 69-70; P1 parameters pp. 42-43; P5 communication parameters pp. 59-60; P0-20..P0-31 p. 66-67; fault 50/52 in section 12.1"
 },
 "notes": [
  "Register 6 packs two bytes: the low byte is the 8-bit status word, the high byte the fault code. Read the register, then take (value >> 8) for the fault number; 0 means no fault.",
  "The guide does not say whether the output values are signed. Frequency, torque, power, analog levels and temperature are typed INT16 here: every value in their documented ranges is below 32768, so INT16 and UINT16 decode identically, and INT16 is also right if the drive sends a negative value.",
  "Parameter registers follow the guide's rule: register number = parameter number, and a parameter shown with one decimal place is sent x10 (the guide's example: P1-01 = 500 means 50.0 Hz). When P1-10 Motor rated speed is non-zero, P1-01/P1-02 are in rpm instead and the decimal handling for rpm is not stated.",
  "The guide says P5-01 (drive address), P5-03 (baud rate) and P5-04 (data format) are not accessible over Modbus, so they are not listed; P5-16 (alternative Modbus address) is left out for the same reason.",
  "The register-4 text says ramp control needs 'P5-08 = 1', but the introduction and the P5-07 parameter description both put Fieldbus Ramp Control in P5-07; this map follows P5-07.",
  "Left out: register 22 pre-ramp speed reference (units not stated), registers 30-33 kWh/MWh meters (resolution not stated, and the guide labels both the resettable and non-resettable pairs as P0-26/P0-27), register 35 run time minutes and seconds (packing not stated), register 3 (reserved), P1-08 motor current and P1-11 boost (decimal places not stated).",
  "P1-12 values 1 and 2 are both printed as 'Keypad control - uni-directional' in this guide edition.",
  "The P5-05 text refers to 'P5-07' for the loss action; the action itself is P5-06."
 ],
 "registers": [
  {
   "table": "holding_register",
   "address": 0,
   "documented": "1",
   "name": "Command control word",
   "description": "Run, fast stop, reset and coast stop bits; needs P1-12 = 4.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": {
    "0": "Run/stop: 1 = run (enable), 0 = stop",
    "1": "Fast stop: 1 = stop using the 2nd deceleration ramp",
    "2": "Fault reset: 1 = reset trip; set back to 0 after the fault clears",
    "3": "Coast stop: 1 = coast to stop"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 1,
   "documented": "2",
   "name": "Command speed reference",
   "description": "Frequency setpoint in 0.1 Hz (500 = 50.0 Hz); needs P1-12 = 4.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "Hz",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 3,
   "documented": "4",
   "name": "Command ramp times",
   "description": "Accel/decel time 0-60000 = 0.00-600.00 s; used only when P5-07 = 1.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 5,
   "documented": "6",
   "name": "Error code / drive status",
   "description": "Low byte = status bits, high byte = fault code when tripped.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "1 = running (enabled), 0 = stopped",
    "1": "1 = tripped, 0 = healthy",
    "2": "1 = Hand, 0 = Auto",
    "3": "Inhibit",
    "4": "Service due",
    "5": "Standby (sleep) active",
    "6": "Drive ready",
    "7": "1 = low or high load condition detected",
    "8": "Bits 8-15 (upper byte): fault code number while tripped (50 = Modbus timeout)"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 6,
   "documented": "7",
   "name": "Output frequency",
   "description": "0.1 Hz (123 = 12.3 Hz).",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "Hz",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 7,
   "documented": "8",
   "name": "Output current",
   "description": "0.1 A (105 = 10.5 A).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "A",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 8,
   "documented": "9",
   "name": "Output torque",
   "description": "Motor torque in 0.1 % (474 = 47.4 %).",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 9,
   "documented": "10",
   "name": "Output power",
   "description": "0.01 kW (1100 = 11.00 kW).",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.01,
   "units": "kW",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 10,
   "documented": "11",
   "name": "Digital input status",
   "description": "Bit n = digital input n+1.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": {
    "0": "Digital input 1",
    "1": "Digital input 2",
    "2": "Digital input 3"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 19,
   "documented": "20",
   "name": "Analog input 1 level",
   "description": "Applied signal in 0.1 % (1000 = 100.0 %).",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 20,
   "documented": "21",
   "name": "Analog input 2 level",
   "description": "Applied signal in 0.1 % (1000 = 100.0 %).",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 22,
   "documented": "23",
   "name": "DC link voltage",
   "description": "Measured DC bus voltage in whole volts.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "V",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 23,
   "documented": "24",
   "name": "Drive temperature",
   "description": "Measured heatsink temperature in whole °C.",
   "data_type": "INT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "°C",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 33,
   "documented": "34",
   "name": "Running time - hours",
   "description": "Total run time, hours part (P0-31).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 100,
   "documented": "101 (P1-01)",
   "name": "P1-01 Maximum frequency / speed limit",
   "description": "x10 per the guide's example (500 = 50.0 Hz); rpm when P1-10 > 0.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "Hz",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 101,
   "documented": "102 (P1-02)",
   "name": "P1-02 Minimum frequency / speed limit",
   "description": "Same format as P1-01; rpm when P1-10 > 0.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "Hz",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 102,
   "documented": "103 (P1-03)",
   "name": "P1-03 Acceleration ramp time",
   "description": "0.0-6000.0 s, sent x10 (default 30.0 s).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 103,
   "documented": "104 (P1-04)",
   "name": "P1-04 Deceleration ramp time",
   "description": "0.0-6000.0 s, sent x10 (default 30.0 s).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 104,
   "documented": "105 (P1-05)",
   "name": "P1-05 Stop mode",
   "description": "Action when the enable signal is removed.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Ramp",
    "1": "Coast",
    "2": "AC flux braking"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 106,
   "documented": "107 (P1-07)",
   "name": "P1-07 Motor rated voltage / kE",
   "description": "Motor nameplate voltage (back-EMF for PM motors).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "V",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 108,
   "documented": "109 (P1-09)",
   "name": "P1-09 Motor rated frequency",
   "description": "Nameplate frequency, whole Hz (25-500).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "Hz",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 109,
   "documented": "110 (P1-10)",
   "name": "P1-10 Motor rated speed",
   "description": "0 = speeds shown in Hz; nameplate rpm switches to rpm.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "rpm",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 111,
   "documented": "112 (P1-12)",
   "name": "P1-12 Primary command source",
   "description": "Set 4 to control the drive over Modbus RTU.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Terminal control",
    "1": "Keypad control, uni-directional",
    "2": "Keypad control, uni-directional",
    "3": "PID control",
    "4": "Fieldbus control (Modbus RTU or option module; not BACnet)",
    "5": "Slave mode",
    "6": "BACnet MS/TP mode"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 112,
   "documented": "113 (P1-13)",
   "name": "P1-13 Digital input function",
   "description": "Digital input macro selection (see guide's P1-13 table).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 504,
   "documented": "505 (P5-05)",
   "name": "P5-05 Communications loss timeout",
   "description": "0.0-5.0 s, sent x10; 0 disables (default 1.0 s).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "s",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 505,
   "documented": "506 (P5-06)",
   "name": "P5-06 Communications loss action",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Trip and coast to stop",
    "1": "Ramp to stop then trip",
    "2": "Ramp to stop only (no trip)",
    "3": "Run at preset speed 4"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 506,
   "documented": "507 (P5-07)",
   "name": "P5-07 Fieldbus ramp control",
   "description": "1 = ramp times come from register 4.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": {
    "0": "Disabled (ramps from P1-03/P1-04)",
    "1": "Enabled (ramps from fieldbus)"
   },
   "bits": null,
   "offset": 0
  }
 ],
 "integration": {
  "summary": "Put the drive in fieldbus control with P1-12 = 4, then write register 1 (control word) and register 2 (speed in 0.1 Hz) and poll registers 6-11 for status, fault code, frequency, current, torque and power. Subtract 1 from every register number the guide prints.",
  "minimum_registers": [
   {
    "table": "holding_register",
    "address": 0,
    "why": "Control word: run/stop, fault reset"
   },
   {
    "table": "holding_register",
    "address": 1,
    "why": "Speed reference, 0.1 Hz"
   },
   {
    "table": "holding_register",
    "address": 5,
    "why": "Status bits (low byte) + fault code (high byte)"
   },
   {
    "table": "holding_register",
    "address": 6,
    "why": "Output frequency, 0.1 Hz"
   },
   {
    "table": "holding_register",
    "address": 7,
    "why": "Output current, 0.1 A"
   },
   {
    "table": "holding_register",
    "address": 9,
    "why": "Output power, 0.01 kW"
   },
   {
    "table": "holding_register",
    "address": 22,
    "why": "DC bus voltage"
   },
   {
    "table": "holding_register",
    "address": 111,
    "why": "P1-12 command source (must be 4)"
   },
   {
    "table": "holding_register",
    "address": 33,
    "why": "Total run time, hours"
   }
  ],
  "enable": "Set P1-14 = 101 to open the extended parameter groups, then set P5-01 node address (1-63; P5-16 for higher addresses), P5-03 baud rate and P5-04 data format, and set P1-12 = 4 (Fieldbus control) so registers 1-2 can run the drive. The hardware ENABLE input must be present before a start command from the fieldbus is accepted. With P1-12 = 6 the port runs BACnet MS/TP instead of Modbus.",
  "watchdog": "P5-05 Communications loss timeout (0.0-5.0 s, default 1.0 s, 0 disables) with P5-06 action: 0 trip and coast, 1 ramp then trip, 2 ramp only, 3 run at preset speed 4. A timeout trips fault 50 (Built-in Modbus RTU communication timeout).",
  "quirks": [
   "Register numbers in the guide are 1-based: subtract 1 for the wire address (register 1 = address 0, P1-01 = register 101 = address 100).",
   "Only function codes 03, 06 and 16 are supported, and 16 (write multiple) works for registers 1-4 only - write parameters one at a time with 06.",
   "Register 6 holds status in the low byte and the fault code in the high byte; mask and shift rather than reading it as one number.",
   "Fault reset (control word bit 2) must be set back to 0 after the fault clears."
  ],
  "setup": [
   "Wire to the RJ45 port: pin 7 = RS485-, pin 8 = RS485+, pin 3 = 0 V common. Connect the 0 V common across all devices; it is not an Ethernet port.",
   "Use shielded twisted pair (120 ohm), terminate the end of the network with 120 ohm, and ground the shield at the controller only.",
   "Defaults: address 1 (P5-01), 115.2 kbps (P5-03), no parity / 1 stop bit (P5-04 'n-1'). Baud choices include 9.6, 19.2, 38.4, 57.6, 76.8 and 115.2 kbps.",
   "P5-15 adds an extra reply delay in characters for slow masters."
  ],
  "gotchas": [
   "If P1-12 is not 4, writes to registers 1-2 do not control the drive; registers 6-24 can still be read in any mode.",
   "P1-01/P1-02 change to rpm once P1-10 Motor rated speed is set to the nameplate rpm.",
   "Register 3 is reserved on the Eco; there is no torque reference register.",
   "P0-49 counts Modbus RTU communication errors - read it on the keypad when diagnosing a noisy bus."
  ]
 },
 "page": "https://easymodbus.com/modbus-register-maps/invertek-drives/optidrive-eco",
 "address_note": "address = 0-based Modbus wire (PDU) address; documented = as printed in the source.",
 "note": "Re-typed from the manufacturer's public documentation (see source) and verified against it. Registers vary by firmware and options; verify against the live device before writing."
}
