{ "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json", "mbmap": 2, "vendor": "Moxa", "model": "ioThinx 45MR-2606", "models": [ "ioThinx 45MR-2606", "ioThinx 45MR-2606-T" ], "vendor_website": "moxa.com", "description": "8 digital input and 8 digital output 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-2606 (-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.", "The earlier version of this map read the counters as 64-bit values; the manual and its RESTful API list them as 32-bit (0 to 4294967295)." ], "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": "DI - Counter mode - status ch0", "group": "diCounterStatus", "area": "coil", "address": 8, "type": "bool", "access": "RW", "description": "DI - Counter mode - status (0: Pause, 1: Run)" }, { "name": "DI - Counter mode - status ch1", "group": "diCounterStatus", "area": "coil", "address": 9, "type": "bool", "access": "RW" }, { "name": "DI - Counter mode - clear overflow flag ch0", "group": "diCounterOverflowFlagClear", "area": "coil", "address": 10, "type": "bool", "access": "RW", "description": "DI - Counter mode - clear overflow flag (1: Clear)" }, { "name": "DI - Counter mode - clear overflow flag ch1", "group": "diCounterOverflowFlagClear", "area": "coil", "address": 11, "type": "bool", "access": "RW" }, { "name": "DO - Pulse mode - status ch0", "group": "doPulseStatus", "area": "coil", "address": 12, "type": "bool", "access": "RW", "description": "DO - Pulse mode - status (0: Stop, 1: Start)" }, { "name": "DO - Pulse mode - status ch1", "group": "doPulseStatus", "area": "coil", "address": 13, "type": "bool", "access": "RW" }, { "name": "DI - DI mode - status ch0", "group": "diStatus", "area": "discrete", "address": 0, "type": "bool", "access": "R", "description": "DI - DI mode - status (0: OFF, 1: ON)" }, { "name": "DI - DI mode - status ch1", "group": "diStatus", "area": "discrete", "address": 1, "type": "bool", "access": "R" }, { "name": "DI - DI mode - status ch2", "group": "diStatus", "area": "discrete", "address": 2, "type": "bool", "access": "R" }, { "name": "DI - DI mode - status ch3", "group": "diStatus", "area": "discrete", "address": 3, "type": "bool", "access": "R" }, { "name": "DI - DI mode - status ch4", "group": "diStatus", "area": "discrete", "address": 4, "type": "bool", "access": "R" }, { "name": "DI - DI mode - status ch5", "group": "diStatus", "area": "discrete", "address": 5, "type": "bool", "access": "R" }, { "name": "DI - DI mode - status ch6", "group": "diStatus", "area": "discrete", "address": 6, "type": "bool", "access": "R" }, { "name": "DI - DI mode - status ch7", "group": "diStatus", "area": "discrete", "address": 7, "type": "bool", "access": "R" }, { "name": "DI - mode ch0", "group": "diMode", "area": "discrete", "address": 8, "type": "bool", "access": "R", "description": "DI - mode (0: DI, 1: Counter)" }, { "name": "DI - mode ch1", "group": "diMode", "area": "discrete", "address": 9, "type": "bool", "access": "R" }, { "name": "DI - mode ch2", "group": "diMode", "area": "discrete", "address": 10, "type": "bool", "access": "R" }, { "name": "DI - mode ch3", "group": "diMode", "area": "discrete", "address": 11, "type": "bool", "access": "R" }, { "name": "DI - mode ch4", "group": "diMode", "area": "discrete", "address": 12, "type": "bool", "access": "R" }, { "name": "DI - mode ch5", "group": "diMode", "area": "discrete", "address": 13, "type": "bool", "access": "R" }, { "name": "DI - mode ch6", "group": "diMode", "area": "discrete", "address": 14, "type": "bool", "access": "R" }, { "name": "DI - mode ch7", "group": "diMode", "area": "discrete", "address": 15, "type": "bool", "access": "R" }, { "name": "DO - mode ch0", "group": "doMode", "area": "discrete", "address": 16, "type": "bool", "access": "R", "description": "DO - mode (0: DO, 1: Pulse)" }, { "name": "DO - mode ch1", "group": "doMode", "area": "discrete", "address": 17, "type": "bool", "access": "R" }, { "name": "DO - mode ch2", "group": "doMode", "area": "discrete", "address": 18, "type": "bool", "access": "R" }, { "name": "DO - mode ch3", "group": "doMode", "area": "discrete", "address": 19, "type": "bool", "access": "R" }, { "name": "DO - mode ch4", "group": "doMode", "area": "discrete", "address": 20, "type": "bool", "access": "R" }, { "name": "DO - mode ch5", "group": "doMode", "area": "discrete", "address": 21, "type": "bool", "access": "R" }, { "name": "DO - mode ch6", "group": "doMode", "area": "discrete", "address": 22, "type": "bool", "access": "R" }, { "name": "DO - mode ch7", "group": "doMode", "area": "discrete", "address": 23, "type": "bool", "access": "R" }, { "name": "DI - Counter mode - overflow flag ch0", "group": "diCounterOverflowFlag", "area": "discrete", "address": 24, "type": "bool", "access": "R", "description": "DI - Counter mode - overflow flag (0: Normal, 1:" }, { "name": "DI - Counter mode - overflow flag ch1", "group": "diCounterOverflowFlag", "area": "discrete", "address": 25, "type": "bool", "access": "R" }, { "name": "DI - Counter mode - value ch0", "group": "diCounterValue", "area": "holding", "address": 0, "type": "uint32", "access": "RW", "description": "DI - Counter mode - value" }, { "name": "DI - Counter mode - value ch1", "group": "diCounterValue", "area": "holding", "address": 2, "type": "uint32", "access": "RW" }, { "name": "DO - status (all channels)", "group": "doStatusAll", "area": "holding", "address": 4, "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": 5, "type": "uint32", "access": "RW", "description": "DO - Pulse mode - count" }, { "name": "DO - Pulse mode - count ch1", "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 - OFF width ch0", "group": "doPulseOffWidth", "area": "holding", "address": 11, "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": 12, "type": "uint16", "access": "RW", "scale": 500, "unit": "µs" }, { "name": "DO - Pulse mode - status (all channels)", "group": "doPulseStatusAll", "area": "holding", "address": 13, "type": "uint16", "access": "RW", "description": "DO - Pulse mode - status (0: Stop, 1: Start); bit n is channel n" }, { "name": "DI - Counter mode - status (all channels)", "group": "diCounterStatusAll", "area": "holding", "address": 14, "type": "uint16", "access": "RW", "description": "DI - Counter mode - status (0: Pause, 1: Run); bit n is channel n" }, { "name": "DI - Counter mode - clear overflow flag (all channels)", "group": "diCounterOverflowFlagClearAll", "area": "holding", "address": 15, "type": "uint16", "access": "RW", "description": "DI - Counter mode - clear overflow flag (1: Clear); bit n is channel n" }, { "name": "DI - DI mode - status (all channels)", "group": "diStatusAll", "area": "input", "address": 0, "type": "uint16", "access": "R", "description": "DI - DI mode - status (0: OFF, 1: ON); bit n is channel n" }, { "name": "DI - Counter mode - overflow flag (all channels)", "group": "diCounterOverflowFlagAll", "area": "input", "address": 1, "type": "uint16", "access": "R", "description": "DI - Counter mode - overflow flag (0: Normal, 1:; bit n is channel n" }, { "name": "DI - mode (all channels)", "group": "diModeAll", "area": "input", "address": 2, "type": "uint16", "access": "R", "description": "DI - mode (0: DI, 1: Counter); bit n is channel n" }, { "name": "DO - mode (all channels)", "group": "doModeAll", "area": "input", "address": 3, "type": "uint16", "access": "R", "description": "DO - mode (0: DO, 1: Pulse); bit n is channel n" } ] }