1 機器人主控計算機
機器人控制器中最重要的是主控計算機。在激光加工機器人中,,主控計算機采用基于PC總線S 104/486DX工業(yè)控制級嵌入式單板計算機,,其核心是AMD 80486 DX微處理器。主控計算機提供串行接口,,可以和它進行串口通信,。主控計算機內(nèi)部的信息處理由機器人控制器操作系統(tǒng)來實現(xiàn),。整個系統(tǒng)采用了實時多任務(wù)操作系統(tǒng)VRTXsa來實現(xiàn),它具有很好的實時性和可靠性,,同時具有完善的任務(wù)管理機制,。
2 激光加工機器人通信系統(tǒng)結(jié)構(gòu)
機器人的運動指令來自通信系統(tǒng)。在我們的通信系統(tǒng)中,,主要包括上位機應(yīng)用程序,、串口控件、串口和機器人主控計算機(下稱下位機),。上位機應(yīng)用程序產(chǎn)生指令,,通過控件訪問串行端口,將指令傳給下位機,。下位機收到指令后,,對指令進行分析處理。對于下位機來說,,這些指令分兩種:一種是解釋執(zhí)行指令,,需要進入命令隊列,排隊執(zhí)行,,占用緩存;另一種是立即執(zhí)行指令,,不需要進入隊列,不占用緩存,。對于解釋執(zhí)行指令,,下位機收到后,把指令放入隊列后馬上返回應(yīng)答,。對于立即執(zhí)行指令,,先執(zhí)行該指令,然后才返回應(yīng)答,。查詢指令屬于立即執(zhí)行指令,,下位機除了返回命令在命令字外,還同時返回相應(yīng)的數(shù)值,。上位機根據(jù)返回的應(yīng)答判斷通信的狀態(tài),,并進行相應(yīng)的處理。
3 通信協(xié)議
我們的激光加工機器人通信系統(tǒng)具有以下特點:
1)機器人只會按指令進行工作,,如果指令有問題,,將會帶來不可預(yù)測的后果。所以對于我們的通信系統(tǒng)來說,,可靠性,、安全性是首要的。
2)機器人工作環(huán)境比較惡劣,,各種干擾比較大,。通信的抗干擾能力,、錯誤處理的能力非常重要。
3)為了提高加工效率,,希望機器人能以較快的速度進行工作,。
為避免機器人出現(xiàn)“空指令”,通信速度要跟得上,?;跈C器人通信系統(tǒng)自身的特點,上位機和它進行通信,,必須滿足其特定的要求,。我們采用如下的通信方式:
(1)主從方式。上位機為主機,,下位機為從機,。一般情況下,下位機不能主動給上位機發(fā)送信息,。只有上位機給下位機發(fā)出指令后,下位機才能作出應(yīng)答,。這樣通過上位機,,我們就可以很好地控制整個通信過程。
(2)數(shù)據(jù)幀方式,。采用數(shù)據(jù)幀的方式,,有利于保證數(shù)據(jù)包的完整性,便于進行數(shù)據(jù)接收和處理,。在我們的通信系統(tǒng)中,,上位機和下位機均采用相同的協(xié)議對通信數(shù)據(jù)進行打包、解包,。我們自己定義幀頭為eb 90 82,,幀尾為9082,幀標志為f0,。另外規(guī)定,,有效數(shù)據(jù)中若出現(xiàn)90,則雙寫90,,用以區(qū)別幀尾中的900數(shù)據(jù)幀格式如下所示:
{幀頭一幀標志一通信數(shù)據(jù)一幀尾一校驗字}
另外,,在我們的通信過程中,要處理各種不同類型的數(shù)據(jù),,包括char’ , short型,、float型、byte型等,,在有效數(shù)據(jù)前加入標識符來識別它們,。如f0 06表示6個浮點數(shù),,f3 05表示5個字符。
(3)校驗和,。這是一種簡單而實用的校驗方式,。在上位機發(fā)送指令前,自動計算數(shù)據(jù)的和,,并將它附在數(shù)據(jù)幀的末端,,一起發(fā)送給下位機。下位機在接收到數(shù)據(jù)幀后,,先解包,,然后再計算一次數(shù)據(jù)和,用它與數(shù)據(jù)幀末端的校驗和進行比較,。反之亦然,。使用這種方式可以檢驗數(shù)據(jù)在傳輸?shù)倪^程中是否發(fā)生了變異。
(4)自動重發(fā)機制,。下位機在接收到錯誤的數(shù)據(jù)幀時,,將會把該數(shù)據(jù)幀遺棄掉,同時向上位機返回錯誤碼報錯,。這時候,,該幀數(shù)據(jù)需要重新發(fā)送。如果把重發(fā)任務(wù)交給應(yīng)用程序,,程序?qū)⒆兊帽容^復雜,。我們把這個任務(wù)交給控件,可以很輕松的實現(xiàn)重發(fā)功能,。在控件內(nèi)部,,當新的數(shù)據(jù)發(fā)送之前,都將數(shù)據(jù)做一個備份,,直到確認接收正確了,,才將其消除。如果發(fā)現(xiàn)有錯誤,,將其再次發(fā)出去,。
(5)應(yīng)答方式。在通信過程,,下位機對上位機每一幀數(shù)據(jù)都必須做出的應(yīng)答,。上位機根據(jù)返回的應(yīng)答判斷通信狀態(tài),然后進行下一步動作,。為了安全起見,,規(guī)定只有在確認前一包指令正確應(yīng)答之后,才可以發(fā)下一包指令。對于非查詢指令(包括全部解釋執(zhí)行指令和部分立即執(zhí)行指令),,下位機收到后,,返回該指令的命令字;對于查詢指令,除了返回命令字之外,,同時還返回查詢數(shù)據(jù),,如機器人的位置、各軸轉(zhuǎn)角等,。如果下位機檢測到數(shù)據(jù)幀有問題,,如無幀頭、校驗和錯等,,則返回相應(yīng)的錯誤碼,。上位機在發(fā)送指令的時候,同時記錄下了該指令的命令字,。在接收到下位機返回的應(yīng)答后,,將其中的命令字與保留的命令字比較,如果一樣,,則說明發(fā)送正確,,可以發(fā)送下一條指令;反之,則說明指令發(fā)送有問題,,根據(jù)錯誤碼進行錯誤處理,,并重發(fā)當前指令包。指令的發(fā)送和應(yīng)答的接收過程如圖1所示,。
(6)成組指令發(fā)送方式。由于機器人的運行速度很快,,為了能保證指令發(fā)送速度能跟上運行速度,,因此在一個數(shù)據(jù)報里同時發(fā)送了多條指令,而下位機只需應(yīng)答第一條指令,。這樣就減少了應(yīng)答時間,,提高了指令的發(fā)送速度。實際應(yīng)用中,,我們采用7條指令一個數(shù)據(jù)報,,結(jié)果顯示,速度快了大約37,。為了安全和處理方便,,控件只允許解釋執(zhí)行指令成組發(fā)送,對于立即指令,,只能發(fā)送單指令數(shù)據(jù)報,。
4 通信的實現(xiàn)
4.1 下位機通信任務(wù)的實現(xiàn)
在實時多任務(wù)系統(tǒng)中,一項工作的完成往往需要通過多個任務(wù)(中斷)共同完成的,。這需要各任務(wù)及中斷協(xié)調(diào)動作,,相互配合,,甚至進行通信。VRTXsa提供了郵箱(mailbox),隊列(queue),、事件標志(event flag),、信號量(semaphore)互斥體(mutexes) 5種通信機制。在下位機通信系統(tǒng)中,,通信工作由串口2中斷,、時鐘中斷、監(jiān)控任務(wù),、顯示任務(wù),、執(zhí)行任務(wù)等共同協(xié)調(diào)完成的。如圖2所示,。
機器人收到上位機的指令后,,串口2中斷發(fā)生,它的中斷服務(wù)程序啟動,。它將設(shè)置中斷同步標志,,觸發(fā)串口2任務(wù)程序。串口2任務(wù)將處理接收到的上位機數(shù)據(jù),,將解釋指令放入命令隊列中,,并設(shè)置相關(guān)標志。在一個時鐘周期內(nèi)(16ms),,所有任務(wù)執(zhí)行一遍,,它們根據(jù)相關(guān)標志,完成相應(yīng)的工作,,如讀取命令隊列,,執(zhí)行命令,給上位機返回應(yīng)答,。
串口2任務(wù)程序如下:
void far com2_ task(void)
{刀初始化
刀裝載串口2中斷
sys_ load vrtx_ isr(Ox34,com- isr);
刀允許串口2中斷
n8259_ inerrupt enable(4);
while(true)
刀等待串口2中斷
ev_group=sc_ fpend(group_ id,0,4,0,&erro);
刀中斷到來,,清中斷同步標志
ev_group=sc_ fclear(gruop_ id,4,&err);
read_ CommData();//處理并讀取數(shù)據(jù)
刀處理各種指令,并設(shè)置各相關(guān)標志
process_ Comm (BYTE *Buff,BYTE *cPtr);
4.2 上位機通信控件的實現(xiàn)
為了便于用戶使用,,把上位機的通信功能封裝到ActiveX控件中,。選擇VC++6進行通信控件的開發(fā),串口操作使用API函數(shù)來實現(xiàn),??丶胁捎昧硕嗑€程技術(shù)。為監(jiān)控串口任務(wù)創(chuàng)建了一個工作線程,,以免它堵塞主線程,,提高了系統(tǒng)的響應(yīng)性。通信控件采用了異步v0方式,以提高發(fā)送,、接收和處理數(shù)據(jù)的效率,。異步v0操作建立后會立即返回,即使操作還未完成,。這樣把費時的v0操作放在后臺進行,,線程就可以干別的事情,極大地提高了程序的運行效率,。在串口通信中,,有
幾種讀取串口數(shù)據(jù)的方式,其中事件驅(qū)動是最有效率的方式,。在監(jiān)視串口的輔助線程中,,當有數(shù)據(jù)到達時串口是,串口事件觸發(fā),,控件開始讀取串口輸入緩沖區(qū)的數(shù)據(jù),。如果沒有數(shù)據(jù)到達,那么使用WaitForMultipleObjects 0’數(shù)堵塞監(jiān)測線程,,把資源讓給其它線程,。在使用線程堵塞技術(shù)之后,監(jiān)視串口線程占用的系統(tǒng)資源大大減少,,同時提高了指令的發(fā)送效率,。串口讀寫和監(jiān)控是通信的最主要部分,采用了異步v0操作,,使得程序復雜化,。異步v0操作分兩部分:一是創(chuàng)建該v0操作,然后返回;二是探測操作的完成,。下面是讀串口的部分程序清單:
void CCommCtrl::ReadChar(COMSTAT comstat)
{
while (comstat.cbInQue>0)f
C1earCommERROR(mJWomm,&dwError,&comstat);
if(!ReadFile(hcomm,&RXBuf,l,&dwRead,&m_ ov))
f //ReadFile返回FALSE,判斷是出錯還是沒完成
if(GetLastError()==ERROR IO_PENDING) f
//沒完成,,需要等待
if(!GetOverlappedResult(hComm,&m- ov,
&dwRead,TRUE)) //等待讀操作完成
{…}刀完成讀操作,但出錯
else //正確完成讀操作
{…}//處理接收的字符
else(…}/贖操作出錯
else //讀操作在函數(shù)返回前已經(jīng)完成
{…}刀處理接收的字符
}
return; //沒有字符了,,返回
}
寫串口程序和讀串口類似。監(jiān)視線程的部分代碼如下:
DINT CommWatch(LPVOID pParam)
{刀清緩存
PurgeComm(hcom,PURGE_ RXCLEAR I PURGE一XCLEAR I
PURGE_ RXABORTIPURGE一XABORT);
for(;;) f
bResult2=WaitCommEvent(hcom,&dwEvtMask,&m一 ov);
刀等待串口事件的發(fā)生
if(!bResult2)[//事件WaitCommEvent返回假
switch (dw=GetLastError(川
case ERROR-10-PENDING://異步I/O操作(WaitCommEvent)/
/進行中,,正常情況
{break;}
default:[ // I/O操作出現(xiàn)錯誤
ProcESSErrorMessage("WaitCommEvent()");
break;}}}
else{//事件WaitCommEven嶇回真,,操作完成
bResult2=C1earCommError(hcom,&dw, &commstat);
if (commstat.cbInQue==0)
continue;}
刀堵塞線程,等待事件組發(fā)生,。事件組包括:關(guān)閉線程事件,、
刀讀事件、寫事件
Event=WaitForMultipleObjects(3, m- hEventArray, FALSE,
INFINITE);
switch (Event){//判斷是哪個事件發(fā)生
case 0:f//關(guān)閉事件
mJbThreadAlive= FALSE;
AfxEndThread(100);//關(guān)閉線程
break;)
case 1:f//字符到達,,讀字符
bRead=TRUE;
bResult=TRUE;
GetCommMask(hcom, &CommEvent);
if(CommEvent&EV_ RXCHAR)(
刀通知控件句柄讀取字符
::SendMessage(CommWnd,WM_ COMM_ READ,0,0);)
break;)
case 2:{//寫事件
//通知控件句柄寫串口
::SendMessage(CommWnd,WM_ COMM_ WRITE,0,0);)}}
刀主循環(huán)結(jié)束
return 0;}
5 結(jié)束語
我們根據(jù)激光加工機器人通信的特點,,制定了相應(yīng)的通信協(xié)議,同時采用了多種有效的編程方法,以達到安全,、高效,、實用的目的。經(jīng)過大量的測試以及I年多工業(yè)運用表明,,該通信協(xié)議及通信系統(tǒng)取得了很好的效果,,完全達到了工業(yè)機器人通信的要求。