(上海交通大學(xué) 電子信息與電氣工程學(xué)院 電氣工程系,上海 200240)
隨著現(xiàn)代控制技術(shù)的發(fā)展,運(yùn)動控制器的出現(xiàn)在一定程度上滿足了新型數(shù)控系統(tǒng)的標(biāo)準(zhǔn)化和開放性需求,為各種工業(yè)設(shè)備、國防設(shè)備以及智能醫(yī)療設(shè)備的自動化控制系統(tǒng)的研制和改進(jìn)提供了一個統(tǒng)一的硬件平臺。特別是在機(jī)器人控制、半導(dǎo)體加工、飛行模擬器等新興行業(yè)中,運(yùn)動控制器都得到了廣泛的應(yīng)用。運(yùn)動控制器在傳統(tǒng)的機(jī)床控制領(lǐng)域所占的份額也在不斷擴(kuò)大。
市場上國外工業(yè)運(yùn)動控制器種類很多,主要分為日本系列和歐洲系列。歐洲系列價格高于日本系列,但使用壽命更長,運(yùn)動穩(wěn)定性和精度也較高,系統(tǒng)兼容性也略勝一籌。知名度較高的有發(fā)那科、ABB、愛普生、庫卡等。國內(nèi)相關(guān)研究的起步較晚,由于歷史較短,技術(shù)水平也比較落后,創(chuàng)新能力不強(qiáng)。早期主要依賴于從日本和歐美進(jìn)口。比較知名的國內(nèi)廠商有廣州數(shù)控、沈陽新松、眾為興等[1]。
目前市面上絕大多數(shù)運(yùn)動控制器都以LinuxCNC為藍(lán)本,根據(jù)具體的產(chǎn)品需求對LinuxCNC進(jìn)行功能上的裁剪和改進(jìn)。LinuxCNC是一款基于Linux操作系統(tǒng)的開放式數(shù)控軟件,能夠?qū)代碼進(jìn)行譯碼并控制數(shù)控機(jī)床的運(yùn)行。最初LinuxCNC是因銑床的應(yīng)用而開發(fā)的,但之后它增加了對車床和其他機(jī)器的支持?,F(xiàn)在LinuxCNC普遍用于銑床、車床、等離子切割機(jī)、路由器和機(jī)器人等。
LinuxCNC的功能強(qiáng)大,代碼庫完備,有利于定制式運(yùn)動控制器的開發(fā)。然而LinuxCNC平臺并不是一個強(qiáng)實(shí)時性操作系統(tǒng),在實(shí)時性要求較高的場合,將無法滿足實(shí)時性需求。另一方面,LinuxCNC平臺由于功能繁多,其在功能運(yùn)行上會有較大的冗余[2]。
由于以上原因,需要構(gòu)建一個實(shí)時性更強(qiáng)的多軸運(yùn)動控制器平臺,而基于μCOS構(gòu)建的多軸運(yùn)動控制器平臺則是一個很好的選擇。
μCOS是一個可以基于ROM運(yùn)行、可裁剪、搶占式的實(shí)時多任務(wù)內(nèi)核,具有高度可移植性,特別適用于微處理器和控制器。μCOS使用ANSI C語言進(jìn)行開發(fā),其主要特點(diǎn)有源代碼公開、代碼結(jié)構(gòu)清晰、可移植性好等,其內(nèi)核屬于搶占式,可以管理多達(dá)60個任務(wù)。
以μCOS為基礎(chǔ)研發(fā)的多軸運(yùn)動控制器,將最大程度地利用μCOS高實(shí)時性的特點(diǎn),且在制造成本上也有著很大的優(yōu)勢。
多軸運(yùn)動控制器是一個多模塊的系統(tǒng)平臺,為了將系統(tǒng)中的各個功能模塊有機(jī)地結(jié)合在一起,需要構(gòu)建一個全新的、可兼容基于μCOS的多軸運(yùn)動控制器的通信模型。
由于LinuxCNC在運(yùn)動控制器應(yīng)用上的泛用性,基于μCOS的多軸運(yùn)動控制器的功能模塊結(jié)構(gòu),大體上與基于LinuxCNC的多軸運(yùn)動控制器的功能模塊結(jié)構(gòu)相同,如圖1所示[3]。
圖1 運(yùn)動控制器的功能模塊圖
多軸運(yùn)動控制器的結(jié)構(gòu)主要分為4個功能模塊,分別是:GUI(Graphic User Interface)模塊,即圖形用戶界面,用于與用戶之間進(jìn)行交互,無實(shí)時性要求;EMCTASK模塊,即任務(wù)管理器,管理任務(wù)調(diào)度和分配,無實(shí)時性要求;EMCMOT模塊,即運(yùn)動控制器,機(jī)械運(yùn)動與軌跡規(guī)劃模塊,有實(shí)時性要求;EMCIO模塊,即輸入輸出管理器,管理一些無實(shí)時性要求的輸入輸出量,無實(shí)時性要求。
GUI模塊是整個系統(tǒng)中唯一與用戶交互的模塊,為用戶提供圖形操作界面,以LinuxCNC上的AXIS人機(jī)界面為例,如圖2所示。在圖形操作界面中,可以執(zhí)行G代碼的導(dǎo)入、手動回零、校準(zhǔn)等功能。用戶對整個系統(tǒng)運(yùn)行功能的設(shè)置,都通過GUI模塊實(shí)現(xiàn)。
圖2 GUI模塊圖形操作界面
EMCTASK模塊向上連接GUI模塊,向下連接EMCMOT和EMCIO兩個模塊。其主要功能是接收從GUI模塊傳遞來的執(zhí)行命令和G代碼,經(jīng)過一系列的轉(zhuǎn)換和整合,將輸入輸出量相關(guān)的命令傳遞給EMCIO模塊,運(yùn)動控制相關(guān)的命令傳遞給EMCMOT模塊。同時EMCTASK還從EMCIO和EMCMOT中收集狀態(tài)信息和錯誤信息,整合后通過GUI模塊反饋給用戶。
EMCIO模塊用來控制機(jī)器的輸入輸出量,主要是一些實(shí)時性要求不高的輸入輸出量,例如注入潤滑液、冷卻功能、控制燈光、轉(zhuǎn)換操作模式等[4-5]。
EMCMOT模塊是整個系統(tǒng)中運(yùn)動控制的核心模塊,運(yùn)動學(xué)計算和軌跡規(guī)劃等都由EMCMOT實(shí)現(xiàn)。EMCMOT模塊在功能上涉及很多實(shí)時運(yùn)算,對通信方式的實(shí)時性需求很高。在LinuxCNC中,EMCMOT和其他模塊都在同一臺整機(jī)中運(yùn)行,EMCTASK與EMCMOT之間的通信通過共享內(nèi)存(Shared Memory)的方式實(shí)現(xiàn)。而在基于μCOS的多軸運(yùn)動控制器中,EMCMOT模塊被分割到μCOS中運(yùn)行,而μCOS的硬件平臺是STM32,所以無法采用共享內(nèi)存通信方案。作為替代,使用Socket套接字通信來實(shí)現(xiàn)EMCMOT與EMCTASK之間的通信。
其他非實(shí)時模塊,如GUI、EMCTASK和EMCIO之間的通信,則采用RCS庫中的NML通信方式。
RCS(Real-Time Control Systems)是由美國國家標(biāo)準(zhǔn)與技術(shù)研究院研發(fā)和支持的一種模塊之間的實(shí)時通信系統(tǒng),可用于復(fù)雜系統(tǒng)的模塊化開發(fā)。RCS是基于面向?qū)ο竽J介_發(fā)的,代碼開源,可以方便地按照需求進(jìn)行代碼重構(gòu)。
RCS庫中有兩個重要的子系統(tǒng),分別是CMS(Communication Manage System)和NML(Neutral Message Language)。CMS是RCS庫的底層通信管理軟件,主要作用在于提供通信接口,完成不同平臺上的基本數(shù)據(jù)類型與中性格式數(shù)據(jù)之間的編碼和解碼,以實(shí)現(xiàn)數(shù)據(jù)的跨平臺通信。NML是RCS庫中獨(dú)立于控制系統(tǒng)的中性消息語言,實(shí)際上是CMS的一種更高級的封裝形式[6]。
CMS為本地進(jìn)程、本地服務(wù)器進(jìn)程和遠(yuǎn)程進(jìn)程都提供了基本的通信功能模塊、編碼/解碼模塊,在本地進(jìn)程訪問中還提供了相應(yīng)的緩沖區(qū)管理和讀寫信息。
CMS的具體功能由封裝好的CMS類來實(shí)現(xiàn)。CMS類中比較重要的成員函數(shù)有以下幾類:
① Format函數(shù):格式化函數(shù),用來識別消息類型、建立進(jìn)程與緩沖區(qū)之間的連接。
② Update函數(shù):更新成員的信息,同時對數(shù)據(jù)進(jìn)行編碼或解碼,使其通過命令通道、狀態(tài)通道或錯誤通道來傳輸信息。
③ CMS通信函數(shù):CMS層的底層讀寫函數(shù),用于向緩沖區(qū)中的消息進(jìn)行讀寫操作。
NML是CMS的頂層封裝,是用戶直接操作的層級,用戶通過對NML層的操作,無需了解NML層以下的層級的具體操作,即可完成NML通信的需求。
NML層主要包括消息管理模塊和配置管理模塊,例如消息詞匯的定義、消息類型的聲明和NML應(yīng)用中配置文件的配置。
基于μCOS的多軸運(yùn)動控制器中,EMCTASK與GUI之間、EMCTASK與EMCIO之間,都通過NML通信建立通信連接。通過NML通信建立通信連接的主要優(yōu)點(diǎn)在于,NML可以實(shí)現(xiàn)不同平臺上的本地或遠(yuǎn)程通信。這是由于NML通信可以將一個平臺上的數(shù)據(jù)類型,轉(zhuǎn)換成中間數(shù)據(jù)類型,到另一個平臺上再轉(zhuǎn)換成對應(yīng)平臺的數(shù)據(jù)類型。利用NML進(jìn)行通信的各個模塊之間,可以處于不同的系統(tǒng)平臺,這對通信接口的統(tǒng)一性和模塊的擴(kuò)展性有極大的助益。
以EMCTASK與EMCIO之間的NML通信為例,其通信框圖如圖3所示。EMCTASK與EMCIO之間的NML通信通道構(gòu)建,主要分為3個通道,分別是命令通道、狀態(tài)通道和錯誤通道。正常工作時,命令通道將EMCTASK下發(fā)的命令傳遞到EMCIO,而狀態(tài)通道將EMCIO的狀態(tài)反饋給EMCTASK。當(dāng)EMCIO發(fā)生錯誤時,錯誤信息通過錯誤通道反饋給EMCTASK。
圖3 EMCTASK與EMCIO的通信框圖
NML通信的構(gòu)建,首先需要配置NML配置文件,NML配置文件主要配置的對象有兩個:一是緩沖區(qū)配置,如表1所示;二是進(jìn)程配置,如表2所示。
表1 NML配置文件中的緩沖區(qū)配置
表2 NML配置文件中的進(jìn)程配置
緩沖區(qū)配置文件中,每一行參數(shù)為對一個緩沖區(qū)的配置,#號所在的行是注釋行。首位的關(guān)鍵字“B”表示配置類型為Buffer,即緩沖區(qū)配置類型。第2位是Name,表明緩沖區(qū)的名稱。第3位是Type,表明緩沖區(qū)內(nèi)存類型,可選項有SHMEM(共享內(nèi)存)、GLOBMEM(全局內(nèi)存)、LOCMEM(本地內(nèi)存)、FILEMEM(文件內(nèi)存),EMCTASK和EMCIO處于同一個操作系統(tǒng)中,選用速度較快的SHMEM類型。第4位是Host,即緩沖區(qū)所在的主機(jī)名稱,用于遠(yuǎn)程通信。第5位是size,即緩沖區(qū)容量,表明該緩沖區(qū)所能容納的最大字節(jié)數(shù)。第6位是neutral,該標(biāo)志位表明消息是否轉(zhuǎn)換為中性格式,該位置為“0”表示消息在同一個操作系統(tǒng)上傳遞,無需改變當(dāng)前的數(shù)據(jù)格式;該位置為“1”,則表示消息會在不同的操作系統(tǒng)上傳遞,傳遞時需要將消息轉(zhuǎn)換為中性格式,消息到達(dá)對應(yīng)平臺時,再轉(zhuǎn)換成平臺對應(yīng)的數(shù)據(jù)格式。第7位與配置文件的版本有關(guān),默認(rèn)置0即可。第8位是buffer number,即緩沖區(qū)標(biāo)號,共享同一個服務(wù)器的緩沖區(qū)標(biāo)號,必須是不同的。第9位是MP(Maximum Processes),即該緩沖區(qū)能連接的最大進(jìn)程數(shù)。再之后的參數(shù)為可選參數(shù),并不是必要的,依次是遠(yuǎn)程通信端口號、遠(yuǎn)程通信協(xié)議、使用的中性消息格式、是否隊列式讀寫等。
NML進(jìn)程的配置,首位的關(guān)鍵字“P”表示配置類型為Process,即進(jìn)程類型。第2位的Name表示進(jìn)程名稱。第3位的Buffer表示該進(jìn)程連接的緩沖區(qū)名稱。第4位的Type表示該進(jìn)程的類型,類型只分為兩種,LOCAL本地類型和REMOTE遠(yuǎn)程類型。第5位的Host表示該進(jìn)程運(yùn)行所在的主機(jī)名。第6位的Ops表示該進(jìn)程所做的操作,可選項有R(只讀)、W(只寫)、RW(讀寫)3種。第7位server是一個標(biāo)志位,置“0”表示該進(jìn)程不是一個NML服務(wù)器,置“1”表示該進(jìn)程為NML服務(wù)器進(jìn)程。第8位的timeout表示進(jìn)程執(zhí)行的時限,單位為s。第9位的master是一個特殊的標(biāo)志位,標(biāo)志位置“0”時,該進(jìn)程連接到的緩沖區(qū)如果不存在,則這是一個錯誤的操作;標(biāo)志位置“1”時,該進(jìn)程連接到的緩沖區(qū)如果不存在,則會新建一個緩沖區(qū)。第10位的cnum即connect number,是在0與緩沖區(qū)最大進(jìn)程數(shù)之間的一個特殊數(shù)字,作為操作特定緩沖區(qū)的進(jìn)程序號,用于信號量操作。
在配置完NML配置文件后,可以在工程代碼中初始化并使用NML函數(shù)庫實(shí)現(xiàn)通信功能。
Socket套接字是支持TCP/IP協(xié)議族的網(wǎng)絡(luò)通信基本操作單元,是網(wǎng)絡(luò)通信層中的中間軟件抽象層。Socket包含兩個最基本的成員:IP和port,IP可標(biāo)識通信網(wǎng)絡(luò)中的一臺主機(jī),而port即端口號,可標(biāo)識一臺主機(jī)中特定的一個進(jìn)程,所以可將Socket套接字視為不同主機(jī)的進(jìn)程之間進(jìn)行通信的端點(diǎn)。
常見的Socket套接字類型有3種。
① 流套接字。面向連接,面向流,提供可靠的數(shù)據(jù)傳輸服務(wù)。這種類型的Socket套接字能實(shí)現(xiàn)數(shù)據(jù)的無差錯、無重復(fù)發(fā)送,接收時會按照發(fā)送的順序接收。由于流套接字使用TCP進(jìn)行數(shù)據(jù)傳輸,接收端在接收數(shù)據(jù)后會返回ack信號。根據(jù)ack信號,發(fā)送端會決定該次傳輸是否成功,傳輸成功則結(jié)束該次傳輸,準(zhǔn)備下一次傳輸;傳輸失敗則重新發(fā)送相同的數(shù)據(jù)。
② 數(shù)據(jù)包套接字。面向消息,提供無連接、高效率的服務(wù)。與流套接字不同,數(shù)據(jù)包套接字類型在傳輸數(shù)據(jù)時不需要建立連接,只需將目的地址信息和數(shù)據(jù)打包后發(fā)出即可,支持一對多傳輸。該Socket套接字使用UDP進(jìn)行傳輸,高效率低延遲,但由于接收方對數(shù)據(jù)傳輸無反饋,所以無法保證數(shù)據(jù)傳輸?shù)目煽啃浴?/p>
③ 原始套接字。允許操作者對訪問和控制底層的通信協(xié)議,即可以通過該類型的Socket套接字操縱網(wǎng)絡(luò)層和傳輸層應(yīng)用。原始套接字主要用于通信協(xié)議的開發(fā),能獲取通信協(xié)議的高級訪問權(quán)限,所以并不適合普通用戶使用[7]。
在基于μCOS的多軸運(yùn)動控制器系統(tǒng)中,Socket套接字主要用于EMCTASK和EMCMOT之間的通信。其中EMCTASK模塊位于上位機(jī)系統(tǒng)中,而EMCMOT模塊位于作為下位機(jī)的STM32中。EMCMOT模塊中的Socket套接字通信模塊會不斷輪詢來自上位機(jī)的通信信息,并由此做出相應(yīng)的操作和反饋。其通信框圖如圖4所示。
圖4 Socket套接字通信框圖
首先,EMCMOT和EMCTASK分別創(chuàng)建Socket套接字。EMCMOT需要用過bind()函數(shù)綁定IP地址和port端口,之后使用listen()函數(shù)開始監(jiān)聽該端口。之后調(diào)用accept()函數(shù),該函數(shù)在EMCTASK發(fā)起連接請求之前,會使通信功能一直處于阻塞狀態(tài)。EMCTASK模塊調(diào)用connect()函數(shù)向EMCMOT模塊發(fā)起Socket套接字通信連接請求。建立通信連接后,EMCMOT模塊會調(diào)用recv()函數(shù)輪詢來自EMCTASK模
塊的指令,EMCTASK模塊將從上個層級傳來的指令通過send()函數(shù)發(fā)送給EMCMOT模塊。EMCMOT模塊在處理完EMCTASK模塊發(fā)出的指令后,會調(diào)用send()函數(shù)反饋對應(yīng)的信息給EMCTASK模塊,之后重新調(diào)用recv()函數(shù)等待下一個指令。
基于μCOS的多軸運(yùn)動控制器相比于傳統(tǒng)的多軸運(yùn)動控制器實(shí)時性更強(qiáng),且生產(chǎn)成本更低,但需要重新設(shè)計通信結(jié)構(gòu)。通信模型的構(gòu)建以4大功能模塊為基礎(chǔ),GUI、EMCTASK和EMCIO 3個模塊之間使用NML通信相連接,而EMCTASK和EMCMOT之間使用Socket套接字通信,這種通信模型既滿足了模塊的實(shí)時性要求,又具有一定程度的靈活性和擴(kuò)展性。