{ "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json", "mbmap": 2, "vendor": "Novus", "model": "N1500", "models": ["N1500", "N1500LC", "N1500G"], "vendor_website": "novus.com.br", "description": "Universal process indicator with up to four alarms, analog retransmission and optional RS485 Modbus RTU: process value, min/max, status, alarms, input and retransmission settings, custom linearization", "revision": 1, "revised": "2026-10-31", "firmware": "Communication manual for software V2.3x", "source": "Novus N1500 / N1500LC / N1500G communication manual V2.3x D (Portuguese)", "sources": [ {"title": "Indicador N1500 / N1500LC / N1500G - Manual de Comunicação", "version": "V2.3x D", "url": "https://github.com/user-attachments/files/34218945/N1500_Manual_Comunicacao_PT.pdf", "note": "linked in issue #94; tables 01 and 02"} ], "notes": [ "Modbus RTU needs the optional RS485 interface. Functions 03, 05 and 06; writes with address 0 are broadcast.", "8 data bits, 1 stop bit, no parity or even parity (chosen together with the baud rate in register 42). The manual does not give the factory address or baud rate: check the adres and bavd screens on the indicator.", "Every register is a signed 16-bit value. Registers 12 and up can be read and written; most registers below 12 are read-only.", "The process value, limits, alarm setpoints, offset and hysteresis are integers in the indicator's display unit, with the decimal places set in register 11 (dppos): 1234 with dppos = 1 is 123.4.", "A write outside the allowed range is not refused: the indicator stores the maximum allowed value and returns it.", "The F key and digital input function lists and the input type list differ on the LC model; the tables in this map are those of the standard model, and the LC values are in the register descriptions.", "The custom linearization points (registers 61 to 90 for the input, 91 to 120 for the indication) are not listed.", "Written from the manufacturer's manual; not tested on a device." ], "protocol": "rtu", "unit_id": 1, "databits": 8, "stopbits": 1, "byte_order": "big", "address_base": 0, "x_status": "official", "enums": { "decimal_point": {"0": "No decimals", "1": "1 decimal", "2": "2 decimals", "3": "3 decimals", "4": "4 decimals", "5": "5 decimals"}, "key_function": {"0": "Off", "1": "Hold", "2": "Reset", "3": "Peak hold"}, "scale": {"0": "-31000 to 31000", "1": "0 to 60000", "2": "0 to 120000"}, "no_yes": {"0": "No", "1": "Yes"}, "alarm_function": {"0": "Off", "1": "Input error", "2": "Low", "3": "High", "4": "Differential low", "5": "Differential high", "6": "Differential outside band", "7": "Differential inside band"}, "input_type": {"0": "Thermocouple J", "1": "Thermocouple K", "2": "Thermocouple T", "3": "Thermocouple E", "4": "Thermocouple N", "5": "Thermocouple R", "6": "Thermocouple S", "7": "Thermocouple B", "8": "Pt100", "9": "0-50 mV", "10": "0-5 V", "11": "0-10 V", "12": "0-50 mV (custom linearization)", "13": "0-5 V (custom linearization)", "14": "0-10 V (custom linearization)", "15": "Linear J", "16": "Linear K", "17": "Linear T", "18": "Linear E", "19": "Linear N", "20": "Linear R", "21": "Linear S", "22": "Linear B", "23": "Linear Pt100", "24": "0-20 mA", "25": "4-20 mA", "26": "0-20 mA (custom linearization)", "27": "4-20 mA (custom linearization)"}, "baud_rate": {"0": "1200 no parity", "1": "2400 no parity", "2": "4800 no parity", "3": "9600 no parity", "4": "19200 no parity", "5": "38400 no parity", "6": "57600 no parity", "7": "115200 no parity", "8": "1200 even", "9": "2400 even", "10": "4800 even", "11": "9600 even", "12": "19200 even", "13": "38400 even", "14": "57600 even", "15": "115200 even"} }, "registers": [ {"name": "Process value", "group": "Measurements", "area": "holding", "address": 0, "type": "int16", "access": "R", "description": "Decimal places set by Decimal point position (register 11)"}, {"name": "Process value minimum", "group": "Measurements", "area": "holding", "address": 1, "type": "int16", "access": "R", "description": "Lowest value since the last clear"}, {"name": "Process value maximum", "group": "Measurements", "area": "holding", "address": 2, "type": "int16", "access": "R", "description": "Highest value since the last clear"}, {"name": "Process value (absolute)", "group": "Measurements", "area": "holding", "address": 3, "type": "uint16", "access": "R", "description": "The manual gives a range of 0 to 120000, which does not fit one register; values above 65535 cannot be read here"}, {"name": "Displayed value", "group": "Measurements", "area": "holding", "address": 4, "type": "int16", "access": "R", "description": "Value of the screen being shown; its range depends on the screen"}, {"name": "Screen number", "group": "Measurements", "area": "holding", "address": 5, "type": "uint16", "access": "R"}, {"name": "Alarm 1 fitted", "group": "Hardware", "area": "holding", "address": 6, "type": "bool", "bit": 0, "access": "R"}, {"name": "Alarm 2 fitted", "group": "Hardware", "area": "holding", "address": 6, "type": "bool", "bit": 1, "access": "R"}, {"name": "Alarm 3 fitted", "group": "Hardware", "area": "holding", "address": 6, "type": "bool", "bit": 2, "access": "R"}, {"name": "Alarm 4 fitted", "group": "Hardware", "area": "holding", "address": 6, "type": "bool", "bit": 3, "access": "R"}, {"name": "Analog output fitted", "group": "Hardware", "area": "holding", "address": 6, "type": "bool", "bit": 4, "access": "R"}, {"name": "RS485 fitted", "group": "Hardware", "area": "holding", "address": 6, "type": "bool", "bit": 5, "access": "R"}, {"name": "Alarm 1 active", "group": "Status", "area": "holding", "address": 6, "type": "bool", "bit": 8, "access": "R"}, {"name": "Alarm 2 active", "group": "Status", "area": "holding", "address": 6, "type": "bool", "bit": 9, "access": "R"}, {"name": "Alarm 3 active", "group": "Status", "area": "holding", "address": 6, "type": "bool", "bit": 10, "access": "R"}, {"name": "Alarm 4 active", "group": "Status", "area": "holding", "address": 6, "type": "bool", "bit": 11, "access": "R"}, {"name": "Digital input active", "group": "Status", "area": "holding", "address": 6, "type": "bool", "bit": 12, "access": "R"}, {"name": "Sensor error", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 0, "access": "R"}, {"name": "Cable error", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 1, "access": "R"}, {"name": "Underflow", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 2, "access": "R"}, {"name": "Overflow", "group": "Status", "area": "holding", "address": 9, "type": "bool", "bit": 3, "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": "Special command", "group": "Commands", "area": "holding", "address": 10, "type": "uint16", "access": "W", "enum": {"0": "Clear tare", "5": "Clear peak hold", "10": "Clear min/max", "15": "Tare"}}, {"name": "Alarm output 1", "group": "Outputs", "area": "coil", "address": 0, "type": "bool", "access": "RW", "description": "Coil 1 in the manual (00001). Can be written only when alarm 1 function is Off"}, {"name": "Alarm output 2", "group": "Outputs", "area": "coil", "address": 1, "type": "bool", "access": "RW", "description": "Coil 2 in the manual (00002). Can be written only when alarm 2 function is Off"}, {"name": "Alarm output 3", "group": "Outputs", "area": "coil", "address": 2, "type": "bool", "access": "RW", "description": "Coil 3 in the manual (00003). Can be written only when alarm 3 function is Off"}, {"name": "Alarm output 4", "group": "Outputs", "area": "coil", "address": 3, "type": "bool", "access": "RW", "description": "Coil 4 in the manual (00004). Can be written only when alarm 4 function is Off"}, {"name": "Decimal point position", "group": "Input", "area": "holding", "address": 11, "type": "uint16", "access": "R", "enum": "decimal_point", "description": "dppos"}, {"name": "Input type", "group": "Input", "area": "holding", "address": 37, "type": "uint16", "access": "RW", "enum": "input_type", "write_min": 0, "write_max": 27, "description": "intyp. On the LC model: 0 = 0-20 mV, 1 = -20 to 20 mV, 2 = 0-50 mV, 3-5 = the same with custom linearization, 6 = 0-20 mA, 7 = 4-20 mA, 8-9 = the same with custom linearization"}, {"name": "Temperature unit", "group": "Input", "area": "holding", "address": 38, "type": "uint16", "access": "RW", "enum": {"0": "°C", "1": "°F"}, "write_min": 0, "write_max": 1, "description": "vnit; not on the LC model"}, {"name": "Indication low limit", "group": "Input", "area": "holding", "address": 39, "type": "int16", "access": "RW", "description": "inlol"}, {"name": "Indication high limit", "group": "Input", "area": "holding", "address": 40, "type": "int16", "access": "RW", "description": "inkil"}, {"name": "Input filter", "group": "Input", "area": "holding", "address": 14, "type": "uint16", "access": "RW", "write_min": 0, "write_max": 60, "description": "filtr"}, {"name": "Input offset", "group": "Input", "area": "holding", "address": 15, "type": "int16", "access": "RW", "description": "ofset; between the indication limits"}, {"name": "Indication range", "group": "Input", "area": "holding", "address": 16, "type": "uint16", "access": "RW", "enum": "scale", "write_min": 0, "write_max": 2, "description": "scale"}, {"name": "Square root", "group": "Input", "area": "holding", "address": 17, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1, "description": "s.root"}, {"name": "F key function", "group": "Input", "area": "holding", "address": 12, "type": "uint16", "access": "RW", "enum": "key_function", "description": "f.fvnc. On the LC model also 4 = High, 5 = Low, 6 = Zero"}, {"name": "Digital input function", "group": "Input", "area": "holding", "address": 13, "type": "uint16", "access": "RW", "enum": "key_function", "description": "dig.in. On the LC model also 4 = High, 5 = Low, 6 = Tare"}, {"name": "Alarm reference", "group": "Alarms", "area": "holding", "address": 19, "type": "int16", "access": "RW", "description": "al.ref; reference for the differential alarms, between the indication limits"}, {"name": "Alarm 1 setpoint", "group": "Alarms", "area": "holding", "address": 21, "type": "int16", "access": "RW", "description": "sp.al1"}, {"name": "Alarm 2 setpoint", "group": "Alarms", "area": "holding", "address": 22, "type": "int16", "access": "RW", "description": "sp.al2"}, {"name": "Alarm 3 setpoint", "group": "Alarms", "area": "holding", "address": 23, "type": "int16", "access": "RW", "description": "sp.al3"}, {"name": "Alarm 4 setpoint", "group": "Alarms", "area": "holding", "address": 24, "type": "int16", "access": "RW", "description": "sp.al4"}, {"name": "Alarm 1 function", "group": "Alarms", "area": "holding", "address": 25, "type": "uint16", "access": "RW", "enum": "alarm_function", "write_min": 0, "write_max": 7}, {"name": "Alarm 2 function", "group": "Alarms", "area": "holding", "address": 26, "type": "uint16", "access": "RW", "enum": "alarm_function", "write_min": 0, "write_max": 7}, {"name": "Alarm 3 function", "group": "Alarms", "area": "holding", "address": 27, "type": "uint16", "access": "RW", "enum": "alarm_function", "write_min": 0, "write_max": 7}, {"name": "Alarm 4 function", "group": "Alarms", "area": "holding", "address": 28, "type": "uint16", "access": "RW", "enum": "alarm_function", "write_min": 0, "write_max": 7}, {"name": "Alarm 1 initial block", "group": "Alarms", "area": "holding", "address": 29, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1}, {"name": "Alarm 2 initial block", "group": "Alarms", "area": "holding", "address": 30, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1}, {"name": "Alarm 3 initial block", "group": "Alarms", "area": "holding", "address": 31, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1}, {"name": "Alarm 4 initial block", "group": "Alarms", "area": "holding", "address": 32, "type": "uint16", "access": "RW", "enum": "no_yes", "write_min": 0, "write_max": 1}, {"name": "Alarm 1 hysteresis", "group": "Alarms", "area": "holding", "address": 33, "type": "int16", "access": "RW", "description": "ky.al1, in display units"}, {"name": "Alarm 2 hysteresis", "group": "Alarms", "area": "holding", "address": 34, "type": "int16", "access": "RW", "description": "ky.al2, in display units"}, {"name": "Alarm 3 hysteresis", "group": "Alarms", "area": "holding", "address": 35, "type": "int16", "access": "RW", "description": "ky.al3, in display units"}, {"name": "Alarm 4 hysteresis", "group": "Alarms", "area": "holding", "address": 36, "type": "int16", "access": "RW", "description": "ky.al4, in display units"}, {"name": "Alarm 1 time 1", "group": "Alarms", "area": "holding", "address": 46, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500}, {"name": "Alarm 1 time 2", "group": "Alarms", "area": "holding", "address": 47, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500}, {"name": "Alarm 2 time 1", "group": "Alarms", "area": "holding", "address": 48, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500}, {"name": "Alarm 2 time 2", "group": "Alarms", "area": "holding", "address": 49, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500}, {"name": "Alarm 3 time 1", "group": "Alarms", "area": "holding", "address": 50, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500}, {"name": "Alarm 3 time 2", "group": "Alarms", "area": "holding", "address": 51, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500}, {"name": "Alarm 4 time 1", "group": "Alarms", "area": "holding", "address": 52, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500}, {"name": "Alarm 4 time 2", "group": "Alarms", "area": "holding", "address": 53, "type": "uint16", "unit": "s", "access": "RW", "write_min": 0, "write_max": 6500}, {"name": "Retransmission type", "group": "Retransmission", "area": "holding", "address": 20, "type": "uint16", "access": "RW", "enum": {"0": "4-20 mA", "1": "0-20 mA"}, "write_min": 0, "write_max": 1, "description": "ovt.ty"}, {"name": "Retransmission error direction", "group": "Retransmission", "area": "holding", "address": 18, "type": "uint16", "access": "RW", "enum": {"0": "Down", "1": "Up"}, "write_min": 0, "write_max": 1, "description": "ovt.er; where the 4-20 mA output goes on an input error"}, {"name": "Retransmission low limit", "group": "Retransmission", "area": "holding", "address": 54, "type": "int16", "access": "RW", "description": "ou.lol; indication that gives 4 mA (0 mA)"}, {"name": "Retransmission high limit", "group": "Retransmission", "area": "holding", "address": 55, "type": "int16", "access": "RW", "description": "ou.kil; indication that gives 20 mA"}, {"name": "Modbus address", "group": "Communication", "area": "holding", "address": 41, "type": "uint16", "access": "RW", "write_min": 1, "write_max": 247, "description": "adres"}, {"name": "Baud rate and parity", "group": "Communication", "area": "holding", "address": 42, "type": "uint16", "access": "RW", "enum": "baud_rate", "write_min": 0, "write_max": 15, "description": "bavd"}, {"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": {"3": "N1500"}, "description": "Other values are special versions"}, {"name": "Serial number (upper display)", "group": "Identity", "area": "holding", "address": 43, "type": "uint16", "access": "R", "description": "0-9999; the serial number is this followed by the lower display part"}, {"name": "Serial number (lower display)", "group": "Identity", "area": "holding", "address": 44, "type": "uint16", "access": "R", "description": "0-9999"} ] }