尹震宇,許 鵬,徐福龍
1(中國科學(xué)院 沈陽計(jì)算技術(shù)研究所, 沈陽 110168)
2(中國科學(xué)院大學(xué),北京 100049)
3(遼寧省國產(chǎn)基礎(chǔ)軟硬件工控平臺技術(shù)研究重點(diǎn)實(shí)驗(yàn)室, 沈陽 110168)
E-mail:xupeng181@mails.ucas.ac.cn
在眾多工業(yè)總線中,EtherCAT憑借速度快、實(shí)時(shí)性好[1]、拓?fù)潇`活[2]等優(yōu)點(diǎn)得到了越來越廣泛的應(yīng)用.傳統(tǒng)的EtherCAT實(shí)現(xiàn)主要基于PC機(jī)及普通的網(wǎng)卡,通過實(shí)時(shí)補(bǔ)丁來提高實(shí)時(shí)性,除了存在體積大功耗高等問題,還存在著實(shí)時(shí)性和穩(wěn)定性得不到保證的缺點(diǎn).因此近年來基于嵌入式平臺的EtherCAT協(xié)議棧實(shí)現(xiàn)方式得到了越來越多的關(guān)注.例如,王慧嬌在嵌入式平臺上實(shí)現(xiàn)了EtherCAT主站的開發(fā)[3],高恩博則實(shí)現(xiàn)了在嵌入式Linux平臺上的EtherCAT主站設(shè)計(jì)[4],饒阿龍?jiān)赪indows平臺上完成了實(shí)時(shí)EtherCAT主站開發(fā)[5].然而傳統(tǒng)嵌入式平臺性能仍然偏低,如果仍采用實(shí)時(shí)補(bǔ)丁的方式來實(shí)現(xiàn),在系統(tǒng)負(fù)載較大時(shí)實(shí)時(shí)性會受到影響.因此本文提出基于FPGA SoC的EtherCAT協(xié)議棧實(shí)現(xiàn)方案.通過在Xilinx推出的Zynq異構(gòu)平臺上構(gòu)建具有實(shí)時(shí)性的Linux操作系統(tǒng)并在FPGA上配置網(wǎng)絡(luò)適配單元,實(shí)現(xiàn)在嵌入式平臺上高效運(yùn)行的EtherCAT協(xié)議棧,并配置可脫離系統(tǒng)獨(dú)立工作的安全單元,實(shí)現(xiàn)在系統(tǒng)故障情況下的安全停止功能.相較于傳統(tǒng)的EtherCAT協(xié)議棧實(shí)現(xiàn)方式,本文設(shè)計(jì)方案實(shí)現(xiàn)難度低、性能高、易于工業(yè)現(xiàn)場部署、運(yùn)行穩(wěn)定性高且成本低,并且具有安全停止功能,具有實(shí)際應(yīng)用價(jià)值.
德國威爾市的倍福自動(dòng)化公司于2003年推出了EtherCAT協(xié)議的實(shí)時(shí)工業(yè)以太網(wǎng)技術(shù)[6].該技術(shù)有3大優(yōu)點(diǎn),1) 具有超高的傳輸速率;2)能夠傳輸超高的數(shù)據(jù)量;3) 具有高效的傳輸效率.自從2007年EtherCAT協(xié)議成為了ISO、IEC和SEMI三大規(guī)范標(biāo)準(zhǔn)以來,EtherCAT作為一種全新的、高效率的工業(yè)以太網(wǎng)技術(shù)受到業(yè)界的廣泛歡迎,被EtherCAT技術(shù)協(xié)會(ETG)在歐洲、亞洲、美洲的全球大部分地區(qū)進(jìn)行宣傳和推廣.
作為全新出現(xiàn)的工業(yè)以太網(wǎng)技術(shù)——EtherCAT協(xié)議對IEEE802.3以太網(wǎng)規(guī)范進(jìn)行了全面的擴(kuò)充,它還利用全雙工的傳輸模式以及新提出的“on the fly”幀處理技術(shù)有效地提高了數(shù)據(jù)傳輸速率[7];同時(shí)EtherCAT協(xié)議在實(shí)時(shí)性和同步精度等方面的性能也有相當(dāng)大的提升,已成為廣受歡迎的工業(yè)以太網(wǎng)技術(shù)[8,9].
EtherCAT的特點(diǎn)如下[10]:
1)主站配置要求低:只要控制單元帶有以太網(wǎng)控制器,無論該單元功能是否豐富、計(jì)算性能是否強(qiáng)大,都可以配置為EtherCAT主站,包括嵌入式平臺單元和X86平臺的PC系統(tǒng),都可以組成EtherCAT控制系統(tǒng).
2)具備以太網(wǎng)標(biāo)準(zhǔn)所需條件:EtherCAT協(xié)議是從以太網(wǎng)修改而來,其具備以太網(wǎng)標(biāo)準(zhǔn)需要的條件,其他以太網(wǎng)的設(shè)備可以與其主從站一起構(gòu)成EtherCAT協(xié)議控制系統(tǒng)[11].
3)具有高效率:EtherCAT傳輸模式是全雙工方式,可達(dá)到百兆的通信速率,并且還提出了“on the fly”的全新幀處理技術(shù),可以保證高效率地傳輸[12,13].
4)具有高精度的同步性能:其具有超高的同步精度,同步精度可達(dá)到100納秒.
EtherCAT幀結(jié)構(gòu)包含4大部分—以太網(wǎng)幀頭、EtherCAT頭、EtherCAT數(shù)據(jù)和FCS[14].以太網(wǎng)幀頭占固定的14字節(jié),其中包含6字節(jié)的目的地址和6字節(jié)的源地址以及2字節(jié)的幀類型.目的地址、源地址、幀類型均采用unsigned char數(shù)據(jù)類型.EtherCAT頭總共占2字節(jié),其中包括占位為11位的EtherCAT數(shù)據(jù)長度、占位為1位的保留位和占位為4位的類型均采用unsigned char數(shù)據(jù)類型.EtherCAT數(shù)據(jù)總共占可變的其最少占44字節(jié),最大占1498字節(jié),EtherCAT數(shù)據(jù)里有若干個(gè)子報(bào)文,每一個(gè)可變的子報(bào)文包含固定長度的10字節(jié)的子報(bào)文頭以及可變的最多1486字節(jié)的數(shù)據(jù)和固定長度的2字節(jié)的WKC,其中可變的數(shù)據(jù)以及定長的WKC均采用unsigned char類型的數(shù)據(jù)類型. 最后是子報(bào)文頭,子報(bào)文頭包含8位的命令、8位的索引、32位的地址區(qū)、11位的長度、4位的保留位、1位的后續(xù)報(bào)文標(biāo)志、16位的狀態(tài)位,命令、索引、地址區(qū)、長度、保留位、后續(xù)報(bào)文標(biāo)志、狀態(tài)位均采用unsigned char作為數(shù)據(jù)類型[15],該EtherCAT幀的結(jié)構(gòu)圖如圖1所示[10].
圖1 EtherCAT數(shù)據(jù)幀結(jié)構(gòu)Fig.1 EtherCAT data frame structure
對于幀的解析,首先獲取接收有效的數(shù)據(jù)幀,獲取的數(shù)據(jù)幀為二進(jìn)制數(shù)可以用于實(shí)現(xiàn)幀結(jié)構(gòu)的解析過程,然后判斷是否成功接收到數(shù)據(jù)幀,成功接收則對二進(jìn)制的數(shù)據(jù)進(jìn)行按EtherCAT幀格式位解析,之后將目的地址,源地址等轉(zhuǎn)換成十六進(jìn)制數(shù),將EtherCAT數(shù)據(jù)長度、命令、子報(bào)文數(shù)據(jù)長度等轉(zhuǎn)換為十進(jìn)制數(shù),最后將所有按位解析之后的結(jié)果輸出,其流程圖如圖2所示.
圖2 EtherCAT幀解析流程圖Fig.2 EtherCAT frame analysis flow chart
EtherCAT協(xié)議棧軟件結(jié)構(gòu)如圖3所示[16],主要由網(wǎng)絡(luò)適配單元驅(qū)動(dòng)、以太網(wǎng)協(xié)議的驅(qū)動(dòng)及應(yīng)用程序結(jié)構(gòu)等構(gòu)成.同時(shí)為了使平臺具有更好的通用性,保留了普通網(wǎng)卡的驅(qū)動(dòng),使平臺上原網(wǎng)口也可以繼續(xù)實(shí)現(xiàn)普通以太網(wǎng)的功能.
圖3 EtherCAT協(xié)議棧軟件結(jié)構(gòu)Fig.3 Software structure of EtherCAT protocol stack
為了使EtherCAT協(xié)議棧能在Zynq平臺上運(yùn)行,首先需要在Zynq平臺上構(gòu)建Linux系統(tǒng),并且系統(tǒng)需要具有實(shí)時(shí)性,來滿足EtherCAT協(xié)議棧的實(shí)時(shí)性需求.Xilinx官方提供了petalinux工具來方便在Zynq平臺上構(gòu)建Linux,使用此工具可以很方便的完成U-boot啟動(dòng)、文件系統(tǒng)等配置,因此本文選用此工具來構(gòu)建Linux系統(tǒng).petalinux構(gòu)建系統(tǒng)流程如圖4所示.在使用petalinux構(gòu)建系統(tǒng)之前,首先需要在Vivado中構(gòu)建目標(biāo)平臺,并且生成HDF文件,方法為在Vivado中創(chuàng)建項(xiàng)目并完成IP核添加及參數(shù)配置,并創(chuàng)建頂層文件及添加管教約束,生成bitstream,并導(dǎo)出為HDF描述文件.安裝petalinux工具之前,先根據(jù)提示安裝所需軟件包,同時(shí)根據(jù)要求修改系統(tǒng)配置.運(yùn)行命令安裝petalinux,創(chuàng)建工程并導(dǎo)入已經(jīng)生成了的硬件配置信息,運(yùn)行petalinux-build命令編譯系統(tǒng),生成U-Boot、Linux內(nèi)核和RootFS鏡像等文件.使用petalinux工具配置文件系統(tǒng)存儲位置為SD卡,并將生成的鏡像文件、文件系統(tǒng)文件等拷貝到SD卡中,設(shè)置好串口參數(shù),將SD卡插入開發(fā)板,在串口終端工具可看到系統(tǒng)成功運(yùn)行.
圖4 Petalinux構(gòu)建系統(tǒng)流程Fig.4 Construction process of Petalinux system
下一步進(jìn)行Preempt RT補(bǔ)丁包的配置以使系統(tǒng)具有實(shí)時(shí)性,首先需要下載與內(nèi)核版本相對應(yīng)的版本的補(bǔ)丁包.Petalinux支持配置外部源碼樹,這使得使用petalinux配置補(bǔ)丁相較于傳統(tǒng)Linux方便很多,在使用patch命令將實(shí)時(shí)補(bǔ)丁融入內(nèi)核后,使用petalinux提供的開發(fā)工具,直接使用編譯命令就可以完成內(nèi)核制作,再將生成的若干文件拷貝到嵌入式平臺,即可完成配置.
安裝實(shí)時(shí)補(bǔ)丁的linux操作系統(tǒng)的實(shí)時(shí)性雖然有了很大提升,但是操作系統(tǒng)可能要處理多個(gè)實(shí)時(shí)任務(wù),并且可能存在負(fù)載過大的情況.這種情況下單純依靠實(shí)時(shí)補(bǔ)丁難以滿足系統(tǒng)的實(shí)時(shí)性需求.因此本文使用FPGA通過硬件方式配置EtherCAT協(xié)議棧的數(shù)據(jù)鏈路層,執(zhí)行解析數(shù)據(jù)幀等工作,通過硬件方式保證系統(tǒng)的實(shí)時(shí)性.同時(shí),zynq平臺的PS即ARM核部分和PL即FPGA部分均可以相互獨(dú)立運(yùn)行,PL部分可以不依靠PS部分的指令而自行執(zhí)行控制操作,因此同時(shí)在PL端配置運(yùn)行安全功能,在PS端不能正常收發(fā)指令時(shí),PL端根據(jù)實(shí)際情況發(fā)送相關(guān)命令,使伺服驅(qū)動(dòng)器等設(shè)備能夠安全停止,保證生產(chǎn)線的安全運(yùn)行,減少由于系統(tǒng)出現(xiàn)問題帶來的經(jīng)濟(jì)損失,避免生產(chǎn)安全事故.
圖5 EtherCAT協(xié)議棧網(wǎng)絡(luò)適配單元Fig.5 Network adaptation unit of EtherCAT protocol stack
為了通過硬件方式保證EtherCAT協(xié)議的實(shí)時(shí)性,本文將數(shù)據(jù)幀的接收、發(fā)送和解析等工作均部署在FPGA上執(zhí)行.并且為了保證運(yùn)行安全的相關(guān)功能夠正常運(yùn)行,特別是在ARM核上系統(tǒng)出現(xiàn)崩潰等情況時(shí)能夠及時(shí)向伺服驅(qū)動(dòng)器等設(shè)備發(fā)出停止指令,安全功能也要部署在FPGA上獨(dú)立執(zhí)行.具體設(shè)計(jì)如圖5所示,F(xiàn)PGA上共配置由BRAM構(gòu)成的兩個(gè)獨(dú)立的緩沖區(qū)作為待發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩沖區(qū)、數(shù)據(jù)幀解析和封裝單元來解析封裝數(shù)據(jù)幀、數(shù)據(jù)幀收發(fā)單元來發(fā)送接收數(shù)據(jù)幀.
由于開發(fā)板底版上只配置了一個(gè)網(wǎng)絡(luò)接口并且是與PS部分連接的,F(xiàn)PGA若想使用則需要將數(shù)據(jù)傳輸回ARM核發(fā)送,顯然實(shí)時(shí)性將會受到很大影響,因此選擇在FPGA上擴(kuò)展口連接PHY芯片及網(wǎng)絡(luò)接口的形式,使FPGA有獨(dú)立連接的網(wǎng)絡(luò)接口并且有能力在脫離ARM的情況下獨(dú)立完成數(shù)據(jù)幀的發(fā)送和接收任務(wù),并且在FPGA上配置數(shù)據(jù)幀收發(fā)單元,單元內(nèi)包括緩沖區(qū)來存放將要發(fā)送和剛接收的數(shù)據(jù)幀.在FPGA上使用BRAM配置兩個(gè)緩沖區(qū),分別是待發(fā)送數(shù)據(jù)幀緩沖區(qū)和接收數(shù)據(jù)幀緩沖區(qū),并且配置為FIFO.對于待發(fā)送數(shù)據(jù)幀緩沖區(qū).數(shù)據(jù)幀封裝解析單元通過AXI總線在隊(duì)尾向BRAM寫入待發(fā)送數(shù)據(jù)幀,而發(fā)送接收控制單元?jiǎng)t從隊(duì)頭依次讀出待發(fā)送數(shù)據(jù)幀進(jìn)行發(fā)送.對于接受數(shù)據(jù)幀緩沖區(qū),發(fā)送接收控制單元將接受到的數(shù)據(jù)幀存入隊(duì)尾,而數(shù)據(jù)幀封裝解析則從隊(duì)頭依次讀出接受數(shù)據(jù)幀并進(jìn)行處理.
由當(dāng)部署在ARM核上的EtherCAT無法正常工作甚至linux系統(tǒng)崩潰無法發(fā)送接收數(shù)據(jù)幀時(shí),部署在FPGA上的安全功能應(yīng)該能夠自動(dòng)運(yùn)行,向外發(fā)送數(shù)據(jù)幀以實(shí)現(xiàn)安全停止.安全功能模塊主要由計(jì)時(shí)器、安全指令存儲區(qū)組成.不同廠商的伺服驅(qū)動(dòng)具有不同的安全停止指令,因此本文使用BRAM配置安全指令存儲區(qū),提供給用戶,用戶輸入指令內(nèi)容存入存儲區(qū).同時(shí)在FPGA上部署定時(shí)器,當(dāng)待發(fā)送數(shù)據(jù)幀緩沖區(qū)為空或接收數(shù)據(jù)幀緩沖區(qū)存滿時(shí),計(jì)時(shí)器開始工作,計(jì)數(shù)到達(dá)不同時(shí)鐘周期時(shí)發(fā)送對應(yīng)指令.例如,當(dāng)待發(fā)送數(shù)據(jù)幀緩沖區(qū)為空,計(jì)時(shí)器開始計(jì)時(shí),當(dāng)10個(gè)時(shí)鐘周期內(nèi)仍沒有新數(shù)據(jù)寫入時(shí),發(fā)送位置及速度歸0指令,再過10個(gè)時(shí)鐘周期仍沒有新數(shù)據(jù)寫入,則發(fā)送下使能信號.
本文搭建的測試平臺分別基于米聯(lián)客Zynq開發(fā)板和基于國產(chǎn)龍芯CPU的工控單元.在開發(fā)板上對系統(tǒng)的實(shí)時(shí)性進(jìn)行測試,以判斷是否能夠滿足實(shí)時(shí)性要求,并且與只安裝實(shí)時(shí)性補(bǔ)丁的實(shí)驗(yàn)平臺進(jìn)行對比,判斷實(shí)時(shí)性是否有提升.在基于龍芯CPU的工控單元上使用自行開發(fā)的程序?qū)Σ东@的數(shù)據(jù)幀進(jìn)行分析,判斷開發(fā)板發(fā)送的數(shù)據(jù)幀是否滿足EtherCAT要求,同時(shí)在開發(fā)板端人工觸發(fā)異常情況,包括停止發(fā)送數(shù)據(jù)幀和停止接收數(shù)據(jù)幀,通過分析工控單元接收的數(shù)據(jù)幀來判斷安全功能模塊是否成功發(fā)送安全指令及指令內(nèi)容是否正確,驗(yàn)證安全功能有效性.
為測試平臺的實(shí)時(shí)性,需要在操作系統(tǒng)內(nèi)模擬出日常使用環(huán)境中的負(fù)載情況,主要包括大量計(jì)算、內(nèi)存訪問和輸入輸出請求.Linux操作系統(tǒng)本身就自帶了一些工具來方便我們對這3種負(fù)載情況進(jìn)行模擬,因此選用這些官方工具模擬日常負(fù)載環(huán)境,并且測試打入實(shí)時(shí)補(bǔ)丁的操作系統(tǒng)在模擬負(fù)載環(huán)境中的實(shí)時(shí)性.
首先進(jìn)行日常負(fù)載的模擬.在Linux系統(tǒng)中,可以通過壓縮隨機(jī)數(shù)計(jì)的方式來模擬CPU負(fù)載,因?yàn)檫x定的平臺為多核結(jié)構(gòu),因此模擬的指令如表1所示.
表1 CPU負(fù)載模擬代碼Table 1 CPU load simulation code
對內(nèi)存負(fù)載的模擬通過減少內(nèi)存總量實(shí)現(xiàn).通過在內(nèi)存中創(chuàng)建文件系統(tǒng)并寫入文件來模擬.寫入文件越多,使用的內(nèi)存也就越多,在寫入文件足夠多時(shí)就會產(chǎn)生頁面置換來模擬頁面置換的負(fù)載情況.具體實(shí)現(xiàn)方式為創(chuàng)建一個(gè)文件系統(tǒng)的掛載點(diǎn),然后在該目錄下創(chuàng)建文件,文件大小及塊大小都可以自行定義.如創(chuàng)建塊大小為512K、文件大小為256M的文件代碼如表2.
表2 內(nèi)存負(fù)載模擬代碼Table 2 Memory load simulation code
對輸入輸出請求的模擬可以通過不??截愇募韺?shí)現(xiàn),可以創(chuàng)建一個(gè)全是0的512M的文件,使用for循環(huán)執(zhí)行20次操作,每次循環(huán)都拷貝新文件來覆蓋舊文件.具體方式為表3所示.
表3 輸入輸出負(fù)載模擬代碼Table 3 Input output load simulation code
使用Cyslictest工具測試在高負(fù)載下的Linux系統(tǒng)的實(shí)時(shí)性能,可知平均延遲、最大延遲均有減少,相較于非實(shí)時(shí)內(nèi)核,實(shí)時(shí)內(nèi)核更加穩(wěn)定,可以滿足EtherCAT協(xié)議棧的需求.
實(shí)時(shí)性測試結(jié)果對比如表4所示.在測試實(shí)時(shí)性之后還要對協(xié)議棧發(fā)送的數(shù)據(jù)幀內(nèi)容進(jìn)行測試,以確保協(xié)議棧的正常運(yùn)行.測試平臺選用實(shí)驗(yàn)室開發(fā)的基于龍芯的工控單元,單元具有測試數(shù)據(jù)幀內(nèi)容功能,可解析數(shù)據(jù)幀的內(nèi)容.測試結(jié)果如圖6,可以看到數(shù)據(jù)幀內(nèi)容正確.
表4 實(shí)時(shí)性測試結(jié)果對比Table 4 Comparison of real time test results
圖6 數(shù)據(jù)幀內(nèi)容測試結(jié)果Fig.6 Data frame content test result
為測試實(shí)驗(yàn)平臺的安全功能,需要人為觸發(fā)異常情況,可以通過在操作系統(tǒng)內(nèi)強(qiáng)行停止協(xié)議棧發(fā)送和接收數(shù)據(jù)幀,來觸發(fā)FPGA上的安全功能單元,來判斷安全功能是否正常運(yùn)行.因?yàn)椴煌瑥S商的伺服驅(qū)動(dòng)器指令各不相同,為了對安全功能進(jìn)行驗(yàn)證,我們設(shè)定數(shù)據(jù)第13、14位分別為使能信號和抱閘信號,對數(shù)據(jù)幀解析并查看13、14位情況來驗(yàn)證功能正確性.如圖7、圖8為測試結(jié)果,可以看到工控單元依次收到了下使能、抱閘的信號,因此可以驗(yàn)證安全功能可以正常運(yùn)行.
圖7 安全功能數(shù)據(jù)幀測試結(jié)果1Fig.7 Security function data frame test result 1
圖8 安全功能數(shù)據(jù)幀測試結(jié)果2Fig.8 Security function data frame test result 2
本文詳細(xì)的介紹了EtherCAT協(xié)議棧特點(diǎn)、數(shù)據(jù)幀結(jié)構(gòu)及解析數(shù)據(jù)幀的過程,提出了一種基于FPGA SoC的EtherCAT協(xié)議棧實(shí)現(xiàn)方案,通過在FPGA上部署網(wǎng)絡(luò)適配單元,同時(shí)加入安全功能單元,實(shí)現(xiàn)了EtherCAT協(xié)議棧在嵌入式平臺上的高效運(yùn)行,經(jīng)過實(shí)驗(yàn)測試,平臺具有良好的穩(wěn)定性,數(shù)據(jù)幀內(nèi)容正確,安全功能可以正常運(yùn)行,具有很強(qiáng)的實(shí)用性和應(yīng)用價(jià)值.