引用 (References)
OPC UA 的节点不是孤立的, 节点之间通过 Reference 关联. 引用本身有类型 (ReferenceType), 客户端 Browse 时拿到的是"目标节点 + 引用类型 + 是否反向".
引用方向
每个引用都是有方向的:
Source ─[ReferenceType]→ Target
例如 Folder1 ─HasComponent→ Tag1 表示 Folder1 拥有 Tag1.
每个引用都有反向引用 (Inverse), 比如 HasComponent 的反向是 ComponentOf, 通常 SDK Browse 时会自动列出双向.
引用类型继承树
OPC Foundation 标准引用类型按继承关系组织:
References (i=31)
├── HierarchicalReferences (i=33) ← 层次关系 (父-子)
│ ├── HasChild
│ │ ├── Aggregates
│ │ │ ├── HasComponent ← 拥有组件 (Object/Variable 子节点)
│ │ │ ├── HasProperty ← 拥有属性 (Variable 子节点)
│ │ │ └── HasOrderedComponent
│ │ └── HasSubtype ← 类型继承
│ ├── HasEventSource ← 事件源
│ └── Organizes ← 文件夹式组织
└── NonHierarchicalReferences (i=32)
├── HasTypeDefinition ← 实例 → 类型
├── HasModellingRule
├── HasEncoding ← Variable → 二进制编码 NodeId
├── HasDescription
└── ... (用户可自定义)
几个重点引用
HasComponent
最常见, 表示 "父节点拥有这个子节点" (子节点可以是 Object 或 Variable):
Boiler1 (Object)
├──HasComponent──> Temperature (Variable)
├──HasComponent──> Pressure (Variable)
└──HasComponent──> Start (Method)
Browse 一个 Object 默认列出 HasComponent / HasProperty 的所有目标, 这就是常说的 "子节点".
HasProperty
Property 是 Variable 的特化, 表示元数据 (静态/语义性质), 例如 EngineeringUnits, EURange, InputArguments. 与 HasComponent 区分仅是语义.
HasTypeDefinition
实例 → 类型, 客户端跟随这个引用能拿到节点的类型, 进而知道该实例预期有哪些子节点 / Attribute.
Organizes
文件夹式组织, 比如 Objects 通过 Organizes 拥有 Server, Boiler1, Boiler2.
Browse 时过滤引用类型
有时候我们只想看某种关系的目标:
// 默认 Browse: 所有 Hierarchical 引用 (forward)
var all = ua.Browse("ns=2;s=Boiler1");
// 只看 HasProperty 引用
var props = ua.Browse("ns=2;s=Boiler1", referenceTypeId: "i=46" /* HasProperty */);
当前 SDK 默认 Browse 走 HierarchicalReferences forward, 一般够用. 如需精细控制 ReferenceTypeId, 使用底层 BrowseDescription.
自定义 ReferenceType
服务端可以定义自己的 ReferenceType, 比如 "ConnectedTo" 表示两个设备的物理连接. 客户端按 NodeId 跟随就能找到拓扑信息. 这就是 OPC UA "信息模型驱动" 的强大之处.
相关链接
- 服务 — Browse / Read / Write 等服务详解
- 节点 — 8 类 NodeClass
- C# SDK Browse API