Skip to main content

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_RunMotor1_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.Speed where Pump_1 is a UDT-typed base tag), the parser extracts the last segment (Speed) and fails to find it as a top-level PLC tag. Result: false orphaned_hmi_binding finding. 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 AliasFor references 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

scada_tag_audit-0.1.1.tar.gz (31.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

scada_tag_audit-0.1.1-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

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

Hashes for scada_tag_audit-0.1.1.tar.gz
Algorithm Hash digest
SHA256 f0280ab0e51ba93a456ca53f77d6bc50053422393e4947e0014a7aeb51e6b2bd
MD5 635b7e76f07e4fa7801e2eed976c8dc2
BLAKE2b-256 b00f0a6fbc717d708d95f14f1e0d2b92378224d601803e0c2b0ce0053ddc726a

See more details on using hashes here.

File details

Details for the file scada_tag_audit-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for scada_tag_audit-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2c47e86cb0dffa37839853ed14138338a941a3a0bb424bdee3552ad25b01c119
MD5 ac6d04a3392f4e08fdfeb2d8d9ec8add
BLAKE2b-256 84c9fd781b5d2a0f22f6acdce4180877ff61b9bd3b22bc0937194e5b8cb46ae9

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page