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