{ "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json", "mbmap": 2, "vendor": "Moxa", "model": "ioThinx 45MR-4420", "models": [ "ioThinx 45MR-4420", "ioThinx 45MR-4420-T" ], "vendor_website": "moxa.com", "description": "4-channel analog 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-4420 (-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": { "ao_mode": { "0": "Disabled", "1": "0-10 V", "2": "0-20 mA", "3": "4-20 mA", "4": "±10 V" } }, "registers": [ { "name": "AO - raw value ch0", "group": "aoValueRaw", "area": "holding", "address": 0, "type": "uint16", "access": "RW", "description": "AO - raw value" }, { "name": "AO - raw value ch1", "group": "aoValueRaw", "area": "holding", "address": 1, "type": "uint16", "access": "RW" }, { "name": "AO - raw value ch2", "group": "aoValueRaw", "area": "holding", "address": 2, "type": "uint16", "access": "RW" }, { "name": "AO - raw value ch3", "group": "aoValueRaw", "area": "holding", "address": 3, "type": "uint16", "access": "RW" }, { "name": "AO - scaled value ch0", "group": "aoValueScaled", "area": "holding", "address": 4, "type": "uint32", "access": "RW", "description": "AO - scaled value" }, { "name": "AO - scaled value ch1", "group": "aoValueScaled", "area": "holding", "address": 6, "type": "uint32", "access": "RW" }, { "name": "AO - scaled value ch2", "group": "aoValueScaled", "area": "holding", "address": 8, "type": "uint32", "access": "RW" }, { "name": "AO - scaled value ch3", "group": "aoValueScaled", "area": "holding", "address": 10, "type": "uint32", "access": "RW" }, { "name": "AO - mode ch0", "group": "aoMode", "area": "input", "address": 0, "type": "uint16", "access": "R", "description": "AO - mode (0: disable, 1: 0-10 V, 2: 0-20 mA, 3:", "enum": "ao_mode" }, { "name": "AO - mode ch1", "group": "aoMode", "area": "input", "address": 1, "type": "uint16", "access": "R", "enum": "ao_mode" }, { "name": "AO - mode ch2", "group": "aoMode", "area": "input", "address": 2, "type": "uint16", "access": "R", "enum": "ao_mode" }, { "name": "AO - mode ch3", "group": "aoMode", "area": "input", "address": 3, "type": "uint16", "access": "R", "enum": "ao_mode" } ] }