{ "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json", "mbmap": 2, "vendor": "AEPH do Brasil", "model": "HORUS", "models": [ "HORUS" ], "vendor_website": "aephdobrasil.com.br", "description": "Two-channel weighing indicator and transmitter: displayed weight with status (gross or net, stable, negative, overload), tare, and remote tare, zero and print commands", "revision": 1, "revised": "2026-11-10", "source": "AEPH do Brasil Horus manual, chapters 13-15 (Modbus RTU protocol)", "sources": [ { "title": "Manual Horus", "version": "08/25", "date": "2025-08", "url": "https://www.aephdobrasil.com.br/storage/files/2025/08/horus-1755887414.pdf", "note": "chapters 13-15 (Modbus RTU protocol); linked in issue #150" } ], "notes": [ "Modbus RTU (slave); set PR = rtU on the indicator. FC03 reads and FC06 writes holding registers. Addresses are 0-based, as sent on the wire.", "The manual allows 9600 to 115200 bit/s, 8 data bits, no parity and 1 or 2 stop bits (set in the serial menu). It gives no default: 9600 and 1 stop bit are placeholders. The address (END) is 1 to 99.", "The device also offers Modbus TCP over Ethernet or Wi-Fi (port configurable, 502 as an example). The manual does not say that the register table is the same for TCP; it is assumed here.", "The device has two load-cell channels, but the manual lists registers for channel 1 only.", "Weight and tare are 17-bit values split over two registers: the high byte of the first register holds the status (or the decimal places), its lowest bit is bit 16 of the value, and the second register holds bits 0-15. They are given here as separate registers because the format has no type for this layout.", "The register table calls the lower register of weight and tare the 'least significant' one, but the example frames put the status byte and bit 16 in the first register (0x000A, 0x000C); this map follows the frames.", "Only the weight, tare, remote command, Modbus address and stop bit registers are mapped. The table also lists calibration, filter, zero, display and other configuration registers whose value encoding the manual does not describe, so they are left out.", "The command values follow the manual's example frames (1 = tare, 2 = zero, 3 = clear tare, 4 = print); the text next to the frames disagrees in places.", "Written from the manual; this map has not been tested on a device." ], "protocol": "tcp+rtu", "unit_id": 1, "baudrate": 9600, "parity": "N", "databits": 8, "stopbits": 1, "port": 502, "byte_order": "big", "word_order": "big", "address_base": 0, "x_status": "official", "enums": { "decimal_point": {"0": "No decimals", "1": "0.0", "2": "0.00", "3": "0.000", "4": "0.0000"} }, "registers": [ {"name": "Weight", "group": "Weight", "area": "holding", "address": 11, "type": "uint16", "description": "Bits 0-15 of the displayed weight; bit 16 is in the first register. Weight = bit 16 x 65536 + this value, with the decimal point and sign given by the status"}, {"name": "Weight bit 16", "group": "Weight", "area": "holding", "address": 10, "type": "bool", "bit": 0}, {"name": "Weight decimal point", "group": "Weight", "area": "holding", "address": 10, "type": "uint16", "bit": 8, "bits": 3, "enum": "decimal_point"}, {"name": "Negative weight", "group": "Weight", "area": "holding", "address": 10, "type": "bool", "bit": 11}, {"name": "Stable weight", "group": "Weight", "area": "holding", "address": 10, "type": "bool", "bit": 12}, {"name": "A/D saturation", "group": "Weight", "area": "holding", "address": 10, "type": "bool", "bit": 13}, {"name": "Overload", "group": "Weight", "area": "holding", "address": 10, "type": "bool", "bit": 14}, {"name": "Gross weight", "group": "Weight", "area": "holding", "address": 10, "type": "bool", "bit": 15, "enum": {"0": "Net", "1": "Gross"}}, {"name": "Tare", "group": "Tare", "area": "holding", "address": 13, "type": "uint16", "description": "Bits 0-15 of the tare; bit 16 is in the first register"}, {"name": "Tare bit 16", "group": "Tare", "area": "holding", "address": 12, "type": "bool", "bit": 0}, {"name": "Tare decimal point", "group": "Tare", "area": "holding", "address": 12, "type": "uint16", "bit": 8, "bits": 3, "enum": "decimal_point"}, {"name": "Remote command", "group": "Commands", "area": "holding", "address": 2, "type": "uint16", "access": "W", "enum": {"1": "Tare", "2": "Zero", "3": "Clear tare", "4": "Print"}}, {"name": "Modbus address", "group": "Device", "area": "holding", "address": 0, "type": "uint16", "access": "RW", "description": "Modbus address of the device (channel 1)"}, {"name": "Stop bits", "group": "Device", "area": "holding", "address": 5, "type": "uint16", "access": "RW", "description": "Stop bit setting of channel 1; the manual does not list the values"} ] }