电表的698通信协议

原文连接:https://blog.csdn.net/ss86655/article/details/109997891

该协议规定了用电信息的数据交换过程,一般用于主站与电能表之间、终端与电能表之间的数据交换,主站与终端一般用不同的客户机地址来区分。

1、通信架构

有两种方向的数据交换。

  1. 是请求/响应类型的数据交换,主机请求从机,从机提供响应,涉及到读取、设置、操作、代理等服务。
  2. 通知/确认类型的数据交换,从机主动上报,主机回复确认,涉及到上报服务,在开发过程中,主机指客户机,包括主站(某上位机)或终端(集中器),从机指服务器,这里就是电表。

二:帧结构

(1)698采用异步传输,不需要接收方和发送方时钟的同步,会有起始字符,结束字符。帧格式如图:

在这里插入图片描述

举例:

68 1f 00 43 05 08 00 00 00 00 00 10 b5 0b 06 01 04 40 00 02 00 1c 07 e0 09 0b 12 1e 00 00 05 69 16
①.起始的68:代表字符的起始码;
②.末尾的16:代表结束字符。
③1f 00:长度域,由2字节组成,取bit0-bit13,指除起始字符和结束字符之外的帧字节数。注意此处实际应为00 1f,因为我用到的上位机软件设计如此。这里指这一串数据有1f字节,即31字节。
④ 43:控制域,1字节,定义如下图,16进制的43转为二进制即:01000011。
在这里插入图片描述
4.1 bit7和bit6组合的意义如下图:
在这里插入图片描述
4.2 功能码定义如下图:
在这里插入图片描述
可看出来该帧是由客户机发起一个请求,功能码为应用连接管理及数据交换服务,实际上,这也是用得最多的一个功能码。

⑤ 05 08 00 00 00 00 00:服务器地址。服务器地址定义如下:
在这里插入图片描述
bit0-bit3:地址字节数,注意此处是加1表示字节长度

bit4-bit5:逻辑地址

bit6-bit7:0表示单地址,1表示通配地址,2表示组地址,3表示广播地址

此处05 08 00 00 00 00 00中,05表示单地址,地址长度为5+1,08 00 00 00 00 00表示真实地址00 00 00 00 00 08.

⑥ 10:客户机地址16.

⑦ b5 0b:帧头校验,是对帧头部分除起始字符和帧头检验本身之外的所有字节的校验

⑧.06 01 04 40 00 02 00 1c 07 e0 09 0b 12 1e 00 00:应用层数据。此处含义下面讲。

⑧05 69:帧校验,是对整帧除起始字符、结束字符和帧校验本身之外的所有字节的校验。

3、应用层:
(1)对于RS485、红外、载波等通信通道,当物理连接建立后,预连接的通道即存在,不需额外建立预连接。

(2)读取:698标准是面向对象的,一个对象对应一个唯一的标识,对象标识有两字节组成。下面以主机发出读取日期的请求,从机响应当前日期为例说明。

请求APDU:05 01 08 40 00 02 00 00

响应APDU:85 01 08 40 00 02 00 01 1C 07 E4 08 06 12 29 19 00 00

请求:

①05:表示读取

②01:表示读取一个对象属性

③08:服务优先级,响应帧里将此数据回复给主机

④40 00 02 00:OAD,表示对象标识,在698标准里40 00表示为日期时间的对象,02表示要读取它的属性参数,00表示特征、索引等,在正向有功等电能数据处就有用到。

⑤00:表示无时间标签。

响应:

①85:表示回复

②01:表示回复一个对象属性

③08:服务优先级

④40 00 02 00:表示日期时间属性值这个对象

⑤01:表示结果类型,1为数据,0表示出错

⑥1c 07 e4 08 06 12 29 19:1c表示时间数据的类型,后面那一串就是真正的日期数据,为2020-08-06 18:41:25,读者可自行换算一下。

⑦00:表示无跟随上报信息

⑧00:表示无时间标签

(3)设置:同样地以设置时间为例说明

请求:06 01 2E 40 00 02 00 1C 07 E4 08 06 12 2B 28 00

①06:表示设置

②01:表示设置一个对象属性

③2e:服务优先级,响应帧里将此数据回复给主机

④40 00 02 00:OAD,表示对象标识,表示为日期时间的对象,02表示要读取它的属性参数,00表示特征、索引。

⑤1C 07 E4 08 06 12 2B 28:1c表示时间数据的类型,表示设置时间为2020-08-06 18:41:25

⑥00:无时间标签

响应:86 01 2E 40 00 02 00 00 00 00

①86:表示回复设置

②01:表示回复一个对象属性

③2e:服务优先级

④40 00 02 00:表示日期时间属性值这个对象

⑤00:表示设置成功

⑥00:无跟随上报信息

⑦00:无时间标签

(4)操作:实际为执行对象标识的方法。以清除瞬时冻结关联属性表为例,进行说明

请求:07 01 07 50 00 08 00 00 00

①07: 表示操作

②01:表示一个对象

③07:服务优先级

④50 00 08 00:OMD,表示瞬时冻结的08方法,即清除关联属性。

⑤00 :表示使数据为空

⑥00:无时间标签

响应:87 01 07 50 00 08 00 00 00 00 00

①87: 表示操作回复

②01:表示一个对象

③07:服务优先级

④50 00 08 00:OMD,表示瞬时冻结的08方法,即清除关联属性。

⑤00 :表示操作成功

⑥00:数据为空

⑦00:无跟随上报

⑧00:无时间标签

实际上,以上的读取、设置、操作等方法都是举了简单的例子,但看懂了这些报文,其它都是在这个的基础上面扩展的,包括但不限于读取记录型数据、读取若干个属性、设置若干个属性、操作若干个方法后读取若干个方法等服务。

698的特殊之处

在我看来,698与一般的通信协议无异,建立在不同的物理层上,可以是485、红外、载波甚至是TCP/IP等通信通道。如以上所解释,其帧头虽有特定含义,无非是起始字符、长度域、控制域、地址域加帧头校验,帧尾则是简单的帧校验加结束字符,整个帧格式也并不难理解。只是698在应用层和连接机制里定义了自己的一套规则,这是一套不同于645的、基于面向对象建模方法的规则,我对645的了解不多,大概知道645的数据标识系统是基于直接引用的,而698的数据标识系统基于直接引用和间接引用。举个例子,数据标识0010表示正向有功电能,使用数据标识2021表示数据冻结时间,使用数据标识5002表示分钟冻结,其中分钟冻结是一个集合对象,里面包含了一些基本对象属性ABC…,也可以按需添加,当我要读当前正向有功电能的时候,我可以使用…05…0010…,这是直接引用,其中05表示读取;当我要读分钟冻结里某个数据冻结时间正向有功电能的时候,基于698,我可以使用…05…5002…2021…0010…,这个对象里的对象来间接引用。

在这里插入图片描述