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 能传结构、历史、报警、方法调用。完全不是一个量级。
下面这张图,是我画的一个简化架构,你看一眼就明白了。
你看,应用层管“是什么”,协议层管“怎么传”,传输层管“走哪条路”。各层独立,换底层网络不影响上层模型。这就是工程上的好设计。
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 调用服务的基本流程:
你看,整个流程很清晰。先握手建立信任,再干活,最后说再见。跟人打交道一样,有礼貌、有流程。
2.5 小结一下
这一章我们聊了 OPC UA 的四个核心概念:
- 架构:三层解耦,各司其职
- 信息模型:把数据变成知识,让设备能互相理解
- 地址空间:信息模型在内存里的树状组织
- 服务集:Client 和 Server 之间的标准对话方式