Glossary · Modelling

Instance declaration

In OPC UA, an instance declaration is a node that belongs to a type definition rather than to a running instance: a child of an ObjectType or VariableType, reached by a hierarchical reference and carrying a modelling rule. Instantiating the type copies these declarations, keeping their BrowseNames, into real instance nodes.

A type is built from real nodes

OPC UA has no separate schema language for types. An ObjectType's structure is expressed as actual Object, Variable and Method nodes hanging off the type node, and those nodes are the instance declarations. They have NodeIds, they can be browsed and read, and a client that browses the TypesFolder at i=86 sees a structure that looks exactly like an instance. The only reliable difference is the HasModellingRule reference, which declarations have and instances normally do not.

Declaration versus instance

A declaration describes; an instance holds data. The Temperature declaration on MixerType is a Variable node with a DataType and a modelling rule and, usually, a null or default value that never changes. The Temperature node under Mixer_01 is the one connected to the process. Subscribing to the declaration succeeds, costs a MonitoredItem, and reports nothing - which is a genuinely confusing failure because it produces no error at all.

The BrowseName path is the identity

A declaration is identified within its type by the browse path of BrowseNames from the type node, and the corresponding instance node has the same path from the instance root. That correspondence is what makes TranslateBrowsePathsToNodeIds work against a companion specification: the model fixes the path, the server chooses the NodeIds. It is also why renaming a BrowseName in a type is a breaking change even when the NodeId is untouched.

Methods declared on a type

Methods appear as instance declarations too, and this is where the distinction bites hardest. The method node on the ObjectType is the declaration and is generally not callable; the callable one is the node beneath the instance. A Call that names the type's method NodeId with an instance ObjectId, or the reverse, is answered with BadMethodInvalid rather than something that hints at the real problem.

Example

The same BrowseName path on the type and on the instance

Types/ObjectTypes/BaseObjectType
 +- MixerType                       ns=4;i=1001
     +- Temperature   Variable      ns=4;i=1002   HasModellingRule -> Mandatory
     |                              Value: null, never updates
     +- SetRecipe     Method        ns=4;i=1003   HasModellingRule -> Mandatory
                                    declaration only - not callable

Objects/Machines
 +- Mixer_01                        ns=6;s=Line3.Mixer_01   HasTypeDefinition -> ns=4;i=1001
     +- Temperature   Variable      ns=6;s=Line3.Mixer_01.Temperature
     |                              Value: 42.5, Good, live
     +- SetRecipe     Method        ns=6;s=Line3.Mixer_01.SetRecipe
                                    callable with ObjectId = ns=6;s=Line3.Mixer_01

Same browse path /4:Temperature from both roots. Different nodes.
A declaration has HasModellingRule; the instance node does not.
The mistake people make: Picking a node out of the TypesFolder in a browse client because its name matched, and wiring a subscription or a method call to it. The subscription reports the declaration's static default value forever with no error, and the method call returns BadMethodInvalid. Check for a HasModellingRule reference, or confirm the node is reachable from i=85 rather than i=86.

Defined in: Part 3 - Address Space Model, instance declarations, the InstanceDeclaration hierarchy and modelling rules.

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