{
 "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
 "mbmap": 2,
 "vendor": "Moxa",
 "model": "ioThinx 45MR-3800",
 "models": [
  "ioThinx 45MR-3800",
  "ioThinx 45MR-3800-T"
 ],
 "vendor_website": "moxa.com",
 "description": "8-channel analog input module for the ioThinx 4510 adapter",
 "revision": 3,
 "revised": "2026-11-11",
 "source": "Moxa, ioThinx 4510 Series User's Manual, version 6.2 (July 2024), Appendix A (Modbus/TCP slave rules and register lists)",
 "sources": [
  {
   "title": "ioThinx 4510 Series User's Manual",
   "version": "6.2",
   "date": "2024-07",
   "note": "Appendix A, 45MR-3800 (-T) registers"
  }
 ],
 "notes": [
  "Addresses are relative to the module: the Modbus address on the 4510 is the slot's base address (set on the Modbus page of the 4510 web console: reload the default addresses or edit them) plus the relative address given here, separately for coils, discrete inputs, holding registers and input registers. Modbus/TCP port 502 on the ioThinx 4510 adapter.",
  "The manual lists every parameter with a length: in bits for coils and discrete inputs, and in 16-bit registers for the others. A DWORD or REAL value takes two registers; a REAL is a 32-bit float. Per-channel entries here follow that: for example 8 registers of DWORD for 4 channels are four 32-bit values.",
  "The manual does not state the word order of the 32-bit values; big is assumed. The function codes are 1, 5 and 15 for coils, 2 for discrete inputs, 3, 6 and 16 for holding registers and 4 for input registers.",
  "Each 'All' register is a bit mask with one bit per channel."
 ],
 "protocol": "tcp",
 "port": 502,
 "unit_id": 1,
 "byte_order": "big",
 "word_order": "big",
 "address_base": 0,
 "x_status": "official",
 "enums": {
  "ai_mode": {
   "0": "Disabled",
   "1": "0-10 V",
   "2": "0-20 mA",
   "3": "4-20 mA burnout",
   "4": "4-20 mA",
   "5": "±10 V"
  },
  "ai_status": {
   "0": "Normal",
   "1": "Burnout",
   "2": "Over range",
   "3": "Under range"
  }
 },
 "registers": [
  {
   "name": "AI - reset minimum value ch0",
   "group": "aiResetMinValue",
   "area": "coil",
   "address": 0,
   "type": "bool",
   "access": "RW",
   "description": "AI - reset minimum value (1: Reset)"
  },
  {
   "name": "AI - reset minimum value ch1",
   "group": "aiResetMinValue",
   "area": "coil",
   "address": 1,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset minimum value ch2",
   "group": "aiResetMinValue",
   "area": "coil",
   "address": 2,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset minimum value ch3",
   "group": "aiResetMinValue",
   "area": "coil",
   "address": 3,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset minimum value ch4",
   "group": "aiResetMinValue",
   "area": "coil",
   "address": 4,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset minimum value ch5",
   "group": "aiResetMinValue",
   "area": "coil",
   "address": 5,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset minimum value ch6",
   "group": "aiResetMinValue",
   "area": "coil",
   "address": 6,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset minimum value ch7",
   "group": "aiResetMinValue",
   "area": "coil",
   "address": 7,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset maximum value ch0",
   "group": "aiResetMaxValue",
   "area": "coil",
   "address": 8,
   "type": "bool",
   "access": "RW",
   "description": "AI - reset maximum value (1: Reset)"
  },
  {
   "name": "AI - reset maximum value ch1",
   "group": "aiResetMaxValue",
   "area": "coil",
   "address": 9,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset maximum value ch2",
   "group": "aiResetMaxValue",
   "area": "coil",
   "address": 10,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset maximum value ch3",
   "group": "aiResetMaxValue",
   "area": "coil",
   "address": 11,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset maximum value ch4",
   "group": "aiResetMaxValue",
   "area": "coil",
   "address": 12,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset maximum value ch5",
   "group": "aiResetMaxValue",
   "area": "coil",
   "address": 13,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset maximum value ch6",
   "group": "aiResetMaxValue",
   "area": "coil",
   "address": 14,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset maximum value ch7",
   "group": "aiResetMaxValue",
   "area": "coil",
   "address": 15,
   "type": "bool",
   "access": "RW"
  },
  {
   "name": "AI - reset minimum value (all channels)",
   "group": "aiResetMinValueAll",
   "area": "holding",
   "address": 0,
   "type": "uint16",
   "access": "RW",
   "description": "AI - reset minimum value (1: Reset); bit n is channel n"
  },
  {
   "name": "AI - reset maximum value (all channels)",
   "group": "aiResetMaxValueAll",
   "area": "holding",
   "address": 1,
   "type": "uint16",
   "access": "RW",
   "description": "AI - reset maximum value (1: Reset); bit n is channel n"
  },
  {
   "name": "AI - raw value ch0",
   "group": "aiValueRaw",
   "area": "input",
   "address": 0,
   "type": "uint16",
   "access": "R",
   "description": "AI - raw value"
  },
  {
   "name": "AI - raw value ch1",
   "group": "aiValueRaw",
   "area": "input",
   "address": 1,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - raw value ch2",
   "group": "aiValueRaw",
   "area": "input",
   "address": 2,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - raw value ch3",
   "group": "aiValueRaw",
   "area": "input",
   "address": 3,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - raw value ch4",
   "group": "aiValueRaw",
   "area": "input",
   "address": 4,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - raw value ch5",
   "group": "aiValueRaw",
   "area": "input",
   "address": 5,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - raw value ch6",
   "group": "aiValueRaw",
   "area": "input",
   "address": 6,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - raw value ch7",
   "group": "aiValueRaw",
   "area": "input",
   "address": 7,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - minimum raw value ch0",
   "group": "aiValueRawMin",
   "area": "input",
   "address": 8,
   "type": "uint16",
   "access": "R",
   "description": "AI - minimum raw value"
  },
  {
   "name": "AI - minimum raw value ch1",
   "group": "aiValueRawMin",
   "area": "input",
   "address": 9,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - minimum raw value ch2",
   "group": "aiValueRawMin",
   "area": "input",
   "address": 10,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - minimum raw value ch3",
   "group": "aiValueRawMin",
   "area": "input",
   "address": 11,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - minimum raw value ch4",
   "group": "aiValueRawMin",
   "area": "input",
   "address": 12,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - minimum raw value ch5",
   "group": "aiValueRawMin",
   "area": "input",
   "address": 13,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - minimum raw value ch6",
   "group": "aiValueRawMin",
   "area": "input",
   "address": 14,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - minimum raw value ch7",
   "group": "aiValueRawMin",
   "area": "input",
   "address": 15,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - maximum raw value ch0",
   "group": "aiValueRawMax",
   "area": "input",
   "address": 16,
   "type": "uint16",
   "access": "R",
   "description": "AI - maximum raw value"
  },
  {
   "name": "AI - maximum raw value ch1",
   "group": "aiValueRawMax",
   "area": "input",
   "address": 17,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - maximum raw value ch2",
   "group": "aiValueRawMax",
   "area": "input",
   "address": 18,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - maximum raw value ch3",
   "group": "aiValueRawMax",
   "area": "input",
   "address": 19,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - maximum raw value ch4",
   "group": "aiValueRawMax",
   "area": "input",
   "address": 20,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - maximum raw value ch5",
   "group": "aiValueRawMax",
   "area": "input",
   "address": 21,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - maximum raw value ch6",
   "group": "aiValueRawMax",
   "area": "input",
   "address": 22,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - maximum raw value ch7",
   "group": "aiValueRawMax",
   "area": "input",
   "address": 23,
   "type": "uint16",
   "access": "R"
  },
  {
   "name": "AI - scaled value ch0",
   "group": "aiValueScaled",
   "area": "input",
   "address": 24,
   "type": "float32",
   "access": "R",
   "description": "AI - scaled value"
  },
  {
   "name": "AI - scaled value ch1",
   "group": "aiValueScaled",
   "area": "input",
   "address": 26,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled value ch2",
   "group": "aiValueScaled",
   "area": "input",
   "address": 28,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled value ch3",
   "group": "aiValueScaled",
   "area": "input",
   "address": 30,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled value ch4",
   "group": "aiValueScaled",
   "area": "input",
   "address": 32,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled value ch5",
   "group": "aiValueScaled",
   "area": "input",
   "address": 34,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled value ch6",
   "group": "aiValueScaled",
   "area": "input",
   "address": 36,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled value ch7",
   "group": "aiValueScaled",
   "area": "input",
   "address": 38,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - minimum scaled value ch0",
   "group": "aiValueScaledMin",
   "area": "input",
   "address": 40,
   "type": "float32",
   "access": "R",
   "description": "AI - minimum scaled value"
  },
  {
   "name": "AI - minimum scaled value ch1",
   "group": "aiValueScaledMin",
   "area": "input",
   "address": 42,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - minimum scaled value ch2",
   "group": "aiValueScaledMin",
   "area": "input",
   "address": 44,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - minimum scaled value ch3",
   "group": "aiValueScaledMin",
   "area": "input",
   "address": 46,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - minimum scaled value ch4",
   "group": "aiValueScaledMin",
   "area": "input",
   "address": 48,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - minimum scaled value ch5",
   "group": "aiValueScaledMin",
   "area": "input",
   "address": 50,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - minimum scaled value ch6",
   "group": "aiValueScaledMin",
   "area": "input",
   "address": 52,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - minimum scaled value ch7",
   "group": "aiValueScaledMin",
   "area": "input",
   "address": 54,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - maximum scaled value ch0",
   "group": "aiValueScaledMax",
   "area": "input",
   "address": 56,
   "type": "float32",
   "access": "R",
   "description": "AI - maximum scaled value"
  },
  {
   "name": "AI - maximum scaled value ch1",
   "group": "aiValueScaledMax",
   "area": "input",
   "address": 58,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - maximum scaled value ch2",
   "group": "aiValueScaledMax",
   "area": "input",
   "address": 60,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - maximum scaled value ch3",
   "group": "aiValueScaledMax",
   "area": "input",
   "address": 62,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - maximum scaled value ch4",
   "group": "aiValueScaledMax",
   "area": "input",
   "address": 64,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - maximum scaled value ch5",
   "group": "aiValueScaledMax",
   "area": "input",
   "address": 66,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - maximum scaled value ch6",
   "group": "aiValueScaledMax",
   "area": "input",
   "address": 68,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - maximum scaled value ch7",
   "group": "aiValueScaledMax",
   "area": "input",
   "address": 70,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - status ch0",
   "group": "aiStatus",
   "area": "input",
   "address": 72,
   "type": "uint16",
   "access": "R",
   "description": "AI - status (0: normal, 1: burnout, 2: over",
   "enum": "ai_status"
  },
  {
   "name": "AI - status ch1",
   "group": "aiStatus",
   "area": "input",
   "address": 73,
   "type": "uint16",
   "access": "R",
   "enum": "ai_status"
  },
  {
   "name": "AI - status ch2",
   "group": "aiStatus",
   "area": "input",
   "address": 74,
   "type": "uint16",
   "access": "R",
   "enum": "ai_status"
  },
  {
   "name": "AI - status ch3",
   "group": "aiStatus",
   "area": "input",
   "address": 75,
   "type": "uint16",
   "access": "R",
   "enum": "ai_status"
  },
  {
   "name": "AI - status ch4",
   "group": "aiStatus",
   "area": "input",
   "address": 76,
   "type": "uint16",
   "access": "R",
   "enum": "ai_status"
  },
  {
   "name": "AI - status ch5",
   "group": "aiStatus",
   "area": "input",
   "address": 77,
   "type": "uint16",
   "access": "R",
   "enum": "ai_status"
  },
  {
   "name": "AI - status ch6",
   "group": "aiStatus",
   "area": "input",
   "address": 78,
   "type": "uint16",
   "access": "R",
   "enum": "ai_status"
  },
  {
   "name": "AI - status ch7",
   "group": "aiStatus",
   "area": "input",
   "address": 79,
   "type": "uint16",
   "access": "R",
   "enum": "ai_status"
  },
  {
   "name": "AI - scaled burnout value ch0",
   "group": "aiBurnoutValueScaled",
   "area": "input",
   "address": 80,
   "type": "float32",
   "access": "R",
   "description": "AI - scaled burnout value"
  },
  {
   "name": "AI - scaled burnout value ch1",
   "group": "aiBurnoutValueScaled",
   "area": "input",
   "address": 82,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled burnout value ch2",
   "group": "aiBurnoutValueScaled",
   "area": "input",
   "address": 84,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled burnout value ch3",
   "group": "aiBurnoutValueScaled",
   "area": "input",
   "address": 86,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled burnout value ch4",
   "group": "aiBurnoutValueScaled",
   "area": "input",
   "address": 88,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled burnout value ch5",
   "group": "aiBurnoutValueScaled",
   "area": "input",
   "address": 90,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled burnout value ch6",
   "group": "aiBurnoutValueScaled",
   "area": "input",
   "address": 92,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - scaled burnout value ch7",
   "group": "aiBurnoutValueScaled",
   "area": "input",
   "address": 94,
   "type": "float32",
   "access": "R"
  },
  {
   "name": "AI - mode ch0",
   "group": "aiMode",
   "area": "input",
   "address": 96,
   "type": "uint16",
   "access": "R",
   "description": "AI - mode (0: disable, 1: 0-10 V, 2: 0-20 mA, 3:",
   "enum": "ai_mode"
  },
  {
   "name": "AI - mode ch1",
   "group": "aiMode",
   "area": "input",
   "address": 97,
   "type": "uint16",
   "access": "R",
   "enum": "ai_mode"
  },
  {
   "name": "AI - mode ch2",
   "group": "aiMode",
   "area": "input",
   "address": 98,
   "type": "uint16",
   "access": "R",
   "enum": "ai_mode"
  },
  {
   "name": "AI - mode ch3",
   "group": "aiMode",
   "area": "input",
   "address": 99,
   "type": "uint16",
   "access": "R",
   "enum": "ai_mode"
  },
  {
   "name": "AI - mode ch4",
   "group": "aiMode",
   "area": "input",
   "address": 100,
   "type": "uint16",
   "access": "R",
   "enum": "ai_mode"
  },
  {
   "name": "AI - mode ch5",
   "group": "aiMode",
   "area": "input",
   "address": 101,
   "type": "uint16",
   "access": "R",
   "enum": "ai_mode"
  },
  {
   "name": "AI - mode ch6",
   "group": "aiMode",
   "area": "input",
   "address": 102,
   "type": "uint16",
   "access": "R",
   "enum": "ai_mode"
  },
  {
   "name": "AI - mode ch7",
   "group": "aiMode",
   "area": "input",
   "address": 103,
   "type": "uint16",
   "access": "R",
   "enum": "ai_mode"
  }
 ]
}