2. OPC UA基础架构
OPC UA 的架构设计兼顾了传统工业控制中的请求-响应模式与新兴物联网场景下的事件驱动模式。理解其两大通信模型和核心数据组织方式,是进行安全配置与高效数据采集的前提。
2.1 客户端/服务器(C/S)模型
这是 OPC UA 最经典的交互模式,适用于点对点、高可靠性的实时数据访问场景,如 PLC 与 SCADA 之间的周期性变量读取。
核心特征:客户端主动发起请求,服务器被动响应。连接由客户端建立,会话由客户端管理。
2.1.1 通信流程
- 发现端点:客户端通过 DiscoveryUrl 获取服务器支持的端点列表(协议、安全策略)。
- 创建通道:基于安全策略(如 Basic256Sha256)建立加密通信通道。
- 创建会话:客户端发送 CreateSessionRequest,服务器返回 SessionId 与认证令牌。
- 激活会话:客户端提供用户身份令牌(匿名、用户名/密码、证书)完成激活。
- 数据交互:执行 Read、Write、Browse、Subscribe 等服务调用。
- 关闭会话:客户端主动调用 CloseSession 或超时断开。
2.1.2 适用场景对比
| 特性 | 客户端/服务器模型 | 发布/订阅模型 |
|---|---|---|
| 通信方向 | 客户端→服务器(请求/响应) | 发布者→订阅者(单向推送) |
| 实时性 | 中等(受轮询周期限制) | 高(事件驱动,低延迟) |
| 连接数 | 点对点,连接数与客户端数成正比 | 一对多,发布者无需维护大量连接 |
| 典型应用 | HMI 读取 PLC 变量、配置工具写入参数 | 传感器数据上报、边缘节点向云端推送 |
| 网络穿透 | 需固定 IP/端口,防火墙配置复杂 | 支持 Broker 中转,NAT 穿透友好 |
实战建议:在车间内网进行 PLC 数据采集时,优先使用 C/S 模型;当需要跨网段、跨防火墙将数据发送到企业级平台时,应切换到发布/订阅模型。
2.2 发布/订阅(Pub/Sub)模型
Pub/Sub 模型是 OPC UA 规范第 14 部分定义的新一代通信模式,专为大规模分布式系统和物联网边缘计算设计。它解耦了数据生产者和消费者,支持 MQTT 和 AMQP 作为底层传输协议。
2.2.1 核心角色
- 发布者(Publisher):负责采集数据并按照配置的 DataSet 周期发布消息。
- 订阅者(Subscriber):接收并处理发布者发送的消息,无需知道发布者地址。
- 消息中间件(Broker):可选组件,用于消息路由、缓存和转发,典型实现如 Mosquitto、RabbitMQ。
2.2.2 工作模式
| 模式 | 描述 | 适用场景 |
|---|---|---|
| Broker 模式 | 发布者将消息发送到 Broker 的 Topic,订阅者从 Topic 拉取 | 跨网络、跨企业、云边协同 |
| 无 Broker 模式(UDP) | 发布者通过组播或单播直接发送 UDP 数据报 | 同一网段内的高频数据同步 |
安全注意:Pub/Sub 模型默认不提供端到端加密。在生产环境中,必须启用 OPC UA PubSub 安全机制(如使用 JWS 签名)或依赖底层 TLS 加密传输。
2.3 地址空间与节点概念
OPC UA 地址空间(AddressSpace)是服务器端所有可用数据的结构化组织方式。它采用全连接图(Fully Meshed Graph)模型,所有信息都以节点(Node)的形式存在,并通过引用(Reference)相互关联。
2.3.1 节点(Node)
节点是地址空间中的基本单元,每个节点都有一个唯一的 NodeId(由 NamespaceIndex + Identifier 组成)。节点分为以下核心类型:
| 节点类型 | 作用 | 示例 |
|---|---|---|
| 对象(Object) | 代表物理或逻辑实体 | PLC、电机、温度传感器 |
| 变量(Variable) | 存储数值或状态 | 当前温度值、电机转速 |
| 方法(Method) | 可调用的操作 | 启动电机、复位报警 |
| 对象类型(ObjectType) | 定义对象的模板 | MotorType、SensorType |
| 变量类型(VariableType) | 定义变量的数据类型与属性 | AnalogItemType、DiscreteItemType |
| 引用类型(ReferenceType) | 定义节点间的关系语义 | HasComponent、Organizes、HasProperty |
| 视图(View) | 地址空间的子集,用于简化浏览 | 设备视图、报警视图 |
2.3.2 引用(Reference)
引用是连接两个节点的有向边,它定义了节点之间的语义关系。常见的引用类型包括:
- Organizes:用于构建层次结构(如文件夹包含子对象)。
- HasComponent:表示整体与部件的关系(如电机包含温度传感器)。
- HasProperty:表示属性关系(如变量具有 EngineeringUnits 属性)。
- HasTypeDefinition:表示实例与类型的关系。
关键理解:地址空间不是树形结构,而是图结构。一个节点可以被多个父节点引用,从而支持多维度数据组织(如按设备位置、按功能类型同时浏览)。
2.3.3 地址空间浏览示例
以下代码展示了使用 OPC UA .NET 客户端浏览地址空间根节点下第一级子节点的基本操作:
// 连接到服务器并浏览根节点
var session = await client.ConnectAsync(endpointUrl);
// 获取 Objects 文件夹节点(NodeId=ObjectsFolder)
var objectsFolderId = ObjectIds.ObjectsFolder;
// 浏览子节点
var references = await session.BrowseAsync(
nodeId: objectsFolderId,
nodeClassMask: (uint)NodeClass.Object,
resultMask: (uint)BrowseResultMask.All
);
foreach (var ref in references)
{
Console.WriteLine($"DisplayName: {ref.DisplayName.Text}, NodeId: {ref.NodeId}");
}
2.4 模型选择与数据采集策略
在实际的工业物联网项目中,两种模型往往混合使用:
- 边缘层:使用 C/S 模型从 PLC、CNC 等控制器采集实时数据,保证低延迟和确定性。
- 平台层:使用 Pub/Sub 模型将边缘处理后的数据上报到云端或企业级平台,实现大规模数据汇聚。
架构建议:在边缘网关中同时实现 OPC UA 客户端(采集设备)和 OPC UA 发布者(上报平台),形成“采集-处理-转发”的完整链路。地址空间的设计应遵循 ISA-95 标准,将设备、生产线、工厂层级映射为对象节点,便于后续维护和扩展。