nobrega8/modbench

Cross-platform Modbus TCP/RTU client for device testing, register debugging, and importing .mbmap device maps.

Rust

7

40 commits

updated Oct 15, 2026

See the code

See what people are saying

SourceMessageScoreDate

MBMap: an open format for sharing Modbus device register maps (r/opensource)

I've been building MBMap, an open format for describing Modbus devices and their registers. The idea is simple: device register maps should be portable data, not information that has to be manually re-created in every Modbus client. A .mbmap file describes registers, data types, byte order,…

3

Oct 13, 2026

README

Modbench

A lightweight Modbus TCP/RTU client for Windows and Linux. Test any address by hand, like a classic Modbus tester, or open a device map and read every register by name, already scaled, with units and labels.

Download

Get the latest installer from Releases:

SystemFile
Windows 10/11Modbench_x.y.z_x64-setup.exe (or the .msi)
LinuxModbench_x.y.z_amd64.AppImage (or the .deb)

Modbench checks for new versions when it starts and installs them when you choose to. On Linux, in-app updates work for the AppImage.

On Linux, add yourself to the dialout group to use serial ports: sudo usermod -aG dialout $USER, then log in again.

Features

  • Three-step workflow: connection (serial RTU, Modbus TCP or RTU over TCP), request (any function code, or a device map), test (Start/Stop, valid/error/timeout counters).
  • Device maps (.mbmap): plain-text, CSV-based files that describe a device and all of its registers: types, byte order, scaling, units, bit fields, translation tables for state codes and sentinel values such as "unimplemented". The format is open and specified in mbmap-library, which also hosts shared maps.
  • Write from the map: writable registers and control commands are listed with the right control for each type.
  • Raw data: the exact bytes sent and received, plus a request log you can save.
  • Device library: keep your maps in the app, import them from a file or browse and download the shared maps of mbmap-library; double-click a .mbmap to open it.
  • Command line and MCP: modbench-cli reads devices without the UI (see below).
  • Light and dark (OLED) themes, a Rust core and small installers (about 2 MB on Windows).

Stack

  • Tauri 2 · Rust (tokio-modbus, tokio-serial)
  • Svelte 5 + TypeScript + Vite

Development

Requirements: Rust (stable), Node.js 22+ and the Tauri prerequisites for your OS.

npm install
npm run tauri dev     # run the app in development mode
npm run tauri build   # build installers (MSI/NSIS on Windows, deb/AppImage on Linux)

To try the app without hardware, run the device simulator. It serves any .mbmap file over Modbus TCP, with values that change over time:

cd src-tauri
cargo run --example simulator -- ../vendor/mbmap-library/examples/example-corp/em-100.mbmap 5020

Then connect Modbench to 127.0.0.1, port 5020. You can also pass a map to the app on start: npm run tauri dev -- -- -- path/to/map.mbmap.

Checks (the same ones CI runs):

npm run format:check && npm run check
cd src-tauri && cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test

Command line and MCP

modbench-cli reads devices without the UI. It is read-only: it never writes to a device.

cd src-tauri
cargo run --bin modbench-cli -- ports
cargo run --bin modbench-cli -- read --tcp 192.168.1.10 holding 0x0405 1
cargo run --bin modbench-cli -- read --rtu COM3 --baud 9600 --stop-bits 2 --unit 18 holding 1029 4
cargo run --bin modbench-cli -- map --rtu COM3 --unit 18 path/to/device.mbmap --filter voltage
cargo run --bin modbench-cli -- validate path/to/device.mbmap

Settings not given on the command line come from the map (@baudrate, @parity, @unit_id…), then from defaults. Add --json to read and map for machine-readable output.

modbench-cli mcp runs the same operations as an MCP server over stdio (list_serial_ports, read_registers, read_map, validate_map). .mcp.json registers it for this project, so MCP clients such as Claude Code can use it.

A serial port can only be open in one program at a time: stop reading in the app before using the CLI on the same port.

Releases and updates

Modbench checks GitHub Releases for a newer version when it starts and offers to install it. Updates are signed; the app only installs packages signed with the project's updater key.

To publish a release:

  1. Bump version in package.json, src-tauri/Cargo.toml and src-tauri/tauri.conf.json.
  2. Commit, then push a tag: git tag v0.2.0 && git push origin v0.2.0.
  3. The Release workflow builds the Windows (MSI, NSIS) and Linux (AppImage, deb) installers, signs the update packages with the TAURI_SIGNING_PRIVATE_KEY secret and publishes them with latest.json.

On Linux, in-app updates work for the AppImage; .deb installs are updated through the package manager.

License

MIT

desktop-app
iiot
industrial-automation
mbmap
modbus
modbus-client
modbus-master
modbus-rtu
modbus-tcp
plc
rust
scada
serial-port
svelte
tauri
tauri-app

