Why Does Ignition Tag History Show Only Two Decimals?

Karen Mitchell6 min read
B&R AutomationOther TopicTroubleshooting
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

What is the screen telling you?

A float tag carries five decimal places, a Tag History binding feeds a Perspective Table, and every cell shows two decimals. The historian did not round anything. A Tag History binding on a floating-point tag returns the stored floating-point value at full resolution. The rounding happens at render time: the Table formats numbers through its column configuration in props.columns. That configuration never inherits formatting from the tag.

The common trap follows directly. You open props.columns, set numberFormat to the four-decimal option, and the table still shows two decimals. The format is right, but it is not attached to any data. A column entry only takes effect when its field matches a column name in props.data. An empty or mismatched field leaves the real data column on default rendering, and your format setting sits on a column object that points at nothing.

Work through the checks below in order. Each one rules out a layer between the historian and the pixel.

Check 1: Does the raw data still carry full precision?

Before you touch the display, confirm the data reaching the Table is intact.

  1. Open the Tag History binding on props.data and look at the binding preview. With a transform present, compare the value before and after the transform.
  2. Alternatively, select the Table in the Designer and expand props.data in the Property Editor. Read the value cells directly.
  3. Note the exact column names in the returned dataset. You need them for Check 3.
Reading Meaning Next check
Full decimals in preview and in props.data Data is intact; the problem is purely display Check 3
Full decimals before transform, rounded after The transform script is altering values Check 2
Rounded or noisy digits even in the raw binding output Precision was lost at the tag or source Check 4

Check 2: Is the transform script changing the numbers?

A script transform between the binding and props.data can cut precision without anyone intending it. Look for these patterns:

  • round(value, 2) or any explicit rounding call.
  • String formatting such as '%.2f' % value or '{:.2f}'.format(value). This produces a string, which also bypasses the column's number rendering.
  • Rebuilding the dataset with a column type of integer or string instead of float/double.

If you find any of these, remove the formatting from the transform and return raw numbers. Formatting belongs in the column configuration. Keeping it there leaves the data numeric, sortable, and usable by other bindings. When the transform only reshapes data, return a dataset with numeric columns and continue to Check 3.

Check 3: Does the column config actually bind to the data column?

This is the resolving branch in most cases. The tag is right; the binding is wrong. Specifically, the column binding is wrong.

Setting (in props.columns[n]) Effect What to enter
field Links this column config to a key or column in props.data. If it is empty or doesn't match, nothing else in the object applies. The exact dataset column name from Check 1, with matching case
render Selects how the cell renders. auto guesses from the data; number forces numeric rendering. number for the value column
numberFormat Numeral-style format string applied to numeric cells 0,0.00000 for five decimals
header.title Display text only; does not affect matching Any label you want operators to see

The Tag History binding names its value column after the tag, or after the alias if you set one in the binding. The timestamp column is typically t_stamp. Do not guess the value column name. Copy it from props.data.

Two configurations both work. You can match field to whatever name the binding produces, or you can set an alias on the tag path in the binding (for example Value) and use that as the field. The alias approach is better. It decouples the Table from the tag path, so moving or renaming the tag does not silently break column formatting.

Watch for duplicates. If props.columns contains an entry whose field is empty and the Table is also rendering the data column on its own, you are looking at the auto-generated column rather than the one you formatted. Delete the empty entries.

Check 4: Can the tag hold five decimals in the first place?

Reach this check only when the raw binding output already looks wrong. The formatter can display digits, but it cannot recover digits the data type never stored.

Tag data type Approx. significant digits Consequence for 5-decimal values
Float4 (32-bit single) ~7 A value like 1234.56789 (9 significant digits) cannot be represented exactly. Trailing decimals drift.
Float8 (64-bit double) ~15-16 Holds five decimals comfortably for any realistic process magnitude

If the magnitude plus five decimals exceeds about seven significant digits, change the tag to Float8. Confirm that the PLC or OPC source really delivers that resolution too; a REAL in the controller has the same 32-bit limit. Also review the tag's history settings. A historical deadband or aggregation mode (average, min/max) changes which values get stored or returned. It does not truncate decimals, but it can make trended values differ from live readings.

How do you apply the fix and prove it worked?

  1. In the Tag History binding, set an alias on the tag path (for example Value). Confirm in the preview that the dataset now has columns t_stamp and Value.
  2. Strip any rounding or string formatting from the transform script so it returns numeric values.
  3. In props.columns, remove column objects with empty field values.
  4. Add or edit a column object for the value:
    {
      "field": "Value",
      "render": "number",
      "numberFormat": "0,0.00000",
      "header": { "title": "Value" }
    }
  5. Add a column object for t_stamp with render set to date and a dateFormat that suits your operators.
  6. Save and open the view in a session. A Designer preview can lag behind property changes.

For verification, pick one row and read the same value from props.data in the Property Editor. The table cell should match it to all five decimals, with any trailing zeros padded by the format string. Temporarily change numberFormat to 0.0 and confirm the cell changes. If it does, the column object is bound to the data. Restore 0,0.00000 and confirm the full five decimals return.

FAQ

How do I show more decimal places in an Ignition Perspective table?

Add an entry to props.columns whose field exactly matches the data column name. Set render to number and numberFormat to a string such as 0,0.00000 for five decimals.

Why does numberFormat have no effect on my Perspective table?

The column object's field is empty or does not match a key in props.data, so the settings never attach to real data. Copy the exact column name from props.data, including case, into field.

How do I find the column name returned by a Tag History binding?

Expand props.data in the Property Editor or read the binding preview. The timestamp is typically t_stamp, and the value column follows the tag name or the alias you set on the path in the binding.

Does the Ignition historian round float values?

No. A Tag History binding on a float tag returns the stored floating-point value. Visible rounding comes from table formatting, a transform script, or a Float4 tag that cannot hold the required significant digits.

Back to blog