Skip to content

Energy, utilities and offshoreMuvia Industrial

From tag names to assets

Five hundred control-system tags, with names such as KP2_P201A_VT01, read by a Python function the way a technician would read them: machine code, instrument, unit. Every match to an asset variable comes with a confidence and a reason, and the doubtful ones go to a person.

Illustrative scenario: it describes a typical case, not a customer project.

The control system has five hundred tags. Only whoever wrote them understands them.

Every plant carries years of conventions: ISA codes, abbreviations from the old system, alarm thresholds and commands mixed in with the measures. Before anything can be analysed, someone has to read hundreds of names and say which machine and which quantity each one belongs to.

In Muvia that work is done by a Python function your team writes, the way a technician would do it: it reads the code, instrument, suffix, description and unit, gives a score and explains why. Confident matches are applied, doubtful ones go to a person.

Who it's for
Automation engineers, system integrators, industrial data engineers and anyone who has to give context to an existing plant's data.
Diagram: the tag list exported from the control system and the old system's names in Excel enter as sources, the pumps' signals arrive from the edge node over OPC UA. Muvia produces the table of matches with confidence and reason, the list of tags to review, the contextualisation dashboard and the asset variables linked to their signals.

In Muvia, step by step

Real product screens, recorded on a project with sample data.

1 of 5

The video · Five hundred control-system tags, with names such as KP2_P201A_VT01, read by a Python function the way a technician would read them: machine code, instrument, unit. Every match to an asset variable comes with a confidence and a reason, and the doubtful ones go to a person.

What you get

Reading tags, automated
A function reads hundreds of names as a technician would; people only look at the doubtful cases.
Every match explains itself
Confidence and reason come with every row: you can see why a tag ended up on a variable.
Non-measures stay out
Alarm thresholds, commands and spare channels are recognised and kept out of the analysis.
Rules that stay yours
The plant's conventions live in the function's code: correct them and apply them again to every new export.

For the technical team

How it is built in Muvia

  1. 1

    Load the tag list

    The control system's export enters as a source and becomes a table with its own query: name, description, unit, originating system.

  2. 2

    Read the tags in Python

    A Python function recognises the machine code, the instrument letters and the suffixes that are not measures, such as thresholds and commands. Each clue is worth points: the sum is the confidence, and the reason says which clues decided it.

  3. 3

    Run and check

    A flow applies the function and writes the matches to a table. The dashboard shows how many tags are matched, how many need review and how many are not measures.

  4. 4

    Link the variables

    Confirmed matches link the fields of a certified dataset to the assets' variables: every pump receives its signals.

Python function

import re
import pandas as pd

INSTRUMENTS = {"VT": ("vibration", "mm/s"), "TT": ("temperature", "°C"),
               "FT": ("flow", "m3/h"), "IT": ("current", "A")}
NOT_MEASURES = {"AH": "an alarm threshold", "SP": "a setpoint",
                "CMD": "a command", "FB": "a status feedback"}
TAG = re.compile(r"^KP\d_([PM])(\d{3}[AB])_([A-Z]+)\d\d(?:_([A-Z]+))?$")

def transform(inputs, params, ctx):
    rows = []
    for tag, unit in inputs["rows"][["tag", "unit"]].itertuples(index=False):
        m = TAG.match(tag.upper())
        if not m:
            rows.append((tag, None, None, 0, "to review", "code not recognised"))
            continue
        asset = f"{m[1]}-{m[2]}"
        if m[4] in NOT_MEASURES:
            rows.append((tag, asset, None, 0, "not a measure", f"it is {NOT_MEASURES[m[4]]}"))
            continue
        variable, expected = INSTRUMENTS.get(m[3], (None, None))
        points = 45 + (35 if variable else 0) + (20 if unit == expected else 0)
        outcome = "matched" if points >= params["threshold"] else "to review"
        rows.append((tag, asset, variable, points, outcome, "code, instrument and unit"))
    columns = ["tag", "asset", "variable", "confidence", "outcome", "reason"]
    return {"rows": pd.DataFrame(rows, columns=columns)}
Machine code, instrument letters and unit are worth points; thresholds and commands stay out. Every row comes out with a confidence, an outcome and a reason.
The data it needs
  • The control system's tag list, with description and unit
  • The old system's names, from an Excel export
  • The plant model: assets and variables of pumps, motors, valves and tanks
  • The pumps' signals, read by the edge node over OPC UA

Tell us which machines you run. We'll tell you how to read them.

PLC brand, protocol, how the floor is connected: with those three answers, in a demo with one of our engineers, we show you how Muvia Industrial puts line data next to the rest of the business.