基于USB接口的機(jī)器人上下位機(jī)通信
上層控制軟件運(yùn)行在Windows98平臺(tái)上,它為用戶(hù)提供與機(jī)器人交互的人機(jī)接口界面,完成復(fù)雜運(yùn)動(dòng)控制的數(shù)據(jù)處理和插補(bǔ)計(jì)算。它由人機(jī)界面、運(yùn)算插補(bǔ)、主控、通信四大模塊構(gòu)成。通信模塊能夠?qū)崟r(shí)地發(fā)送控制命令給下位機(jī)并從下位機(jī)獲得反饋信息,同時(shí)保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性。
為了提供對(duì)USB的支持(為了使底層控制系統(tǒng)有更好的實(shí)時(shí)性和更緊湊,下一步準(zhǔn)備將底層控制系統(tǒng)改用支持USB的Windows CE、VxWorks或嵌入式Linux),底層控制系統(tǒng)目前采用Windows98平臺(tái)。底層控制軟件接口收上層控制軟件的控制命令,同時(shí)解釋并執(zhí)行控制命令。這通過(guò)多線(xiàn)程實(shí)現(xiàn)。任務(wù)調(diào)度和管理模塊是底層控制軟件的主線(xiàn)程,它負(fù)責(zé)從指令隊(duì)列中取出指令并解釋執(zhí)行。主線(xiàn)程執(zhí)行過(guò)程會(huì)產(chǎn)生一個(gè)輔助線(xiàn)程——通信線(xiàn)程。通信線(xiàn)程調(diào)用通信模塊的輸出函數(shù),負(fù)責(zé)監(jiān)視USB端口。如果上位機(jī)傳來(lái)控制命令,則遵循教學(xué)機(jī)器人通信協(xié)議接收并存入指令隊(duì)列中。
3.2 通信模塊的實(shí)現(xiàn)
上位機(jī)和下位機(jī)控制軟件共用相同的PL-2301客戶(hù)驅(qū)動(dòng)程序、傳輸模塊(由Prolific公司提供)和通信模塊。
PL-2301客戶(hù)驅(qū)動(dòng)程序是典型的WDM驅(qū)動(dòng)程序。驅(qū)動(dòng)程序屏蔽了底層的硬件細(xì)節(jié)和USB協(xié)議,使上層軟件僅通過(guò)驅(qū)動(dòng)程序接口函數(shù)就可以訪(fǎng)問(wèn)PL-2301。主要的幾個(gè)驅(qū)動(dòng)程序接口函數(shù)是CreateFile()、WriteFile()、ReadFile()、DeviceIOControl()。
傳輸模塊(Transfer.dll)是驅(qū)動(dòng)程序的上層模塊,它通過(guò)調(diào)用驅(qū)動(dòng)程序接口函數(shù),實(shí)現(xiàn)了兩臺(tái)主機(jī)通過(guò)PL-2301通信的基本通信能力。Transfer.dll會(huì)產(chǎn)生一列三個(gè)線(xiàn)程:
(1)發(fā)送線(xiàn)程。這個(gè)線(xiàn)程對(duì)發(fā)送請(qǐng)求進(jìn)行排隊(duì)并按先后順序處理請(qǐng)求。如果出現(xiàn)錯(cuò)誤,則努力恢復(fù)。
(2)接收線(xiàn)程。這個(gè)線(xiàn)程等待來(lái)自狀態(tài)線(xiàn)程的消息,如果發(fā)現(xiàn)對(duì)方主機(jī)將要傳輸數(shù)據(jù),就按照傳輸協(xié)議接收數(shù)據(jù)。接收線(xiàn)程把接收到的數(shù)據(jù)放在接收FIFO緩沖器中,等待上層軟件(Comm.dll)取走。如果有錯(cuò)誤發(fā)生時(shí),也會(huì)努力恢復(fù)。
(3)狀態(tài)線(xiàn)程。這個(gè)線(xiàn)程監(jiān)視PL-2301的狀態(tài)信號(hào)。如果發(fā)現(xiàn)有任何狀態(tài)改變,它將給相關(guān)線(xiàn)程發(fā)消息或調(diào)用回調(diào)函數(shù)通知上層軟件。
Transfer.dll提供幾個(gè)供上層軟件(Comm.dll)調(diào)用的輸出函數(shù):
·USB_InitService()調(diào)用Transfer.dll里的其他輸出函數(shù)之間必須先調(diào)用這個(gè)函數(shù)。
·USB_OpenConnect()調(diào)用此函數(shù)獲得PL-2301的句柄。發(fā)送和接收數(shù)據(jù)時(shí)要用到這個(gè)句柄。
·USB_WriteConnect()調(diào)用此函數(shù)向?qū)Ψ街鳈C(jī)發(fā)送指定的數(shù)據(jù)。
·USB_ReadConnect()調(diào)用此函數(shù)從接收FIFO緩沖器中讀取數(shù)據(jù)。
通信模塊(Comm.dll)通過(guò)調(diào)用Transfer.dll提供的輸出函數(shù)完成教學(xué)機(jī)器人控制命令的發(fā)送和接收。為了協(xié)調(diào)命令的發(fā)送和接收,定義了套控制字,作為上位機(jī)與下位機(jī)通信時(shí)的握手信號(hào)(與PL-2301的握手信號(hào)沒(méi)有聯(lián)系)。上位機(jī)發(fā)送數(shù)據(jù)(控制命令或控制字)時(shí),直接調(diào)用USB-WriteConnect()即可。下位機(jī)讀取數(shù)據(jù)采取輪詢(xún)方式,循環(huán)調(diào)用USB-Read Connect()掃描USB端口,如果有數(shù)據(jù)則接收下來(lái)。如果接收到的是指令,則放入指令隊(duì)列中,等待任務(wù)管理和調(diào)度線(xiàn)程取走。圖4是上位機(jī)發(fā)送一條命令的示意圖。有些命令需要下位機(jī)發(fā)送返回值給上位機(jī),如讀機(jī)器人狀態(tài)命令status需要下位機(jī)發(fā)送返回值給上位機(jī),如讀機(jī)器人狀態(tài)命令status需要下位機(jī)把機(jī)器人狀態(tài)返回給上位機(jī)。下位機(jī)發(fā)送返回值的過(guò)程與上位機(jī)發(fā)送命令的過(guò)程相似。
USB作為一種新興的計(jì)算機(jī)外設(shè)接口標(biāo)準(zhǔn),其技術(shù)特點(diǎn)使不但能作為計(jì)算機(jī)與一般外設(shè)的接口,也可用于實(shí)時(shí)通信和控制。本文介紹的用USB實(shí)現(xiàn)教學(xué)機(jī)器為上下位機(jī)的通信,為機(jī)器人上下位機(jī)的通信提供了一種新穎、方便和可靠的解決方案。隨著USB2.0的推出,其高達(dá)480Mbps的傳輸速率可滿(mǎn)足高實(shí)時(shí)性要求的工業(yè)設(shè)備控制、動(dòng)態(tài)圖像實(shí)時(shí)傳輸?shù)?,為USB在更廣闊領(lǐng)域的應(yīng)用打下了堅(jiān)實(shí)的基礎(chǔ)。
評(píng)論