首页 电表报文解析

电表报文解析

举报
开通vip

电表报文解析该通信规约适用于本地系统中多功能表的费率装置与手持单元(HHU)或其它数据终端设备进行点对点的或一主多从的数据交换方式,规定了它们之间的物理连接、通信链路及应用技术规范。该协议在做“电力监控”、“水监控”等“工控领域”,具有广泛的应用。协议具体内容可以从网上Google,下面主要介绍下协议的解析方法。 DL645协议需要先发送“前导字节”,用来唤醒从站,当然有些设备是不需要这样唤醒的。在发送帧信息之前,先发送1-4个字节FEH,以唤醒接收方("FEH",H表示16进制,是一个字节),  “前导字节”  +  “取...

电表报文解析
该通信规约适用于本地系统中多功能表的费率装置与手持单元(HHU)或其它数据终端设备进行点对点的或一主多从的数据交换方式,规定了它们之间的物理连接、通信链路及应用技术规范。该协议在做“电力监控”、“水监控”等“工控领域”,具有广泛的应用。协议具体内容可以从网上Google,下面主要介绍下协议的解析方法。 DL645协议需要先发送“前导字节”,用来唤醒从站,当然有些设备是不需要这样唤醒的。在发送帧信息之前,先发送1-4个字节FEH,以唤醒接收方("FEH",H表示16进制,是一个字节),  “前导字节”  +  “取数据报文”=“整体报文”。 首先我们先整体了解一个发送报文“68 12 34 56 78 90 12 68 01 02 43 C3 cs 16”  在这之前呢,先看一下BCD码。 BCD码:二进制编码的十进制代码。 比如: 0=0000 1=0001 2=0010 3=0011 4=0100 5=0101 6=0110 7=0111 8=1000 9=1001 BCD码:ASCII表示(都是字符) BCD码都是由0~9,10个字符构成。 也就是说,BCD码一个字节是两位,一位是0~9,一个字节能够表示00~99。 BCD码1位是2进制的4位。按16进制表示,没有ABCDEF。 帧格式(DL/T645-1997通讯规约标准文档中) 帧是传送信息的基本单元。帧格式如图所示。 说 明 代码 帧起始符 68H 地址域 A0 A1 A2 A3 A4 A5 帧起始符 68H 控制码 C 数据长度域 L 数据域 DATA 校验码 CS 结束符 16H     4.2.1 帧起始符68H:标识一帧信息的开始,其值为68H=01101000B。 4.2.2地址域A0∽A5:地址域由6个字节构成,每字节2位BCD码。地址长度为12位十进制数,可以为表号、资产号、用户号、设备号等。具体使用可由用户自行决定。当使用的地址码长度不足6字节时,用十六进制AAH补足6字节。低地址位在先,高地址位在后。当地址为999999999999H时,为广播地址。 4.2.3 控制码C:控制码的格式如下所示。 D7 D6 D5 D4 D3 D2 D1 D0                 功能码 后续帧标志 从站异常标志 传送方向 D7=0:由主站发出的命令帧 D7=1:由从站发出的应答帧 D6=0:从站正确应答 D6=1:从站对异常信息的应答 D5=0:无后续数据帧 D5=1:有后续数据帧 D4∽D0:请求及应答功能码 00000:保留 00001:读数据 00010:读后续数据 00011:重读数据 00100:写数据 01000:广播校时 01010:写设备地址 01100:更改通信速率 01111:修改密码 10000:最大需量清零 4.2.4 数据长度L:L为数据域的字节数。读数据时L≤200,写数据时L≤50,L=0 表示无数据域。 4.2.5 数据域DATA:数据域包括数据标识和数据、密码等,其结构随控制码的功能而改变。传输时发送方按字节进行加33H处理,接收方按字节进行减33H处理。 4.2.6 校验码CS:从帧起始符开始到校验码之前的所有各字节的模256的和,即各字节二进制算术和,不计超过256的溢出值。 4.2.7结束符号16H:标识一帧信息的结束,其值为16H=00010110B。 发送报文: 68 12 34 56 78 90 12 68 01 02 43 C3 cs 16 说明如下: 68(帧起始符) 12   34  56  78  90   12 (6字节,没字节两位,共12位地址,BCD码表示。)   68(帧起始符) 01(控制码“包含功能码”= 01 = 读取数据) 02 (数据域长度,指 “43,C3”一共是两字节。)  “43 c3” (“43 C3”是数据域,表示读取数据类型 = “10 90”,发送报文中数据域需要做“+0x33处理”) cs(加校验和,一个字节,根据前面的计算) 16(帧结束符) 下面详细的解释下: 帧起始符(645协议规定由68H开始,16进制。) 0x12(BCD数值码) --- 12(string)      转为字符串0x12.ToString("X2") 0x45(BCD数值码) --- 45(string) 如果表地址为:000021010203(电表上看到的地址串),里面就是12位(字符串来看) 通讯时,使用 0x00, 0x00 , 0x21 ,0x01 , 0x02 , 0x03, 6个字节表示地址,但发送的时候要先发低字节,再发高字节。发送时也是“0x03,0x02,0x01, 0x21,0x00,0x00” 控制码: 从电脑到表具:0(主从站方向)+0(设备没问题)+0(有无后续帧)+00001(读)=1=0x1 数据域长度:表示数据域有多长 串口传输方式:所有数据项均先传送低位字节,后传送高位字节 数据域内容,也就是“数据类型+数据项”(比如电表): 1001(电能量)+00(当前)+00(有功)+0001(正向电能)+0000(总点能) 02(数据域长度) 10 90(数据域内容,两个字节)拼接后的报文,要先发低字节(90),再发10. 发送报文要加上"33",最后数据域就是"10 + 33"和"90 + 33"最终就是“ 43     c3”。 02 10 90 == 02   (10 + 33)     (90 + 33) = 02   43    c3 返回报文: 68   12   34 56 78 90 12 68 81 06 43 c3 33 44 55 66 cs 16 68(帧起始符) 12 34 56 78 90 12(地址域) 68(帧起始符) 81(控制码,返回有功总电能“10000001”,读取数据) 06(数据域长度) 43 C3(数据域) 33  44  55  66 (数据项,四字节) 数据项要减去“33H”,根据数据类型(附录)点小数点。 33   44   55   66 (数据域数据计算) = (33 - 33) (44 - 33) (55 - 33) (66 - 33) = 00112233 = 1122.33   kWh 最后我们来看一个电表实例,取地址为“694561”的电表的“反相有功电能(发电量)”。 实例如下: 一、发送报文 1、电表地址:694561(地址,6位BCD码,BCD码1位是2进制的4位。按16进制表示,没有ABCDEF。不足12位,需要在高位“补0”。)。 2、完善地址:000000694561(12位BCD码) 3、前导符字节:0xFE 4、帧起始符:0x68 5、地址域:0x6(第字节在前,高字节在后。DL645协议,先发低字节再发高字节。) 6、帧起始符:0x68 7、控制码:0x01(读数据1,读后续数据2,其中还包含功能码等。) 8、数据域长度:0x02(2字节) 9、待发送数据类型(数据类型放在数据域中):9(1001,电能量)+0(0000,00当前,00有功)+ 2(0010,反向电能)+0(0000,总电能) 10、数据域+33H:0x90+0x33=0xC3 0x20+0x33=0x53 11、发送数据域:0x53 0xC3 12、校验码:CS(1个字节,比如计算出来的是“0x01”) 13、结束符:0x16 14、发送字符串:0xFE 0x68 0x61 45 69 00 00 00 0x68 0x01 0x02 0x53 0xC3 0x01 0x16 15、Byte[] bufferlist=new Byte[] {0xFE,0x68,0x61,0x45,0x69,0x00,0x00,0x00,0x68,0x01,0x02,0x53,0xC3,0x01,0x16 } DL645编码过程: 增加“前导符字节”(可以没有) 增加帧起始符 增加地址域 增加帧起始符 增加控制码 增加数据域长度 增加数据域 计算CS校验码,并增加 增加结束符 二、返回报文 1、帧起始符:0x68 2、地址域:0x6 3、帧起始符:0x68 4、控制码:传送方向(0—电脑到表具,1—表具到电脑),从站异常标志(0—表具无异常,1—表具有异常),后续帧标识(0—无后续数据,1—有后续数据) 功能码(读数据):00001 最后是10000001(读反相有功电能。从站向主站发送,第一位是“1”。主站向从站,第一位是“0”。),也就是“0x81” 5、数据域长度: 返回数据长度,根据请求的数据类型来定的。比如,电能量是“6个字节”,包含“2的数据类型”和“4字节的数据项”。 0x06 6、数据域 数据类型:0x53(低字节先返回) 0xC3(高字节后返回)  数据:0x33 0x78 0x34 0x66(先返回低字节,再返回高字节。电表是发送方。) 7、数据减去“33H” 0x33-0x33=0x00 0x78-0x33=0x45 0x34-0x33-0x01 0x66-0x33=0x33 8、按BCD码解析16进制数 single datas = single.parse(0x33.ToString("X2");+0x01.ToString("X2");+0x45.ToString("X2");+"."+0x00.ToString("X2");) 9、最后结果 datas=datas+" kWh"; 结果就是:330145.00 kWh  (电表总反相有功电能量,也就是“发电量”。耗电量是“正相有功电能量”)
本文档为【电表报文解析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_083599
暂无简介~
格式:doc
大小:36KB
软件:Word
页数:11
分类:互联网
上传时间:2019-04-06
浏览量:52