Glossary · Modelling

Type hierarchy

In OPC UA, the type hierarchy is the tree of type nodes built from HasSubtype references. There are four of them, rooted at BaseObjectType, BaseVariableType, BaseDataType and References, plus the event tree under BaseEventType. Companion specifications extend these roots, which is how a Robotics node is still a DI node.

Four hierarchies, one mechanism

ObjectTypes descend from BaseObjectType at i=58, VariableTypes from BaseVariableType at i=62, DataTypes from BaseDataType at i=24 and ReferenceTypes from References at i=31. Event types are ObjectTypes and live under BaseEventType at i=2041, which is why an EventFilter select clause is written against a type in that subtree. All four are browsable at runtime under the TypesFolder at i=86, so a client can read an unknown server's entire type system without any prior file.

Layering is what companion specifications sell

The value of the hierarchy is that models stack. Robotics types derive from IA types, which derive from DI types, which derive from core UA types; Machinery item types sit on the same spine. A client that understands only DI can still read the identification nameplate of a Robotics instance, because that instance is a DeviceType by ancestry. Reading how far up a node's chain goes tells you exactly how much of it your client can interpret.

Ancestry, not equality

Almost every useful question is about ancestry: is this instance a MachineryItem, is this DataType a Structure or an Enumeration, is this reference hierarchical. None is answered by comparing one NodeId. Services take an IncludeSubtypes flag so the server can do the walk; where that is not available, browse HasSubtype inverse from the concrete type until you reach the type you care about. Cache the resulting map once per session - it does not change while you are connected unless the server loads a nodeset.

Abstract types mark the joints

IsAbstract types exist only to be subtyped and never have instances: BaseObjectType, Structure at i=22, Enumeration at i=29, HierarchicalReferences at i=33. They are the anchors your ancestry walk tests against, and a DataType attribute naming an abstract type is a server telling you the concrete type varies per value.

Example

The four type roots plus the event tree, as browsed under i=86

Types                              i=86
 +- ObjectTypes
 |   +- BaseObjectType             i=58   (abstract)
 |       +- FolderType
 |       +- BaseEventType          i=2041  -> the whole event/alarm tree
 |       +- BaseInterfaceType              -> interfaces (I...Type)
 |       +- TopologyElementType    (DI) -> DeviceType -> MachineryItemType -> ...
 +- VariableTypes
 |   +- BaseVariableType           i=62   (abstract)
 |       +- BaseDataVariableType   i=63
 |       +- PropertyType           i=68
 +- DataTypes
 |   +- BaseDataType               i=24   (abstract)
 |       +- Structure              i=22   (abstract)
 |       +- Enumeration            i=29   (abstract)
 +- ReferenceTypes
     +- References                 i=31   (abstract)
         +- HierarchicalReferences i=33   (abstract)
         +- NonHierarchicalReferences i=32 (abstract)
The mistake people make: Caching the type hierarchy at first connect and never refreshing it. A server that loads a nodeset at runtime, starts an aggregated downstream server, or adds a device can extend the hierarchy mid-session, and your ancestry map then rejects perfectly valid instances of a type it has never seen. Subscribe to GeneralModelChangeEvent, or re-read the hierarchy after any BadNodeIdUnknown on a type node.

Defined in: Part 3 - Address Space Model, type definitions and HasSubtype; Part 5 - Information Model for the standard type hierarchy.

Last verified 7 September 2026 against OPC UA 1.05.07. OPC UA Connect is an educational resource and is not affiliated with the OPC Foundation.

Free download
OPC UA Server Acceptance Test Pack
A 40-check acceptance test you run against a vendor's server before commissioning sign-off. Weighted scoring, three hard gates, and a one-page verdict for the supplier meeting.
Get the free test pack →
Free, no course, no login