2. OPC UA 基础概念:地址空间、节点、对象、变量、方法、事件、引用
OPC UA 的核心设计哲学是“统一信息建模”。它不再像传统 OPC(如 DA、HDA、A&E)那样仅传输原始数值或报警,而是将工业现场的所有实体——从物理设备、传感器、控制器到软件功能、报警规则、历史趋势——都抽象为节点(Node),并通过引用(Reference)连接成一张巨大的、可浏览的地址空间(Address Space)。理解这七个基础概念,是掌握 OPC UA 数据解析的基石。
2.1 地址空间(Address Space)
地址空间是 OPC UA 服务器的“信息宇宙”。它是一个分层的、面向对象的网络结构,客户端通过浏览地址空间即可发现服务器提供的所有数据和能力,无需预先约定通信接口。
- 本质:由节点和引用构成的图(Graph),而非简单的树形目录。
- 入口:根节点(Root Node),通常 ID 为
i=84。 - 组织方式:通过
Organizes、HasComponent、HasProperty等引用类型形成层次结构。 - 可扩展性:用户可自定义节点和引用,将私有设备模型映射到地址空间中。
2.2 节点(Node)与节点类
节点是地址空间的基本组成单元。每个节点都有一个唯一的 NodeId(由命名空间索引和标识符组成),并属于特定的 NodeClass(节点类)。OPC UA 定义了 8 种标准节点类,其中 5 种最为常用:
| 节点类(NodeClass) | 用途 | 典型示例 |
|---|---|---|
| Object | 代表物理或逻辑实体 | 电机、控制器、PLC 程序块 |
| Variable | 存储可读/写的数值 | 温度值、转速、设备状态码 |
| Method | 代表可调用的函数 | 复位报警、启动电机、切换配方 |
| ObjectType | 定义对象的类型模板 | “电机类型”、“传感器类型” |
| ReferenceType | 定义节点间关系的语义 | “包含”、“连接至”、“输入” |
2.3 对象(Object)与变量(Variable)
对象和变量是地址空间中最常见的节点,它们共同构成了设备的数据模型。
- 对象(Object):是“容器”或“实体”。它本身不存储数值,但可以包含变量、方法和其他对象。例如,一个“泵”对象可能包含“转速”变量、“启停”方法和“电机”子对象。
- 变量(Variable):是“数据载体”。它拥有 Value(当前值)、DataType(数据类型,如 Float、Int32、String)、AccessLevel(读写权限)等属性。
变量又分为两种:
- 属性(Property):描述对象的静态特征,如“序列号”、“量程上限”。通常用
HasProperty引用连接。 - 数据变量(DataVariable):代表动态过程值,如“当前温度”、“压力值”。通常用
HasComponent引用连接。
// 示例:浏览地址空间时,客户端看到的节点结构(伪代码)
Object: "Motor_01" (NodeId: ns=2;i=100)
├── Property: "SerialNumber" (Value: "SN-2024-001", DataType: String)
├── Property: "RatedPower" (Value: 7.5, DataType: Float)
├── Variable: "CurrentSpeed" (Value: 1450, DataType: Int32, AccessLevel: Read/Write)
├── Variable: "Temperature" (Value: 68.5, DataType: Float, AccessLevel: Read)
└── Method: "ResetAlarm" (InputArguments: [AckCode], OutputArguments: [Result])
2.4 方法(Method)
方法节点代表服务器端可被客户端远程调用的函数。与变量不同,方法调用是有状态的,通常用于触发动作或执行计算。
- 调用方式:客户端通过
Call服务请求,传入输入参数,服务器执行后返回输出参数。 - 属性:
Executable(是否可执行)、UserExecutable(当前用户是否有权限)。 - 典型场景:确认报警、切换操作模式、执行自诊断。
2.5 事件(Event)
事件是 OPC UA 实现主动通知的机制。当服务器内部发生特定情况(如报警触发、状态变化、数据越限)时,会生成一个事件对象,并通过订阅(Subscription)推送给客户端。
- 事件源:通常是 Object 节点。
- 事件类型:继承自
BaseEventType,常见子类型包括AlarmConditionType(报警)、DeviceFailureEventType(设备故障)。 - 关键属性:
Time(发生时间)、Severity(严重等级 1-1000)、Message(描述文本)、SourceNode(源节点)。
2.6 引用(Reference)
引用是连接节点的“有向边”,它定义了节点之间的语义关系。没有引用,地址空间只是一堆孤立的节点。
- 方向性:引用有源节点(Source)和目标节点(Target)。
- 类型:由
ReferenceType节点定义。标准引用类型包括:Organizes:用于组织层次结构(如文件夹包含对象)。HasComponent:表示整体-部分关系(如对象包含变量)。HasProperty:表示对象拥有属性。HasTypeDefinition:指向节点的类型定义。
- 反向引用:客户端可以请求反向浏览(从子节点找父节点)。
// 引用在地址空间中的表示(简化)
Node: "Motor_01" (Object)
--[HasComponent]--> Node: "CurrentSpeed" (Variable)
--[HasProperty]--> Node: "SerialNumber" (Variable)
--[HasTypeDefinition]--> Node: "MotorType" (ObjectType)
Node: "CurrentSpeed" (Variable)
--[HasProperty]--> Node: "EngineeringUnits" (Variable) // 单位属性
2.7 概念关系总览
下面这张 SVG 图展示了 OPC UA 地址空间中核心概念之间的逻辑关系,帮助你建立整体认知。
2.8 节点与引用的实际浏览示例
为了让你更直观地理解地址空间的浏览过程,下图展示了一个简化的 PLC 设备模型在 OPC UA 地址空间中的结构。客户端从根节点出发,沿着引用找到“设备”对象,再找到“温度传感器”变量。
Browse 服务获取地址空间结构,然后通过 Read 或 Subscribe 操作变量节点。理解节点间的引用关系,能帮助你编写更健壮的数据采集逻辑,避免因节点路径变化导致的解析失败。