{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "Novus",
  "model": "N2000",
  "models": [
    "N2000"
  ],
  "vendor_website": "novus.com.br",
  "description": "Universal PID process controller with ramp and soak, four alarms, analog output and optional RS485 Modbus RTU: PV, setpoints, output power, status, PID, input, alarms, I/O and serial settings",
  "revision": 1,
  "revised": "2026-10-31",
  "firmware": "Instruction manual V3.0x P",
  "source": "Novus N2000 controller instruction manual V3.0x P (Portuguese), annex 1",
  "sources": [
    {
      "title": "Controlador N2000 - Manual de Instruções",
      "version": "V3.0x P",
      "url": "https://github.com/user-attachments/files/34218870/Manual_N2000_PT.pdf",
      "note": "linked in issue #89; annex 1, tables 12-16"
    }
  ],
  "notes": [
    "Modbus RTU needs the optional RS485 interface (485 in the order code); the USB port also speaks Modbus RTU. Functions 03, 05 and 06; writes with address 0 are broadcast.",
    "8 data bits, 1 stop bit, no parity. The manual does not give the factory address or baud rate: check the addr and bavd screens.",
    "Every register is a signed 16-bit value. Registers 12 and up can be read and written; most registers below 12 are read-only.",
    "Process value, setpoints, limits, offset and alarm setpoints are integers in display units with the decimals of register 30 (dppo): 0 = 3 decimals, 3 = none.",
    "A write outside the allowed range is not refused: the controller stores the maximum allowed value and returns it.",
    "The ramp and soak programs (registers 73 to 240: events, tolerance, link, times and setpoints of programs 1 to 7) are not listed.",
    "Written from the manufacturer's manual; not tested on a device."
  ],
  "protocol": "rtu",
  "unit_id": 1,
  "databits": 8,
  "parity": "N",
  "stopbits": 1,
  "byte_order": "big",
  "address_base": 0,
  "x_status": "official",
  "enums": {
    "no_yes": {
      "0": "No",
      "1": "Yes"
    },
    "alarm_function": {
      "0": "Off",
      "1": "Input error",
      "2": "Ramp and soak event",
      "3": "Low",
      "4": "High",
      "5": "Differential low",
      "6": "Differential high",
      "7": "Differential"
    },
    "io_function": {
      "0": "Off",
      "1": "Alarm 1 output",
      "2": "Alarm 2 output",
      "3": "Alarm 3 output",
      "4": "Alarm 4 output",
      "5": "Loop break output",
      "6": "Control output",
      "7": "Auto/manual input",
      "8": "Run/stop input",
      "9": "Remote SP input",
      "10": "Hold program input",
      "11": "Select program 1 input",
      "12": "Control 0-20 mA",
      "13": "Control 4-20 mA",
      "14": "PV retransmission 0-20 mA",
      "15": "PV retransmission 4-20 mA",
      "16": "SP retransmission 0-20 mA",
      "17": "SP retransmission 4-20 mA"
    }
  },
  "registers": [
    {"name": "Active setpoint", "group": "Control", "area": "holding", "address": 0, "type": "int16", "access": "RW", "description": "Read: the setpoint in use (main screen, ramp and soak or remote). Write: the main screen setpoint. In display units, with the decimals of register 30 (dppo)"},
    {"name": "Process value", "group": "Control", "area": "holding", "address": 1, "type": "int16", "access": "R", "description": "In display units, with the decimals of register 30 (dppo)"},
    {"name": "Output power", "group": "Control", "area": "holding", "address": 2, "type": "int16", "scale": 0.1, "unit": "%", "access": "R", "description": "Active output (manual or automatic)"},
    {"name": "Displayed value", "group": "Control", "area": "holding", "address": 4, "type": "int16", "access": "RW", "description": "Value of the screen being shown; range depends on the screen"},
    {"name": "Screen number", "group": "Control", "area": "holding", "address": 5, "type": "uint16", "access": "R", "description": "High byte: screen cycle, low byte: screen"},
    {"name": "Setpoint", "group": "Control", "area": "holding", "address": 25, "type": "int16", "access": "RW", "description": "SV, the main screen setpoint. In display units, with the decimals of register 30 (dppo)"},
    {"name": "Manual output power", "group": "Control", "area": "holding", "address": 28, "type": "int16", "scale": 0.1, "unit": "%", "access": "RW", "write_min": 0, "write_max": 100},
    {"name": "Control mode", "group": "Control", "area": "holding", "address": 46, "type": "uint16", "access": "RW", "enum": {"0": "Manual", "1": "Automatic"}, "write_min": 0, "write_max": 1, "description": "avto"},
    {"name": "Control enabled", "group": "Control", "area": "holding", "address": 47, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1, "description": "rvn (run)"},
    {"name": "Control action", "group": "Control", "area": "holding", "address": 48, "type": "uint16", "access": "RW", "enum": {"0": "Reverse", "1": "Direct"}, "write_min": 0, "write_max": 1},
    {"name": "Auto-tune", "group": "Control", "area": "holding", "address": 49, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1, "description": "atvn"},
    {"name": "Remote key action", "group": "Control", "area": "holding", "address": 54, "type": "uint16", "access": "W", "enum": {"1": "P key", "2": "Up key", "4": "Down key", "8": "Back key", "9": "P and back keys"}},
    {"name": "Alarm 1 active", "group": "Status", "area": "holding", "address": 6, "type": "bool", "bit": 0, "access": "R"},
    {"name": "Alarm 2 active", "group": "Status", "area": "holding", "address": 6, "type": "bool", "bit": 1, "access": "R"},
    {"name": "Alarm 3 active", "group": "Status", "area": "holding", "address": 6, "type": "bool", "bit": 2, "access": "R"},
    {"name": "Alarm 4 active", "group": "Status", "area": "holding", "address": 6, "type": "bool", "bit": 3, "access": "R"},
    {"name": "I/O 5 input active", "group": "Status", "area": "holding", "address": 6, "type": "bool", "bit": 4, "access": "R"},
    {"name": "I/O 6 input active", "group": "Status", "area": "holding", "address": 6, "type": "bool", "bit": 6, "access": "R"},
    {"name": "Automatic mode", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 0, "access": "R"},
    {"name": "Running", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 1, "access": "R"},
    {"name": "Direct action", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 2, "access": "R"},
    {"name": "Auto-tune running", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 4, "access": "R"},
    {"name": "Alarm 1 initial block on", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 5, "access": "R"},
    {"name": "Alarm 2 initial block on", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 6, "access": "R"},
    {"name": "Alarm 3 initial block on", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 7, "access": "R"},
    {"name": "Alarm 4 initial block on", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 8, "access": "R"},
    {"name": "Unit is °F", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 9, "access": "R", "enum": {"0": "°C", "1": "°F"}},
    {"name": "Output 1 on", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 11, "access": "R"},
    {"name": "Output 2 on", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 12, "access": "R"},
    {"name": "Output 3 on", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 13, "access": "R"},
    {"name": "Output 4 on", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 14, "access": "R"},
    {"name": "Output 5 on", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 15, "access": "R"},
    {"name": "PV conversion too low", "group": "Status", "area": "holding", "address": 10, "type": "bool", "bit": 0, "access": "R"},
    {"name": "Negative conversion after calibration", "group": "Status", "area": "holding", "address": 10, "type": "bool", "bit": 1, "access": "R"},
    {"name": "PV conversion too high", "group": "Status", "area": "holding", "address": 10, "type": "bool", "bit": 2, "access": "R"},
    {"name": "Linearization limit exceeded", "group": "Status", "area": "holding", "address": 10, "type": "bool", "bit": 3, "access": "R"},
    {"name": "Pt100 cable resistance too high", "group": "Status", "area": "holding", "address": 10, "type": "bool", "bit": 4, "access": "R"},
    {"name": "Auto zero out of limits", "group": "Status", "area": "holding", "address": 10, "type": "bool", "bit": 5, "access": "R"},
    {"name": "Auto span out of limits", "group": "Status", "area": "holding", "address": 10, "type": "bool", "bit": 6, "access": "R"},
    {"name": "Cold junction out of limits", "group": "Status", "area": "holding", "address": 10, "type": "bool", "bit": 7, "access": "R"},
    {"name": "Output 1 (I/O1)", "group": "Outputs", "area": "coil", "address": 0, "type": "bool", "access": "RW", "description": "Coil 1 in the manual. Can be written only when I/O1 function is Off"},
    {"name": "Output 2 (I/O2)", "group": "Outputs", "area": "coil", "address": 1, "type": "bool", "access": "RW", "description": "Coil 2 in the manual. Can be written only when I/O2 function is Off"},
    {"name": "Output 3 (I/O3)", "group": "Outputs", "area": "coil", "address": 2, "type": "bool", "access": "RW", "description": "Coil 3 in the manual. Can be written only when I/O3 function is Off"},
    {"name": "Output 4 (I/O4)", "group": "Outputs", "area": "coil", "address": 3, "type": "bool", "access": "RW", "description": "Coil 4 in the manual. Can be written only when I/O4 function is Off"},
    {"name": "Output 5 (I/O5)", "group": "Outputs", "area": "coil", "address": 4, "type": "bool", "access": "RW", "description": "Coil 5 in the manual. Can be written only when I/O5 function is Off"},
    {"name": "Integral rate", "group": "PID", "area": "holding", "address": 11, "type": "uint16", "scale": 0.01, "unit": "rep/min", "access": "RW", "write_min": 0, "write_max": 30},
    {"name": "Derivative time", "group": "PID", "area": "holding", "address": 12, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 250},
    {"name": "Proportional band", "group": "PID", "area": "holding", "address": 13, "type": "uint16", "scale": 0.1, "unit": "%", "access": "RW", "write_min": 0, "write_max": 500, "description": "0 = On/Off control"},
    {"name": "PWM cycle time", "group": "PID", "area": "holding", "address": 15, "type": "uint16", "scale": 0.1, "unit": "s", "access": "RW", "write_min": 0.5, "write_max": 100},
    {"name": "On/off hysteresis", "group": "PID", "area": "holding", "address": 17, "type": "int16", "access": "RW", "description": "In display units, with the decimals of register 30 (dppo)"},
    {"name": "Output low limit", "group": "PID", "area": "holding", "address": 19, "type": "uint16", "scale": 0.1, "unit": "%", "access": "RW", "write_min": 0, "write_max": 100},
    {"name": "Output high limit", "group": "PID", "area": "holding", "address": 20, "type": "uint16", "scale": 0.1, "unit": "%", "access": "RW", "write_min": 0, "write_max": 100},
    {"name": "Bias", "group": "PID", "area": "holding", "address": 68, "type": "int16", "unit": "%", "access": "RW", "write_min": -100, "write_max": 100},
    {"name": "Soft start time", "group": "PID", "area": "holding", "address": 66, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 9999},
    {"name": "Safe output on input error", "group": "PID", "area": "holding", "address": 270, "type": "int16", "unit": "%", "access": "RW", "description": "ieov"},
    {"name": "Loop break detection time", "group": "PID", "area": "holding", "address": 271, "type": "uint16", "unit": "min", "access": "RW", "write_min": 0, "write_max": 9999},
    {"name": "Input type", "group": "Input", "area": "holding", "address": 43, "type": "uint16", "access": "RW", "description": "type. The manual lists J, K, T, N, R, S, B, E, Pt100, 0-50 mV, 4-20 mA, 0-5 V, 0-10 V and square root, without their codes"},
    {"name": "Decimal point position", "group": "Input", "area": "holding", "address": 30, "type": "uint16", "access": "RW", "enum": {"0": "3 decimals", "1": "2 decimals", "2": "1 decimal", "3": "No decimals"}, "write_min": 0, "write_max": 3, "description": "dppo"},
    {"name": "Temperature unit", "group": "Input", "area": "holding", "address": 67, "type": "uint16", "access": "RW", "enum": {"0": "°C", "1": "°F"}, "write_min": 0, "write_max": 1},
    {"name": "PV offset", "group": "Input", "area": "holding", "address": 29, "type": "int16", "access": "RW", "description": "In display units, with the decimals of register 30 (dppo)"},
    {"name": "PV filter", "group": "Input", "area": "holding", "address": 264, "type": "uint16", "access": "RW", "write_min": 0, "write_max": 20},
    {"name": "Setpoint low limit", "group": "Input", "area": "holding", "address": 26, "type": "int16", "access": "RW", "description": "spll. In display units, with the decimals of register 30 (dppo)"},
    {"name": "Setpoint high limit", "group": "Input", "area": "holding", "address": 27, "type": "int16", "access": "RW", "description": "spkl. In display units, with the decimals of register 30 (dppo)"},
    {"name": "Cold junction temperature", "group": "Input", "area": "holding", "address": 254, "type": "int16", "access": "R"},
    {"name": "Remote setpoint enabled", "group": "Input", "area": "holding", "address": 243, "type": "uint16", "access": "RW", "enum": {"0": "Not used", "1": "Forced"}, "write_min": 0, "write_max": 1},
    {"name": "Remote setpoint input", "group": "Input", "area": "holding", "address": 244, "type": "uint16", "access": "RW", "enum": {"0": "0-20 mA", "1": "4-20 mA", "2": "0-5 V", "3": "0-10 V"}, "write_min": 0, "write_max": 3},
    {"name": "Remote setpoint low limit", "group": "Input", "area": "holding", "address": 55, "type": "int16", "access": "RW", "description": "In display units, with the decimals of register 30 (dppo)"},
    {"name": "Remote setpoint high limit", "group": "Input", "area": "holding", "address": 56, "type": "int16", "access": "RW", "description": "In display units, with the decimals of register 30 (dppo)"},
    {"name": "Alarm 1 setpoint", "group": "Alarms", "area": "holding", "address": 31, "type": "int16", "access": "RW", "description": "In display units, with the decimals of register 30 (dppo)"},
    {"name": "Alarm 1 function", "group": "Alarms", "area": "holding", "address": 35, "type": "uint16", "access": "RW", "enum": "alarm_function", "write_min": 0, "write_max": 7},
    {"name": "Alarm 1 hysteresis", "group": "Alarms", "area": "holding", "address": 39, "type": "int16", "access": "RW", "description": "The manual gives 0 to 9999 (0.00 to 99.99 %)"},
    {"name": "Alarm 1 initial block", "group": "Alarms", "area": "holding", "address": 50, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1},
    {"name": "Alarm 2 setpoint", "group": "Alarms", "area": "holding", "address": 32, "type": "int16", "access": "RW", "description": "In display units, with the decimals of register 30 (dppo)"},
    {"name": "Alarm 2 function", "group": "Alarms", "area": "holding", "address": 36, "type": "uint16", "access": "RW", "enum": "alarm_function", "write_min": 0, "write_max": 7},
    {"name": "Alarm 2 hysteresis", "group": "Alarms", "area": "holding", "address": 40, "type": "int16", "access": "RW", "description": "The manual gives 0 to 9999 (0.00 to 99.99 %)"},
    {"name": "Alarm 2 initial block", "group": "Alarms", "area": "holding", "address": 51, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1},
    {"name": "Alarm 3 setpoint", "group": "Alarms", "area": "holding", "address": 33, "type": "int16", "access": "RW", "description": "In display units, with the decimals of register 30 (dppo)"},
    {"name": "Alarm 3 function", "group": "Alarms", "area": "holding", "address": 37, "type": "uint16", "access": "RW", "enum": "alarm_function", "write_min": 0, "write_max": 7},
    {"name": "Alarm 3 hysteresis", "group": "Alarms", "area": "holding", "address": 41, "type": "int16", "access": "RW", "description": "The manual gives 0 to 9999 (0.00 to 99.99 %)"},
    {"name": "Alarm 3 initial block", "group": "Alarms", "area": "holding", "address": 52, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1},
    {"name": "Alarm 4 setpoint", "group": "Alarms", "area": "holding", "address": 34, "type": "int16", "access": "RW", "description": "In display units, with the decimals of register 30 (dppo)"},
    {"name": "Alarm 4 function", "group": "Alarms", "area": "holding", "address": 38, "type": "uint16", "access": "RW", "enum": "alarm_function", "write_min": 0, "write_max": 7},
    {"name": "Alarm 4 hysteresis", "group": "Alarms", "area": "holding", "address": 42, "type": "int16", "access": "RW", "description": "The manual gives 0 to 9999 (0.00 to 99.99 %)"},
    {"name": "Alarm 4 initial block", "group": "Alarms", "area": "holding", "address": 53, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1},
    {"name": "Alarm 1 time 1", "group": "Alarms", "area": "holding", "address": 62, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500},
    {"name": "Alarm 1 time 2", "group": "Alarms", "area": "holding", "address": 63, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500},
    {"name": "Alarm 2 time 1", "group": "Alarms", "area": "holding", "address": 64, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500},
    {"name": "Alarm 2 time 2", "group": "Alarms", "area": "holding", "address": 65, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500},
    {"name": "Alarm 3 time 1", "group": "Alarms", "area": "holding", "address": 257, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500},
    {"name": "Alarm 3 time 2", "group": "Alarms", "area": "holding", "address": 258, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500},
    {"name": "Alarm 4 time 1", "group": "Alarms", "area": "holding", "address": 259, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500},
    {"name": "Alarm 4 time 2", "group": "Alarms", "area": "holding", "address": 260, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500},
    {"name": "Flash PV on alarm", "group": "Alarms", "area": "holding", "address": 256, "type": "uint16", "access": "RW", "write_min": 0, "write_max": 15, "description": "flsh"},
    {"name": "I/O 1 function", "group": "I/O", "area": "holding", "address": 57, "type": "uint16", "access": "RW", "enum": "io_function", "write_min": 0, "write_max": 17},
    {"name": "I/O 2 function", "group": "I/O", "area": "holding", "address": 58, "type": "uint16", "access": "RW", "enum": "io_function", "write_min": 0, "write_max": 17},
    {"name": "I/O 3 function", "group": "I/O", "area": "holding", "address": 59, "type": "uint16", "access": "RW", "enum": "io_function", "write_min": 0, "write_max": 17},
    {"name": "I/O 4 function", "group": "I/O", "area": "holding", "address": 60, "type": "uint16", "access": "RW", "enum": "io_function", "write_min": 0, "write_max": 17},
    {"name": "I/O 5 function", "group": "I/O", "area": "holding", "address": 61, "type": "uint16", "access": "RW", "enum": "io_function", "write_min": 0, "write_max": 17},
    {"name": "I/O 6 function", "group": "I/O", "area": "holding", "address": 69, "type": "uint16", "access": "RW", "enum": "io_function", "write_min": 0, "write_max": 17},
    {"name": "F key function", "group": "I/O", "area": "holding", "address": 22, "type": "uint16", "access": "RW", "enum": {"0": "Not used", "7": "Enable control", "8": "Select remote SP", "9": "Hold program", "10": "Select program 1"}},
    {"name": "Auto/manual key enabled", "group": "I/O", "area": "holding", "address": 21, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1},
    {"name": "Time base", "group": "Ramp and soak", "area": "holding", "address": 14, "type": "uint16", "access": "RW", "enum": {"0": "Seconds", "1": "Minutes"}, "write_min": 0, "write_max": 1},
    {"name": "Running segment", "group": "Ramp and soak", "area": "holding", "address": 70, "type": "uint16", "access": "R"},
    {"name": "Program shown", "group": "Ramp and soak", "area": "holding", "address": 71, "type": "uint16", "access": "RW", "write_min": 1, "write_max": 7, "description": "Program being viewed or edited"},
    {"name": "Program running", "group": "Ramp and soak", "area": "holding", "address": 72, "type": "uint16", "access": "RW", "write_min": 0, "write_max": 7},
    {"name": "Segment time left", "group": "Ramp and soak", "area": "holding", "address": 261, "type": "uint16", "access": "R", "description": "In the time base of register 14"},
    {"name": "Modbus address", "group": "Communication", "area": "holding", "address": 44, "type": "uint16", "access": "RW", "write_min": 1, "write_max": 247},
    {"name": "Baud rate", "group": "Communication", "area": "holding", "address": 45, "type": "uint16", "access": "RW", "enum": {"0": "1200", "1": "2400", "2": "4800", "3": "9600", "4": "19200", "5": "38400", "6": "57600", "7": "115200"}, "write_min": 0, "write_max": 7},
    {"name": "Parity", "group": "Communication", "area": "holding", "address": 241, "type": "uint16", "access": "RW", "description": "The manual does not give the codes"},
    {"name": "Protection level", "group": "Communication", "area": "holding", "address": 242, "type": "uint16", "access": "RW"},
    {"name": "Software version", "group": "Identity", "area": "holding", "address": 7, "type": "uint16", "scale": 0.01, "access": "R", "role": "firmware", "description": "100 is V1.00"},
    {"name": "Equipment ID", "group": "Identity", "area": "holding", "address": 8, "type": "uint16", "access": "R", "role": "model", "enum": {"2": "N2000"}, "description": "Other values are special versions"},
    {"name": "Serial number (first 4 digits)", "group": "Identity", "area": "holding", "address": 23, "type": "uint16", "access": "R"},
    {"name": "Serial number (last 4 digits)", "group": "Identity", "area": "holding", "address": 24, "type": "uint16", "access": "R"}
  ]
}
