Multi-system industrial monitoring dashboard engineered in Ignition Perspective, implementing real-time tag binding, structured alarm management, alarm-to-page navigation workflows, and a scalable multi-page HMI architecture across heterogeneous industrial subsystems.
This project delivers a centralised SCADA-style supervisory dashboard designed to provide unified real-time operational visibility across three discrete industrial subsystems: Solar generation, bottling Production lines, and Tank level management. The interface is architected around Ignition Perspective's tag binding engine, leveraging expression bindings for dynamic state-driven UI rendering, a structured alarm pipeline for fault detection and acknowledgment, and an event-driven navigation system linking alarm records directly to their associated system views. The architecture reflects industrial HMI design principles, prioritising operator response time, data integrity, and fault isolation across a unified control surface.
Industrial environments operating across multiple discrete subsystems — each with independent data sources, fault domains, and operational states — impose significant cognitive overhead on operators when monitoring tools are fragmented across disconnected screens or require manual context switching. The engineering requirement was to consolidate real-time system status, active alarm telemetry, and fault condition indicators into a single, coherent supervisory interface. The solution needed to support immediate fault identification, alarm-driven navigation to the relevant subsystem view, and dynamic UI state updates without operator-initiated page refreshes or manual data polling.
Sites/ ├── Solar/ │ ├── PowerOutput -- REAL, kW generation value │ ├── Status -- STRING, operational state tag │ ├── Production/ │ ├── BottleCount -- INTEGER, cumulative unit counter │ ├── LineState -- STRING, drive/conveyor state │ ├── Fault -- BOOL, fault condition flag │ ├── Tank/ │ ├── Level -- REAL, percentage fill level │ ├── PumpState -- BOOL, pump run status
if(lower({[default]Sites/Production/LineState})="running","#22c55e",
if(lower({[default]Sites/Production/LineState})="fault","#ef4444","#6b7280"))
This expression binding evaluates the live LineState tag value on each scan cycle,
normalising the string to lowercase to ensure case-insensitive matching across operator-entered and
PLC-written values. The ternary chain resolves to a green hex value for running, red for fault, and
a neutral grey for all idle or undefined states — driving the background color property of the status
indicator component without requiring a script transform or additional tag logic.
The alarm management layer was implemented using a Perspective Table component backed by a script
transform that post-processes the raw alarm dataset into a structured, navigation-ready format.
Each alarm record is enriched with a target page path and system identifier, enabling
the Table's row selection event handler to resolve the appropriate navigation destination at runtime.
The system.perspective.navigate call passes highlight and active
parameters to the destination page, allowing the receiving view to pre-filter or highlight the
relevant component without additional operator input.
system.perspective.navigate(
page=data["target"],
params={
"highlight": data["Name"],
"active": data["isActive"]
}
)