Ignition Expression Tags: Why Does One Stop Updating?

Claire Rousseau7 min read
HMI / SCADAOther ManufacturerTroubleshooting
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

In this Ignition project, changing Cp updates M but leaves the small htMultiplier value stale until the tag is reapplied; reducing the expression tag deadband to 1e-6 corrected the behavior.

Deadband and scan-class approaches

Compare the likely causes before changing the tag group. The decisive distinction is whether the expression is being evaluated but its small change is suppressed, or whether its inputs are not being observed at the expected rate.

Approach What it changes When it fits Decision for this case
Reduce htMultiplier deadband Reduces the change threshold that can suppress reporting of a small result change. Use when the expression’s value changes by less than its deadband, particularly when the result magnitude is small. Recommended. The reported result was on the order of 1e-5; setting the deadband to 1e-6 resolved the observed update.
Change the scan class or tag group Changes polling or evaluation scheduling for tags assigned to that group. Investigate when a source tag itself is stale, or when observed updates arrive at an unexpected cadence. Not the first fix here: M and other dependent tags already updated after Cp changed.
Open the tag editor and apply Forces an edit/apply action on the affected tag instance. Useful as a diagnostic observation that the tag can produce a refreshed result when reapplied. Not a durable operating procedure. It masks the update problem rather than correcting the threshold.

Keep the deadband adjustment local to the affected expression unless measurements show that other tags also need different thresholds. A blanket reduction increases the amount of reported value change and can add unnecessary downstream updates.

Deadband adjustment procedure

  1. Record the existing configuration. In the tag editor, inspect htMultiplier and note its expression, deadband setting, and tag group or scan class. Confirm that Cp is the value being changed and that M responds to that change. Do not alter scheduling while collecting this baseline.
  2. Observe the result before forcing a refresh. Change Cp through the normal project workflow and read M and htMultiplier from the tag browser or the project’s normal diagnostic view. Record the displayed values and update indicators available in that view. Avoid opening and applying the htMultiplier instance during this test, because that would confound whether the normal dependency update worked.
  3. Compare the result delta with the configured deadband. For two consecutive htMultiplier values, calculate abs(new_value - old_value). Compare that difference with the configured threshold, keeping the tag’s units and the interpretation of its deadband in mind. A small result near 1e-5 can change by less than a larger deadband even though the upstream calculation has changed.
  4. Set the expression deadband to 1e-6. Edit the htMultiplier tag’s deadband setting and apply the change. Leave Cp, M, the expression, and the scan class unchanged for this test. The project that resolved this symptom used this deadband value.
  5. Repeat the same input change. Change Cp again through the normal workflow. Read M and htMultiplier without reopening the tag editor. Confirm that M changes and that htMultiplier now reflects its recalculated value.
  6. Test both small and larger changes. Repeat with representative Cp changes that produce different htMultiplier deltas. Confirm the expression reports changes that matter to the application, and inspect whether the lower threshold causes excessive downstream updates. If the calculated delta still falls below 1e-6, capture the actual values and reassess the required threshold instead of assuming this value fits every operating range.

Expression dependency and threshold mechanism

The calculation chain is Cp → M → htMultiplier. The observed behavior isolates the failure downstream of M: changing Cp updates M, and other expressions such as A, B, and C that depend on M also update. That pattern makes a missing Cp update or a generally stalled tag group less likely than a threshold applied to htMultiplier.

A deadband suppresses recognition or reporting of changes smaller than a configured threshold. A calculated tag can therefore be mathematically responsive while consumers see no value-change update when the delta is under that threshold. This matters especially when the expression result itself is small: its absolute magnitude is not the same thing as the change between successive results. Inspect the actual difference between readings, not only the displayed value’s order of magnitude.

Changing Cp and seeing M update does not alone prove that htMultiplier is wrong. Follow the dependency chain and test the final expression without forcing a manual apply. If lowering the deadband makes that last link update, the deadband—not the scan schedule—was the operative issue.

Scan-class diagnostic gates

A scan class or tag group controls when tags are polled or evaluated according to their configuration. It is a reasonable investigation only when the input itself is delayed, a source tag is not changing as expected, or update cadence is inconsistent across tags that share the group. It is a poor first adjustment when the intermediate and sibling expressions already respond promptly to the same input change.

Observation Likely area to inspect Next check
Cp changes but M does not Input update, expression dependency, or scheduling Read Cp directly, inspect the M expression and its dependencies, then compare their tag-group configuration and observed update cadence.
M, A, B, and C update, but htMultiplier does not Specific expression result or deadband Measure consecutive htMultiplier values and compare their difference with that tag’s threshold.
htMultiplier changes only after opening and applying its tag Forced edit obscures the normal update path Repeat the test without editing the tag and verify the deadband configuration directly.

Do not change scan timing simply to make a small value appear more responsive. Faster evaluation cannot by itself make a delta exceed a deadband. If the source and intermediate values arrive on time, establish the threshold first; revisit scheduling only if timestamp or cadence observations point to a separate delay.

Numerical threshold selection

Use measured values rather than guessing from the name or units of the tag. For each test, record the old result, new result, and absolute delta:

delta = abs(htMultiplier_new - htMultiplier_old)

Then compare delta with the configured deadband. In the reported case, htMultiplier was on the order of 1e-5, and the working threshold was 1e-6. These values describe that case; they are not a universal setting for every model or operating range. The threshold must be low enough to pass changes that matter, but not so low that inconsequential numerical variation produces unwanted updates.

If the result has a meaningful operating range, test across that range, including the smallest change that the application needs to detect. Keep enough displayed precision or use a diagnostic readout capable of exposing the actual value; rounded display text can hide a delta and lead to a wrong conclusion. Check any downstream calculations or displays that subscribe to htMultiplier after changing its deadband.

UDT template references and dynamic instances

The template issue is separate from the expression update issue. A Brick structure containing ten BrickNodes raised a design need to bind child UDT tags to template objects while reusing a template for multiple instances. The practical change described was to use indirect tag references in the templates for the brickNode and brick structures, rather than hard-coding child tags from one existing instance.

For a reusable view, parameterize the instance path and resolve child references relative to the selected Brick instance. Verify the binding against more than one instance: each displayed Brick must resolve its own child nodes, not continue to show the BrickNodes from a fixed instance such as barrelBrick. Keep this binding change independent of the deadband test so a UDT path correction does not obscure whether htMultiplier now reports small changes.

FAQ

How do I fix an Ignition expression tag that does not update?

Compare the expression’s value change with its configured deadband. In the described case, setting htMultiplier deadband to 1e-6 made the small result update normally.

How do I know whether Ignition deadband is hiding a value change?

Record two successive values and calculate abs(new_value - old_value). If the delta is below the tag’s deadband and upstream tags update, lower the affected expression’s threshold and retest without manually applying the tag.

Should I change the scan class when one expression tag is stale?

Not as the first step when M and sibling expressions already respond to Cp. Check source update cadence and tag-group configuration only if those readings show scheduling delay.

How do I reuse a Brick template for multiple UDT instances?

Use indirect tag references for the brick and brickNode template bindings, then test the template against multiple instances and confirm that each resolves its own child tags.

Back to blog