2. OPC UA 协议栈架构:四层模型详解

OPC UA 协议栈,说白了就是一套通信的“规矩”。它不像有些协议那样只有一层,而是分成了四个层次。我个人习惯把这四层想象成一栋楼:最底下是传输层,负责把数据搬来搬去;上面是安全层,给数据加把锁;再往上是通信层,定义怎么建立连接、怎么发请求;最顶层是应用层,也就是你真正要操作的数据本身。

这四层各司其职,又紧密配合。咱们一层一层拆开看。

核心观点: OPC UA 协议栈的四层架构,每一层解决一个核心问题——传输层解决“怎么传”,安全层解决“怎么防”,通信层解决“怎么聊”,应用层解决“数据长什么样”。
OPC UA 协议栈四层架构 应用层 地址空间 · 节点 · 对象 · 变量 · 方法 数据建模与信息模型 通信层 会话管理 · 服务调用 · 订阅 · 请求/响应 OPC UA 服务集(Read/Write/Browse/Subscribe 等) 安全层 加密 · 签名 · 认证 · 证书管理 WS-SecureConversation / UA-SecureConversation 传输层 TCP · UA-TCP 二进制 · HTTPS · OPC UA 二进制协议 数据编码:UA Binary · JSON · XML 每一层都依赖下一层提供的服务,上层对下层透明

2.1 传输层:数据怎么搬

传输层是协议栈的根基。它不关心数据是什么,只关心怎么把字节流从 A 点搬到 B 点。OPC UA 支持三种传输协议:UA-TCP 二进制、HTTPS 和 OPC UA 二进制协议。

UA-TCP 二进制 是最常用的。它基于 TCP,但加了一层自己的帧头。我记得刚开始做项目时,有个同事问:“直接用 TCP 不行吗?” 嗯,理论上可以,但 OPC UA 需要区分消息类型、序列号、安全令牌等额外信息。UA-TCP 就是给 TCP 套了个“马甲”,让通信更规范。

HTTPS 主要用于跨防火墙或 Web 场景。说白了就是把 OPC UA 消息包装成 HTTP 请求,走 443 端口。好处是 IT 部门不用开额外端口,坏处是性能比二进制差一些。

OPC UA 二进制协议 是 UA-TCP 的变种,用于一些特殊场景。我个人习惯在工业现场首选 UA-TCP 二进制,延迟低、效率高。

传输协议 端口 编码格式 适用场景 性能
UA-TCP 二进制 4840 UA Binary 工业现场、实时控制 高
HTTPS 443 JSON / XML 跨防火墙、Web 集成 中
OPC UA 二进制 自定义 UA Binary 嵌入式设备、资源受限场景 中高
实战建议: 如果你在车间做设备互联,优先用 UA-TCP 二进制 + UA Binary 编码。我在一个汽车焊装车间遇到过用 HTTPS 传实时数据的案例,延迟高了 30ms,被工艺工程师追着骂了三天。

2.2 安全层:数据怎么防

安全层是 OPC UA 区别于传统工业协议的核心。它解决了三个问题:你是谁(认证)、数据有没有被改过(完整性)、别人能不能看到数据(机密性)。

OPC UA 的安全模型基于 X.509 证书。每个设备都有一个证书,就像身份证。通信前先交换证书,验证身份,然后协商加密算法。

这里有个关键概念:安全策略(SecurityPolicy)。它定义了用什么算法加密、用什么算法签名。常见的策略有:

  • None:不加密、不签名。仅用于测试,千万别上生产。
  • Basic128Rsa15:128 位 AES 加密,RSA-15 签名。兼容性好,但强度一般。
  • Basic256:256 位 AES 加密,SHA-256 签名。我建议新项目至少用这个。
  • Basic256Sha256:目前推荐的安全策略,强度最高。
避坑指南: 我曾经在一个项目中看到客户把安全策略设为 None,理由是“内网没关系”。结果三个月后产线被勒索病毒攻击,所有 PLC 都被加密了。嗯,从那以后我坚持所有项目至少用 Basic256。

安全层还负责 证书生命周期管理。证书会过期,需要更新。很多设备厂商出厂时预置了自签名证书,但自签名证书无法被其他设备信任。我建议在项目中搭建一个 证书颁发机构(CA),统一签发和管理证书。

2.3 通信层:数据怎么聊

通信层定义了客户端和服务器之间怎么“对话”。它包含两个核心概念:会话(Session) 和 服务(Service)。

会话 是一个逻辑连接。客户端先创建会话,然后在这个会话里发请求。会话有超时时间,超时后自动断开。你想想看,如果每个请求都重新建立连接,效率得多低?会话就是解决了这个问题。

服务 是 OPC UA 定义的操作接口。常用的服务有:

  • Read:读取节点属性值
  • Write:写入节点属性值
  • Browse:浏览地址空间中的节点
  • Subscribe:订阅数据变化,服务器主动推送
  • Call:调用方法

通信层还定义了 请求/响应 的格式。每个请求都有一个 RequestHeader,包含会话 ID、时间戳、超时时间等。响应也有一个 ResponseHeader,包含状态码、诊断信息等。

关键点: 通信层是“无状态”的。每个请求都独立处理,服务器不保存客户端的状态。会话只是用来管理安全上下文和资源,不保存业务数据。

2.4 应用层:数据长什么样

应用层是离用户最近的一层。它定义了数据怎么组织、怎么描述。核心概念是 地址空间(AddressSpace) 和 节点(Node)。

地址空间 是一个树状结构,有点像文件系统。每个节点都有一个唯一的 节点 ID(NodeId),用来定位。节点之间通过 引用(Reference) 连接,形成网络。

节点 是地址空间的基本单元。每个节点都有属性,比如名称、描述、数据类型等。节点类型包括:

  • 对象(Object):代表一个实体,比如一台电机、一个传感器
  • 变量(Variable):代表一个数值,比如温度、压力
  • 方法(Method):代表一个可调用的操作,比如启动、停止
  • 类型(Type):定义对象或变量的模板

举个例子。一台电机可以建模为一个 对象节点,它的转速是一个 变量节点,启动操作是一个 方法节点。这些节点通过引用关联起来。

经验之谈: 我在做半导体设备项目时,客户要求把设备的每个传感器都建模成 OPC UA 节点。一开始我用了扁平结构,结果地址空间里几百个节点,浏览起来非常慢。后来改成树状结构,按设备层级组织,性能提升了好几倍。所以,地址空间的设计一定要提前规划好。

应用层还定义了 信息模型(Information Model)。它是一套标准化的节点模板,比如 DI(Device Integration) 模型、PLCopen 模型。使用标准信息模型可以保证不同厂商的设备互操作。

节点类型 描述 示例
Object 代表实体对象 电机、泵、控制器
Variable 代表数值或状态 温度、压力、转速
Method 代表可调用的操作 启动、停止、复位
View 代表地址空间的子集 只读视图、维护视图
DataType 定义数据类型 Int32、Float、String

2.5 四层如何协同工作

这四层不是孤立的。我举个例子,你感受一下:

  1. 客户端想读取电机的转速。它先通过 传输层 建立 TCP 连接。
  2. 然后 安全层 验证证书、协商加密算法,建立安全通道。
  3. 接着 通信层 创建会话,发送 Read 请求。
  4. 最后 应用层 在地址空间中查找转速节点,返回数值。

整个过程对用户是透明的。你只需要调用一个 Read 方法,底层自动帮你完成四层协作。

总结: 理解四层架构是 OPC UA 合规落地的第一步。传输层选对协议,安全层配好证书,通信层用好服务,应用层建好模型。每一层都做对,整个系统才能稳定运行。