跳到主要内容

引用 (References)

OPC UA 的节点不是孤立的, 节点之间通过 Reference 关联. 引用本身有类型 (ReferenceType), 客户端 Browse 时拿到的是"目标节点 + 引用类型 + 是否反向".

配套阅读
  • 节点 — 8 类 NodeClass
  • 服务 — Browse / Read / Write 等服务详解

引用方向

每个引用都是有方向的:

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 "信息模型驱动" 的强大之处.


相关链接