3215|0

7228

帖子

195

TA的资源

五彩晶圆(高级)

楼主
 

[Hanker M4]第十篇简单的645规约 [复制链接]

本帖最后由 常见泽1 于 2015-5-27 22:36 编辑

1. 简单介绍
645规约的全称应该是中华人民共和国电力行业标准DL/T 645——1997多功能电能表通信规约。在经过多年的现场时间基础上,为了适应市场需求的发展,全国电工仪器仪表标委会于200010月组建《自动抄表系统》国家标准起草工作组,并开始起草《自动抄表系统》国家标准。
(由于本人能力有限,而且工作之余时间也有限,再加上645比较庞大,我只能做一些最最简单的部门仅仅作参考)
2.1字节格式
每字节含8位二进制码,传输时加上一个起始位(0)、一个偶校验位和一个停止位(1)共11位。其传输序列如图1。D0是字节的最低有效位,D7是字节的最高有效位。先传低位,后传高位。

2.2 帧格式
帧是传送信息的基本单元。帧格式如图2所示
  
说   明
  
代码
帧起始符
68H
  
  
地址域
A0
A1
A2
A3
A4
A5
帧起始符
68H
控制码
C
数据长度域
L
  
数据域
  
DATA
校验码
CS
结束符
16H
                         图2   帧格式
帧起始符68H:标识一帧信息的开始,其值为68H=01101000B。
地址域A0∽A5:地址域由6个字节构成,每字节2位BCD码。地址长度为12位十进制数,可以为表号、资产号、用户号、设备号等。具体使用可由用户自行决定。当使用的地址码长度不足6字节时,用十六进制AAH补足6字节。低地址位在先,高地址位在后。当地址为999999999999H时,为广播地址。
控制码C:控制码的格式如下所示。
  
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gifD7
  
D6
D5
D4
D3
D2
D1
D0
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.giffile:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image008.giffile:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image009.gif
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif               
       D7=0:由主站发出的命令帧
       D7=1:由从站发出的应答帧
       D6=0:从站正确应答
       D6=1:从站对异常信息的应答
       D5=0:无后续数据帧
       D5=1:有后续数据帧
       D4∽D0:请求及应答功能码
              
数据长度L:L为数据域的字节数。读数据时L≤200,写数据时L≤50,L=0 表示无数据域。
数据域DATA:数据域包括数据标识和数据、密码等,其结构随控制码的功能而改变。传输时发送方按字节进行加33H处理,接收方按字节进行减33H处理。
校验码CS:从帧起始符开始到校验码之前的所有各字节的模256的和, 即各字节二进制算术和,不计超过256的溢出值。
结束符号16H:标识一帧信息的结束,其值为16H=00010110B。
3传输
前导字节
     在发送帧信息之前,先发送1-4个字节FEH,以唤醒接收方。
传输次序
      所有数据项均先传送低位字节,后传送高位字节。
传输响应
      每次通信都是由主站按信息帧地址域选择的从站发出请求命令帧开始,被请求的从站根据命令帧中控制码的要求作出响应。
      收到命令帧后的响应延时Td:20ms≤Td≤500ms.
4数据标识
  数据分类
除测量值以外,本协议将计数值,最大需量发生时间,瞬时电压、电流、功率值等归为变量类,将日历、时间、用户设置值、费率装置的特征字、状态字、费率时段等归为参变量类。
数据标识结构及编码
费率装置中有各种不同类型、不同属性的数据。本规约采用四级树状结构的标识法来表示这些数据。用2个字节的4个字段分别标识数据的类型和属性,这2个字节为DI1和DI0,4个字段分别为DI1H、DI1L、DI0H、DI0L,其中DI0L为最低级标识字段,DI1H为最高级标识段。
      用DI1H标识数据的类型,其标识如下:

5应用层

    应用层包含的比较多,不可能一一介绍,这里我主要就做了一个读通信地址,网友可以参考645规约协议学习。
