OPC UA状态码与错误处理

错误处理

服务参数和服务处理中,错误处理都是重要的部分,因为不同厂商的分布式系统之间的通信,可能在不同层次和不同情况发生错误。错误可能是普通的操作,例如一个客户端使用错误的参数(如不再可用的节点标识符)。错误也可能是通信错误,例如当客户端和服务器之间,或服务器和底层系统之间连接被中断。

在服务中使用两种类型的错误信息。一种类型是被称为状态码(StatusCode)的错误码。状态码是一个32位的无符号整型。髙16位用来探测特殊错误和条件,16位是标记位,包含附加的信息,但不影响状态码的意义。最髙两位用来指出错误信息的总体严重性,可能有三种值,Good表示成功,Uncertain表示警告Bad表示失败。状态码只能由OPCUA定义,而不能被供应商或其他组织扩展。

第二种类型的错误信息是诊断信息(Diagnosticlnformation)。这个结构包含了状态码的附加信息,包括供应商特定的错误码、错误的本地化描述,以及一个用来提供附加信息的文本字段。诊断信息可以被嵌套,以便提供一个错误栈。服务中的

每个状态码字段都有一个可用的诊断信息字段,但是这些附加信息只有当客户端请求时才会返回。本章的服务描述不包含诊断信息字段。

错误信息有两个层次。第一个层次是服务调用的结果,第二个层次是服务调用内部的操作列表。因为OPCUA中,所有用于数据交换的服务都支持批量操作,所以在服务调用中,可能有部分操作成功,而另一部分操作失败。以读取服务为.例,客户端在一个读取服务操作中读取一个关于变量的列表,读取的每个变量就是一个操作。

客户端必须总是校验这两个层次的结果,因为它们有可能都失败。在第一步中客户端必须校验服务调用是否成功。如果失败的话,结果字段都是无效的。如果服务成功的话,在使用结果之前,客户端必须对每个操作的状态码进行验证。

与传统OPC相比,在OPCUA中对错误处理做了简化。传统OPC提供了读取和数据交换的结果码和质量戳代码。客户端需要首先校验结果码,然后是质量戳代码,但是仅仅有一个字段可能包含错误信息OPCUA仅仅提供了一个状态码,这个字段包含了一般的错误码和质量戳。

状态码

状态码基于OPC UA的statuscode定义,遵循“OPC UA Part 4 specification”规范约束。可以把状态码按照字节来解析含义。如果10:11位值为 01,你可使用 0:4 位去获得历史状态码。

表 1. 状态码解析规则

字段

字节数位

说明

结果等级

30:31

定义状态码所代表的返回结果的严重性(风险)等级,即代表了一个成功、失败或不确认的结果,

00 成功可用,表示操作执行成功且其返回结果可用

01 不确认警告,表示操作部分成功执行,且其返回结果可能不可用于某些严格用途。

10 失败不可用,表示操作执行失败且其返回结果不可用

11 预留,生产中相当于"10 失败不可用"

预留

28:29

预留,写死为00

错误码

16:27

错误子码,由OPC UA Part 6规范定义

结构改变

15:15

表示自从上次Notification通知之后,服务端返回的数据结构发生改变,客户端必须再次读取元数据才能处理返回数据。

如果一个变量的数据编码DataTypeEncoding(Clause7.23)发生变化,服务端要把15:15位设置为1

变量的数据类型Attribute改变需要设置, BaseDataType改变不需要设置

变量的DataType的ArrayDimensions,ValueRank Attribute,EnumStrings Property改变需要设置

这是为了当客户端解析复杂数据时,警告客户端数据的结构改变了,解析可能会失败。

仅用于Notification或HistoryRead时的StatusCodes,其余情况下本位必须写死为0

语义变化

14:14

表示服务端返回变量的数据语义发生改变(etc. Part 8 DA Variable),客户端必须再次读取元数据才能处理返回数据。

如果一个变量的元数据发生变化,客户端必须再次读取元数据否则会出错时,服务端要把15:15位设置为1,如计量单位变化,会影响计算结果

仅用于Notification或HistoryRead时的StatusCodes,其余情况下本位必须写死为0

预留

12:13

预留他用,必须写死为0

信息类型

10:11

表明了信息位的的信息类型:

00 尚未使用,必须写死为0

01 数据的值.

1X 预留他用,必须写死为0

信息位

0:9

与状态码质量相关的附加信息,其结构由10:11信息类型定义.

当信息类型10:11设置为”01 数据值”时,信息位0:9的结构。

表 2. 信息位的数据值

信息类型

字节数位

说明

限制位 8:9

限制位和数据值是相关的,限制位的含义如下:

限制 数位 说明

00

数据值可自由改变

01

该数据源的值有最小值限制

10

该数据源的值有最大值限制

常量

11

数据值是个常量,不可改变

溢出位 7

如果本位设置为1,表示不是每个侦测的改变都被返回了,因为服务端的Monitoredftem缓存队列超过其容量了,数据溢出丢失。

预留 5:6

预留他用,必须写死为0

历史数据位 0:4 仅用于读取历史数据时,表明数据的来源和涉及客户使用数据值的相关信息。历史数据位含义如下:
含义 数位 说明

原始数据

XXX00

原始数据的值

算出值

XXX01

计算出来的数据值

插值

XXX10

以内插值替换的数据值

预留

XXX11

未定义

部分值

XX1XX

根据不完整数据计算出来的数据值

附加值

X1XXX

一个在同一个时间戳中摭掩了其他数据的原始数据值

多值

1XXXX

多个同时满足聚合规范的数据值(如在同一个时间间隔中出现的最小值)

(Part 11 详细说明了这些数位的用法)