| What it writes | What is in it | How far it is checked |
|---|
An Asset Administration Shell AAS, IEC 63278 | Every machine as a shell, every reading as a property with its unit, and the readings it would not place in a part of their own with the reason. | checked against the official JSON schema on both real plants |
A Unified Namespace topic tree ISA-95, UNS | Enterprise, site, area, line, machine, reading. A level it could not establish is marked as unknown; an unplaced tag sits under its own branch, never under a machine. | file only; nothing published to a broker |
Brick buildings | Machines, points and units in the Brick schema, where the mapping is certain, and left out where it is not. | every class checked against Brick 1.3; parsed by rdflib |
Ignition tag documentation Inductive Automation | Folders per machine, each tag with what it measures, its unit and the evidence, to import into a new folder and review. | format from the vendor's documentation; not yet imported on a live gateway |
Power BI and Grafana dashboards | A tag dictionary to join on, with whether each reading can be trusted this week, and Grafana annotations saying “frozen since Tuesday” on the panel itself. | TMDL and the annotation format from the vendors' documentation; not yet loaded into either |
Work requests Maximo or any CMMS | Each data fault as a proposed work request with the machine, the evidence and a priority by a stated rule, as CSV and as Maximo draft bodies. A person sends them. | field names from IBM's documentation; nothing is ever sent |
Your asset register Gemini VA, IFS, Maximo | Each machine matched to the register's own object, with the evidence, or refused when two objects fit about as well. | tested on a made-up register, which tests the logic, not accuracy on yours |
Any AI assistant MCP | 16 read-only tools, by process or by URL. One of them, check_tag, takes a tag as another server names it and says what it is and whether to trust it this week. | tested here; not yet run beside the other vendors' servers |
Run on two real Danish sites, every file above was written from one compile: 7 machines and 17 readings for the wastewater plant, 41 machines, 145 topics and 37 tags kept apart with their reason for the office building. It proposed 5 work requests there and 1 at the plant, one for each data fault it found that week.
The check before a yearly report found something we got wrong first. On the office building it flagged the fans and the heating as frozen. They were stopped: weekends, and a September with no heating. It now reads a running total against its own rate on the same machine, by conservation, and that explained 35 still stretches. 6 were left, all on 2 district heating meter totals that stood for a day or more while the power through them said they should have moved: a meter that reports late, or a fault, for a person to tell. And not one figure came out “ready”, on either site, because the published exports carry no units (13 of 13 figures there, 4 of 4 at the plant). A unit is the first thing a person confirms.
It reads more of what a control system already knows
Drop an Ignition tag export or a Geo SCADA object list beside the exports, and the folders,
templates, units and ranges in it become evidence for which machine a tag is on and what it
measures. Where a file disagrees with the tag's own name, the name stands and the disagreement
is written down.
Beside other AI servers, not instead of them
Many plants will connect an assistant to their OPC UA server, their historian or Ignition.
Several community servers for those can also write to the plant. Auge's cannot. The pattern we
recommend: let the assistant read values from the plant's own server, and call
check_tag on Auge before it trusts one. A frozen meter then comes back as
“do not trust this, frozen since Tuesday” instead of a confident number.
Every file above comes out of the same run, with the same evidence behind it.