3. OPC UA 信息模型:对象类型、变量类型、方法类型、数据类型与结构定义
OPC UA 信息模型是数据采集与仪表盘配置的基石。它通过一套标准化的类型系统,将现实世界中的设备、传感器、控制器抽象为服务器地址空间中的节点。理解对象类型、变量类型、方法类型以及数据类型与结构定义,是正确配置数据源、编写历史查询语句的前提。
核心认知: OPC UA 信息模型并非简单的“标签-值”映射,而是一种面向对象的、可继承的、带有语义的类型系统。仪表盘中的每一个数据点,背后都对应着地址空间中某个节点的实例化类型。
3.1 对象类型 (ObjectType)
对象类型是信息模型中最核心的容器,用于定义现实世界实体的结构。例如,一台“水泵”、一个“温度传感器”或一个“PLC 控制器”都可以建模为对象类型。
- 定义: 描述对象的属性、变量、方法以及与其他对象的关系。
- 继承: 支持多层继承。例如,
BaseObjectType是所有对象类型的基类,DeviceType继承自BaseObjectType,而PumpType又继承自DeviceType。 - 实例化: 在地址空间中,对象类型可以创建多个实例,每个实例拥有相同的结构但不同的数据值。
| 对象类型示例 | 父类型 | 典型子变量 | 典型方法 |
|---|---|---|---|
| BaseObjectType | — | 无 | 无 |
| FolderType | BaseObjectType | 无 | 无 |
| DeviceType | BaseObjectType | Manufacturer, SerialNumber | Reset, SelfTest |
| PumpType | DeviceType | Speed, Pressure, FlowRate | Start, Stop, SetSpeed |
实战要点: 在配置仪表盘时,通常需要遍历对象类型的实例。例如,要采集所有“水泵”的“转速”,应先定位到
PumpType 的所有实例,再读取其 Speed 变量。
3.2 变量类型 (VariableType)
变量类型定义了数据点的数据类型、语义和访问级别。与对象类型不同,变量类型通常用于描述具体的测量值或状态。
- 定义: 指定变量的数据类型(如 Float、Int32、String)、值域、工程单位以及读写属性。
- BaseDataVariableType: 最常用的变量类型,用于表示过程数据。
- PropertyType: 用于描述对象的属性,通常为静态或低频变化的数据。
- AnalogItemType: 专门用于模拟量,包含
EURange(量程)、EngineeringUnits(工程单位)等属性。
| 变量类型 | 基类 | 典型用途 | 关键属性 |
|---|---|---|---|
| BaseDataVariableType | BaseVariableType | 通用过程值 | DataType, ValueRank |
| PropertyType | BaseVariableType | 设备序列号、固件版本 | DataType, AccessLevel |
| AnalogItemType | BaseDataVariableType | 温度、压力、流量 | EURange, EngineeringUnits |
| DiscreteItemType | BaseDataVariableType | 开关状态、档位 | EnumValues, ValuePrecision |
常见误区: 不要混淆“变量类型”与“数据类型”。变量类型是语义层面的分类(如“模拟量”),而数据类型是存储层面的格式(如“Float”)。一个
AnalogItemType 的变量,其底层数据类型可以是 Float 或 Double。
3.3 方法类型 (MethodType)
方法类型定义了可以在服务器上执行的远程过程调用(RPC)。在仪表盘场景中,方法常用于触发设备动作或执行数据计算。
- 定义: 包含输入参数和输出参数的定义。
- 调用: 客户端通过
Call服务调用方法,传递输入参数并接收输出结果。 - 可执行性: 方法节点具有
Executable和UserExecutable属性,用于控制调用权限。
// 方法类型定义示例(伪代码)
MethodType: SetPoint
InputArguments:
- Name: "TargetValue"
DataType: Float
Description: "目标设定值"
OutputArguments:
- Name: "Result"
DataType: StatusCode
Description: "操作结果状态码"
3.4 数据类型与结构定义
数据类型是信息模型中最底层的构建块。OPC UA 不仅支持基础数据类型,还支持通过结构定义创建复杂数据类型。
3.4.1 基础数据类型
| 类型标识 | 描述 | 示例值 |
|---|---|---|
| Boolean | 布尔值 | true / false |
| SByte / Int16 / Int32 / Int64 | 有符号整数 | -128, 32767 |
| Byte / UInt16 / UInt32 / UInt64 | 无符号整数 | 0, 65535 |
| Float / Double | 浮点数 | 3.14, 2.71828 |
| String | UTF-8 字符串 | "Pump-01" |
| DateTime | 日期时间 | 2025-01-15T10:30:00Z |
| ByteString | 字节数组 | 0x1A2B3C |
| LocalizedText | 本地化文本 | {"en":"Temperature","zh":"温度"} |
| NodeId | 节点标识符 | ns=2;i=1001 |
| QualifiedName | 限定名称 | 2:Temperature |
3.4.2 结构定义 (Structured Type)
当基础数据类型无法满足复杂业务需求时,可以通过 StructureDefinition 定义复合数据类型。结构定义在历史数据查询中尤为重要,因为复杂数据点(如“振动频谱”、“GPS 坐标”)通常以结构体形式存储。
// 结构定义示例:振动数据
StructureDefinition: VibrationData
Fields:
- Name: "Frequency"
DataType: Float
Description: "频率 (Hz)"
- Name: "Amplitude"
DataType: Float
Description: "振幅 (mm/s)"
- Name: "Timestamp"
DataType: DateTime
Description: "采样时间戳"
- Name: "Axis"
DataType: LocalizedText
Description: "轴向 (X/Y/Z)"
历史查询技巧: 当查询包含结构体类型的历史数据时,需要使用
ReadRawModified 或 ReadProcessed 服务,并指定 Fields 参数来提取结构体中的特定字段。例如,只提取 VibrationData 中的 Amplitude 字段。
3.5 信息模型在仪表盘配置中的应用
理解上述类型系统后,仪表盘配置将变得有章可循。以下是基于信息模型的数据采集流程:
- 浏览地址空间: 使用
Browse服务遍历对象类型实例,定位目标设备。 - 识别变量节点: 根据变量类型(如
AnalogItemType)筛选出需要采集的数据点。 - 读取元数据: 获取变量的工程单位、量程、数据质量等属性,用于仪表盘刻度配置。
- 订阅数据变化: 使用
MonitoredItem订阅变量值变化,实现实时仪表盘更新。 - 历史数据查询: 对于需要趋势分析的变量,使用
HistoryRead服务读取历史数据。
实战案例: 某工厂需要配置一个“水泵群监控仪表盘”。通过浏览
PumpType 的所有实例,自动发现 12 台水泵。每台水泵的 Speed 变量(类型为 AnalogItemType)被订阅,量程 0-3000 RPM 自动映射到仪表盘刻度。同时,VibrationData 结构体中的 Amplitude 字段被配置为历史趋势图的数据源。
3.6 本章小结
OPC UA 信息模型通过对象类型、变量类型、方法类型和数据类型构建了一个层次分明、可扩展的语义空间。掌握这些概念,能够帮助你在仪表盘配置中实现:
- 自动化发现: 基于类型系统自动识别设备与数据点。
- 语义一致性: 工程单位、量程等元数据由模型统一管理。
- 高效查询: 历史数据查询可以精确到结构体中的特定字段。
- 可维护性: 当设备类型升级时,只需更新类型定义,所有实例自动继承。