時(shí)間:2008-08-20 10:07:00來源:ronggang
圖3 機(jī)械手監(jiān)控軟件功能框圖[/align]
4.2 CAN總線數(shù)據(jù)通信
CAN總線是一種有效支持分布式控制及實(shí)時(shí)控制的多主串行總線,它具有短報(bào)文幀收發(fā)靈活、非破壞性基于優(yōu)先權(quán)的總線仲裁技術(shù)等多種優(yōu)越性能。在機(jī)械手控制系統(tǒng)中,CAN總線數(shù)據(jù)通信是通過與CANPCA適配卡一起提供Pcicandrv.LIB(CAN總線函數(shù)庫)中的相關(guān)函數(shù)調(diào)用實(shí)現(xiàn)的[5]。為了及時(shí)準(zhǔn)確地了解CAN總線狀態(tài),并盡可能減少故障和縮小故障范圍,在控制軟件中專門設(shè)計(jì)了測試程序,負(fù)責(zé)CAN總線接口及通信部分的調(diào)試、運(yùn)行任務(wù)。只有在測試正常的前提下,才能進(jìn)一步運(yùn)用CAN總線對機(jī)械手進(jìn)行控制。CAN總線數(shù)據(jù)有標(biāo)準(zhǔn)幀和擴(kuò)展幀之分,它們都是由信息和數(shù)據(jù)兩部分組成的,只是地址標(biāo)識符的位數(shù)不同。下面是CAN總線初始化及CAN標(biāo)準(zhǔn)幀數(shù)據(jù)收發(fā)的部分代碼。
//CAN總線初始化
void CWuLiao::InitCAN()
{
int retval;
retval =CAN_Open(); //打開PCI適配卡函數(shù)
if(retval!=1) AfxMessageBox("打開PCI卡失敗!");
ptrConfig = &Config;
ptrStruct = &Struct; //定義CAN數(shù)據(jù)幀結(jié)構(gòu)指針
ptrConfig->timer0=0x3f;
ptrConfig->timer1=0xff; //設(shè)置波特率為5K
ptrConfig->workMode=0; //使用11位的CAN節(jié)點(diǎn)地址
ptrStruct->card=0; //PCI適配卡卡號
ptrConfig->accCode=0; //CAN接收碼
ptrConfig->accMask=0xff; //CAN屏蔽碼
ptrConfig->control=1; //開放中斷
ptrConfig->filterMode=0; //CAN控制器采用單濾波方式
retval =CAN_Init(ptrStruct,ptrConfig); //調(diào)CAN初始化函數(shù)
if(retval!=1) AfxMessageBox("初始化失敗!");
}
//CAN數(shù)據(jù)發(fā)送
void CWuLiao::OutputCAN(unsigned int CanID,unsigned char H8B,unsigned char L8B)
?。?
int retval;
ptrPacket = &Packet;
ptrStruct = &Struct;
ptrStruct->card=0;
ptrPacket->length=4;//發(fā)送數(shù)據(jù)長度4個(gè)字節(jié)
ptrPacket->rtr=0;//表示發(fā)送的是數(shù)據(jù)幀,而非遠(yuǎn)程幀
ptrPacket->CAN_ID=CanID;//定義CAN節(jié)點(diǎn)地址
ptrPacket->data[0]=0x44;
ptrPacket->data[1]=0x4f;//CAN數(shù)據(jù)發(fā)送命令字
ptrPacket->data[2]=H8B;
ptrPacket->data[3]=L8B;//要發(fā)送的高、低字節(jié)
retval=CAN_Trans(ptrStruct,ptrPacket);//調(diào)發(fā)送數(shù)據(jù)幀函數(shù)
}
//CAN數(shù)據(jù)接收
void CWuLiao::InputCAN(unsigned int ID)
{
ptrPacket = &Packet;
ptrStruct = &Struct;
int Rece_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)
?。?
retval=CAN_Rece(ptrStruct,ptrPacket); //調(diào)接收數(shù)據(jù)幀函數(shù)
if(retval==1) //接收成功,則返回值為1
{
Rece_Length=ptrPacket->length; //取接收到的數(shù)據(jù)長度
for(n=0;n
{
Rece_Data[n]=ptrPacket->data[n]; //接收到的數(shù)據(jù)從ptrPacket的成員變量Data中讀取,Race.Data[8]已 設(shè)置為全局變量
?。?
?。?
?。?
?。?
4.3 多線程技術(shù)在機(jī)械手實(shí)時(shí)監(jiān)控中的應(yīng)用
機(jī)械手控制程序是在Windows98下開發(fā)的,除了具有豐富的用戶圖形操作界面,該控制程序還需完成實(shí)時(shí)數(shù)據(jù)采集和控制任務(wù)。然而Windows98并不是實(shí)時(shí)操作系統(tǒng),它是基于消息驅(qū)動(dòng)機(jī)制的搶先式多任務(wù)系統(tǒng),沒有提供足夠的實(shí)時(shí)處理功能。因此,在程序開發(fā)中,我們采用多線程技術(shù)來實(shí)現(xiàn)系統(tǒng)的實(shí)時(shí)功能。線程是多任務(wù)的基本單元,是操作系統(tǒng)用來調(diào)度執(zhí)行的最小單位[3]。一個(gè)進(jìn)程可以由多個(gè)線程組成,系統(tǒng)調(diào)度程序?qū)PU時(shí)間片劃分給各個(gè)線程,各個(gè)線程在各自的時(shí)間片內(nèi)使用CPU,從而實(shí)現(xiàn)了微觀上輪流執(zhí)行、宏觀上并發(fā)運(yùn)行的多任務(wù)效果。
為了避免機(jī)械手控制軟件前臺(tái)顯示界面因CAN總線數(shù)據(jù)采集和機(jī)械手控制指令的程序循環(huán)而導(dǎo)致響應(yīng)過慢或任務(wù)阻塞(Blocking)現(xiàn)象,增強(qiáng)應(yīng)用程序的快速響應(yīng)特性,我們將主要的數(shù)據(jù)采集和控制任務(wù):“機(jī)械手搬運(yùn)”及“物料分揀”定義成獨(dú)立的可以按并行方式執(zhí)行的工作線程,讓這個(gè)工作線程在后臺(tái)通過對CAN總線節(jié)點(diǎn)的讀寫完成數(shù)據(jù)輸入和控制參數(shù)輸出的任務(wù)。前臺(tái)顯示界面則通過PostMessage()函數(shù)與后臺(tái)數(shù)據(jù)采集及控制程序進(jìn)行通信,以共享數(shù)據(jù)單元的方式得到實(shí)時(shí)采集數(shù)據(jù)并加以顯示。在“機(jī)械手系統(tǒng)運(yùn)行”界面中設(shè)置了一個(gè)按鈕用于數(shù)據(jù)采集和控制線程的啟動(dòng)。以下給出部分“送料缸”運(yùn)行控制代碼:
//設(shè)置全局變量
int Rece_Data[8]; //CAN輸入數(shù)據(jù)數(shù)組
//以下是主線程
……
#define WM_THREADCAN WMUSER+10 //用戶消息定義
……
ON_MESSAGE(WM_THREADCAN,OnThreadCAN) //用宏將消息和處理函數(shù)聯(lián)系起來
……
LRESULT CWuLiao::OnThreadCAN(WPARAM wParam,LPARAM lParam)
?。?
CWuLiao::InputCAN(0x10); //讀2#CAN節(jié)點(diǎn)輸入狀態(tài)
if (Rece_Data[2]==0x7e) CWuLiao::OutputCAN(0x10,0x00,0x55); //滿足條件,則輸出控制送料缸運(yùn)動(dòng)
……
return 0;
}
void CWuLiao::OnWuLiaoThread()
?。?
InitCAN(); //CAN總線初始化
pThread=AfxBeginThread(CAN_IN,GetSafeHwnd(),THREAD_PRIORITY_NORMAL); //創(chuàng)建工作線程
?。?
//以下是CAN數(shù)據(jù)采集和控制子線程
UINT CAN_IN(LPVOID pParam)
?。?
HWND hWnd;
hWnd=(HWND)param;
do
?。?
PostMessage(hWnd,WM_THREADCAN,0,0);
Sleep(10);
}
while (Rece_Data[2]!=0xef); //停止按鈕按下則中止工作線程
return 0;
?。?
上述代碼中,由主線程建立并初始化子線程,而子線程負(fù)責(zé)讀取CAN節(jié)點(diǎn)的狀態(tài)數(shù)據(jù),并通過分析、計(jì)算給出相應(yīng)的控制信號,完成控制任務(wù)。子線程一旦被創(chuàng)建,它將獨(dú)立于創(chuàng)建它的主線程運(yùn)行。由于一個(gè)進(jìn)程中的所有線程都共享該進(jìn)程的虛擬地址空間,從而可以通過將主線程和子線程間需共享的數(shù)據(jù)聲明為全局變量的方法來訪問該進(jìn)程的所有全局變量。在機(jī)械手監(jiān)控程序中引入多線程機(jī)制,充分利用了Windows系統(tǒng)的多任務(wù)特點(diǎn),可以有效地克服CAN總線數(shù)據(jù)采集和控制過程中的停滯和反應(yīng)不及時(shí)現(xiàn)象,并能大大提高程序的運(yùn)行效率和可靠性。
4.4 機(jī)械手運(yùn)行過程的動(dòng)態(tài)顯示
工業(yè)監(jiān)控軟件中,現(xiàn)場采集來的數(shù)據(jù)都需要以某種方式表示在屏幕上。在機(jī)械手系統(tǒng)中,主要的控制對象是氣缸和步進(jìn)電機(jī),為了能直觀地反映出它們的運(yùn)行狀態(tài),必須將CAN總線采集到的各傳感器狀態(tài)以及運(yùn)動(dòng)部件的運(yùn)行情況以動(dòng)畫的形式表現(xiàn)出來。為此,我們采用了ActiveX控件開發(fā)及應(yīng)用技術(shù)。ActiveX控件是微軟公司提供的功能強(qiáng)大的程序設(shè)計(jì)和開發(fā)技術(shù),它是提高程序開放性和可重用性的重要手段。在機(jī)械手控制程序中,通過MFC ActiveX Control Wizard建立了一個(gè)名為jixieshou的ActiveX控制的應(yīng)用程序框架,并在其中生成了可動(dòng)態(tài)顯示的機(jī)械手裝置圖形控件。通過對該控件中諸如氣缸寬度、高度等屬性的設(shè)置來改變控件的形狀;通過氣缸活塞每移動(dòng)一步的延時(shí)和每移動(dòng)一步的距離來改變氣缸的運(yùn)動(dòng)速度;通過調(diào)用該控件的接口函數(shù)來顯示氣缸、步進(jìn)電機(jī)、傳感器等的運(yùn)動(dòng)和狀態(tài)。而上述行為的發(fā)生是由CAN總線數(shù)據(jù)采集和控制子線程向主線程傳遞相應(yīng)全局變量的值引發(fā)的,由此將圖形顯示與實(shí)物動(dòng)作緊密聯(lián)系。
5 結(jié)束語
利用CAN總線技術(shù),并采用面向?qū)ο蟮某绦蛟O(shè)計(jì)方法以及多線程技術(shù)、ActiveX技術(shù)等,可以使監(jiān)控軟件具有較強(qiáng)的通用性、可擴(kuò)展性和可靠性,同時(shí)進(jìn)一步提高了控制系統(tǒng)的開放性和實(shí)時(shí)性。通過在物料搬運(yùn)機(jī)械手控制中的應(yīng)用表明:該控制系統(tǒng)運(yùn)行可靠,能夠完全滿足設(shè)計(jì)要求。
參考文獻(xiàn):
[1] 周學(xué)才,李衛(wèi)平,李強(qiáng). 開放式機(jī)器人通用控制系統(tǒng),機(jī)器人. 1998,20(1).
[2] William E. Ford. What is an Open Architecture Robot Controller?1994 IEEE International Symposium on Intelligent Control ,16-18 August,1994.Columbus,Ohio,USA.
[3] 陽憲惠. 現(xiàn)場總線技術(shù)及其應(yīng)用. 清華大學(xué)出版社,1999.6.
[4] 胡哲源. 掌握Visual C++—MFC程序設(shè)計(jì)與剖析. 清華大學(xué)出版社,2001.7.
[5] 瑞隆德公司. PCI非智能卡使用說明書. 2002.
標(biāo)簽:
傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為傳動(dòng)網(wǎng)(m.y3602.cn)獨(dú)家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。
產(chǎn)品新聞
更多>勇梅機(jī)械液壓閘門給煤機(jī)的優(yōu)點(diǎn)
2025-10-22
2025-10-17
2025-10-11
「一體機(jī)性價(jià)比王者」NK290M普及型數(shù)控...
2025-10-09
2025-09-23
影視舞臺(tái)燈光低煙無鹵扁平電纜13*4+2*(2...
2025-09-23