下面来简单介绍下几个小代码:
  1. #include "inc/hw_types.h"                   //定义常用的宏
  2. #include "inc/hw_memmap.h"                   //定义功能存储映射
  3. #include "Dat_Types.h"
  4. #include "scom.h"
  5. #include "Dl645_Globals.h"
  6. #include "driverlib/sysctl.h"                    //
  7. #include "driverlib/gpio.h"                      //
  8. #include "driverlib/sysctl.h"
  9. #include "driverlib/uart.h"
  10. #include "driverlib/pin_map.h"                   //
  11. #include "driverlib/fpu.h"                           //
  12. #include "inc/hw_ints.h"                          //定义中断分配数
  13. #include "driverlib/interrupt.h"          //
  14. #include "utils/ustdlib.h"
  15. #include "utils/uartstdio.h"

  16. u8        fnSum(u8 *Dat , u16 Len)
  17. {
  18.         u8         Sum;
  19.         u16 i;
  20.         
  21.         for(Sum = 0 , i = 0 ; i < Len ; i++)
  22.         {
  23.                 Sum += Dat[i];        
  24.         }        
  25.         return(Sum);
  26. }

  27. u8        fnDl645B_FrameCheck(sFrmDl645B_TypeDef *pCheck)
  28. {
  29.         if(pCheck->Head1 != 0x68) return(0);
  30.         if(pCheck->Head2 != 0x68) return(0);
  31.         
  32.         if(pCheck->AFN!=0x03 && pCheck->AFN!=0x08 && pCheck->AFN!=0x0d && pCheck->AFN!=0x0e && pCheck->AFN<0x10) return(0);        
  33.         if(pCheck->UDat.Dat[pCheck->Len - 4 + 0] != fnSum(&pCheck->Head1 , pCheck->Len + 10) ) return(0);                                
  34.         if(pCheck->UDat.Dat[pCheck->Len - 4 + 1] != 0x16) return(0);               
  35.         
  36.         return(1);
  37. }

  38. u8 *fnPt_Check(u8 *Src , u16 Len)  //帧格式检测
  39. {
  40.         u16 i;
  41.         u8         err;
  42.         
  43.         for(i = 0 ; i < Len ; i++ , Src++)
  44.         {
  45.                 err = fnDl645B_FrameCheck( (sFrmDl645B_TypeDef *) Src);                                // 07规约判断
  46.                 if(err == 1)
  47. //                {
  48.                         if(Len < (  (*(sFrmDl645B_TypeDef *)Src).Len + 12) )
  49.                         {
  50.                                 return(NULL);        
  51.                         }
  52.                         else
  53.                         {        
  54.                                 return(Src);
  55.                         }
  56.         //        }
  57.         }
  58.         
  59.         return(NULL);        
  60. }

  61. void fnScomPk_Exec()  //通讯包执行--
  62. {
  63.         u16                        Len = 0;
  64.         u8 j;
  65.            if(ComPack[0].EFlag == SCOMPK_EFLAG_RXFINISH)  
  66.         {
  67.                 Len = fnPt_Exec();
  68.                 if(Len)
  69.                 {
  70.                         ComPack[0].EFlag = SCOMPK_EFLAG_TXSTART;
  71.                 }        
  72.                 if(ComPack[0].EFlag == SCOMPK_EFLAG_TXSTART)  //发送开启?
  73.                 {
  74.                          switch(TxFlag)
  75.                          {
  76.                                           case 0x13:        
  77.                                                                 for(j=0;j<22;j++)
  78.                                                                 {        
  79.                                                                         UARTCharPut(UART5_BASE, *(Txbuf+j));
  80.                                                                 }
  81.                                                         //        Rxlen=0;
  82.                                                 
  83.                                                                  break;                                
  84.                                         default: Len = 0 ; break;        
  85.                         
  86.                         
  87.                          }
  88.                

  89.                         ComPack[0].EFlag = SCOMPK_EFLAG_IDLE;
  90.                         RxLen=0x0;                        
  91.                 }        
  92.         }
  93. }


  94. u16 fnDl645B_Unpack13(sFrmDl645B_TypeDef *RxFrm)
  95. {
  96.         u8 i;
  97.         u16 Len;
  98.         sFrmDl645B_TypeDef *TxFrm;
  99.         TxFrm = (sFrmDl645B_TypeDef *)&ComPack[0].TxBuf[0x02];

  100.         for(i = 0 ; i < 6 ; i++)
  101.         {
  102.                 if(RxFrm->Addr[i] != 0xAA) return(0);
  103.         }
  104.                
  105.         if(RxFrm->Len != 0) return(0);
  106.         
  107.         
  108.         Len = 0x08;
  109.         return(Len);
  110. }

  111. u16 fnDl645B_RxAnalyse(sFrmDl645B_TypeDef *RxFrm)        
  112. {
  113.         u16 Len;
  114.         
  115.         switch(RxFrm->AFN)
  116.         {               
  117.                 case 0x13:        
  118.                                         Len = fnDl645B_Unpack13( RxFrm);
  119.                                          TxFlag=0x13;
  120.                                          break;                                
  121.                 default: Len = 0 ; break;                        
  122.         }
  123.         return(Len);
  124. }

  125. u16 fnDl645B_Exec(sFrmDl645B_TypeDef *RxFrm)
  126. {
  127.         u16 Len;
  128.         
  129.         Len = fnDl645B_RxAnalyse(RxFrm);
  130.         return(Len);        
  131. }

  132. u16 fnPt_Exec()  //协议执行
  133. {
  134.         u8         *sFrame;
  135.         u16        Len;
  136.         sFrame = fnPt_Check(&ComPack[0].RxBuf[0],RxLen );///处理接收到的数据
  137. //        if(sFrame != NULL)        
  138. //        {                        
  139.                         Len = fnDl645B_Exec((sFrmDl645B_TypeDef *)sFrame);        //07规约处理                                                                                       
  140. //        }
  141. //        else Len = 0;
  142.         return(Len);
  143.         //return(1);
  144. }
复制代码
而在读取通信地址处理的时候,由于时间有限,不能完全采用通用的处理,对应答坐了最简单的处理,直接把值付给了应答帧。

串口打印显示查看:


搜索
复制

搜索
复制

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表