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 等引用类型形成层次结构。
  • 可扩展性:用户可自定义节点和引用,将私有设备模型映射到地址空间中。
💡 关键理解:地址空间是“可发现的”。客户端无需硬编码变量 ID,只需浏览地址空间即可找到“温度传感器 A”的当前值。

2.2 节点(Node)与节点类

节点是地址空间的基本组成单元。每个节点都有一个唯一的 NodeId(由命名空间索引和标识符组成),并属于特定的 NodeClass(节点类)。OPC UA 定义了 8 种标准节点类,其中 5 种最为常用:

节点类(NodeClass) 用途 典型示例
Object 代表物理或逻辑实体 电机、控制器、PLC 程序块
Variable 存储可读/写的数值 温度值、转速、设备状态码
Method 代表可调用的函数 复位报警、启动电机、切换配方
ObjectType 定义对象的类型模板 “电机类型”、“传感器类型”
ReferenceType 定义节点间关系的语义 “包含”、“连接至”、“输入”
🎯 实战提示:在解析数据时,90% 的交互发生在 Variable 节点上。但若不了解其所属的 Object 节点,你可能会丢失上下文(例如:不知道这个温度值属于哪个电机)。

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 地址空间中核心概念之间的逻辑关系,帮助你建立整体认知。

OPC UA 地址空间核心概念关系图 地址空间(Address Space) 节点(Node) 对象(Object) 变量(Variable) 方法(Method) 事件(Event) 引用(Reference) Organizes HasComponent HasProperty 说明:节点通过引用连接形成图结构;对象包含变量和方法;事件由对象触发;引用类型定义了关系的语义。 客户端通过浏览地址空间(节点+引用)即可发现所有可用的数据和服务。

2.8 节点与引用的实际浏览示例

为了让你更直观地理解地址空间的浏览过程,下图展示了一个简化的 PLC 设备模型在 OPC UA 地址空间中的结构。客户端从根节点出发,沿着引用找到“设备”对象,再找到“温度传感器”变量。

地址空间浏览示例:PLC 设备模型 Root (i=84) Objects 文件夹 PLC_Device_01 温度传感器 电机控制器 报警管理器 历史数据存储 CurrentTemp Speed / Start()
🔍 解析要点:在边缘计算环境中,你通常需要先通过 Browse 服务获取地址空间结构,然后通过 Read 或 Subscribe 操作变量节点。理解节点间的引用关系,能帮助你编写更健壮的数据采集逻辑,避免因节点路径变化导致的解析失败。