工业互联网 OPC UA 信息建模:从 AddressSpace 到语义互操作

Jing Wang

2026-10-23 /

OPC UA 的核心突破在于用统一的 AddressSpace 替代了传统 OPC 的接口割裂。信息建模是整个架构的基石——没有正确的节点与引用关系,上层的订阅、读写、方法调用都无从谈起。

AddressSpace 的组织逻辑

AddressSpace 本质上是一个有向无环图(DAG),节点是图的顶点,引用是图的边。OPC UA 规范在 Part 3 中定义了八种核心节点类,其中实际工程建模最常用的是 Object、Variable、Method、DataType 和 ReferenceType。

节点之间通过 Reference 关联,每条引用由 SourceNodeId、TargetNodeId、ReferenceTypeId 三元组定义。HasComponent、HasProperty、Organizes 这三种引用类型构成了绝大多数层级关系。HasComponent 表达包含关系(电机包含轴承子对象),HasProperty 绑定属性(电机对象具备额定功率属性),Organizes 则用于文件夹式的逻辑分组。

+---------------------+
|   1:RootFolder      |
|   (FolderType)      |
+----------+----------+
           | Organizes
           v
+---------------------+
|   2:ObjectsFolder   |
|   (FolderType)      |
+----------+----------+
           | Organizes
           v
+---------------------+      HasComponent      +---------------------+
|   3:Motor_001       | ----------------------->|   4:Bearing_A       |
|   (MotorType)       |                        |   (BearingType)      |
+----------+----------+                        +----------+----------+
           | HasProperty                                  | HasProperty
           v                                              v
+---------------------+                            +---------------------+
| 5:RatedPower        |                            | 6:Temperature       |
| (Double, kW)        |                            | (Double, °C)        |
+---------------------+                            +---------------------+

图中展示了一个典型的电机对象树。Motor_001 作为 Object 节点,类型为自定义的 MotorType,通过 HasProperty 关联 RatedPower 这个 Variable 节点,通过 HasComponent 嵌入 Bearing_A 子对象。数据类型由 DataType 属性指向的 NodeId 决定——这里是内置的 BaseDataTypes 命名空间下的 Double。

AddressSpace 支持多命名空间隔离。工业服务器通常将标准定义放在 namespace 0,厂商扩展类型放在 namespace 2,运行时实例放在 namespace 3。这种划分避免了不同设备厂商的类型定义冲突,也为 Companion Spec 的扩展机制预留了空间。

Companion Spec 与标准映射

Companion Specification 是 OPC UA 生态最重要的扩展机制。它不修改核心规范,而是针对特定工业领域定义一组相互配合的类型定义和语义约定。截至 2025 年 8 月,OPC Foundation 已发布 40+ 份 Companion Spec,覆盖 ISA-95(企业控制系统集成)、IEC 61131-3(PLC 编程语言)、MTConnect(数控机床互联)、Euromap(塑料机械)等领域。

以 ISA-95 Companion 为例,它定义了 EquipmentClass、PhysicalAssetClass、MaterialClass 等对象类型,分别对应 ISA-95 的设备层级、物理资产层级和物料层级。每个实例化的设备对象必须提供 Identification(标识)、Location(位置)、OperationalState(运行状态)等标准属性,客户端可以统一解析而无需关心设备底层是 PLC 还是 CNC。

Companion Spec

适用领域

核心对象类型

数据映射规范

ISA-95

MES-设备集成

Equipment, Material, ProcessSegment

层级式对象树,状态枚举对齐

IEC 61131-3

PLC 变量暴露

POUVariable, FunctionBlock

直接映射变量名和注释

MTConnect

数控机床

Device, Component, DataItem

流式数据项 + 条件事件

OPC UA for Robotics

工业机器人

Robot, Joint, Tool

运动学模型 + 关节状态

Euromap 77

注塑机

InjectionMouldingMachine

工艺段状态 + 参数快照

Companion Spec 的落地并不强制——很多厂商只实现了核心对象的部分属性。客户端在连接时需要通过 Browse 服务遍历 AddressSpace,检查目标对象是否存在 Companion Spec 要求的标准属性,再决定如何消费数据。这种"尽力而为"的设计在工程上是务实的,但也给语义互操作带来了不确定性。

语义层:从 AddressSpace 到机器可读

AddressSpace 解决了数据结构统一的问题,但语义统一是另一回事。两个不同的电机对象,额定功率属性的名称可能是 "RatedPower"、"NominalPower" 或 "RatedCapacity",即使底层数据类型都是 Double,客户端也需要人工适配。

语义层的目标是让机器自动理解 AddressSpace 中节点的业务含义。有两条主流路径:

