learn · South Africa
HMI tag binding: from PLC tag table to faceplate
HMI tag binding for SA control engineers — symbolic paths, faceplate animations, broken-link symptoms, and the four mistakes that take an HMI offline.
HMI tag binding is the boring, finicky, almost-administrative work that decides whether a brand-new HMI screen actually does anything when you put it in front of an operator. Every animation, every numeric readout, every alarm bubble, every command button on a faceplate maps to a tag in the PLC's data table. Get the path right and the screen lights up. Get it wrong by a single character of case, a single mismatched data type, or a single change to the underlying tag table after the binding has been laid down, and the operator is staring at a screen of question marks at four in the morning during a recipe changeover. This tutorial is for the SA technician or junior controls engineer who has built their first HMI faceplate in FactoryTalk View, TIA Portal WinCC, or Ignition and now needs to understand what is happening behind the binding dialog.
Try the simulator →Why this matters on real plants
A broken HMI binding does not crash. The screen still draws. The button is still there. The operator still presses it. Nothing happens. Or something happens, but the wrong thing. We walked into a brownfield mining plant where an entire SCADA replacement project had been signed off as complete, the operators had been trained on the new screens, the legacy system had been decommissioned, and three weeks later the maintenance manager realised that half the alarm acknowledgements on the night-shift screens had been writing to the wrong tags. The original HMI vendor had bound the alarm-ack buttons to a generic AlarmAck tag at the area level instead of the per-alarm _ACK tag on each individual alarm record. The operators had been pressing buttons that wrote 1 and then 0 to a tag nobody read. The alarms were never being acknowledged. The historian still had every alarm marked unacknowledged. The compliance audit picked it up six weeks later and the rework cost a six-figure invoice.
The cost is rarely the binding itself. The cost is the time between the bug going live and the bug being noticed. An HMI binding that returns "###" or "?" on the screen gets fixed within a shift because the operator complains. An HMI binding that returns plausible-but-wrong values runs for months. The plausible-but-wrong category includes data-type silent re-cast (a REAL tag bound to an INT animation truncates to an integer that looks reasonable on a slow trend), tag-path drift (an engineer renames a PLC tag and the HMI binding is updated everywhere except one obscure batch screen), and stale-cache reads (an HMI driver caches the tag value for performance and the cached value persists past the actual PLC value when the network goes flaky). All three are common. All three are the kind of thing a junior commissioning engineer will not catch on a one-day site acceptance test.
The third reason this matters: in SA, plant networks are unreliable in ways that the HMI vendor's documentation usually does not anticipate. A primary-secondary failover between two redundant CompactLogix CPUs is supposed to be transparent to the HMI. In practice, on a plant where the network has copper-fibre converters from three different vendors and a switch ring with one badly-configured spanning-tree priority, the failover triggers an HMI driver re-subscribe that takes anywhere from two to forty seconds. During those forty seconds every faceplate on every screen reads stale or null, the operator panics, somebody hits the e-stop, and the recipe is lost. Knowing the binding model — what gets cached, what gets re-subscribed, what triggers a refresh — is the operational knowledge that lets a senior controls engineer write driver-level configuration that handles SA-realistic network conditions.
The mental model — symbolic path, data type, polling rate
An HMI tag binding has three parts and you need to know all three.
The symbolic path is the human-readable name that points at a piece of data in the PLC. On a Rockwell ControlLogix it looks like Program:Production.Motor1.Status — program scope, then a structure name, then a member. On a Siemens S7-1500 it looks like "Conveyor_Data".Motor1.Status — DB name in quotes, then nested structure access. On Ignition or any OPC UA-based system it looks like [default]Production/Motor1/Status or ns=2;s=Production.Motor1.Status depending on whether you are in the visual binding or the raw OPC UA address. The path is the part the binding dialog asks you for, and the path is case-sensitive on every modern HMI we have used. Motor1 is not the same as motor1 and the silent failure is a tag that is never found, displayed as ? or ### on the faceplate.
The data type is what kind of value the tag holds — BOOL, INT, DINT, REAL, STRING, or a structure of those. The HMI's animation expects a specific data type. A button bound to a BOOL with one-shot semantics writes 1 then 0. A numeric readout bound to a REAL displays a decimal. A string label bound to a DINT shows the integer cast to its string representation. Mismatched data types are sometimes silently re-cast and sometimes throw a binding error — and which one depends on the HMI vendor and the specific animation type. A REAL bound to an INT readout truncates. A REAL bound to a STRING formats with the HMI's default precision (often two decimals). A BOOL bound to a DINT readout shows 0 or 1. The lack of a clear runtime error is the dangerous part.
The polling rate is how often the HMI re-reads the tag. On a faceplate animation the default is usually 500 ms. On an alarm subscription it is event-driven (the PLC pushes the change on a change-of-state). On a trend it can be down to 100 ms. On a recipe screen it is often only on screen-open. The polling rate is the difference between an HMI that updates smoothly and an HMI that lags by half a second behind reality. It is also the difference between an HMI that hammers the PLC's communication scan and an HMI that lets the CPU run its production scan without interference. Get the polling rate wrong and you either make the operator wait or you make the PLC scan stretch from 5 ms to 15 ms because the HMI is asking for a thousand tag reads per second.
The mental model in one sentence: an HMI tag binding is a symbolic path resolved against the PLC's tag table at subscription time, returning a typed value at a fixed polling rate. Every part of that sentence has a failure mode.
Worked example — a motor faceplate with four bindings
Open the simulator. Drop a CompactLogix CPU on the rack with a DI16, a DO16, and an AI8 module. Drop a motor faceplate on the HMI canvas — the simulator's motor_faceplate template ships with a status indicator (green/red/grey LED), a fault indicator (yellow triangle), a Start command button, and a Stop command button. We need to bind all four to the right PLC addresses.
The PLC tag table for the motor:
Program:Production.Motor1.Status : BOOL (alias of Local:1:I.Data.0 — Q0.0 contactor feedback)
Program:Production.Motor1.Fault : BOOL (alias of an internal M-bit at M10.0)
Program:Production.Motor1.StartCmd : BOOL (mapped to I0.0 via PLC logic, write-side)
Program:Production.Motor1.StopCmd : BOOL (mapped to I0.1 via PLC logic, write-side)
In the faceplate editor on the simulator, open the binding dialog for each animation. The simulator uses Ignition-style symbolic addressing under the hood, so the four bindings are:
// status indicator (read-only, color animation)
Animation: BG color
Path: [PLC1]Program:Production.Motor1.Status
Type: BOOL
Polling: 500 ms
Map: 0 -> grey (off), 1 -> green (running)
// fault indicator (read-only, visibility animation)
Animation: Visibility
Path: [PLC1]Program:Production.Motor1.Fault
Type: BOOL
Polling: 500 ms
Map: 0 -> hidden, 1 -> visible
// Start button (write-on-press, momentary)
Animation: On-press action
Action: SetTag([PLC1]Program:Production.Motor1.StartCmd, 1)
Release: SetTag([PLC1]Program:Production.Motor1.StartCmd, 0)
// Stop button (write-on-press, momentary)
Animation: On-press action
Action: SetTag([PLC1]Program:Production.Motor1.StopCmd, 1)
Release: SetTag([PLC1]Program:Production.Motor1.StopCmd, 0)
Note the symmetry: the read animations declare a path and a polling rate; the write actions invoke a function (SetTag) with a path and a value. The data type is implicit in the path's resolution against the PLC tag table. The HMI driver looks up the path, finds it is BOOL, and the binding is valid.
Run the simulator. The status indicator should be grey (motor off, Status is 0). Press Start. The contactor pulls in (you can see it on the panel view). The PLC's Q0.0 fires. The status indicator goes green. Press Stop. Q0.0 drops. The status indicator goes back to grey. Force a fault — the simulator has a "Force Fault" toggle on the motor instance — and the fault triangle appears. All four bindings are now exercised end-to-end.
Now break each one and watch what happens. Change the path on the status binding from Motor1.Status to motor1.Status (lowercase m). The HMI displays ? over the indicator. The binding is unresolved. Change it back. Change the data type on the PLC side from BOOL to DINT (in the simulator's tag table editor) and watch what happens to the indicator — depending on the HMI version, you get either a binding error or a colour stuck on grey because 0 and 1 BOOL semantics no longer apply. Change the polling rate on the status binding from 500 ms to 5000 ms and press Start — the indicator now lags noticeably, ticking green four seconds after the contactor actually fires. Each of these is a real failure mode that has caused real plant outages.
Common mistakes
-
Typo'd or case-mismatched tag path. The single most common HMI binding bug. Every modern HMI is case-sensitive on tag paths, and the binding dialogs autocomplete only at design time — once the binding is laid down, a later rename of the underlying PLC tag does not update the HMI path automatically unless your HMI runtime has a tag-rename watcher (Ignition does, FactoryTalk View does not, TIA Portal WinCC partially). The symptom is always
?or###on the screen. The fix is always to re-open the binding dialog and re-pick the tag from the live tag tree. Avoid hand-typing tag paths into the binding dialog when an autocomplete is available. -
Changing PLC tag datatype after HMI binding (silent re-cast). Promoting a tag from INT to DINT in the PLC because the value is going to exceed 32767 is a routine refactor. The HMI bindings against that tag may continue to display values without an obvious error, but the upper bits get lost or the animation lookup table no longer matches the new range. The fix is a discipline: when you change a PLC tag's data type, search the HMI project for every binding against that tag and re-validate. Most modern HMI tools have a "find usages" or "tag dependency" report — run it before and after every PLC tag-table change.
-
Polling alarms instead of using event-driven subscription. A junior engineer sets up an alarm screen by binding a hundred tag readouts each at 500 ms polling. The alarm screen now reads a hundred tags every 500 ms — 200 reads per second on the PLC's comms scan, plus the cost of the HMI rendering each value. Alarm subscriptions should be event-driven: the PLC pushes the alarm record on a change-of-state, the HMI's alarm subsystem caches it, and the alarm screen renders from the cache without polling the PLC at all. Modern alarm subsystems on FactoryTalk Alarms & Events, TIA Portal WinCC alarms, or Ignition Alarm Notification all support change-of-state subscription. Use it.
-
Mixing absolute addresses with symbolic paths in the same screen. Some legacy HMI projects survive a migration from a SLC-500 to a CompactLogix and the engineer ports the screens by leaving the absolute addresses (
N7:0,B3:1/4) in some bindings and using symbolic paths in others. The symbolic paths follow the PLC's tag table and survive renames. The absolute addresses do not — they are pinned to the underlying memory layout, which the PLC compiler is allowed to rearrange between downloads. The screen works on day one and breaks on day forty-five when somebody recompiles after adding a routine. The fix is a one-time pass through every binding, replacing every absolute address with the symbolic equivalent. Painful, but the alternative is intermittent breakage forever.
How to practise this in the simulator
The simulator's HMI canvas has a motor_faceplate template you can drop onto a screen and a tag-binding dialog that mirrors the major HMI vendor patterns. Drop two motor instances on the screen, bind one correctly, deliberately mis-case the path on the second, and run the screen. Watch the bound instance work and the mis-cased one display ?. Open the diagnostics panel — the simulator logs every binding resolution and you can see exactly which path failed and why. Now exercise the polling-rate trap: bind a numeric readout to an analog input, set polling to 100 ms, and watch the PLC's reported scan time climb in the diagnostics. Set it back to 500 ms and watch the scan time recover. The simulator surfaces the cost of each HMI design decision in numbers you can read.
Vendor reference
The cross-vendor protocol every modern HMI driver speaks underneath the binding dialog is OPC UA, and the Wikipedia OPC Unified Architecture article is a readable reference for how the symbolic addressing, subscription model, and security envelope work across Rockwell, Siemens, Ignition, and any third-party SCADA platform you might encounter on an SA plant. The information-modelling section is the part most relevant to tag binding — it describes how a structured tag in the PLC is exposed as a typed node in the OPC UA address space, which is exactly what the HMI binding dialog is browsing under the hood.
What we don't claim
This site is not SAQA-registered, not MerSETA-accredited, and not an NQF-registered qualification provider. Our completion certificates are course-level only — they describe what you covered, not an NQF Level X qualification. The CCST cert from ISA is the portable industry credential we recommend; we are not an ISA cert delivery partner either, but our cert packs are CCST-aligned. HMI configuration is covered at a high level on the CCST Level 1 syllabus and the symbolic-binding patterns shown here are the pattern most modern HMI platforms in SA process work converge on.