Summary
On Ignition 8.1.49, a tag configured with Historical Deadband Mode = Percent and Historical Deadband Style = Analog appears to use the configured number as an engineering-unit value, not as a percentage of the Engineering Range.
The effect is invisible on tags whose range happens to be 0–100 (where 1.5% of 100 equals the literal 1.5), and grows with the span everywhere else. On a 0–5000 tag the effective deadband ends up 50x tighter than intended; on a 0–300,000 tag, 3000x.
I would like to know whether this is expected behavior that I am misreading, or something others have run into.
How I measured it
The manual gives the slope formulas for the Analog method:
Upper Slope = ((NewValue + Deadband) - PreviousValue) / (NewTimestamp - PreviousTimestamp)
Lower Slope = ((NewValue - Deadband) - PreviousValue) / (NewTimestamp - PreviousTimestamp)
Writing PreviousValue = 0 and then NewValue = 1, these become (1 + D)/dt and (1 - D)/dt. Adding and subtracting them:
Upper + Lower = 2 / dt
Upper - Lower = 2D / dt
Dividing one by the other, dt cancels out:
D = (Upper Slope - Lower Slope) / (Upper Slope + Lower Slope)
So the two slopes shown in Tag Diagnostics reveal the deadband the engine is actually using, independently of timing and of the signal value. That is what makes this reproducible on any gateway.
Reproduction
Three memory tags, Float8, identical except where noted. History enabled, Sample Mode = On Change, Historical Deadband Style = Analog, Min Time = 0 (important — a time gate would mask the deadband), Max Time = 1 day, engLow = 0.
| Tag | engHigh | Historical Deadband | Mode |
|---|---|---|---|
T1_Span100 |
100 | 10 | Percent |
T2_Span1000 |
1000 | 10 | Percent |
T3_Span1000_Absolute |
1000 | 100 | Absolute |
T1 and T3 are controls. On T1, both interpretations agree (10% of 100 = 10 = the literal). T3 is the unambiguous case.
Steps: write 0 to all three, wait ~20 s, write 1 to all three, then open Tag Diagnostics on each.
Results
| Tag | Tolerance | Upper Slope | Lower Slope | D computed | D expected |
|---|---|---|---|---|---|
T1_Span100 |
10.0 | 6.558159E-4 | -5.3657667E-4 | 10.0000 | 10 |
T2_Span1000 |
10.0 | 5.687694E-4 | -4.6535677E-4 | 10.0000 | 100 |
T3_Span1000_Absolute |
100.0 | 4.650092E-3 | -4.558011E-3 | 100.0000 | 100 |
T2 and T3 have the same Engineering Range (0–1000). The only difference is the mode. In Absolute the effective deadband is 100. In Percent, 10% of a 1000-wide span yields 10, not 100.
The Tolerance field in Diagnostics reports the same figure, which is consistent with the slopes.
Sanity check on the readings
Since dt = 2 / (Upper + Lower), the time of the initial stored point can be recovered from the slopes alone and compared against the Last value timestamp:
| Tag | dt derived | Last value (epoch ms) |
Recovered t0 |
|---|---|---|---|
T1_Span100 |
16,773 ms | 1789475567410 | 1789475550637 |
T2_Span1000 |
19,340 ms | 1789475569977 | 1789475550637 |
T3_Span1000_Absolute |
21,720 ms | 1789475572357 | 1789475550637 |
All three recover the same instant to the millisecond — which is when the three tags were written with 0. The readings are internally consistent.
Why it matters in practice
This was found while reducing a Tag Historian that was growing ~9 GB/month. Roughly 874 analog tags were configured Percent at 1.5%, across Engineering Ranges from 0–100 to 0–300,000. Because the effective deadband was stuck at 1.5 engineering units, the tags with wide ranges recorded almost continuously:
- A differential-pressure tag with range 0–5000 mbar and a 1.5% deadband (expected threshold 75) recorded 458 points in 2.4 hours while the signal moved a total of 32.7 mbar over the whole window — less than half of its own intended threshold.
- Switching those tags to
Absolutewith the pre-computed value ((engHigh - engLow) * pct / 100) cut the historian rate by 41.8% measured like-for-like, with no loss of resolution: the same tag now records 1–2 points, which is the correct behavior for a signal that never crosses its threshold.
Questions
- Is
Percentsupposed to be relative to the Engineering Range in the historical deadband, as it is for the value deadband? The manual describes the Analog formulas but does not state whatDeadbandresolves to inPercentmode. - Has anyone else measured this? It is easy to miss, because on 0–100 tags the two interpretations coincide, and on other tags it only shows up as "the historian writes more than I expected".
- In our production tags the Engineering Range comes from UDT parameter bindings (
{EngHigh}/{EngLow}), so my first suspicion was that the binding was not being resolved. But the memory tags above use literal values forengHighand show the same behavior, which seems to rule that out. Has anyone tested both contexts?
Environment: Ignition 8.1.49, PostgreSQL historian provider, Analog (swinging door) style, memory tags for the repro.
Thanks in advance.