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.
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.