Universal Bench Instrument & Gateway Emulator Suite
Zero-hardware test equipment simulation for PyVISA, SCPI, TestController, LabVIEW, and MATLAB test automation developers.
Important
A verified Windows build is available from the
Releases page as
BenchForge-Windows.zip, with a .sha256 checksum and a BUILDINFO.txt
recording the exact Python and package versions it was built from.
Before reporting a bug, read docs/RELEASE_NOTES.md.
Three behaviours look like defects and are not — most importantly,
TestController cannot connect to the E5810A persona, because a real E5810A
refuses the device string it sends.
The executable is not code-signed, so Windows SmartScreen will warn on first run. Verify the SHA-256 against the published checksum rather than relying on the warning. Extract to local storage: Windows will not execute a binary from a network drive.
BenchForge Studio is a standalone, lightweight, multi-protocol bench instrument and hardware gateway emulator suite. It empowers lab automation engineers, driver developers, and test software authors to build, test, and validate instrument automation scripts without needing physical test equipment or hardware adapters on their desk.
- 🌐 Multi-Protocol Gateway Emulation:
- Prologix Ethernet (TCP 1234 — default): byte-identical to a physical GPIB-ETHERNET controller, firmware
01.06.06.00— command set, CRLF framing, ESC escaping, case sensitivity, argument validation, serial poll, single-connection displacement. - Keysight E5810A (VXI-11 / ONC-RPC, TCP 111 + 1024): a real VXI-11 gateway — RPC portmapper, core channel, interrupt/SRQ channel and the abort stub. Not a raw-socket stand-in.
- LXI SCPI Raw Socket (TCP 5025) and LXI mDNS Discovery (UDP 5353).
- Prologix Ethernet (TCP 1234 — default): byte-identical to a physical GPIB-ETHERNET controller, firmware
- 🔬 Instrument Personalities: DMM, frequency counter, function generator and power supply, with vendor-correct reply formats — Keithley and Agilent disagree on how
FUNC?spells DC volts, on whether integers carry a sign, and on whether a reading is a bare number or carries its elements. All reproduced from measurement. - 🧾 SCPI Error Queue & Debug Log:
- Per-instrument error queue with
*ESR?latching, raising-113,-410and-420from the same conditions real hardware does. - The Traffic page is split: the Data Stream shows what went over the wire, the Debug Log shows what it means. Both export.
- Per-instrument error queue with
- 🧪 Hardware Verification Toolchain (
tools/, documented here):verify_offline.py— 7 fidelity checks, no hardware, CI-safe.verify_hardware.py— byte-for-byte diff against a physical Prologix.ab_instruments.py— per-instrument A/B over either gateway.check_errors.py,capture_e5810.py,capture_e5810_channels.py.
- ⚡ CI Validation Harness (
tests/run_validation_harness.py): 12 protocol assertions plus a QPS stress mode. - 📄 TestController Tooling: parser for
Devices/*.txtand generator forsettingsGPIB.txt/settingsLoad.txt.
Every behaviour BenchForge reproduces was measured against physical equipment. Where something is inferred rather than measured, the profile says so.
| Profile | Hardware | Status |
|---|---|---|
PROLOGIX_HARDWARE_PROFILE.md |
Prologix GPIB-ETHERNET, fw 01.06.06.00 |
measured — 0 mismatches |
E5810_HARDWARE_PROFILE.md |
Agilent E5810A LAN/GPIB Gateway | measured — VXI-11 wire behaviour |
bus_capture.json |
7 instruments on the GPIB bus | measured — 86/86 replies |
e5810_vxi11_capture.json |
E5810A RPC-level capture | measured |
e5810_channels_capture.json |
abort / interrupt / docmd | measured |
KEYSIGHT_34461A_LXI_PROFILE.md |
Keysight 34461A Truevolt DMM | measured |
SIGLENT_SDM3065X_LXI_PROFILE.md |
Siglent SDM3065X DMM | measured |
AR488_ADAPTER_PROFILE.md |
AR488 / AR488Lan |
Important
Read docs/RELEASE_NOTES.md before filing a bug.
Three behaviours look like defects and are not — most importantly, TestController
cannot connect to the E5810A persona, because a real E5810A refuses the device
string it sends. Details and evidence in
docs/TESTCONTROLLER_OBSERVATIONS.md.
- Python 3.9+
- Windows 10 or 11 (the UI targets Segoe UI Variable and Cascadia Mono, with fallbacks)
git clone https://github.com/Cyclotronic/BenchForge.git
cd BenchForge
pip install -r requirements.txtThe emulator core is pure standard library. The only runtime dependency is PySide6, which provides the desktop UI.
Note
BenchForge uses PySide6 (Qt for Python), licensed LGPL v3 and compatible with this project's MIT licence. Do not substitute PyQt6 — it is offered only under GPL v3 or a paid commercial licence, and linking it would force GPL on the entire application.
python benchforge.pypython -m unittest discover -s tests26 tests covering the gateways, instrument models, DNS-SD behavior, GUI construction, and packaging integration. They require no physical hardware.
python tools/verify_offline.py # no hardware
python tools/verify_hardware.py --host 192.168.1.80 # Prologix gateway
python tools/ab_instruments.py --host 192.168.1.80 # instruments, Prologix
python tools/ab_instruments.py --gateway e5810 --host 192.168.1.85
python tools/check_errors.py --host 192.168.1.80 # drain error queuesThese are read-only and safe on a live bench. See tools/README.md — it documents the lessons that make them safe, including why reads are gated on MAV and why a bus scan reads each address three times.
pip install -r requirements-dev.txt
python build_exe.py(Produces the distributable application directory under dist/BenchForge.
Keep that entire directory together; BenchForge.exe is not a standalone
single-file build.)
Tip
CI/CD Releases: Every official release published on GitHub automatically
triggers a GitHub-hosted Windows build. Static analysis, unit tests, offline
fidelity checks, and a frozen-application smoke test must pass before the
workflow attaches BenchForge-Windows.zip and its SHA-256 checksum.
Official downloads are published through
GitHub Releases. Release
binaries are currently unsigned, so Windows may display an Unknown
Publisher or Microsoft Defender SmartScreen warning. Compare the downloaded
ZIP with the .sha256 file attached to the same release. See the
Code Signing Policy for current status and the future
SignPath plan.
- Contributing — development checks and pull-request guidance
- Privacy — listeners, local discovery, and data handling
- Security — private vulnerability reporting
- Code Signing Policy — release provenance and signing status
- Third-party notices — bundled dependency terms
BenchForge does not collect telemetry, analytics, or crash reports. Network listeners and local mDNS advertisements operate only as part of emulator modes started by the user.
BenchForge source code is distributed under the MIT License.
Binary distributions also include the applicable third-party license texts and
notices in the LICENSES directory.