第一条是 UA 自身的 Annotation 机制。OPC UA Part 3 允许为节点添加 AdditionalAttributes 属性,其中可以嵌入 JSON Schema 片段。客户端在读取 Variable 节点时同时拉取对应的 JSON Schema,就能知道该值的物理量纲、取值范围和业务约束。

第二条是映射到 W3C 标准的语义网体系。即将 AddressSpace 中的 Object 和 Variable 映射为 OWL 本体中的类和属性,引用关系映射为对象属性。这样 AddressSpace 就成为了一个轻量级的工业领域本体库,可以被 SPARQL 查询引擎消费。已有开源项目 opcua-ontology 提供了从 UAModeler 导出模型自动转换为 OWL 的工具链。

两条路径各有取舍。Annotation 机制的优势是低侵入——不需要修改 AddressSpace 结构,只扩展属性内容;缺点是表达能力有限,无法描述复杂的推理规则。OWL 路径表达力强,但对客户端的语义网技术栈有依赖,当前工业现场的接受度不高。

建模团队在实践中通常采用 Annotation 为主、OWL 为辅的策略:在 Companion Spec 要求的属性层面用 JSON Schema 标注物理量纲和取值约束,在跨系统语义对齐场景下(比如 MES 与 WMS 的物料批次关联)再引入轻量 OWL 映射。

自定义类型扩展

没有哪个 Companion Spec 能覆盖所有场景,工业现场大量存在领域特有的数据结构。OPC UA 的 BaseDataType 层级体系允许从任意已存在的 DataType 派生出新类型。

派生有两种方式:Subtype 和 Structure。Subtype 针对简单类型,比如从 Double 派生出 PercentType,约束取值范围 [0, 100]。Structure 针对复合结构,类似于编程中的 Struct——例如振动采样数据需要同时传递时间戳、三个方向的加速度值和采样频率,用 Structure 定义如下:

<StructuredType DataType="ns=2;s=VibrationSample" BaseType="ns=0;i=22">
  <Field Name="Timestamp" DataType="ns=0;i=29" ValueRank="-1"/>
  <Field Name="AccX" DataType="ns=0;i=11" ValueRank="-1"/>
  <Field Name="AccY" DataType="ns=0;i=11" ValueRank="-1"/>
  <Field Name="AccZ" DataType="ns=0;i=11" ValueRank="-1"/>
  <Field Name="SampleRate" DataType="ns=0;i=11" ValueRank="-1"/>
</StructuredType>

ValueRank=-1 表示该字段是标量,如果是数组则设为 1 并增加 ArrayDimensions 属性。定义好的 Structure 需要注册到服务器的 DataType 字典中,客户端在首次连接时通过 DataTypeDictionary 服务拉取完整定义,之后就能直接反序列化收到的 Variant 值。

结构定义的版本管理容易被忽视。当 DataType 结构发生变更(增加或删除字段)时,服务器应递增 DataType 的 Version 属性,并在 ChangeReferenceType 中保留旧版本到新版本的迁移路径。否则依赖旧版结构的客户端在收到新数据时会出现反序列化错误。

建模工具链

UAModeler 是当前最主流的建模工具,由 Unified Automation 开发,提供可视化界面编辑节点树、定义 DataType 和 ObjectType。模型文件以 XML 格式存储(.xml 或 .csv 导出),支持导入导出 Companion Spec 标准模型。

但 UAModeler 有明显的局限:它是单点编辑工具,不支持多人协作,模型与服务器实现之间需要手动同步。对于大型项目——例如一个包含 2000+ 标签的水电站机组模型——建模团队通常采用 Git 管理 XML 源文件,用 CI 脚本自动校验模型完整性(所有 Variable 的 DataType 必须在字典中注册、Object 节点必须有 InstanceOf 引用指向 ObjectType)。

近年来一些团队开始用 Python 脚本化建模:通过 opcua SDK 在测试服务器上动态构建 AddressSpace,然后用 UAModeler 导出最终模型文件。这种方式适合有大量重复结构的场景——例如 20 台相同型号的电机,可以写循环批量生成实例节点。

结语

工业现场的设备种类和数据结构差异巨大,OPC UA 信息建模提供了一套统一的抽象框架。工业互联网的建设需要将跨厂商的语义对齐作为长期推进方向——Companion Spec 的普及率仍然偏低,自定义类型的版本兼容常常靠人工约定。AI 原生工业数据平台可以在 AddressSpace 之上自动识别语义、关联跨设备的上下文关系,为建模团队提供模型完整性校验和类型推断能力,降低大规模模型的维护成本。