nobrega8/modbench

Cross-platform Modbus TCP/RTU client for device testing, register debugging, and importing .mbmap device maps.

Rust

7

40 commits

updated Oct 15, 2026

See the code

See what people are saying

SourceMessageScoreDate

MBMap: an open format for sharing Modbus device register maps (r/opensource)

I've been building MBMap, an open format for describing Modbus devices and their registers. The idea is simple: device register maps should be portable data, not information that has to be manually re-created in every Modbus client. A .mbmap file describes registers, data types, byte order,…

3

Oct 13, 2026

README

Modbench

A lightweight Modbus TCP/RTU client for Windows and Linux. Test any address by hand, like a classic Modbus tester, or open a device map and read every register by name, already scaled, with units and labels.

Download

Get the latest installer from Releases:

SystemFile
Windows 10/11Modbench_x.y.z_x64-setup.exe (or the .msi)
LinuxModbench_x.y.z_amd64.AppImage (or the .deb)

Modbench checks for new versions when it starts and installs them when you choose to. On Linux, in-app updates work for the AppImage.

On Linux, add yourself to the dialout group to use serial ports: sudo usermod -aG dialout $USER, then log in again.

Features

  • Three-step workflow: connection (serial RTU, Modbus TCP or RTU over TCP), request (any function code, or a device map), test (Start/Stop, valid/error/timeout counters).
  • Device maps (.mbmap): plain-text, CSV-based files that describe a device and all of its registers: types, byte order, scaling, units, bit fields, translation tables for state codes and sentinel values such as "unimplemented". The format is open and specified in mbmap-library, which also hosts shared maps.
  • Write from the map: writable registers and control commands are listed with the right control for each type.
  • Raw data: the exact bytes sent and received, plus a request log you can save.
  • Device library: keep your maps in the app, import them from a file or browse and download the shared maps of mbmap-library; double-click a .mbmap to open it.
  • Command line and MCP: modbench-cli reads devices without the UI (see below).
  • Light and dark (OLED) themes, a Rust core and small installers (about 2 MB on Windows).

Stack

  • Tauri 2 · Rust (tokio-modbus, tokio-serial)
  • Svelte 5 + TypeScript + Vite

Development

Requirements: Rust (stable), Node.js 22+ and the Tauri prerequisites for your OS.

npm install
npm run tauri dev     # run the app in development mode
npm run tauri build   # build installers (MSI/NSIS on Windows, deb/AppImage on Linux)

To try the app without hardware, run the device simulator. It serves any .mbmap file over Modbus TCP, with values that change over time:

cd src-tauri
cargo run --example simulator -- ../vendor/mbmap-library/examples/example-corp/em-100.mbmap 5020

Then connect Modbench to 127.0.0.1, port 5020. You can also pass a map to the app on start: npm run tauri dev -- -- -- path/to/map.mbmap.

Checks (the same ones CI runs):

npm run format:check && npm run check
cd src-tauri && cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test

Command line and MCP

modbench-cli reads devices without the UI. It is read-only: it never writes to a device.

cd src-tauri
cargo run --bin modbench-cli -- ports
cargo run --bin modbench-cli -- read --tcp 192.168.1.10 holding 0x0405 1
cargo run --bin modbench-cli -- read --rtu COM3 --baud 9600 --stop-bits 2 --unit 18 holding 1029 4
cargo run --bin modbench-cli -- map --rtu COM3 --unit 18 path/to/device.mbmap --filter voltage
cargo run --bin modbench-cli -- validate path/to/device.mbmap

Settings not given on the command line come from the map (@baudrate, @parity, @unit_id…), then from defaults. Add --json to read and map for machine-readable output.

modbench-cli mcp runs the same operations as an MCP server over stdio (list_serial_ports, read_registers, read_map, validate_map). .mcp.json registers it for this project, so MCP clients such as Claude Code can use it.

A serial port can only be open in one program at a time: stop reading in the app before using the CLI on the same port.

Releases and updates

Modbench checks GitHub Releases for a newer version when it starts and offers to install it. Updates are signed; the app only installs packages signed with the project's updater key.

To publish a release:

  1. Bump version in package.json, src-tauri/Cargo.toml and src-tauri/tauri.conf.json.
  2. Commit, then push a tag: git tag v0.2.0 && git push origin v0.2.0.
  3. The Release workflow builds the Windows (MSI, NSIS) and Linux (AppImage, deb) installers, signs the update packages with the TAURI_SIGNING_PRIVATE_KEY secret and publishes them with latest.json.

On Linux, in-app updates work for the AppImage; .deb installs are updated through the package manager.

License

MIT

desktop-app
iiot
industrial-automation
mbmap
modbus
modbus-client
modbus-master
modbus-rtu
modbus-tcp
plc
rust
scada
serial-port
svelte
tauri
tauri-app