Cross-platform OPC UA simulation suite — desktop apps built with Rust · Tauri 2 · Vue 3 + TypeScript + Vite and the async-opcua stack.
| Binary | Role |
|---|---|
| OPCUAMaster | Master station / client — connect, browse, monitor, history, methods |
| OPCUAServer | Address-space simulator — folders, variables with simulation modes, optional writable nodes |
- OPC UA DA — connect to any OPC UA server, browse address space, read/write values
- Security — None / Sign / SignAndEncrypt; Anonymous, Username/Password, Certificate auth
- Endpoint discovery — query a server URL to enumerate available endpoints and their security profiles
- Lazy-loading address browser — infinite-depth tree, expand on demand
- Smart variable collection — pick an Object node to add all Variable descendants in one click
- Subscription + Polling — server push or client pull at a configurable interval, per-node
DataChangeFilter - Real-time table — searchable, multi-select with
Ctrl/Cmd+Click, quality colour coding - Value & Write panel — node attributes, manual read, value write back to writable nodes
- History (HA) — read raw history into a plot + table tab, quick ranges (1m … 24h)
- Method calls — auto-discover input/output arguments and invoke methods from the browser
- Communication log — bottom panel with direction filter, search, CSV export
- Project files — save/load all connections + groups as
.opcuaproj - Certificate manager — list, trust/reject, delete certificates in the local PKI
- Embedded OPC UA server — defaults to
opc.tcp://127.0.0.1:4840(bind host configurable; use0.0.0.0for LAN access) - Secure by default — default security policy
Basic256Sha256/SignAndEncrypt; certificate & private key paths configurable - Folder + Variable tree — add folders and variables under
Objects - Simulation modes —
Static,Random,Sine,Linear(Repeat/Bounce),Script(evalexpr) - Live values — variable values update at their per-node interval and stream to the UI
- Writable nodes — toggle
RWto let clients write through - Project files — save/load the entire address space as
.opcuaproj
# install frontend dependencies (run from the repository root)
cd frontend && npm install
cd master-frontend && npm install
# run the Server simulator
cd crates/opcuaserver-app && cargo tauri dev
# run the Master station
cd crates/opcuamaster-app && cargo tauri devOPCUASim/
├── crates/
│ ├── opcuasim-core/ # Core library: client, server, browse, subscription, polling, history, methods
│ ├── opcuaserver-app/ # OPCUAServer Tauri application
│ └── opcuamaster-app/ # OPCUAMaster Tauri application
├── frontend/ # Server Vue 3 frontend
├── master-frontend/ # Master Vue 3 frontend
└── shared-frontend/ # Shared Vue components, i18n, styles
- Fork and create a feature branch from
master cargo fmtandcargo clippy --workspace -- -D warningsbefore committing- Conventional commit prefixes:
feat:,fix:,refactor:,docs:,chore: - Open a PR against
master
See CHANGELOG.md and the Releases page.
The bundles are not Apple-notarized (no paid Developer Program). On first launch macOS shows "OPCUAServer / OPCUAMaster cannot be opened — Apple could not verify…" with only Done and Move to Trash buttons. This is the standard macOS 15 (Sequoia) block for ad-hoc-signed apps — the app is not damaged.
How to allow it (pick one)
1. GUI path
- Double-click the
.app, see the block dialog, click Done. - Open System Settings → Privacy & Security, scroll to the bottom.
- You'll see "OPCUAServer was blocked…" — click Open Anyway and enter your password.
- The next dialog has an Open button; click it. Subsequent launches go straight through.
2. One-line Terminal
xattr -dr com.apple.quarantine "/Applications/OPCUAServer.app"
xattr -dr com.apple.quarantine "/Applications/OPCUAMaster.app"Strips the quarantine flag so macOS stops blocking.
MIT