scada-tag-audit
Pre-commissioning cross-vendor tag database drift audit for SCADA integrators.
Reads an Ignition HMI tag CSV export + a Rockwell Studio 5000 L5X export, reconciles them, and produces a self-contained HTML report flagging the drift patterns that break faceplates at commissioning-week: orphaned HMI bindings, type mismatches, and naming-convention drift between what the PLC exports and what the HMI references.
Runs on the integrator's laptop. No cloud upload. No vendor API dependency. No client data leaves the machine.
Install
Windows .exe (recommended for integrators): download the latest from Releases.
Double-click to run (opens file-picker dialogs for both inputs), or invoke from a terminal with arguments.
Python package (for CLI-culture users):
pip install scada-tag-audit
Requires Python 3.10+.
Quick start
Double-click scada-tag-audit.exe and select the two exports when prompted. Report opens in your default browser.
Or from a terminal:
scada-tag-audit --ignition path/to/tags.csv --rockwell path/to/routine.L5X --output drift-report.html
The HTML report is self-contained (no external dependencies), safe to email or archive.
What it flags
| Category | Color | Severity | Meaning |
|---|---|---|---|
| Orphaned HMI binding | Red | High | HMI references a PLC tag that does not exist. Faceplate breaks at go-live. |
| Type mismatch | Purple | High | Same tag, incompatible data types PLC-side vs HMI-side (e.g. PLC REAL, HMI Int4). |
| Naming convention drift | Yellow | Medium | Reference resolves under normalization but not exact match (e.g. Pump2_Run vs Pump_2_Run). |
| Unit mismatch | Blue | Info | HMI declares engineering units; PLC counterpart has no EU metadata. |
| Orphaned PLC tag | Orange | Info | PLC tag exists but no HMI tag references it. Cleanup opportunity. |
| Exact match | Green | None | Reference resolves cleanly with compatible types. |
How it works
The engine extracts PLC-side references from Ignition's OPC Item Paths (e.g. [Global_PLC]Motor1_Run → Motor1_Run) and matches them against Rockwell tag names from the L5X. When exact matches fail, it retries under name normalization (case-fold, prefix strip, separator collapse, letter-digit boundary insertion). Every reference that fails to resolve becomes an orphan. Every match with incompatible data types becomes a type-mismatch finding.
The HTML report groups findings by severity: actionable drift (commissioning breakers) at the top, informational rows below, exact matches collapsed at the bottom.
Development
git clone https://github.com/Yveshby27/scada-tag-audit
cd scada-tag-audit
pip install -e ".[dev]"
pytest
v0.1 scope + limitations + roadmap
In scope: Ignition tag CSV + Rockwell Studio 5000 L5X exports. Base tag reconciliation across scalar data types (BOOL, SINT, INT, DINT, REAL, LREAL, STRING).
Known v0.1 limitations (will produce false findings; be aware):
- UDT member references are not resolved. If your Ignition HMI references a Rockwell UDT member (e.g.
[PLC]Pump_1.SpeedwherePump_1is a UDT-typed base tag), the parser extracts the last segment (Speed) and fails to find it as a top-level PLC tag. Result: falseorphaned_hmi_bindingfinding. UDT-heavy PlantPAx projects will surface many of these. v0.2 roadmap. - Alias chains are not resolved. L5X alias tags parse as base tags, but the drift engine does not chase
AliasForreferences to detect when an HMI reference through an alias resolves to a valid base tag. Simple flat aliases still match when the HMI references either name directly. v0.2 roadmap. - Wonderware .aaGDB, Kepware XML, FactoryTalk, Iconics, OPC UA custom information models — not parsed. v0.2+ roadmap if the wedge holds.
Practical implication: run against a small representative slice of your project first to calibrate the false-positive rate for your codebase. If UDT-member false-orphans dominate, wait for v0.2 UDT support.
Feedback on which limitations hurt most is exactly what determines the v0.2 priority. Reach out via the article link below.
Background
Notes on why this exists: What small SCADA integrators actually ship when the tag database drifts.
If you run a small integrator shop (2-15 EE) delivering multi-vendor projects and the pain shape matches what you see, reach out. LinkedIn or email in the article.
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scada_tag_audit-0.1.1.tar.gz.
File metadata
- Download URL: scada_tag_audit-0.1.1.tar.gz
- Upload date:
- Size: 31.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0280ab0e51ba93a456ca53f77d6bc50053422393e4947e0014a7aeb51e6b2bd
|
|
| MD5 |
635b7e76f07e4fa7801e2eed976c8dc2
|
|
| BLAKE2b-256 |
b00f0a6fbc717d708d95f14f1e0d2b92378224d601803e0c2b0ce0053ddc726a
|
File details
Details for the file scada_tag_audit-0.1.1-py3-none-any.whl.
File metadata
- Download URL: scada_tag_audit-0.1.1-py3-none-any.whl
- Upload date:
- Size: 15.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c47e86cb0dffa37839853ed14138338a941a3a0bb424bdee3552ad25b01c119
|
|
| MD5 |
ac6d04a3392f4e08fdfeb2d8d9ec8add
|
|
| BLAKE2b-256 |
84c9fd781b5d2a0f22f6acdce4180877ff61b9bd3b22bc0937194e5b8cb46ae9
|