基于CAN总线的集散控制系统智能节点的设计

unsignedcharcan_send(MSG_STRUCTsmsg)
{
unsignedcharv;
inti;
v=*(unsignedchar*)(BASE_CAN+2);
if(v0x08)/*判断是否可以发送数据*/
{v=smsg.id>>3;/*标识符送识别码寄存器*/
*(unsignedchar*)(BASE_CAN+10)=v;
v=*(unsignedchar*)(BASE_CAN+10);
v=smsg.id7;/*识别码0-2位、RTR、DLC*/
v=5;
v+=smsg.dlen;
*(unsignedchar*)(BASE_CAN+11)=v;
for(i=0;i
{*(unsignedchar*)(BASE_CAN+12+i)=smsg.data[i];}
*(unsignedchar*)(BASE_CAN+1)=0x01;
return(1);
}
else
{return(0);}
}
c.报文接收部分

unsignedcharcan_receive()
{
MSG_STRUCTrmsg;
inti;
unsignedcharbuf1,buf2;
while((*(unsignedchar*)(BASE_CAN+2))0x01)/*判断是否有可接收信息*/
{buf1=*(unsignedchar*)(BASE_CAN+20);/*将一帧信息取出*/
buf2=*(unsignedchar*)(BASE_CAN+21);
rmsg.dlen=buf20x0f;/*数据长度*/
for(i=0;irmsg.dlen;i++)/*取出数据*/
{rmsg.data[i]=*(unsignedchar*)(BASE_CAN+22+i);}
*(unsignedchar*)(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智能节点不仅可以应用于集散控制系统,还可以用于其它分布式控制系统。
评论