电表的698通信协议
原文连接:https://blog.csdn.net/ss86655/article/details/109997891。
原文连接:https://blog.csdn.net/ss86655/article/details/109997891
该协议规定了用电信息的数据交换过程,一般用于主站与电能表之间、终端与电能表之间的数据交换,主站与终端一般用不同的客户机地址来区分。
1、通信架构
有两种方向的数据交换。
- 是请求/响应类型的数据交换,主机请求从机,从机提供响应,涉及到读取、设置、操作、代理等服务。
- 通知/确认类型的数据交换,从机主动上报,主机回复确认,涉及到上报服务,在开发过程中,主机指客户机,包括主站(某上位机)或终端(集中器),从机指服务器,这里就是电表。
二:帧结构
(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…,这个对象里的对象来间接引用。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)