4. OPC UA 信息模型:基础节点类型、对象类型、变量类型、方法类型,以及如何自定义信息模型
OPC UA 信息模型是工业物联网数据采集的语义基石。它通过标准化的节点类型和引用关系,将物理世界中的设备、传感器、执行器及其数据抽象为可互操作的地址空间。理解信息模型,是部署工业网关和进行数据清洗的前提。
4.1 信息模型的核心:节点与引用
OPC UA 地址空间由节点(Node)和引用(Reference)构成。每个节点代表一个实体(如一个温度传感器、一个电机、一个方法),引用则定义了节点之间的语义关系(如“包含”、“类型定义”、“输入参数”)。
| 概念 | 说明 | 示例 |
|---|---|---|
| 节点(Node) | 地址空间中的基本元素,拥有唯一标识符(NodeId)和属性。 | “温度传感器1”节点,包含“当前温度”变量。 |
| 引用(Reference) | 连接两个节点的有向边,携带引用类型语义。 | “温度传感器1”通过“HasComponent”引用指向“当前温度”。 |
| 节点类(NodeClass) | 定义节点的类型,如对象、变量、方法等。 | Object、Variable、Method、ObjectType、VariableType、DataType、ReferenceType。 |
关键理解: 信息模型不是数据库表,而是一个图结构。网关通过遍历这个图,就能发现所有可用的数据点和操作。
4.2 基础节点类型详解
OPC UA 定义了 8 种基础节点类,其中 Object(对象)、Variable(变量)、Method(方法) 是数据采集中最常打交道的三种实例节点。
4.2.1 对象类型(ObjectType)与对象(Object)
- 对象类型:定义了一类对象的蓝图,包括其包含的变量、方法和子对象。例如,“泵类型”定义了所有泵都应具有“转速”、“运行状态”变量和“启动”、“停止”方法。
- 对象:对象类型的实例,代表具体的物理或逻辑实体。例如,“1号冷却泵”是“泵类型”的一个实例。
4.2.2 变量类型(VariableType)与变量(Variable)
- 变量类型:定义变量的数据类型、语义和属性。例如,“模拟量类型”定义了变量具有“工程单位”、“量程上限”、“量程下限”等属性。
- 变量:变量类型的实例,用于存储实际的数据值。例如,“当前温度”变量,其值可能是 25.6°C。
4.2.3 方法类型(MethodType)与方法(Method)
- 方法类型:定义方法的输入/输出参数签名。例如,“复位报警方法类型”定义了输入参数“报警ID”和输出参数“执行结果”。
- 方法:方法类型的实例,代表一个可被客户端调用的远程过程调用(RPC)。例如,在“1号冷却泵”对象上调用“启动”方法。
数据采集视角: 网关通过读取 Variable 节点的 Value 属性获取实时数据;通过调用 Method 节点执行写操作或控制指令;通过遍历 Object 节点的子节点发现完整的设备数据层级。
4.3 信息模型结构图:对象、变量与方法的层级关系
下图展示了一个典型的工业设备(电机)在 OPC UA 地址空间中的信息模型结构,清晰呈现了对象、变量和方法之间的包含关系。
4.4 如何自定义信息模型
当标准信息模型(如 DI、PLCopen)无法满足特定设备或行业需求时,工程师需要自定义信息模型。以下是标准步骤:
- 定义类型层次结构:确定自定义对象类型(ObjectType)和变量类型(VariableType)的基类。通常从
BaseObjectType或BaseVariableType继承。 - 添加子节点:为自定义类型添加必需的变量、方法和子对象。例如,为“智能传感器类型”添加“校准日期”变量和“自检”方法。
- 设置数据类型和属性:为变量指定具体的数据类型(如 Float、Int32、String),并设置工程单位、描述等属性。
- 定义引用关系:使用标准引用类型(如 HasComponent、HasProperty、HasInputArgument)或自定义引用类型,连接节点。
- 创建实例:基于自定义类型创建具体的对象实例,并填充实际数据。
实践注意: 自定义信息模型应尽量复用标准类型,避免过度设计。在工业网关部署时,过于复杂的自定义模型会增加地址空间解析的负担,影响数据采集性能。
4.5 自定义信息模型示例:智能振动传感器
以下是一个自定义信息模型的 XML 片段(Nodeset2 格式),定义了一个“智能振动传感器类型”(SmartVibrationSensorType),包含振动值、温度值两个变量和一个复位报警方法。
<!-- 自定义对象类型定义 -->
<UANode NodeId="ns=1;i=1001" BrowseName="1:SmartVibrationSensorType">
<DisplayName>SmartVibrationSensorType</DisplayName>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference> <!-- 继承自 BaseObjectType -->
</References>
</UANode>
<!-- 添加变量:振动值 -->
<UAVariable NodeId="ns=1;i=2001" BrowseName="1:VibrationValue"
ParentNodeId="ns=1;i=1001" DataType="i=10" ValueRank="-1">
<DisplayName>VibrationValue</DisplayName>
<References>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=1001</Reference>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference> <!-- AnalogItemType -->
</References>
<Value>
<uax:Float>0.0</uax:Float>
</Value>
</UAVariable>
<!-- 添加方法:复位报警 -->
<UAMethod NodeId="ns=1;i=3001" BrowseName="1:ResetAlarm"
ParentNodeId="ns=1;i=1001">
<DisplayName>ResetAlarm</DisplayName>
<References>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=1001</Reference>
<Reference ReferenceType="HasProperty">ns=1;i=3002</Reference>
</References>
</UAMethod>
<!-- 方法输入参数 -->
<UAVariable NodeId="ns=1;i=3002" BrowseName="InputArguments"
DataType="i=296" ValueRank="1">
<DisplayName>InputArguments</DisplayName>
<Value>
<uax:ArrayOfArgument>
<uax:Argument>
<uax:Name>AlarmCode</uax:Name>
<uax:DataType>i=12</uax:DataType> <!-- UInt32 -->
</uax:Argument>
</uax:ArrayOfArgument>
</Value>
</UAVariable>
4.6 自定义信息模型与标准模型的对比
| 对比维度 | 标准信息模型(如 DI、PLCopen) | 自定义信息模型 |
|---|---|---|
| 通用性 | 高,跨厂商、跨行业通用 | 低,针对特定设备或场景 |
| 开发成本 | 低,直接使用现成类型 | 高,需要设计类型层次和语义 |
| 互操作性 | 强,客户端无需额外适配 | 弱,客户端需加载自定义类型定义 |
| 数据语义 | 通用语义(如“温度”、“压力”) | 专有语义(如“主轴振动频率”、“油膜厚度”) |
| 适用场景 | 通用设备、标准控制系统 | 专有设备、高端传感器、特殊工艺 |
4.7 信息模型在数据清洗中的作用
在工业网关中,信息模型不仅是数据采集的导航图,更是数据清洗的语义依据:
- 数据质量标记:变量节点自带的
StatusCode属性,直接指示数据是否有效(Good/Uncertain/Bad),是清洗的第一道关卡。 - 工程单位转换:通过变量节点的
EngineeringUnits属性,网关可以自动进行单位换算(如 psi 转 bar)。 - 数据聚合规则:对象类型的层次结构,定义了哪些变量属于同一设备,便于进行设备级的数据聚合和清洗。
- 异常值过滤:变量类型中定义的
EURange(工程量程)属性,可作为异常值过滤的阈值依据。
实战建议: 在部署网关时,优先解析信息模型中的
DataType、EngineeringUnits 和 EURange 属性,将其作为数据清洗规则的元数据输入,可大幅提升清洗的自动化程度。