首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 单片机栏
基于CAN总线的集散控制系统智能节点的设计
来源:本站整理  作者:佚名  2009-08-14 09:18:11



b.报文发送部分

  unsigned char can_send(MSG_STRUCT smsg)

  {

  unsigned char v;

  int i;

  v=*(unsigned char*)(BASE_CAN + 2);

  if( v &0x08) /*判断是否可以发送数据*/

  { v=smsg.id>>3; /*标识符送识别码寄存器*/

  *(unsigned char*)(BASE_CAN + 10) = v;

  v=*(unsigned char*)(BASE_CAN + 10);

  v=smsg.id & 7; /*识别码0-2位、RTR、DLC*/

  v<<=5;

  v+=smsg.dlen;

  *(unsigned char*)(BASE_CAN + 11) = v;

  for(i=0;i 

  { *(unsigned char*)(BASE_CAN + 12+i) = smsg.data[i]; }

  *(unsigned char*)(BASE_CAN + 1) = 0x01;

  return(1);

  }

  else

  { return(0);}

  }

  c.报文接收部分
  

  unsigned char can_receive()

  {

  MSG_STRUCT rmsg;

  int i;

  unsigned char buf1,buf2;

  while((*(unsigned char*)(BASE_CAN + 2)) & 0x01)/*判断是否有可接收信息*/

  {buf1 = *(unsigned char*)(BASE_CAN + 20); /*将一帧信息取出*/

  buf2 = *(unsigned char*)(BASE_CAN + 21);

  rmsg.dlen = buf2 & 0x0f; /*数据长度*/

  for(i=0; i< rmsg.dlen; i++) /*取出数据*/

  {rmsg.data[i]=*(unsigned char*)(BASE_CAN + 22 + i); }

  *(unsigned char*)(BASE_CAN + 1) = 0x04; /*释放接收缓冲器*/

  rmsg.rtr = (buf2 >> 4) & 0x01; /*远程帧*/

  rmsg.id = buf1; /*取出报文标识符*/

  rmsg.id <<= 3;

  rmsg.id |= (buf2 >> 5) & 0x06;

  switch (rmsg.id) /*按标识符转入不同的数据处理程序*/

  case ……

  {……

  ……}

  break;

  case ……

  }

  }

5. 结束语

  本文的创新点在于:将现场总线引入到集散控制系统中,克服了传统的串行通讯集散控制系统的实时性不强,通讯可靠性差的问题。所给出的CAN智能节点已应用于某发电厂的集散控制系统中,经过一年多的运行情况发现该设计方案具有较好的可靠性、实时性和灵活性。CAN智能节点不仅可以应用于集散控制系统,还可以用于其它分布式控制系统。

上一页  [1] [2] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:249,257.80000 毫秒