{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "Moxa",
  "model": "ioThinx 45MR-2600 / 2601",
  "models": [
    "ioThinx 45MR-2600",
    "ioThinx 45MR-2600-T",
    "ioThinx 45MR-2601",
    "ioThinx 45MR-2601-T"
  ],
  "vendor_website": "moxa.com",
  "description": "16-channel digital output modules (45MR-2600 sink, 45MR-2601 source) 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-2600 (-T) registers"
    },
    {
      "title": "ioThinx 4510 Series User's Manual",
      "version": "6.2",
      "date": "2024-07",
      "note": "Appendix A, 45MR-2601 (-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",
  "registers": [
    {
      "name": "DO - status ch0",
      "group": "doStatus",
      "area": "coil",
      "address": 0,
      "type": "bool",
      "access": "RW",
      "description": "DO - status (0: OFF, 1: ON)"
    },
    {
      "name": "DO - status ch1",
      "group": "doStatus",
      "area": "coil",
      "address": 1,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch2",
      "group": "doStatus",
      "area": "coil",
      "address": 2,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch3",
      "group": "doStatus",
      "area": "coil",
      "address": 3,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch4",
      "group": "doStatus",
      "area": "coil",
      "address": 4,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch5",
      "group": "doStatus",
      "area": "coil",
      "address": 5,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch6",
      "group": "doStatus",
      "area": "coil",
      "address": 6,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch7",
      "group": "doStatus",
      "area": "coil",
      "address": 7,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch8",
      "group": "doStatus",
      "area": "coil",
      "address": 8,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch9",
      "group": "doStatus",
      "area": "coil",
      "address": 9,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch10",
      "group": "doStatus",
      "area": "coil",
      "address": 10,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch11",
      "group": "doStatus",
      "area": "coil",
      "address": 11,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch12",
      "group": "doStatus",
      "area": "coil",
      "address": 12,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch13",
      "group": "doStatus",
      "area": "coil",
      "address": 13,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch14",
      "group": "doStatus",
      "area": "coil",
      "address": 14,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - status ch15",
      "group": "doStatus",
      "area": "coil",
      "address": 15,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - Pulse mode - status ch0",
      "group": "doPulseStatus",
      "area": "coil",
      "address": 16,
      "type": "bool",
      "access": "RW",
      "description": "DO - Pulse mode - status (0: Stop, 1: Start)"
    },
    {
      "name": "DO - Pulse mode - status ch1",
      "group": "doPulseStatus",
      "area": "coil",
      "address": 17,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - Pulse mode - status ch2",
      "group": "doPulseStatus",
      "area": "coil",
      "address": 18,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - Pulse mode - status ch3",
      "group": "doPulseStatus",
      "area": "coil",
      "address": 19,
      "type": "bool",
      "access": "RW"
    },
    {
      "name": "DO - mode ch0",
      "group": "doMode",
      "area": "discrete",
      "address": 0,
      "type": "bool",
      "access": "R",
      "description": "DO - mode (0: DO, 1: Pulse)"
    },
    {
      "name": "DO - mode ch1",
      "group": "doMode",
      "area": "discrete",
      "address": 1,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch2",
      "group": "doMode",
      "area": "discrete",
      "address": 2,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch3",
      "group": "doMode",
      "area": "discrete",
      "address": 3,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch4",
      "group": "doMode",
      "area": "discrete",
      "address": 4,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch5",
      "group": "doMode",
      "area": "discrete",
      "address": 5,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch6",
      "group": "doMode",
      "area": "discrete",
      "address": 6,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch7",
      "group": "doMode",
      "area": "discrete",
      "address": 7,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch8",
      "group": "doMode",
      "area": "discrete",
      "address": 8,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch9",
      "group": "doMode",
      "area": "discrete",
      "address": 9,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch10",
      "group": "doMode",
      "area": "discrete",
      "address": 10,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch11",
      "group": "doMode",
      "area": "discrete",
      "address": 11,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch12",
      "group": "doMode",
      "area": "discrete",
      "address": 12,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch13",
      "group": "doMode",
      "area": "discrete",
      "address": 13,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch14",
      "group": "doMode",
      "area": "discrete",
      "address": 14,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - mode ch15",
      "group": "doMode",
      "area": "discrete",
      "address": 15,
      "type": "bool",
      "access": "R"
    },
    {
      "name": "DO - status (all channels)",
      "group": "doStatusAll",
      "area": "holding",
      "address": 0,
      "type": "uint16",
      "access": "RW",
      "description": "DO - status (0: OFF, 1: ON); bit n is channel n"
    },
    {
      "name": "DO - Pulse mode - count ch0",
      "group": "doPulseCount",
      "area": "holding",
      "address": 1,
      "type": "uint32",
      "access": "RW",
      "description": "DO - Pulse mode - count"
    },
    {
      "name": "DO - Pulse mode - count ch1",
      "group": "doPulseCount",
      "area": "holding",
      "address": 3,
      "type": "uint32",
      "access": "RW"
    },
    {
      "name": "DO - Pulse mode - count ch2",
      "group": "doPulseCount",
      "area": "holding",
      "address": 5,
      "type": "uint32",
      "access": "RW"
    },
    {
      "name": "DO - Pulse mode - count ch3",
      "group": "doPulseCount",
      "area": "holding",
      "address": 7,
      "type": "uint32",
      "access": "RW"
    },
    {
      "name": "DO - Pulse mode - ON width ch0",
      "group": "doPulseOnWidth",
      "area": "holding",
      "address": 9,
      "type": "uint16",
      "access": "RW",
      "description": "DO - Pulse mode - ON width (unit: 500 us)",
      "scale": 500,
      "unit": "µs"
    },
    {
      "name": "DO - Pulse mode - ON width ch1",
      "group": "doPulseOnWidth",
      "area": "holding",
      "address": 10,
      "type": "uint16",
      "access": "RW",
      "scale": 500,
      "unit": "µs"
    },
    {
      "name": "DO - Pulse mode - ON width ch2",
      "group": "doPulseOnWidth",
      "area": "holding",
      "address": 11,
      "type": "uint16",
      "access": "RW",
      "scale": 500,
      "unit": "µs"
    },
    {
      "name": "DO - Pulse mode - ON width ch3",
      "group": "doPulseOnWidth",
      "area": "holding",
      "address": 12,
      "type": "uint16",
      "access": "RW",
      "scale": 500,
      "unit": "µs"
    },
    {
      "name": "DO - Pulse mode - OFF width ch0",
      "group": "doPulseOffWidth",
      "area": "holding",
      "address": 13,
      "type": "uint16",
      "access": "RW",
      "description": "DO - Pulse mode - OFF width (unit: 500 us)",
      "scale": 500,
      "unit": "µs"
    },
    {
      "name": "DO - Pulse mode - OFF width ch1",
      "group": "doPulseOffWidth",
      "area": "holding",
      "address": 14,
      "type": "uint16",
      "access": "RW",
      "scale": 500,
      "unit": "µs"
    },
    {
      "name": "DO - Pulse mode - OFF width ch2",
      "group": "doPulseOffWidth",
      "area": "holding",
      "address": 15,
      "type": "uint16",
      "access": "RW",
      "scale": 500,
      "unit": "µs"
    },
    {
      "name": "DO - Pulse mode - OFF width ch3",
      "group": "doPulseOffWidth",
      "area": "holding",
      "address": 16,
      "type": "uint16",
      "access": "RW",
      "scale": 500,
      "unit": "µs"
    },
    {
      "name": "DO - Pulse mode - status (all channels)",
      "group": "doPulseStatusAll",
      "area": "holding",
      "address": 17,
      "type": "uint16",
      "access": "RW",
      "description": "DO - Pulse mode - status (0: Stop, 1: Start); bit n is channel n"
    },
    {
      "name": "DO - mode (all channels)",
      "group": "doModeAll",
      "area": "input",
      "address": 0,
      "type": "uint16",
      "access": "R",
      "description": "DO - mode (0: DO, 1: Pulse); bit n is channel n"
    }
  ]
}