基于CAN總線的機械手控制系統(tǒng)
?。?/p>
voidCWuLiao::InputCAN(unsignedintID)
?。?/p>
ptrPacket=Packet;
ptrStruct=Struct;
intRece_Length,retval,n;
ptrStruct->card=0;
ptrPacket->length=2;
ptrPacket->rtr=0;
ptrPacket->CAN_ID=ID;
ptrPacket->data[0]=0x44;
ptrPacket->data[1]=0x49;//CAN數(shù)據(jù)接收命令字
retval=CAN_Trans(ptrStruct,ptrPacket);//調(diào)發(fā)送數(shù)據(jù)幀函數(shù),發(fā)出接收命令
if(retval==1)
?。?/p>
retval=CAN_Rece(ptrStruct,ptrPacket);//調(diào)接收數(shù)據(jù)幀函數(shù)
if(retval==1)//接收成功,則返回值為1
{
Rece_Length=ptrPacket->length;//取接收到的數(shù)據(jù)長度
for(n=0;n
?。?/p>
Rece_Data[n]=ptrPacket->data[n];//接收到的數(shù)據(jù)從ptrPacket的成員變量Data中讀取,Race.Data[8]已設(shè)置為全局變量
?。?/p>
}
?。?/p>
}
4.3多線程技術(shù)在機械手實時監(jiān)控中的應用
機械手控制程序是在Windows98下開發(fā)的,除了具有豐富的用戶圖形操作界面,該控制程序還需完成實時數(shù)據(jù)采集和控制任務。然而Windows98并不是實時操作系統(tǒng),它是基于消息驅(qū)動機制的搶先式多任務系統(tǒng),沒有提供足夠的實時處理功能。因此,在程序開發(fā)中,我們采用多線程技術(shù)來實現(xiàn)系統(tǒng)的實時功能。線程是多任務的基本單元,是操作系統(tǒng)用來調(diào)度執(zhí)行的最小單位。一個進程可以由多個線程組成,系統(tǒng)調(diào)度程序?qū)PU時間片劃分給各個線程,各個線程在各自的時間片內(nèi)使用CPU,從而實現(xiàn)了微觀上輪流執(zhí)行、宏觀上并發(fā)運行的多任務效果。
為了避免機械手控制軟件前臺顯示界面因CAN總線數(shù)據(jù)采集和機械手控制指令的程序循環(huán)而導致響應過慢或任務阻塞(Blocking)現(xiàn)象,增強應用程序的快速響應特性,我們將主要的數(shù)據(jù)采集和控制任務:“機械手搬運”及“物料分揀”定義成獨立的可以按并行方式執(zhí)行的工作線程,讓這個工作線程在后臺通過對CAN總線節(jié)點的讀寫完成數(shù)據(jù)輸入和控制參數(shù)輸出的任務。前臺顯示界面則通過PostMessage()函數(shù)與后臺數(shù)據(jù)采集及控制程序進行通信,以共享數(shù)據(jù)單元的方式得到實時采集數(shù)據(jù)并加以顯示。在“機械手系統(tǒng)運行”界面中設(shè)置了一個按鈕用于數(shù)據(jù)采集和控制線程的啟動。以下給出部分“送料缸”運行控制代碼:
//設(shè)置全局變量
intRece_Data[8];//CAN輸入數(shù)據(jù)數(shù)組
//以下是主線程
……
#defineWM_THREADCANWMUSER+10//用戶消息定義
……
ON_MESSAGE(WM_THREADCAN,OnThreadCAN)//用宏將消息和處理函數(shù)聯(lián)系起來
……
LRESULTCWuLiao::OnThreadCAN(WPARAMwParam,LPARAMlParam)
{
CWuLiao::InputCAN(0x10);//讀2#CAN節(jié)點輸入狀態(tài)
if(Rece_Data[2]==0x7e)CWuLiao::OutputCAN(0x10,0x00,0x55);//滿足條件,則輸出控制送料缸運動
……
return0;
?。?/p>
voidCWuLiao::OnWuLiaoThread()
{
InitCAN();//CAN總線初始化
pThread=AfxBeginThread(CAN_IN,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);//創(chuàng)建工作線程
?。?/p>
//以下是CAN數(shù)據(jù)采集和控制子線程
UINTCAN_IN(LPVOIDpParam)
?。?/p>
HWNDhWnd;
hWnd=(HWND)param;
do
?。?/p>
PostMessage(hWnd,WM_THREADCAN,0,0);
Sleep(10);
}
while(Rece_Data[2]!=0xef);//停止按鈕按下則中止工作線程
return0;
?。?/p>
上述代碼中,由主線程建立并初始化子線程,而子線程負責讀取CAN節(jié)點的狀態(tài)數(shù)據(jù),并通過分析、計算給出相應的控制信號,完成控制任務。子線程一旦被創(chuàng)建,它將獨立于創(chuàng)建它的主線程運行。由于一個進程中的所有線程都共享該進程的虛擬地址空間,從而可以通過將主線程和子線程間需共享的數(shù)據(jù)聲明為全局變量的方法來訪問該進程的所有全局變量。在機械手監(jiān)控程序中引入多線程機制,充分利用了Windows系統(tǒng)的多任務特點,可以有效地克服CAN總線數(shù)據(jù)采集和控制過程中的停滯和反應不及時現(xiàn)象,并能大大提高程序的運行效率和可靠性。
4.4機械手運行過程的動態(tài)顯示
工業(yè)監(jiān)控軟件中,現(xiàn)場采集來的數(shù)據(jù)都需要以某種方式表示在屏幕上。在機械手系統(tǒng)中,主要的控制對象是氣缸和步進電機,為了能直觀地反映出它們的運行狀態(tài),必須將CAN總線采集到的各傳感器狀態(tài)以及運動部件的運行情況以動畫的形式表現(xiàn)出來。為此,我們采用了ActiveX控件開發(fā)及應用技術(shù)。ActiveX控件是微軟公司提供的功能強大的程序設(shè)計和開發(fā)技術(shù),它是提高程序開放性和可重用性的重要手段。在機械手控制程序中,通過MFCActiveXControlWizard建立了一個名為jixieshou的ActiveX控制的應用程序框架,并在其中生成了可動態(tài)顯示的機械手裝置圖形控件。通過對該控件中諸如氣缸寬度、高度等屬性的設(shè)置來改變控件的形狀;通過氣缸活塞每移動一步的延時和每移動一步的距離來改變氣缸的運動速度;通過調(diào)用該控件的接口函數(shù)來顯示氣缸、步進電機、傳感器等的運動和狀態(tài)。而上述行為的發(fā)生是由CAN總線數(shù)據(jù)采集和控制子線程向主線程傳遞相應全局變量的值引發(fā)的,由此將圖形顯示與實物動作緊密聯(lián)系。
5結(jié)束語
利用CAN總線技術(shù),并采用面向?qū)ο蟮某绦蛟O(shè)計方法以及多線程技術(shù)、ActiveX技術(shù)等,可以使監(jiān)控軟件具有較強的通用性、可擴展性和可靠性,同時進一步提高了控制系統(tǒng)的開放性和實時性。通過在物料搬運機械手控制中的應用表明:該控制系統(tǒng)運行可靠,能夠完全滿足設(shè)計要求。
評論