F05 · Session 5 · Chapter 1
Why one name for everything
Every report, alarm, screen and AI question finds plant data by its name. If each line names the same thing differently, every one of those is built again for every line. This chapter shows what a plant's names cost today and where a single standard comes from.
25 min3 chapters≈ 90 minutes2 exercises12-question assessment · 80% passes
By the end of this chapter you can
- Explain why a naming standard is the cheapest analytics investment a plant can make.
- Recognise the four kinds of names one piece of equipment already has, and who uses each.
- Turn the ISA-95 equipment hierarchy into a path that every system can use.
The same filler, three names
A bottling plant runs three lines. Each was commissioned in a different year by a different integrator. On line 1 the good-bottle count from the filler is called Filler_Cnt. On line 2 it is FIL2_COUNT_GOOD. On line 3 someone typed L3 Filler Good Bottles, with spaces. All three mean exactly the same thing.
Now the plant manager asks for one screen showing good bottles per hour on every line. Someone must find the three names, learn what each one means, check whether each counts the same way, and write three queries. When line 4 arrives, the work is repeated. When an AI agent is asked "how many good bottles did we make yesterday?", it has to guess that these three names are the same measure, and it may guess wrong.
A naming standard fixes this at the source. It is a short document, owned by the people who run the plant, that says how every machine, line, measure and tag is named. It costs nothing but an afternoon to write, and it is the part of a data platform that domain experts, not IT, are best placed to own.
The names your plant already has
No plant starts from nothing. Each piece of equipment already carries several names, each made for a different job and a different team. A standard does not throw them away; it picks one as the name the platform uses and records the others against it.
| Kind of name | Example | Made for | Where it belongs |
|---|---|---|---|
| PLC or device address | N7:12, DB10.DBW4, register 40001 | The controller's memory | Only at the controller and the connector that reads it; never shown above it |
| ISA-5.1 instrument tag | FIC-101, TT-2203 | P&IDs and instrument lists [1] | An attribute of the asset, so drawings and data can be matched |
| ISO/IEC 81346 reference designation | =FIL.CNV1-M1 | Function (=), product (-) and location (+) across disciplines [2] | An attribute of the asset, for electrical and mechanical records |
| Unified Namespace path | acme/cle/bottling/line-2/filler/good_count | Every system that reads or writes plant data [3] | The one name the platform, its screens and its AI agents use |
What each name tells you
An ISA-5.1 tag tells an instrument technician what an instrument measures and does: in FIC-101, F is flow, I is indicating, C is controlling, and 101 is the loop number [1]. An ISO/IEC 81346 code tells an electrician what function a part serves, which product it is and where it is [2]. A device address tells the controller where a value sits in memory. None of these tells a dashboard which site, area and line a value comes from. That is what the platform's name must do.
Knowledge check
A new analyst asks why the platform does not simply use the PLC addresses as names. What is the best answer?
The backbone: the ISA-95 hierarchy
The platform's name needs an order that every plant already understands. ISA-95 (IEC 62264) provides it: enterprise, site, area, then the work centre (a line, a process cell or a storage zone) and the equipment inside it [4]. It is the same hierarchy Session 3's schema used for its tables. Written as a path, each level becomes one segment, joined by slashes, which is exactly how MQTT topics are built [5].
This order is what makes a Unified Namespace work: a consumer can ask for acme/cle/bottling/+/filler/good_count and receive the good count from every filler in the bottling area, without knowing how many lines there are. The + is MQTT's single-level wildcard; # matches everything below a level [5]. Neither works if the levels are in a different order on each line.
Knowledge check
Why does the order of the levels matter as much as the words?
Knowledge check
Which of these is the platform's name for the good-bottle count on line 2?
References
- ISA: ANSI/ISA-5.1-2024, Instrumentation and Control Symbols and Identification (announcement). https://www.isa.org/news-press-releases/2024/october/widely-used-engineering-symbols-and-drawings-stand
- ISO: IEC 81346 reference designation system (ISO Online Browsing Platform). https://www.iso.org/obp/ui/en/#!iso:std:75471:en
- HiveMQ: Implementing a Unified Namespace with MQTT and Sparkplug. https://www.hivemq.com/blog/implementing-unified-namespace-uns-mqtt-sparkplug/
- ISA: ISA-95 Standard, Enterprise-Control System Integration. https://www.isa.org/standards-and-publications/isa-standards/isa-95-standard
- OASIS: MQTT Version 5.0 (topic names, topic filters and wildcards). https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html
- Eclipse Foundation: Sparkplug specification. https://sparkplug.eclipse.org/specification/
F05 · Chapter 2 · The rules
Writing the standard
A naming standard fits on one page: the levels, the allowed words, how words are joined, and where units go. This chapter writes one for a real line, then renames its tags.
30 min1 page6 rules1 vocabulary list
By the end of this chapter you can
- Write the six rules of a naming standard: levels, case, joining, vocabulary, units and forbidden characters.
- Build a controlled vocabulary of measures with units, from your own intent.
- Rename a set of legacy tags to the standard, and record each old name as an alias.
Six rules on one page
A standard that people can remember beats a complete one that nobody reads. The six rules below cover almost every name a small or mid-size plant needs. Each exists because breaking it has caused a real problem.
| Rule | What it says | Why |
|---|---|---|
| 1. Fixed levels | enterprise / site / area / line / equipment / measure, always all six, in that order | Wildcards and reused screens depend on position [1] |
| 2. Lower case | No capital letters anywhere | MQTT topic names are case sensitive, so Line-2 and line-2 would be two different places [1] |
| 3. Joining | Words inside a level are joined with hyphens (press-shop); words inside a measure with underscores (good_count) | The measure stays one token in code, queries and spreadsheets |
| 4. Vocabulary | Measures come from a short, written list; a new word is added by review, not invented on the day | The same measure gets the same word on every line |
| 5. Units | Every physical measure ends with its unit: temp_c, pressure_bar, flow_l_min | A number without a unit is a guess; unit codes follow UCUM where one exists [2] |
| 6. Forbidden | No spaces, dots, +, # or $ at the start | + and # are MQTT wildcards and topics starting with $ are reserved for the broker [1] |
The vocabulary: measures your intent needs
Start from the intent statement you wrote in Session 2. It names the decision and the data the decision needs. Each piece of data becomes a measure, and each measure gets one word. For a supervisor deciding which line gets the next technician, from downtime by reason and open work orders, the list starts small:
| Measure | Meaning | Unit | Type |
|---|---|---|---|
state | Machine state: running, idle, down, changeover (one fixed list) | none | text from a list |
down_reason | Why the machine is down, from the plant's reason list | none | text from a list |
good_count | Good units since the start of the shift | units | whole number |
reject_count | Rejected units since the start of the shift | units | whole number |
speed_bpm | Current speed in bottles per minute | 1/min | number |
temp_c | Temperature in degrees Celsius | Cel | number |
pressure_bar | Pressure in bar | bar | number |
Counts and states carry no unit suffix because they have no physical unit. A state should use a fixed list of values, written in the standard. PackML's machine states are a published model to borrow from if your equipment supports it [3].
Time, and where it lives
A measure's name never contains a time or a date. Each value carries its own timestamp, stored in UTC and written in ISO 8601 form (for example 2026-10-04T13:05:00Z) [4]. Shift and day boundaries are computed from the timestamp and the plant's time zone, never baked into a name such as count_shift_b.
Knowledge check
A line lead proposes the measure name Temp for an oven. What does the standard change?
Writing it down
The standard is a file in the platform's repository, so it is versioned, reviewed and visible to every person and agent who works on the platform. A short Markdown file is enough. Here is a complete one for the bottling plant:
# Naming standard (version 1)
Owner: operations engineering. Changes by pull request, reviewed by the area owner.
## Path
enterprise/site/area/line/equipment/measure (all six, in this order)
Example: acme/cle/bottling/line-2/filler/good_count
## Characters
Lower case a-z and digits 0-9 only.
Levels: words joined by hyphens (press-shop, line-2).
Measures: words joined by underscores (good_count).
Never: spaces, dots, + # or a leading $.
## Units
Physical measures end with the unit: temp_c, pressure_bar, flow_l_min, speed_bpm.
Counts and states have no unit.
## Vocabulary (add a word only by review)
state, down_reason, good_count, reject_count, speed_bpm, temp_c, pressure_bar
## Codes
Sites: cle = Cleveland. Areas: bottling, packaging, utilities.
Lines: line-1 ... line-9. Equipment: filler, capper, labeller, pasteuriser, palletiser.
## Aliases
Every legacy tag is recorded in the alias table with its standard name.Renaming the legacy tags
With the standard written, each existing tag gets its standard name. Nothing in the control system is renamed: the PLC keeps its addresses and the SCADA keeps its tags. The connector, or the template in your SCADA, maps each old name onto the new one, and the alias table records the pair [5].
- Export the tag list from the SCADA or historian as a spreadsheet (name, description, unit, address).
- Add a column for the standard name. Fill it level by level: site, area, line, equipment, then the measure from the vocabulary.
- Where no vocabulary word fits, write the proposed word in a separate column. These go to review, not straight into the standard.
- Where two tags turn out to be the same measure, keep one and mark the other as a duplicate.
- Save the finished list as the alias table: legacy name, standard name, unit, source system.
You need: A spreadsheet, your Session 2 intent statement, a list of 20 real tag names from one line (or the sample list in the steps)
Work on paper or in a spreadsheet. Nothing here touches the plant. If you cannot export real tags yet, use these: Filler_Cnt, FIL2_COUNT_GOOD, Past2Temp, TT101_PV, CAP_SPD, Line1Down, L1_DOWN_RSN, PAL_CNT, Oven Temp, OVN_TMP_F.
Outcome: A one-page naming standard and a 20-row alias table, every standard name following the six rules.
Knowledge check
OVN_TMP_F holds an oven temperature in degrees Fahrenheit. The standard says temperatures are in Celsius. What is the right standard entry?
Knowledge check
Why is the standard kept as a file in the repository rather than in a shared drive?
References
- OASIS: MQTT Version 5.0, section 4.7 Topic Names and Topic Filters. https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html
- The Unified Code for Units of Measure (UCUM). https://ucum.org/
- OMAC: PackML, the packaging machine language state model. https://www.omac.org/packml
- ISO: ISO 8601 Date and time format. https://www.iso.org/iso-8601-date-and-time-format.html
- Inductive Automation: Ignition user manual (tags, user-defined types and reference tags). https://www.docs.inductiveautomation.com/
F05 · Chapter 3 · Enforcement
Keeping every name true
A standard that relies on memory decays within a year. This chapter makes the machine enforce it: templates that stamp out correct names, a database that refuses bad ones, a CI check on every change, and an owner for every branch of the tree.
25 min4 layers of enforcement1 CI check≈ 30 minutes hands-on
By the end of this chapter you can
- Use templates and aliases so correct names are the default, not an effort.
- Make the database and CI refuse a name that breaks the standard.
- Run a simple governance loop for new words, new levels and renames.
Make the right name the easy name
People do not break naming standards on purpose. They break them at 2 a.m. during a changeover, when typing a new tag by hand is faster than looking up the rule. The answer is to make sure nobody types names by hand. In a SCADA such as Ignition, a user-defined type (UDT) is a template: define a Filler once with its members (state, good count, reject count, speed), and every filler you create from it has exactly those members with exactly those names [1]. A parameter maps each instance onto its controller's addresses, which is aliasing done by the template.
The same idea works without a SCADA. CESMII's Smart Manufacturing Profiles and the OPC UA information models are published, reusable definitions of a type of equipment and its attributes, so different vendors' machines can present the same structure [2] [3]. Whatever tool you use, the pattern is the same: one type, many instances, names generated from the type.
Make the database refuse a bad name
The platform's database is the last line of defence. Session 3's schema has a table for the measures the platform knows about. A CHECK constraint on that table makes PostgreSQL refuse any row whose path breaks the standard, whoever or whatever tries to insert it [4]. A constraint cannot be forgotten, and an AI agent that writes a bad name gets an error instead of silently creating an island.
-- Every measure path must follow the naming standard (docs/naming-standard.md).
alter table measures
add constraint measures_path_follows_standard check (
path ~ '^[a-z0-9]+(-[a-z0-9]+)*(/[a-z0-9]+(-[a-z0-9]+)*){4}/[a-z][a-z0-9]*(_[a-z0-9]+)*$'
);Read the pattern left to right: one level of lower-case words joined by hyphens, then exactly four more such levels after a slash, then a slash and a measure of lower-case words joined by underscores. It is exactly rules 1, 2, 3 and 6 of the standard. Rule 4 (vocabulary) is checked against the list in the next step, and rule 5 (units) by the vocabulary itself, because every word in the list already carries its unit.
Check every change in CI
The database catches names at the moment they are written. CI catches them earlier, in the pull request, before anything reaches the live platform. A short test reads the vocabulary from the standard, then checks every name in the seed data, the synthetic data generator from Session 4 and any configuration file. Branch protection (Session 1) means a failing check blocks the merge [5].
// test/names.test.mjs — every name in the seed data follows the standard.
import { readFileSync } from "node:fs";
import assert from "node:assert/strict";
const standard = readFileSync("docs/naming-standard.md", "utf8");
const vocabulary = standard.split("## Vocabulary")[1].split("\n")[1].split(",").map((w) => w.trim());
const PATH = /^[a-z0-9]+(-[a-z0-9]+)*(\/[a-z0-9]+(-[a-z0-9]+)*){4}\/[a-z][a-z0-9]*(_[a-z0-9]+)*$/;
const seed = JSON.parse(readFileSync("db/seed/measures.json", "utf8"));
for (const { path } of seed) {
assert.match(path, PATH, `${path}: breaks the naming standard`);
const measure = path.split("/").pop();
assert.ok(vocabulary.includes(measure), `${path}: "${measure}" is not in the vocabulary`);
}
console.log(`${seed.length} names follow the standard`);The file names above (db/seed/measures.json) are examples: your agent will use the paths in your own repository. What matters is that the test reads the standard itself, so the document and the check can never disagree.
Knowledge check
An AI agent adds 40 new measures in a pull request. One is named Filler_Speed. What stops it reaching the live platform?
An owner for every branch
A standard also needs people. Give each area of the tree an owner: the person who decides what a new measure in bottling is called, or whether packaging gets a new line code. Changes follow one loop, through a pull request, so every decision has a reviewer and a date.
Renames never break anything
Sooner or later a name will be wrong: a line is renumbered, an area is split. Never rename in place. Add the new name, record the old one as an alias, move consumers across, and only then retire the old name. Consumers keep working throughout, and the history is never orphaned.
| Change | How | Who approves |
|---|---|---|
| New measure word | Pull request adding it to the vocabulary | Area owner |
| New line or equipment code | Pull request adding the code; templates create the names | Area owner |
| New level or new rule | Pull request changing the standard; version number goes up | Plant engineering lead and IT |
| Rename | Add new name, alias the old, move consumers, retire the old | Area owner; announce to everyone who consumes it |
You need: Your platform repository, your AI coding agent (Claude Code or similar), GitHub
Do this on a branch of your own platform. Your agent writes the code; you check that it does what the standard says.
Outcome: The naming standard is in the repository, the database refuses bad paths, and CI blocks any pull request that adds a bad name.
Knowledge check
Line 2 is renumbered to line 5. What is the safe way to change its names?
References
- Inductive Automation: Ignition user manual (user-defined types). https://www.docs.inductiveautomation.com/
- CESMII: Smart Manufacturing Profiles (GitHub). https://github.com/cesmii/SMProfiles
- OPC Foundation: OPC Unified Architecture. https://opcfoundation.org/about/opc-technologies/opc-ua/
- PostgreSQL Documentation: Constraints (check constraints). https://www.postgresql.org/docs/current/ddl-constraints.html
- GitHub Docs: About protected branches. https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches
Chapter 4 · 12 questions · 80% passes
Final assessment
Twelve questions across the element. Score 80% (10 of 12) to pass. Your LMS records your score and each answer; you can review the chapters and try again.
15 min12 questions≈ 15 minutesRetake allowed
Your result
CivOps AI Academy
One Name for Everything: a Naming Standard for Every Machine, Line, Measure and Tag
Element F05 complete · Learner
Your LMS records this completion. For the CivOps Foundation certificate, finish the Foundation Course at https://civops.io/learn.