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 位去获得历史状态码。
字段 |
字节数位 |
说明 |
结果等级 |
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的结构。
信息类型 |
字节数位 |
说明 |
||||||||||||||||||||||||
限制位 | 8:9 | 限制位和数据值是相关的,限制位的含义如下:
|
||||||||||||||||||||||||
溢出位 | 7 | 如果本位设置为1,表示不是每个侦测的改变都被返回了,因为服务端的Monitoredftem缓存队列超过其容量了,数据溢出丢失。 |
||||||||||||||||||||||||
预留 | 5:6 | 预留他用,必须写死为0 |
||||||||||||||||||||||||
历史数据位 | 0:4 | 仅用于读取历史数据时,表明数据的来源和涉及客户使用数据值的相关信息。历史数据位含义如下:
(Part 11 详细说明了这些数位的用法) |
||||||||||||||||||||||||