Designing a unified namespace that survives contact with the plant
Most UNS designs fail in month three, when the second site does not fit the model. Here is the hierarchy discipline that prevents it.

Every unified namespace project starts the same way: a whiteboard, an ISA-95 diagram, and a great deal of optimism. Most of them hit the same wall around month three, when the second site arrives and does not fit the model built for the first.
The failure is almost never technical. It is that the first model encoded one plant's organisational accidents as if they were universal truths.
Model the process, not the org chart
The most common mistake is building the hierarchy around who manages what. Departments get reorganised; the physical process does not. A filler is a filler whether it reports to Packaging or to Line Operations this quarter.
A hierarchy that holds up looks like this:
Enterprise / Site / Area / Line / Cell / Asset
Each level answers a question about where the material is, never a question about who is responsible. Responsibility belongs in metadata attached to the node, where it can change without a migration.
Type your assets before you instantiate them
If you have forty pumps and forty separate node definitions, you do not have a namespace — you have a spreadsheet with a tree view. Define a Pump type once, with its expected members:
| Member | Type | Unit | Required |
|---|---|---|---|
RunState | Boolean | — | Yes |
SuctionPressure | Float | bar | Yes |
DischargePressure | Float | bar | Yes |
MotorCurrent | Float | A | Yes |
SealTemperature | Float | °C | No |
Then instantiate it forty times and bind each instance to its source. When someone adds VibrationRMS to the type next year, forty assets gain it at once, and every screen bound to the type picks it up.
Make the optional members explicit
The table above has a Required column for a reason. Real plants are heterogeneous — sixteen of your forty pumps have a seal temperature probe and the rest do not. If the type pretends they all do, every screen shows twenty-four broken bindings and operators learn to ignore bad quality.
Declare optional members as optional. Screens can then hide the widget rather than display a stale value, and your alarm rationalisation does not have to special-case a quarter of the fleet.
Namespace paths are an API — version them
Once a path is published, something downstream depends on it. A warehouse job, a Grafana panel, a report, someone's Python notebook. Renaming Line3 to Line03 for tidiness is a breaking change to every one of them.
Treat the published surface of the namespace with the same care you would treat a REST API:
- Additive changes are free. Add members, add branches.
- Renames require an alias that resolves the old path for at least one release cycle.
- Deletions get announced, then deprecated, then removed.
What good looks like
You know the model is working when a new site can be onboarded by instantiating existing types rather than by designing a new tree — and when a data engineer who has never set foot in the plant can find the value they need without asking a controls engineer what DB1.DBW24 means.
That second test is the one that matters. The namespace is not for you. It is for everyone downstream of you.
- #OPC UA
- #Unified namespace


