Configuring Ignition Perspective Horizon-Style Deviation Trends

David Krause7 min read
HMI / SCADAOther ManufacturerTechnical Reference
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

Six area trends that all carry the same deviation value draw six identical polygons in a Perspective chart. Only the top color shows, and turning on stack multiplies the height instead of producing bands. The WinCC Professional display never depended on six copies of the data. It depended on per-axis clipping. Perspective does not reproduce that clipping, so you rebuild the effect by splitting the -1 to 1 deviation signal into pre-clipped band series before the chart draws them.

Axis clipping behind the WinCC band display

In WinCC Professional, each of the six trends had its own axis with a fixed value range, and all six axes spanned the same pixel height. A band is the slice of the deviation range that one axis covers, for example 0 to 1/3. Each trend was clipped to its axis. Below the axis minimum it drew nothing. Inside the range it rose proportionally. Above the maximum it sat at full height. Stack those overlaid trends with the darkest band drawn last, and the darker color appears to take over from the lighter one as deviation grows. This layout is a horizon chart: fixed height, with magnitude encoded by how many overlaid bands are saturated.

The effect was a byproduct of how the WinCC trend control mapped values outside an axis range. Porting the six-axis configuration to Perspective is the wrong approach. Put the clipping into the data, and any area-capable chart will render the bands correctly on one fixed axis.

Check 1: series data identity in the Perspective chart

Open the chart's series data and compare the value columns that feed the area trends.

  • Reading: all area trends reference the same column or identical values. Each area fills from the baseline to the same value, so the polygons coincide and only the last-drawn color is visible. Hiding a trend reveals the one underneath, but the takeover effect is gone. Go to Check 2.
  • Reading: trends already reference distinct band columns. The decomposition exists. Skip to the verification section and test the band math and draw order.

Check 2: target band geometry, horizon overlay versus cumulative stack

Turn stack on for the area trends with identical data. The top edge sits at roughly N times the deviation, where N is the number of stacked trends. That result confirms stacking alone cannot segment one signal. Stacking sums series, and summing copies of v gives multiples of v. Choose the geometry you actually need before computing bands:

Geometry Band value per sample stack Axis Visual result
Horizon overlay (matches the WinCC screenshots) Normalized 0 to 1 fill of each band Off Fixed, -1 to 1 Constant height; darker bands overlay lighter ones from the same baseline
Cumulative stack Raw clipped slice, 0 to band width On Fixed, -1 to 1 Area height equals v; color changes with height

For the WinCC look, use the horizon overlay and go to Check 3. The cumulative stack is a valid alternative when operators need to read absolute deviation from the area height.

Check 3: computation point for band values

Band values can be computed in two places. The trade-off is where the history lives.

  • Chart fed by a historian query binding: compute the bands in a script transform on the binding. The historian keeps storing only the raw deviation, and band thresholds stay editable in one place. Use this path by default.
  • Chart fed by live tags only, or other displays need the bands: create one expression tag per band and historize them. The cost is six extra historized tags, and threshold changes do not apply to history that is already stored.

For an expression-tag band, the positive band k with lower edge lo and width w takes this form. {DeviationTag} is a placeholder for your tag path:

max(0, min(({DeviationTag} - lo) / w, 1))

For negative bands, negate the input and negate the result.

Band decomposition procedure in a Perspective binding

Assumption, labeled: six trends on a -1 to 1 scale means three bands per sign, each 1/3 wide. Adjust edges if your WinCC axes used different ranges. Read those ranges from the WinCC axis value-range settings.

  1. Bind the chart's series data to the historian query for the raw deviation tag. Use the same return format the chart already accepts.
  2. Add a script transform that converts the one-value dataset into a timestamp column plus six band columns:
    def transform(self, value, quality, timestamp):
        edges = [0.0, 1.0/3, 2.0/3]
        w = 1.0/3
        headers = [value.getColumnName(0),
                   'pos1','pos2','pos3','neg1','neg2','neg3']
        rows = []
        for r in range(value.getRowCount()):
            t = value.getValueAt(r, 0)
            v = value.getValueAt(r, 1)
            if v is None:
                rows.append([t] + [None]*6)
                continue
            v = float(v)
            pos = [max(0.0, min((v - lo) / w, 1.0)) for lo in edges]
            neg = [-max(0.0, min((-v - lo) / w, 1.0)) for lo in edges]
            rows.append([t] + pos + neg)
        return system.dataset.toDataSet(headers, rows)
  3. Create six area trends, one per band column, all on one value axis.
  4. Set that axis to a fixed minimum of -1 and maximum of 1, and disable auto-scaling. An auto-scaled axis rescales to the largest band present and distorts the fill ratios.
  5. Leave stack off on all six trends.
  6. Order the trends lightest to darkest within each sign, so pos3 and neg3 render last and sit on top. If the takeover runs backward, the draw order is inverted.
  7. Assign one hue family per sign, stepping from light to dark. Set area fill opacity to fully opaque. Partial opacity blends the overlaid bands into muddy intermediate colors.
  8. Add the raw deviation as a thin line trend, or expose it in the tooltip. Otherwise tooltips report normalized band fill instead of engineering deviation.

Band edges are only as sharp as the sample density. The chart interpolates linearly between samples, so a crossing of a band threshold between two samples is drawn as a slope. Query at a fixed sample interval fine enough for the band transitions you need to see.

Band rendering verification with test deviation values

Drive the raw deviation through a memory tag, or edit a test dataset, and check each reading against the expected render:

  1. v = 0.0: all six band columns read 0. No area is drawn on either side of the baseline.
  2. v = 0.2: pos1 = 0.6, all others 0. The lightest positive color fills 60% of the positive half.
  3. v = 0.5: pos1 = 1.0, pos2 = 0.5, pos3 = 0. The positive half is full light color, with the medium color overlaid to half height.
  4. v = 1.0: all positive bands read 1.0. Only the darkest positive color is visible, at full height.
  5. v = -0.5: neg1 = -1.0, neg2 = -0.5, positive bands 0. This mirrors check 3 below the baseline in the negative hue family.
  6. Ramp from -1 to 1 over one trend window: colors hand over in sequence at the 1/3 and 2/3 thresholds on each side, with no gap and no double-height area. A gap points to an edge error in edges. A double-height area means stack is still on for one trend.
  7. Axis readout: the value axis holds fixed at -1 to 1 when you pan across periods with low deviation. If the axis rescales, auto-scaling is still enabled.

FAQ

Why do my Ignition Perspective area trends overlap instead of stacking?

Every trend references the same deviation value, so each area fills from the baseline to the same height and the polygons coincide. Only the last-drawn color stays visible. Feed each trend its own clipped band column instead.

Why does the stack property not create deviation bands in a Perspective time series chart?

Stacking sums the series, so N copies of the deviation produce an area N times taller. Bands only appear when each stacked series carries its own clipped slice, max(0, min(v - lo, w)), whose sum equals v.

Why did the six-axis trend work in WinCC Professional but not in Ignition?

Each WinCC axis had a fixed value range, and the trend control clipped every trend to its axis. That clipping produced the horizon-chart layering. Perspective needs that clipping computed into the data before the chart renders it.

Why do the band colors look blended or muddy in the overlaid chart?

The area fill opacity is below 100%, so overlaid bands mix. Set the fills fully opaque and order the trends lightest to darkest so the darkest band draws on top.

How do I show the real deviation value in the tooltip on a banded Perspective chart?

Add the raw deviation as a separate thin line trend on the same fixed -1 to 1 axis, or include it in the tooltip content. The band columns hold normalized 0 to 1 fill values, not engineering deviation.

Back to blog