{ "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json", "mbmap": 2, "vendor": "Unipi Technology", "model": "Edge E412", "models": [ "Edge E412" ], "vendor_website": "www.unipi.technology", "description": "Modbus TCP I/O unit with 4 digital inputs and 2 digital outputs (with PWM)", "x_status": "official", "revision": 3, "revised": "2026-11-10", "source": "Edge E412 Modbus map v2.0, Unipi technology", "sources": [ { "title": "Edge E412 Modbus map", "version": "2.0", "url": "https://kb.unipi.technology/_media/files:products:edge:unipi-edge-e412-modbus-map-v2.0.pdf", "note": "Holding registers and Coils sheets (Unit ID 0 and Unit ID 1), Description sheet" } ], "notes": [ "Registers are 0-based. Bit numbers: 0 = LSB, 15 = MSB. 32-bit values are assumed low word first (CDAB), as on the Unipi extensions; the manual does not state the word order.", "Registers marked Reserved in the manual are left out.", "Transport is not stated in the manual; Modbus TCP on port 502 is assumed.", "I/O, configuration and command registers are on Unit ID 1. The user LED, storage and connection registers (addresses 3000-4203) are on Unit ID 0. Defaults: debounce 50 (5 ms), DirectSwitch off, MWD timeout 2500 ms and disabled." ], "protocol": "tcp", "unit_id": 1, "port": 502, "byte_order": "big", "word_order": "little", "address_base": 0, "registers": [ {"name": "User LED 1", "group": "LEDs", "area": "holding", "address": 3998, "type": "bool", "bit": 0, "access": "W"}, {"name": "User LED 2", "group": "LEDs", "area": "holding", "address": 3998, "type": "bool", "bit": 1, "access": "W"}, {"name": "User LED 3", "group": "LEDs", "area": "holding", "address": 3998, "type": "bool", "bit": 2, "access": "W"}, {"name": "Storage - erase cycles used", "group": "System", "area": "holding", "address": 4000, "type": "uint16", "unit": "%", "access": "R"}, {"name": "Storage - good blocks", "group": "System", "area": "holding", "address": 4001, "type": "uint16", "unit": "%", "access": "R"}, {"name": "Connection mode", "group": "Connection", "area": "holding", "address": 4200, "type": "uint16", "access": "R"}, {"name": "Connection network type", "group": "Connection", "area": "holding", "address": 4201, "type": "uint16", "access": "R"}, {"name": "Connection RSSI", "group": "Connection", "area": "holding", "address": 4202, "type": "uint16", "unit": "dBm", "access": "R"}, {"name": "Connection signal quality", "group": "Connection", "area": "holding", "address": 4203, "type": "uint16", "access": "R"}, {"name": "User LED 1 (coil)", "group": "LEDs", "area": "coil", "address": 3000, "type": "bool", "access": "W"}, {"name": "User LED 2 (coil)", "group": "LEDs", "area": "coil", "address": 3001, "type": "bool", "access": "W"}, {"name": "User LED 3 (coil)", "group": "LEDs", "area": "coil", "address": 3002, "type": "bool", "access": "W"}, {"name": "Digital Input 1", "group": "Digital inputs", "area": "holding", "address": 0, "type": "bool", "bit": 0, "access": "R"}, {"name": "Digital Input 2", "group": "Digital inputs", "area": "holding", "address": 0, "type": "bool", "bit": 1, "access": "R"}, {"name": "Digital Input 3", "group": "Digital inputs", "area": "holding", "address": 0, "type": "bool", "bit": 2, "access": "R"}, {"name": "Digital Input 4", "group": "Digital inputs", "area": "holding", "address": 0, "type": "bool", "bit": 3, "access": "R"}, {"name": "Digital Output 1", "group": "Digital outputs", "area": "holding", "address": 1, "type": "bool", "bit": 0, "access": "RW"}, {"name": "Digital Output 2", "group": "Digital outputs", "area": "holding", "address": 1, "type": "bool", "bit": 1, "access": "RW"}, {"name": "MWD enable", "group": "Watchdog", "area": "holding", "address": 2, "type": "bool", "bit": 0, "access": "RW"}, {"name": "MWD reboot detected", "group": "Watchdog", "area": "holding", "address": 2, "type": "bool", "bit": 1, "access": "RW"}, {"name": "Digital Input 1 counter", "group": "Counters", "area": "holding", "address": 3, "type": "uint32", "description": "Pulse counter; writable to reset", "access": "RW"}, {"name": "Digital Input 2 counter", "group": "Counters", "area": "holding", "address": 5, "type": "uint32", "description": "Pulse counter; writable to reset", "access": "RW"}, {"name": "Digital Input 3 counter", "group": "Counters", "area": "holding", "address": 7, "type": "uint32", "description": "Pulse counter; writable to reset", "access": "RW"}, {"name": "Digital Input 4 counter", "group": "Counters", "area": "holding", "address": 9, "type": "uint32", "description": "Pulse counter; writable to reset", "access": "RW"}, {"name": "PWM duty cycle DO 1.1", "group": "Digital outputs", "area": "holding", "address": 11, "type": "uint16", "access": "RW"}, {"name": "PWM duty cycle DO 1.2", "group": "Digital outputs", "area": "holding", "address": 12, "type": "uint16", "access": "RW"}, {"name": "Synchronised digital output 1", "group": "Synchronised outputs", "area": "holding", "address": 14, "type": "bool", "bit": 0, "access": "RW"}, {"name": "Synchronised digital output 2", "group": "Synchronised outputs", "area": "holding", "address": 14, "type": "bool", "bit": 1, "access": "RW"}, {"name": "Synchronised digital output lock 1", "group": "Synchronised outputs", "area": "holding", "address": 15, "type": "bool", "bit": 0, "access": "RW"}, {"name": "Synchronised digital output lock 2", "group": "Synchronised outputs", "area": "holding", "address": 15, "type": "bool", "bit": 1, "access": "RW"}, {"name": "Firmware version", "group": "Info", "area": "holding", "address": 1000, "type": "uint16", "role": "firmware", "description": "Firmware version (raw number)", "access": "R"}, {"name": "Number of digital inputs", "group": "Info", "area": "holding", "address": 1001, "type": "uint16", "bit": 0, "bits": 8, "access": "R"}, {"name": "Number of digital outputs", "group": "Info", "area": "holding", "address": 1001, "type": "uint16", "bit": 8, "bits": 8, "access": "R"}, {"name": "Number of internal RS485 lines", "group": "Info", "area": "holding", "address": 1002, "type": "uint16", "bit": 0, "bits": 4, "access": "R"}, {"name": "Number of analog outputs", "group": "Info", "area": "holding", "address": 1002, "type": "uint16", "bit": 4, "bits": 4, "access": "R"}, {"name": "Number of analog inputs", "group": "Info", "area": "holding", "address": 1002, "type": "uint16", "bit": 8, "bits": 8, "access": "R"}, {"name": "Firmware ID", "group": "Info", "area": "holding", "address": 1003, "type": "uint16", "access": "R"}, {"name": "Hardware ID", "group": "Info", "area": "holding", "address": 1004, "type": "uint16", "access": "R"}, {"name": "PCB serial number", "group": "Info", "area": "holding", "address": 1005, "type": "uint32", "role": "serial", "access": "R"}, {"name": "MWD timeout", "group": "Settings", "area": "holding", "address": 1008, "type": "uint16", "unit": "ms", "description": "MasterWatchDog timeout; default 2500 ms", "access": "RW"}, {"name": "MCU VRef", "group": "Info", "area": "holding", "address": 1009, "type": "uint16", "description": "Reference voltage of the MCU (raw)", "access": "R"}, {"name": "Debounce time DI 1", "group": "Settings", "area": "holding", "address": 1010, "type": "uint16", "scale": 0.1, "unit": "ms", "description": "Raw unit is 100 us; default 50 (5 ms)", "access": "RW"}, {"name": "Debounce time DI 2", "group": "Settings", "area": "holding", "address": 1011, "type": "uint16", "scale": 0.1, "unit": "ms", "description": "Raw unit is 100 us; default 50 (5 ms)", "access": "RW"}, {"name": "Debounce time DI 3", "group": "Settings", "area": "holding", "address": 1012, "type": "uint16", "scale": 0.1, "unit": "ms", "description": "Raw unit is 100 us; default 50 (5 ms)", "access": "RW"}, {"name": "Debounce time DI 4", "group": "Settings", "area": "holding", "address": 1013, "type": "uint16", "scale": 0.1, "unit": "ms", "description": "Raw unit is 100 us; default 50 (5 ms)", "access": "RW"}, {"name": "DirectSwitch enable DI 1", "group": "DirectSwitch", "area": "holding", "address": 1014, "type": "bool", "bit": 0, "access": "RW"}, {"name": "DirectSwitch enable DI 2", "group": "DirectSwitch", "area": "holding", "address": 1014, "type": "bool", "bit": 1, "access": "RW"}, {"name": "DirectSwitch invert polarity DI 1", "group": "DirectSwitch", "area": "holding", "address": 1015, "type": "bool", "bit": 0, "access": "RW"}, {"name": "DirectSwitch invert polarity DI 2", "group": "DirectSwitch", "area": "holding", "address": 1015, "type": "bool", "bit": 1, "access": "RW"}, {"name": "DirectSwitch toggle DI 1", "group": "DirectSwitch", "area": "holding", "address": 1016, "type": "bool", "bit": 0, "access": "RW"}, {"name": "DirectSwitch toggle DI 2", "group": "DirectSwitch", "area": "holding", "address": 1016, "type": "bool", "bit": 1, "access": "RW"}, {"name": "Section PWM prescaler", "group": "Settings", "area": "holding", "address": 1017, "type": "uint16", "access": "RW"}, {"name": "Section PWM cycle length", "group": "Settings", "area": "holding", "address": 1018, "type": "uint16", "access": "RW"}, {"name": "Digital Output 1 (coil)", "group": "Digital outputs", "area": "coil", "address": 0, "type": "bool", "access": "RW"}, {"name": "Digital Output 2 (coil)", "group": "Digital outputs", "area": "coil", "address": 1, "type": "bool", "access": "RW"}, {"name": "Digital Input 1 (coil)", "group": "Digital inputs", "area": "coil", "address": 2, "type": "bool", "access": "R"}, {"name": "Digital Input 2 (coil)", "group": "Digital inputs", "area": "coil", "address": 3, "type": "bool", "access": "R"}, {"name": "Digital Input 3 (coil)", "group": "Digital inputs", "area": "coil", "address": 4, "type": "bool", "access": "R"}, {"name": "Digital Input 4 (coil)", "group": "Digital inputs", "area": "coil", "address": 5, "type": "bool", "access": "R"}, {"name": "MWD reset indication", "group": "Commands", "area": "coil", "address": 1000, "type": "bool", "description": "Clears the MWD reboot indication", "access": "RW"}, {"name": "Reset MCU group", "group": "Commands", "area": "coil", "address": 1002, "type": "bool", "access": "W"}, {"name": "Save configuration", "group": "Commands", "area": "coil", "address": 1003, "type": "bool", "description": "Stores the current configuration so it is used at startup", "access": "W"} ] }