多功能电表使用经验

来源:互联网 发布:fs软件像ppt的软件 编辑:程序博客网 时间:2024/05/16 23:55

1.前言

两年之前使用过多功能电表,即具有RS485通信接口的智能电表。可通过具体的RS485指令访问电表,电表根据指令返回具体参数,例如总电量,上月总电量,上两月总电量等。在应用这种多功能电表时积累了一些经验,借博客总结整理一下!总的来说,多功能电表的使用有三个难点,第一,多功能电表的地址采用BCD编码,并符合小端模式,即发送地址域数据时低地址数据在前,高地址数据在后;第二,在多功能电表的数据域数据,发送时需加33H,接收时需减33H。第三,返回的数据域数据同样采用BCD编码模式和小端模式。

2.多功能电表的地址

提到通信便必须包含地址。多功能电表的地址为6个字节,采用BCD编码格式和小端格式。例如西安某公司的多功能电表,在电表的铭牌上标注了电表的地址为“620445941606”。首先,电表采用BCD编码,所谓BCD编码就是以两个数字为一组,这两个数字代表16进制数,例如BCD编码12,其16进制为12,其10进制为18。电表在数据域也采用BCD编码,真心觉得这非常多余。其次,该电表的地址从高地址向低地址排列为62-04-45-94-16-06。以上6字节数据全部为16进制描述,采用了类似MAC地址的描述方式(不过电表没学像)。但是电表在发送地址域数据时采用小端模式,即低地址数据先发送,那么发送顺序为06-16-94-45-04-62。总结,读多功能电表时需要以两个数字为单位倒过来读取,读取的数据为16字节数据。

再者,若多功能电表的地址不足6字节,可使用00补充。例如常州某公司的多功能电表,其铭牌地址为RS3430163。那么其地址域从低地址往高地址排列为63-01-43-03-00-00。

3.访问总电量指令

阅读相关的国家标准,查询多功能电表的总电量的标志编码为DI0 = 10H,DI1= 90H。在发送时需要加33H,所以变成了 43H和C3H,在发送时低地址数据要先发送,所以发送顺序为43H-C3H

4.总电量返回结果

总电量的返回结果也要遵循小端模式和BCD编码格式,返回的具体格式为XXXXXX.XX。例如多功能电表显示总电量为112233.44。那么接收的数据为44-33-22-11,4字节数据均为16进制描述,44H先被接收到,11H最后被接收到,请务必注意44-33-22-11均为减33H之后的结果,接收到的44H表示小数部分,即0.44。从44H转换为0.44,需要经过BCD编码到10进制编码转变并乘以0.01,例如接收到的44H为BCD码,变为10进制为4X10+4=44(BCD码和33H真的是多余的)。以此类推,可解析11-22-33。

5.实例

例如读取编号为RS3430163的多功能电表的总电能,可以发送以下字节数组(16进制表示)

68 63 01 43 03 00 00 68 01 02 43 C3 83 16

其中

68H 地址域起始字节

63H 地址域A0

01H 地址域A1

43H 地址域A2

03H 地址域A3

00H 地址域A4

00H 地址域A5

68H 数据域起始字节

01H 读数据指令

02H 数据域字节长度

43H 数据域D0 10H + 33H 正向总电能

C3H 数据域D1 90H + 33H 当前总电能

83H 和校验,从起始字节到该字节之前所有字节之和,256取模

16H结束字节

多功能电表返回结果

FE 68 63 01 43 03 00 00 68 81 06 43 C3 55 33 33 33 F5 16

68H 地址域起始字节

63H 地址域A0

01H 地址域A1

43H 地址域A2

03H 地址域A3

00H 地址域A4

00H 地址域A5

68H 数据域起始字节

81H 正常应答

06H 数据域长度

43H 数据域D0 10H + 33H 正向总电能

C3H 数据域D1 90H + 33H 当前总电能

55H 小数部分 0.22

33H 个位和十位 00

33H 百位和千位 00

33H 万位和十万位 00

F5H 校验和

16H结束字节

6.总结

个人认为,多功能电表通信协议设计的不太合理。关于地址设置,可参考以太网的MAC地址,例如00-08-0F-0C-48-21(Hex格式),并使用大端模式,高地址数据先发送。关于数据域设置,可取消发送时增加33H,返回时减少33H,多此一举吗。关于BCD编码,个人认为BCD编码不合适,不如干脆写成16进制数据。关于返回结果,例如返回总电量XXXXX.XX,可采用4字节长度的浮点数。


原创粉丝点击