{ "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json", "mbmap": 2, "vendor": "BEKO TECHNOLOGIES", "model": "METPOINT VFS TI / TM", "models": ["METPOINT VFS TI 220", "METPOINT VFS TI 220 X", "METPOINT VFS TI 400", "METPOINT VFS TI 400 X", "METPOINT VFS TM 20", "METPOINT VFS TM 25", "METPOINT VFS TM 50"], "vendor_website": "beko-technologies.com", "description": "Thermal mass flow meter for compressed air and gases, Modbus RTU (RS485)", "revision": 1, "revised": "2026-11-09", "source": "BEKO TECHNOLOGIES, METPOINT VFS TI / TM, Original installation and service instructions 10-447, version 00.02, 31 March 2025", "sources": [{"title": "METPOINT VFS TI / TM, Original installation and service instructions (10-447)", "version": "00.02", "date": "2025-03-31", "note": "Chapter 4.6, Modbus settings"}], "notes": [ "The manual gives the addresses without saying whether they are 0- or 1-based. The one example it gives (holding register 0x07D0 is decimal 2000) is a wire address, so they are given here as 0-based. If a read fails, try address_base 1.", "Defaults from the manual: 19200 baud, 8 data bits, even parity, 1 stop bit, slave address 247. When the address is changed it can be 1 to 246.", "Byte order is ABCD for floats and 32-bit integers (big-endian words). Each float takes two registers.", "The manual lists the 4.6.3 table as Read Input Registers (0x04) and the 4.6.6 table as Write Multiple Holding Registers (0x10). The holding registers are given as RW; the manual does not say they can be read back with 0x03.", "Input and holding registers use the same numbers for different things (3222, 3400 to 3406): they are separate address spaces.", "Error flags: register 3200 holds all flags as a bit field (the manual numbers the bits 1 to 16, here 0 to 15). Registers 3201 to 3216 repeat each flag as a register; the manual lists no Error9 flag.", "In the manual's unit lists for registers 3400 and 3701, value 4 is printed as l/h, the same as value 2. It is most likely l/s.", "Changing the interface parameters is a three step write: 0xAC1D to register 5010, the parameter word to register 2000, then 0xBA5E to register 5020; restart the device afterwards.", "The device also answers Read Device Identification (0x2B / 0x0E) with the vendor, product code, software version and serial number as text; this is not a register, so it is not in the map.", "Written from the manufacturer's document; not tested on a device." ], "protocol": "rtu", "unit_id": 247, "baudrate": 19200, "parity": "E", "databits": 8, "stopbits": 1, "address_base": 0, "byte_order": "big", "word_order": "big", "x_status": "official", "enums": { "on_off": {"0": "Off", "1": "On"}, "active": {"0": "Inactive", "1": "Active"}, "pressure_unit": {"0": "mbar", "1": "hPa", "2": "psi"}, "temperature_unit": {"0": "°C", "1": "°F"}, "diameter_unit": {"0": "mm", "1": "in"}, "velocity_unit": {"0": "m/s", "1": "ft/min"}, "flow_unit": {"1": "m³/h", "2": "m³/min", "3": "l/s", "4": "l/min", "5": "l/h", "6": "kg/s", "7": "kg/min", "8": "kg/h", "9": "cfm", "10": "cfh", "11": "g/s", "12": "g/min", "13": "t/h", "14": "lbs/s", "15": "lb/min", "16": "lb/h"}, "source": {"0": "m³/h", "1": "m³/min", "2": "l/h", "3": "l/min", "4": "l/h (as printed; probably l/s)", "5": "cfm", "6": "cfh", "7": "kg/h", "8": "kg/min", "9": "kg/s", "10": "g/s", "11": "g/min", "12": "t/h", "13": "lb/s", "14": "lb/min", "15": "lb/h", "16": "m/s", "17": "fpm", "18": "°C", "19": "°F"}, "summation_unit": {"22": "m³", "23": "l", "24": "kg", "25": "cf", "26": "lb"}, "display_consumption_unit": {"1": "m³", "2": "l", "3": "kg", "4": "cf", "5": "lb"}, "pulse_alarm_mode": {"0": "Inactive", "1": "Pulse mode", "2": "Alarm mode"}, "alarm_mode": {"0": "Inactive", "1": "High", "2": "Low", "3": "Low/High", "4": "Calibration alarm", "5": "System alarm"}, "polarity": {"0": "Negative", "1": "Positive"}, "interface_serial": {"0": "4800 baud, no parity, 2 stop bits", "1": "4800 baud, even parity, 1 stop bit", "2": "4800 baud, odd parity, 1 stop bit", "3": "9600 baud, no parity, 2 stop bits", "4": "9600 baud, even parity, 1 stop bit", "5": "9600 baud, odd parity, 1 stop bit", "6": "19200 baud, no parity, 2 stop bits", "7": "19200 baud, even parity, 1 stop bit", "8": "19200 baud, odd parity, 1 stop bit", "9": "38400 baud, no parity, 2 stop bits", "10": "38400 baud, even parity, 1 stop bit", "11": "38400 baud, odd parity, 1 stop bit", "12": "57600 baud, no parity, 2 stop bits", "13": "57600 baud, even parity, 1 stop bit", "14": "57600 baud, odd parity, 1 stop bit", "15": "76800 baud, no parity, 2 stop bits", "16": "76800 baud, even parity, 1 stop bit", "17": "76800 baud, odd parity, 1 stop bit", "18": "115200 baud, no parity, 2 stop bits", "19": "115200 baud, even parity, 1 stop bit", "20": "115200 baud, odd parity, 1 stop bit"} }, "registers": [ {"name": "RS485 termination state", "group": "Status", "area": "input", "address": 1701, "type": "uint16", "access": "R", "enum": "on_off"}, {"name": "Error 1: Code flash fault", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 0, "access": "R", "description": "Bit 1 of the error flags word (Error1 flag)"}, {"name": "Error 2: Configuration fault", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 1, "access": "R", "description": "Bit 2 of the error flags word (Error2 flag)"}, {"name": "Error 3: Product not adjusted", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 2, "access": "R", "description": "Bit 3 of the error flags word (Error3 flag)"}, {"name": "Error 4: Hardware fault", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 3, "access": "R", "description": "Bit 4 of the error flags word (Error4 flag)"}, {"name": "Error 5: Hardware fault, sensor memory", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 4, "access": "R", "description": "Bit 5 of the error flags word (Error5 flag)"}, {"name": "Error 6: Hardware fault, bridge DAC", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 5, "access": "R", "description": "Bit 6 of the error flags word (Error6 flag)"}, {"name": "Error 7: Hardware fault, current loop DAC", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 6, "access": "R", "description": "Bit 7 of the error flags word (Error7 flag)"}, {"name": "Error 8: Hardware fault, sensor RGS, RHZ or bridge", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 7, "access": "R", "description": "Bit 8 of the error flags word (Error8 flag)"}, {"name": "Error 10: Invalid offset value for bridge DAC", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 9, "access": "R", "description": "Bit 10 of the error flags word (Error10 flag)"}, {"name": "Error 11: TOF fault", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 10, "access": "R", "description": "Bit 11 of the error flags word (Error11 flag)"}, {"name": "Error 12: Sensor immersion depth fault", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 11, "access": "R", "description": "Bit 12 of the error flags word (Error12 flag)"}, {"name": "Error 13: Excess value warning", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 12, "access": "R", "description": "Bit 13 of the error flags word (Error13 flag)"}, {"name": "Error 14: Excess value error", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 13, "access": "R", "description": "Bit 14 of the error flags word (Error14 flag)"}, {"name": "Error 15: Gas temperature warning", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 14, "access": "R", "description": "Bit 15 of the error flags word (Error15 flag)"}, {"name": "Error 16: Gas temperature error", "group": "Errors", "area": "input", "address": 3200, "type": "bool", "bit": 15, "access": "R", "description": "Bit 16 of the error flags word (Error16 flag)"}, {"name": "Error1 flag", "group": "Errors", "area": "input", "address": 3201, "type": "uint16", "access": "R", "enum": "active", "description": "Code flash fault"}, {"name": "Error2 flag", "group": "Errors", "area": "input", "address": 3202, "type": "uint16", "access": "R", "enum": "active", "description": "Configuration fault"}, {"name": "Error3 flag", "group": "Errors", "area": "input", "address": 3203, "type": "uint16", "access": "R", "enum": "active", "description": "Product not adjusted"}, {"name": "Error4 flag", "group": "Errors", "area": "input", "address": 3204, "type": "uint16", "access": "R", "enum": "active", "description": "Hardware fault"}, {"name": "Error5 flag", "group": "Errors", "area": "input", "address": 3205, "type": "uint16", "access": "R", "enum": "active", "description": "Hardware fault, sensor memory"}, {"name": "Error6 flag", "group": "Errors", "area": "input", "address": 3206, "type": "uint16", "access": "R", "enum": "active", "description": "Hardware fault, bridge DAC"}, {"name": "Error7 flag", "group": "Errors", "area": "input", "address": 3207, "type": "uint16", "access": "R", "enum": "active", "description": "Hardware fault, current loop DAC"}, {"name": "Error8 flag", "group": "Errors", "area": "input", "address": 3208, "type": "uint16", "access": "R", "enum": "active", "description": "Hardware fault, sensor RGS, RHZ or bridge"}, {"name": "Error10 flag", "group": "Errors", "area": "input", "address": 3210, "type": "uint16", "access": "R", "enum": "active", "description": "Invalid offset value for bridge DAC"}, {"name": "Error11 flag", "group": "Errors", "area": "input", "address": 3211, "type": "uint16", "access": "R", "enum": "active", "description": "TOF fault"}, {"name": "Error12 flag", "group": "Errors", "area": "input", "address": 3212, "type": "uint16", "access": "R", "enum": "active", "description": "Sensor immersion depth fault"}, {"name": "Error13 flag", "group": "Errors", "area": "input", "address": 3213, "type": "uint16", "access": "R", "enum": "active", "description": "Excess value warning"}, {"name": "Error14 flag", "group": "Errors", "area": "input", "address": 3214, "type": "uint16", "access": "R", "enum": "active", "description": "Excess value error"}, {"name": "Error15 flag", "group": "Errors", "area": "input", "address": 3215, "type": "uint16", "access": "R", "enum": "active", "description": "Gas temperature warning"}, {"name": "Error16 flag", "group": "Errors", "area": "input", "address": 3216, "type": "uint16", "access": "R", "enum": "active", "description": "Gas temperature error"}, {"name": "Beacon state", "group": "Status", "area": "input", "address": 3222, "type": "uint16", "access": "R", "enum": "on_off", "description": "Identification signal"}, {"name": "Remaining calibration time", "group": "Status", "area": "input", "address": 3300, "type": "uint16", "unit": "h", "access": "R", "description": "Time left until the next calibration"}, {"name": "Volume flow (m³/h)", "group": "Measurement", "area": "input", "address": 3400, "type": "float32", "unit": "m³/h", "access": "R"}, {"name": "Volume flow (m³/min)", "group": "Measurement", "area": "input", "address": 3402, "type": "float32", "unit": "m³/min", "access": "R"}, {"name": "Volume flow (l/h)", "group": "Measurement", "area": "input", "address": 3404, "type": "float32", "unit": "l/h", "access": "R"}, {"name": "Volume flow (l/min)", "group": "Measurement", "area": "input", "address": 3406, "type": "float32", "unit": "l/min", "access": "R"}, {"name": "Volume flow (l/s)", "group": "Measurement", "area": "input", "address": 3408, "type": "float32", "unit": "l/s", "access": "R"}, {"name": "Volume flow (cfm)", "group": "Measurement", "area": "input", "address": 3410, "type": "float32", "unit": "cfm", "access": "R"}, {"name": "Volume flow (cfh)", "group": "Measurement", "area": "input", "address": 3412, "type": "float32", "unit": "cfh", "access": "R"}, {"name": "Mass flow (kg/h)", "group": "Measurement", "area": "input", "address": 3414, "type": "float32", "unit": "kg/h", "access": "R"}, {"name": "Mass flow (kg/min)", "group": "Measurement", "area": "input", "address": 3416, "type": "float32", "unit": "kg/min", "access": "R"}, {"name": "Mass flow (kg/s)", "group": "Measurement", "area": "input", "address": 3418, "type": "float32", "unit": "kg/s", "access": "R"}, {"name": "Mass flow (g/s)", "group": "Measurement", "area": "input", "address": 3420, "type": "float32", "unit": "g/s", "access": "R"}, {"name": "Mass flow (g/min)", "group": "Measurement", "area": "input", "address": 3422, "type": "float32", "unit": "g/min", "access": "R"}, {"name": "Mass flow (t/h)", "group": "Measurement", "area": "input", "address": 3424, "type": "float32", "unit": "t/h", "access": "R"}, {"name": "Mass flow (lbs/s)", "group": "Measurement", "area": "input", "address": 3426, "type": "float32", "unit": "lbs/s", "access": "R"}, {"name": "Mass flow (lbs/min)", "group": "Measurement", "area": "input", "address": 3428, "type": "float32", "unit": "lbs/min", "access": "R"}, {"name": "Mass flow (lbs/h)", "group": "Measurement", "area": "input", "address": 3430, "type": "float32", "unit": "lbs/h", "access": "R"}, {"name": "Flow velocity (m/s)", "group": "Measurement", "area": "input", "address": 3432, "type": "float32", "unit": "m/s", "access": "R"}, {"name": "Flow velocity (fpm)", "group": "Measurement", "area": "input", "address": 3434, "type": "float32", "unit": "fpm", "access": "R"}, {"name": "Gas temperature (°C)", "group": "Measurement", "area": "input", "address": 3436, "type": "float32", "unit": "°C", "access": "R"}, {"name": "Gas temperature (°F)", "group": "Measurement", "area": "input", "address": 3438, "type": "float32", "unit": "°F", "access": "R"}, {"name": "User summation (m³)", "group": "Measurement", "area": "input", "address": 3444, "type": "uint32", "unit": "m³", "access": "R", "description": "Consumption"}, {"name": "User summation (l)", "group": "Measurement", "area": "input", "address": 3446, "type": "uint32", "unit": "l", "access": "R", "description": "Consumption"}, {"name": "User summation (kg)", "group": "Measurement", "area": "input", "address": 3448, "type": "uint32", "unit": "kg", "access": "R", "description": "Consumption"}, {"name": "User summation (cf)", "group": "Measurement", "area": "input", "address": 3450, "type": "uint32", "unit": "cf", "access": "R", "description": "Consumption"}, {"name": "User summation (lb)", "group": "Measurement", "area": "input", "address": 3452, "type": "uint32", "unit": "lb", "access": "R", "description": "Consumption"}, {"name": "RS485 termination", "group": "Settings", "area": "holding", "address": 2030, "type": "uint16", "access": "RW", "enum": "active", "description": "Bus termination at the end of a daisy chain"}, {"name": "Reference pressure", "group": "Reference conditions", "area": "holding", "address": 3218, "type": "float32", "access": "RW", "description": "User-defined reference condition; unit in register 3226"}, {"name": "Reference temperature", "group": "Reference conditions", "area": "holding", "address": 3220, "type": "float32", "access": "RW", "description": "User-defined reference condition; unit in register 3227"}, {"name": "Pipe inner diameter", "group": "Reference conditions", "area": "holding", "address": 3222, "type": "float32", "access": "RW", "description": "Unit in register 3228"}, {"name": "Low flow value", "group": "Settings", "area": "holding", "address": 3224, "type": "float32", "access": "RW", "description": "Low flow cut-off value; unit in register 3229"}, {"name": "Reference pressure unit", "group": "Reference conditions", "area": "holding", "address": 3226, "type": "uint16", "access": "RW", "enum": "pressure_unit"}, {"name": "Reference temperature unit", "group": "Reference conditions", "area": "holding", "address": 3227, "type": "uint16", "access": "RW", "enum": "temperature_unit"}, {"name": "Pipe diameter unit", "group": "Reference conditions", "area": "holding", "address": 3228, "type": "uint16", "access": "RW", "enum": "diameter_unit"}, {"name": "Low flow unit", "group": "Settings", "area": "holding", "address": 3229, "type": "uint16", "access": "RW", "enum": "flow_unit"}, {"name": "Recalibration interval", "group": "Calibration", "area": "holding", "address": 3301, "type": "uint16", "unit": "h", "access": "RW"}, {"name": "Calibration pre-notice time", "group": "Calibration", "area": "holding", "address": 3302, "type": "uint16", "unit": "h", "access": "RW", "description": "How long before the end of the recalibration interval the notice is given"}, {"name": "Current loop source", "group": "4-20 mA output", "area": "holding", "address": 3400, "type": "uint16", "access": "RW", "enum": "source", "description": "Value sent on the 4 to 20 mA output"}, {"name": "Current loop enable", "group": "4-20 mA output", "area": "holding", "address": 3401, "type": "uint16", "access": "RW", "enum": "active"}, {"name": "Current loop value at 4 mA", "group": "4-20 mA output", "area": "holding", "address": 3402, "type": "float32", "access": "RW"}, {"name": "Current loop value at 20 mA", "group": "4-20 mA output", "area": "holding", "address": 3404, "type": "float32", "access": "RW"}, {"name": "Current loop error current", "group": "4-20 mA output", "area": "holding", "address": 3406, "type": "float32", "unit": "mA", "access": "RW"}, {"name": "User summation preset", "group": "Totalizer", "area": "holding", "address": 3600, "type": "uint32", "access": "RW", "description": "Preset value of the consumption counter; unit in register 3602"}, {"name": "User summation preset unit", "group": "Totalizer", "area": "holding", "address": 3602, "type": "uint16", "access": "RW", "enum": "summation_unit"}, {"name": "Digital output mode", "group": "Digital output", "area": "holding", "address": 3700, "type": "uint16", "access": "RW", "enum": "pulse_alarm_mode"}, {"name": "Alarm source", "group": "Digital output", "area": "holding", "address": 3701, "type": "uint16", "access": "RW", "enum": "source", "description": "Value that triggers the alarm"}, {"name": "Alarm mode", "group": "Digital output", "area": "holding", "address": 3702, "type": "uint16", "access": "RW", "enum": "alarm_mode"}, {"name": "Pulse polarity", "group": "Digital output", "area": "holding", "address": 3703, "type": "uint16", "access": "RW", "enum": "polarity"}, {"name": "Alarm high limit", "group": "Digital output", "area": "holding", "address": 3704, "type": "float32", "access": "RW"}, {"name": "Alarm low limit", "group": "Digital output", "area": "holding", "address": 3706, "type": "float32", "access": "RW"}, {"name": "Alarm hysteresis", "group": "Digital output", "area": "holding", "address": 3708, "type": "float32", "access": "RW"}, {"name": "Pulse source", "group": "Digital output", "area": "holding", "address": 3711, "type": "uint16", "access": "RW", "enum": "summation_unit", "description": "Consumption value that is sent as pulses"}, {"name": "Pulse value", "group": "Digital output", "area": "holding", "address": 3712, "type": "float32", "access": "RW", "description": "Consumption that one pulse stands for"}, {"name": "Display unit: flow", "group": "Display", "area": "holding", "address": 3851, "type": "uint16", "access": "RW", "enum": "flow_unit"}, {"name": "Display unit: consumption", "group": "Display", "area": "holding", "address": 3852, "type": "uint16", "access": "RW", "enum": "display_consumption_unit"}, {"name": "Display unit: velocity", "group": "Display", "area": "holding", "address": 3853, "type": "uint16", "access": "RW", "enum": "velocity_unit"}, {"name": "Display unit: temperature", "group": "Display", "area": "holding", "address": 3854, "type": "uint16", "access": "RW", "enum": "temperature_unit"}, {"name": "Display unit: pressure", "group": "Display", "area": "holding", "address": 3855, "type": "uint16", "access": "RW", "enum": "pressure_unit"}, {"name": "Interface unlock", "group": "Interface", "area": "holding", "address": 5010, "type": "uint16", "access": "W", "description": "Write 0xAC1D (44061) here before writing register 2000"}, {"name": "Interface parameters", "group": "Interface", "area": "holding", "address": 2000, "type": "uint16", "access": "W", "description": "High byte: baud rate, parity and stop bits (enum interface_serial); low byte: slave address 1 to 246. Example: 0x070A is 19200 baud, even parity, 1 stop bit, address 10"}, {"name": "Interface save", "group": "Interface", "area": "holding", "address": 5020, "type": "uint16", "access": "W", "description": "Write 0xBA5E (47710) to store the interface parameters; they take effect about 10 s after a restart"} ] }