A standalone SCADA/HMI dashboard built in FUXA, simulating a liquid storage tank fill/drain process. This project demonstrates core SCADA engineering concepts, tag architecture, analog level monitoring, safety interlocking, alarm states, and server-side process scripting — independent of any physical or virtual PLC.
The dashboard models a simple industrial tank system:
- Fill Control: Starting the pump begins raising the tank level over time.
- Analog Level Monitoring: A live level bar reflects the tank's fill percentage (0–100%).
- High-Level Safety Interlock: When the tank reaches 90%, the system automatically stops the pump and raises a high-level alarm.
- Low-Level Warning: When the tank drops to 10% or below, a low-level alarm is raised.
- Status Feedback: A pilot lamp indicates whether the pump is actively running.
| Tag Name | Type | Purpose |
|---|---|---|
Tank_Level |
Number | Current fill percentage (0–100) |
Pump_Status |
Number | Pump running state (1 = running, 0 = off) |
Drain_Valve |
Number | Drain valve state |
High_Alarm |
Number | High-level safety alarm |
Low_Alarm |
Number | Low-level warning alarm |
Start_PB |
Number | Operator start command |
Stop_PB |
Number | Operator stop command |
Tank_Rate |
Number | Configurable fill/drain rate per cycle |
All tags are internal to FUXA's own tag server — no external PLC or Modbus device is required, making this a fully self-contained simulation.
A server-side JavaScript script (TankLogic) runs on a fixed interval and governs the simulation:
- Reads
Start_PB/Stop_PBto determine operator intent - Increments
Tank_LevelwhilePump_Statusis active - Enforces a 90% high-level interlock: automatically stops the pump and raises
High_Alarm - Enforces a 10% low-level warning: raises
Low_Alarm - Resets momentary push-button tags after each action, mimicking real push-button behavior
This mirrors the same safety-interlock logic pattern used in the companion PLC-Conveyor-Control ladder logic project — translated from ladder rungs into an equivalent scripted state machine.
Dashboard elements are tag-bound and update live from the underlying process state:
- Tank shape with proportional fill level indicator
- START / STOP buttons for operator control
- STATUS lamp reflecting real-time pump state
Note on interaction method: During development, a UI-layer click-event quirk in this FUXA build version was identified — button-triggered tag writes did not propagate through the same rendering path as direct tag writes (verified via server logs and browser console debugging). As a result, this dashboard is demonstrated using FUXA's built-in tag-force/test panel to drive tag states directly — a standard technique used in real SCADA commissioning and testing. All underlying process logic, safety interlocks, and visual bindings are fully functional and verified working; only the on-screen button's click handler is affected.
Getting this dashboard fully operational involved substantial hands-on troubleshooting, including:
- Diagnosing a scripting API mismatch (
getTagValue/setTagValuevs. FUXA's actual$getTag/$setTagfunctions) via server-side terminal error logs - Identifying a data-type mismatch between boolean tags and numeric shape-fill rules, and resolving it by standardizing all discrete tags to numeric type
- Isolating a UI/script write-path inconsistency through systematic testing (manual tag force vs. scripted write vs. button click) and browser console inspection
- Managing script execution intervals to balance live simulation behavior against demo/documentation needs
This iterative diagnostic process — reading server logs, isolating variables, testing hypotheses one at a time — reflects the same troubleshooting discipline required when commissioning real industrial control systems.
Screenshots demonstrating the system across its key operating states are included in Documentation/screenshots/:
- Rest state — tank empty, pump off
- Pump running — status lamp active
- Mid-fill — proportional level indication
- Fail-safe interlock: High-level condition unconditionally overrides pump command, regardless of operator input
- Separation of concerns: Process logic (script) is decoupled from visualization (tag-bound shapes), consistent with standard SCADA architecture
- Tag-based design: All logic operates on named tags rather than hardcoded values, allowing the same dashboard to be repointed to a real Modbus/OPC device with no visual changes
- Resolve the click-event binding quirk and restore full on-screen button control
- Connect to a real or virtual PLC via Modbus TCP (following the same pattern as the OpenPLC conveyor project)
- Add a historical trend chart for
Tank_Levelover time - Add configurable fill/drain rates via the
Tank_Ratetag - Connect to a real or virtual PLC via Modbus TCP (following the same pattern as the OpenPLC conveyor project)
- Add a historical trend chart for
Tank_Levelover time - Add configurable fill/drain rates via the
Tank_Ratetag