基于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智能節點不僅可以應用于集散控制系統,還可以用于其它分布式控制系統。
評論