2. OPC UA 协议基础:架构、信息模型、地址空间、服务集

好,咱们进入正题。OPC UA 这东西,说白了就是工业设备之间互相说话的“普通话”。你想想看,以前西门子跟罗克韦尔设备没法直接聊,得靠中间人转译。OPC UA 就是那个让它们能直接对话的协议。

我个人习惯,学任何协议先看它的骨架——架构。架构清楚了,后面那些细节就顺了。

2.1 OPC UA 架构:分层解耦的设计哲学

OPC UA 的架构,我把它分成三层:传输层、协议层和应用层。嗯,这里要注意,这不是官方分法,是我自己总结的,但特别好用。

核心要点:OPC UA 是 Client/Server 模式,但也支持 Pub/Sub(发布/订阅)。Server 负责暴露数据,Client 负责消费数据。Pub/Sub 适合海量设备场景,比如一个车间几百个传感器同时上报。

我在项目中遇到过,有人把 OPC UA 跟 OPC DA(老版)混为一谈。DA 只能传实时值,UA 能传结构、历史、报警、方法调用。完全不是一个量级。

下面这张图,是我画的一个简化架构,你看一眼就明白了。

OPC UA 分层架构图 OPC UA 分层架构(简化版) 应用层 信息模型 · 地址空间 · 服务接口 协议层 UA Binary · UA XML · UA TCP · HTTPS · 安全通道 传输层 TCP/IP · UDP(Pub/Sub) · 以太网 说明:Pub/Sub 模式可跳过 Server 层,直接通过 UDP 多播传输,适合高实时场景

你看,应用层管“是什么”,协议层管“怎么传”,传输层管“走哪条路”。各层独立,换底层网络不影响上层模型。这就是工程上的好设计。

2.2 信息模型:不只是数据,是知识

OPC UA 最牛的地方,我觉得就是它的信息模型。以前 OPC DA 传的只是一个数值,比如温度=25.3。但 OPC UA 传的是:这是一个温度传感器,型号 PT100,量程 -50~200℃,当前值 25.3℃,上次校准时间 2024-01-15。

你想想看,这差距有多大?

信息模型的核心元素有这几个:

  • 节点(Node):一切皆节点。变量、对象、方法、视图,都是节点。
  • 引用(Reference):节点之间的“关系线”。比如“这个温度传感器属于这个反应釜”。
  • 属性(Attribute):节点的特征。比如节点ID、名称、数据类型。
  • 类型(Type):节点的模板。比如“温度传感器类型”定义了所有温度传感器共有的属性。

我的经验:刚开始做信息模型时,别想着一次设计完美。我建议先画实体关系图,把设备、参数、报警、历史数据之间的关系理清楚。我曾经在一个项目中,客户说有 2000 个变量,结果建模后发现真正需要的是 300 个结构化的对象。建模省下来的工作量,够你喝半年咖啡。

信息模型还有一个好处——语义互操作性。什么意思?就是不同厂商的设备,只要遵循同一个配套规范(Companion Specification),就能互相理解。比如 PLC 和机器人,都遵循 PackML 规范,它们之间传数据就不用写一堆映射代码。

2.3 地址空间:信息模型的“文件系统”

地址空间,说白了就是信息模型在内存里的“文件系统”。Server 启动后,把所有节点组织成一个巨大的树状结构,Client 通过遍历这棵树来发现数据。

我习惯把地址空间想象成 Windows 的资源管理器:

  • 根节点(Root):相当于 C:\
  • 对象文件夹(Objects):相当于 Program Files
  • 类型文件夹(Types):相当于系统模板库
  • 视图(Views):相当于快捷方式或筛选后的视图

每个节点都有一个唯一的 NodeId,就像文件的绝对路径。Client 通过 NodeId 来读写数据。

避坑指南:我曾经遇到一个坑——地址空间设计得太大,导致 Client 启动时遍历地址空间花了 3 分钟。后来我们加了视图(View),只暴露 Client 关心的那部分节点。记住:地址空间不是越大越好,够用就行。

地址空间的节点类型,我列个表给你看:

节点类型 作用 类比
Object(对象) 代表物理或逻辑实体 一个电机、一个阀门
Variable(变量) 存储数值或状态 温度值、转速、开关状态
Method(方法) 可调用的操作 启动设备、复位报警
View(视图) 地址空间的子集 只显示关键参数的快捷方式
DataType(数据类型) 定义变量值的结构 结构体、枚举、数组
ReferenceType(引用类型) 定义节点间的关系 包含、连接、输入输出

2.4 服务集:Client 和 Server 的“对话协议”

服务集,就是 Client 和 Server 之间能做的那些操作。OPC UA 定义了 40 多种服务,分成了几个组。我挑最常用的给你讲。

2.4.1 发现服务集(Discovery)

Client 怎么知道哪里有 Server?通过发现服务。Client 可以调用 FindServers 或 GetEndpoints 来获取可用的 Server 列表和它们支持的安全策略。

2.4.2 安全通道服务集(SecureChannel)

建立加密通信通道。这一步做完,后面所有的数据都是加密传输的。嗯,这里要注意,安全通道是有生命周期的,超时要重新建立。

2.4.3 会话服务集(Session)

Client 登录到 Server,建立会话。会话里包含了用户的身份和权限。我建议每个 Client 只保持一个会话,别开太多,浪费资源。

2.4.4 节点管理服务集(NodeManagement)

这是最常用的。包括:

  • Read / Write:读写变量值
  • Browse:遍历地址空间
  • Subscribe:订阅数据变化,Server 主动推送
  • Call:调用方法

实战建议:能用订阅就别用轮询。我在一个项目中,Client 每 100ms 轮询 500 个变量,结果网络带宽占满,CPU 飙升。改成订阅后,只有变化时才推送,带宽降到原来的 5%。

2.4.5 查询服务集(Query)

类似 SQL 查询。你可以按条件筛选节点,比如“找出所有温度超过 100℃ 的传感器”。这个在大型系统中特别有用。

2.4.6 历史访问服务集(HistoricalAccess)

读取历史数据。Server 可以存储变量的历史值,Client 通过时间范围来查询。比如“查一下昨天 8:00 到 9:00 的温度曲线”。

下面这张图,展示了 Client 调用服务的基本流程:

OPC UA 服务调用流程 OPC UA 服务调用流程 OPC UA Client OPC UA Server 1. 发现服务(FindServers) 2. 建立安全通道(OpenSecureChannel) 3. 创建会话(CreateSession) 4. 浏览/读写/订阅(Browse/Read/Subscribe) 5. 关闭会话(CloseSession) 说明:步骤 1-3 是握手阶段,步骤 4 是数据交互阶段,步骤 5 是清理阶段

你看,整个流程很清晰。先握手建立信任,再干活,最后说再见。跟人打交道一样,有礼貌、有流程。

2.5 小结一下

这一章我们聊了 OPC UA 的四个核心概念:

  • 架构:三层解耦,各司其职
  • 信息模型:把数据变成知识,让设备能互相理解
  • 地址空间:信息模型在内存里的树状组织
  • 服务集:Client 和 Server 之间的标准对话方式