Mobile version of the OpenModScan Modbus master/client utility.
- Save Modbus devices and register lists.
- Connect to Modbus TCP and Modbus RTU/IP devices.
- Read holding registers, input registers, coils, and discrete inputs.
- Write holding registers and coils when writes are enabled.
- Discover Modbus TCP and Modbus RTU/IP devices on the local network.
- Inspect captured Modbus traffic with decoded frame details.
- Export and import app settings and saved devices as a JSON backup.
- Supports English and Russian UI localization.
| Protocol | Notes |
|---|---|
| Modbus TCP | Standard Modbus master/client connections over TCP. |
| Modbus RTU/IP | RTU-style Modbus frames transported over TCP/IP. |
Install Flutter (Dart SDK ^3.12.0), then fetch dependencies:
flutter pub getRun the app:
flutter runBuild release artifacts for a target platform:
flutter build apkflutter build iosNote
iOS builds require Xcode and a configured Apple signing environment.
Run static analysis:
flutter analyzeRun tests:
flutter testRun tests with coverage:
flutter test --coverageThe CI workflow enforces at least 80% line coverage from coverage/lcov.info.
Coverage output is a local artifact and is ignored by git.
Run integration tests (requires a connected device or running emulator):
macOS / Linux:
scripts/integration_test.shWindows (PowerShell):
.\scripts\integration_test.ps1Windows (cmd.exe):
scripts\integration_test.batThe demo scenarios (app_smoke_test.dart, register_write_test.dart) need the
demo fixtures, so they must run with --dart-define=OMODSCAN_DEMO_DATA=true —
the script sets this for you. The seeded scenarios (device_crud_test.dart,
settings_test.dart) own their state and pass with or without the flag.
- Writes can be disabled in Settings.
- Multiple-register writes fall back to sequential single-register writes when a device rejects function code 16 with an illegal-function exception.
- Traffic file logging writes
modbus-traffic.login the app documents directory when enabled.
Released under the MIT License.


