2. OPC UA 协议栈架构:四层模型详解
OPC UA 协议栈,说白了就是一套通信的“规矩”。它不像有些协议那样只有一层,而是分成了四个层次。我个人习惯把这四层想象成一栋楼:最底下是传输层,负责把数据搬来搬去;上面是安全层,给数据加把锁;再往上是通信层,定义怎么建立连接、怎么发请求;最顶层是应用层,也就是你真正要操作的数据本身。
这四层各司其职,又紧密配合。咱们一层一层拆开看。
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 | 嵌入式设备、资源受限场景 | 中高 |
2.2 安全层:数据怎么防
安全层是 OPC UA 区别于传统工业协议的核心。它解决了三个问题:你是谁(认证)、数据有没有被改过(完整性)、别人能不能看到数据(机密性)。
OPC UA 的安全模型基于 X.509 证书。每个设备都有一个证书,就像身份证。通信前先交换证书,验证身份,然后协商加密算法。
这里有个关键概念:安全策略(SecurityPolicy)。它定义了用什么算法加密、用什么算法签名。常见的策略有:
- None:不加密、不签名。仅用于测试,千万别上生产。
- Basic128Rsa15:128 位 AES 加密,RSA-15 签名。兼容性好,但强度一般。
- Basic256:256 位 AES 加密,SHA-256 签名。我建议新项目至少用这个。
- Basic256Sha256:目前推荐的安全策略,强度最高。
安全层还负责 证书生命周期管理。证书会过期,需要更新。很多设备厂商出厂时预置了自签名证书,但自签名证书无法被其他设备信任。我建议在项目中搭建一个 证书颁发机构(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):定义对象或变量的模板
举个例子。一台电机可以建模为一个 对象节点,它的转速是一个 变量节点,启动操作是一个 方法节点。这些节点通过引用关联起来。
应用层还定义了 信息模型(Information Model)。它是一套标准化的节点模板,比如 DI(Device Integration) 模型、PLCopen 模型。使用标准信息模型可以保证不同厂商的设备互操作。
| 节点类型 | 描述 | 示例 |
|---|---|---|
| Object | 代表实体对象 | 电机、泵、控制器 |
| Variable | 代表数值或状态 | 温度、压力、转速 |
| Method | 代表可调用的操作 | 启动、停止、复位 |
| View | 代表地址空间的子集 | 只读视图、维护视图 |
| DataType | 定义数据类型 | Int32、Float、String |
2.5 四层如何协同工作
这四层不是孤立的。我举个例子,你感受一下:
- 客户端想读取电机的转速。它先通过 传输层 建立 TCP 连接。
- 然后 安全层 验证证书、协商加密算法,建立安全通道。
- 接着 通信层 创建会话,发送 Read 请求。
- 最后 应用层 在地址空间中查找转速节点,返回数值。
整个过程对用户是透明的。你只需要调用一个 Read 方法,底层自动帮你完成四层协作。