激光加工機器人通信協(xié)議設計
4.1 下位機通信任務的實現(xiàn)
在實時多任務系統(tǒng)中,一項工作的完成往往需要通過多個任務(中斷)共同完成的。這需要各任務及中斷協(xié)調動作,相互配合,甚至進行通信。VRTXsa提供了郵箱(mailbox),隊列(queue)、事件標志(event flag)、信號量(semaphore)互斥體(mutexes) 5種通信機制。在下位機通信系統(tǒng)中,通信工作由串口2中斷、時鐘中斷、監(jiān)控任務、顯示任務、執(zhí)行任務等共同協(xié)調完成的。如圖2所示。
機器人收到上位機的指令后,串口2中斷發(fā)生,它的中斷服務程序啟動。它將設置中斷同步標志,觸發(fā)串口2任務程序。串口2任務將處理接收到的上位機數(shù)據(jù),將解釋指令放入命令隊列中,并設置相關標志。在一個時鐘周期內(16ms),所有任務執(zhí)行一遍,它們根據(jù)相關標志,完成相應的工作,如讀取命令隊列,執(zhí)行命令,給上位機返回應答。
串口2任務程序如下:
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ù)
刀處理各種指令,并設置各相關標志
process_ Comm (BYTE *Buff,BYTE *cPtr);
4.2 上位機通信控件的實現(xiàn)
為了便于用戶使用,把上位機的通信功能封裝到ActiveX控件中。選擇VC++6進行通信控件的開發(fā),串口操作使用API函數(shù)來實現(xiàn)??丶胁捎昧硕嗑€程技術。為監(jiān)控串口任務創(chuàng)建了一個工作線程,以免它堵塞主線程,提高了系統(tǒng)的響應性。通信控件采用了異步v0方式,以提高發(fā)送、接收和處理數(shù)據(jù)的效率。異步v0操作建立后會立即返回,即使操作還未完成。這樣把費時的v0操作放在后臺進行,線程就可以干別的事情,極大地提高了程序的運行效率。在串口通信中,有
幾種讀取串口數(shù)據(jù)的方式,其中事件驅動是最有效率的方式。在監(jiān)視串口的輔助線程中,當有數(shù)據(jù)到達時串口是,串口事件觸發(fā),控件開始讀取串口輸入緩沖區(qū)的數(shù)據(jù)。如果沒有數(shù)據(jù)到達,那么使用WaitForMultipleObjects 0'數(shù)堵塞監(jiān)測線程,把資源讓給其它線程。在使用線程堵塞技術之后,監(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ā)生。事件組包括:關閉線程事件、
刀讀事件、寫事件
Event=WaitForMultipleObjects(3, m- hEventArray, FALSE,
INFINITE);
switch (Event){//判斷是哪個事件發(fā)生
case 0:f//關閉事件
mJbThreadAlive= FALSE;
AfxEndThread(100);//關閉線程
break;)
case 1:f//字符到達,讀字符
bRead=TRUE;
bResult=TRUE;
GetCommMask(hcom, CommEvent);
if(CommEventEV_ RXCHAR)(
刀通知控件句柄讀取字符
::SendMessage(CommWnd,WM_ COMM_ READ,0,0);)
break;)
case 2:{//寫事件
//通知控件句柄寫串口
::SendMessage(CommWnd,WM_ COMM_ WRITE,0,0);)}}
刀主循環(huán)結束
return 0;}
5 結束語
我們根據(jù)激光加工機器人通信的特點,制定了相應的通信協(xié)議,同時采用了多種有效的編程方法,以達到安全、高效、實用的目的。經(jīng)過大量的測試以及I年多工業(yè)運用表明,該通信協(xié)議及通信系統(tǒng)取得了很好的效果,完全達到了工業(yè)機器人通信的要求。
評論