余道洋
合肥工業(yè)大學(xué)機(jī)械工程學(xué)院,合肥,230009
傳統(tǒng)方法中,當(dāng)一個三維模型需要打印時,首先由三維建模軟件或設(shè)備建立一個三維模型,然后將三維模型文件轉(zhuǎn)換成目前大多數(shù)3D打印機(jī)系統(tǒng)通用的STL格式,再經(jīng)過切片軟件將三維模型按照用戶設(shè)定的層高將模型切成一層層的截面進(jìn)而對每一層截面進(jìn)行路徑規(guī)劃,最后生成3D打印機(jī)通用的格式G代碼文件輸入到3D打印機(jī)進(jìn)行打印[1-2]。3D打印機(jī)的控制系統(tǒng)Marlin在處理G代碼時,需要經(jīng)過字符串識別命令并轉(zhuǎn)換提取數(shù)值,接著執(zhí)行相對應(yīng)的工作[3],當(dāng)G代碼命令為直線移動時,則須執(zhí)行直線坐標(biāo)運算、直線軌跡規(guī)劃及連接速度計算等運算;控制系統(tǒng)在打印過程中還要處理中斷、溫度檢測、加熱溫度控制及打印頭移動控制等任務(wù)[4]。Marlin系統(tǒng)及其他開源3D打印機(jī)控制系統(tǒng),目前只支持單核處理器,只能應(yīng)付目前的工作需求,若在產(chǎn)品開發(fā)過程中增加新功能導(dǎo)致處理器無法負(fù)擔(dān)時,只有使用更快更好的處理器來回應(yīng),這就限制了3D打印機(jī)日后的發(fā)展。
為了突破開源3D控制系統(tǒng)的限制,本文提出改變原有的開源打印機(jī)的代碼處理模式架構(gòu),使用一種新的代碼處理方式,將部分處理程序在PC段先行運算處理完畢后,再輸入3D打印機(jī)中執(zhí)行,以此提升代碼處理的速度和效率,減少處理器負(fù)擔(dān)并節(jié)省CPU處理時間,并可為系統(tǒng)留下更多的發(fā)展空間,且通過PC端的預(yù)處理可得到更優(yōu)化的運算結(jié)果。本文選定由切層軟件自動生成的G代碼程序進(jìn)行外部處理,于PC端設(shè)計程序軟件,輸入G代碼程序,處理完成后輸出成自行定義的文件格式,再輸入到修改后的Marlin系統(tǒng)中進(jìn)行處理,并與原始處理機(jī)制進(jìn)行兩者處理時間差異的比較,以證明預(yù)處理機(jī)制的優(yōu)點。
本文研究的3D打印機(jī)G代碼預(yù)處理機(jī)制架構(gòu)采用間接打印的方式。當(dāng)切層軟件將STL文件轉(zhuǎn)換成G代碼后,先經(jīng)由本文研究開發(fā)的G代碼預(yù)處理程序預(yù)先處理轉(zhuǎn)換成自行定義的GPRE格式文檔,存儲于PC機(jī)中,再通過串口輸入到打印機(jī)中進(jìn)行打印,因此,本文研究的3D打印機(jī)G代碼預(yù)處理架構(gòu)分為兩大部分:
(1)PC端的G代碼預(yù)處理程序負(fù)責(zé)將G代碼文件預(yù)先進(jìn)行路徑規(guī)劃后,輸出成本文自行定義的預(yù)處理文件GPRE文件。
(2)在熔融沉積成形(fused deposition modeling,FDM)3D打印機(jī)端將Marlin系統(tǒng)固件修改成一個不需執(zhí)行路徑規(guī)劃運算的軟件系統(tǒng)。
一般3D打印機(jī)在打印零件時是一邊編譯G代碼一邊執(zhí)行打印,所以G代碼的預(yù)處理就是將原本由3D打印機(jī)控制系統(tǒng)Marlin所需處理的G代碼程序移出至PC端先行編譯,然后輸入至打印機(jī)執(zhí)行打印。由于在原來的Marlin中打印時G代碼文件的處理都是依序讀入命令及運算處理再存入隊列架構(gòu)的塊緩沖器中,等待電機(jī)驅(qū)動程序提取,加上運算時絕大部分的運算參數(shù)皆為固定參數(shù)或是由前次運算產(chǎn)生,所以G代碼的預(yù)處理程序就是將一部分處理程序由3D打印機(jī)的控制系統(tǒng)“移植”到PC端由軟件來處理。
預(yù)處理程序工作可分為文件輸入與輸出、指令分析與字符轉(zhuǎn)換、指令運算處理3個部分,工作流程見圖1。
圖1 G代碼預(yù)處理程序流程圖Fig.1 G code preprocess flowchart
(1)文件的輸入與輸出。當(dāng)預(yù)處理程序開始時,會先根據(jù)輸入的文件名開啟文件,并建立文件名相同、后綴名為GPRE的預(yù)處理文件,并將預(yù)處理的結(jié)果存入該文件中。
(2)指令分析與字符轉(zhuǎn)換。以“行”為單位讀取文件內(nèi)容并分析,首先判斷該行的指令類別,對G預(yù)備功能指令或M輔助功能指令分別進(jìn)行處理;若為G預(yù)備功能指令,那么接著將由字符組成的G代碼指令中代表數(shù)值的部分轉(zhuǎn)換成數(shù)值,再將所轉(zhuǎn)出的功能參數(shù)分別存入相應(yīng)的暫存器中,供指令運算處理提取使用。
(3)指令運算處理。當(dāng)代碼指令分析完成后,根據(jù)指令的不同進(jìn)入各自的處理程序,并進(jìn)行判斷。①若為G預(yù)備功能命令,則進(jìn)入預(yù)備功能處理程序,再根據(jù)不同命令分別作如下不同處置:若G為G0或G1指令,由于G0和G1基本功能類似,G0和G1指令在Marlin中被視為同一功能,因此在執(zhí)行預(yù)處理時,也被視為同一功能,首先提取代表各移動軸移動的目標(biāo)點位置及移動速度參數(shù),再開始進(jìn)行路徑規(guī)劃,計算各軸電機(jī)移動參數(shù),運算結(jié)果按照本文規(guī)劃的文件封包格式存入預(yù)處理文件中;若為G92指令,則根據(jù)指令參數(shù)重設(shè)該軸位置參數(shù),下次運算時會以新位置參數(shù)來計算移動位置。②若為M輔助功能命令,則進(jìn)入輔助功能處理程序,由于輔助功能命令是作為變更內(nèi)部系統(tǒng)設(shè)定及動作的功能命令,無需預(yù)處理,因此所有輔助功能命令都是按照規(guī)劃的文件格式,直接轉(zhuǎn)換成數(shù)值封包存入預(yù)處理文件中的。
分析3D打印G代碼文件時會發(fā)現(xiàn),打印指令絕大部分都是由G1指令構(gòu)成的,因此G代碼預(yù)處理的工作重點就是連續(xù)的直線路徑規(guī)劃。直線路徑規(guī)劃的工作是輸入各軸目標(biāo)位置及目前速度后,計算目前位置移動到下一個位置時,控制步進(jìn)電機(jī)動作所需的各項參數(shù)。由于步進(jìn)電機(jī)在啟動時速度不能太大,必須要有一個加速過程,因此在G代碼文件預(yù)處理時,要規(guī)劃加減速算法,本文經(jīng)過綜合考慮,采用梯形加減速速度控制算法。經(jīng)計算產(chǎn)生的參數(shù)及說明見表1,表1中的步數(shù)是指步進(jìn)電機(jī)轉(zhuǎn)動一個步距角時,驅(qū)動執(zhí)行機(jī)構(gòu)所移動的直線位移。
由于預(yù)處理程序主要做G代碼路徑規(guī)劃的預(yù)先計算處理,所以本文將G代碼預(yù)處理后文件數(shù)據(jù)結(jié)構(gòu)分為兩類:一類是路徑規(guī)劃運算完成后所產(chǎn)生的數(shù)據(jù),另一類是不經(jīng)運算處理直接轉(zhuǎn)換成數(shù)據(jù)的狀態(tài)控制及輔助功能指令所產(chǎn)生的數(shù)據(jù)。這兩類數(shù)據(jù)封包格式分別為:①直線軌跡計算文件封包格式,用于記錄路徑規(guī)劃運算完成后所產(chǎn)生的數(shù)據(jù),封包大小為84字節(jié);②狀態(tài)控制及輔助功能指令封包格式,用于記錄不經(jīng)運算處理直接轉(zhuǎn)換成數(shù)據(jù)的指令,封包大小為12字節(jié)。本文規(guī)劃了開頭碼與結(jié)束碼作為每一段封包的識別標(biāo)記。
表1 采用梯形加減速控制算法的直線軌跡參數(shù)
為了保證大量微小線段的連續(xù)運行,避免在運動過程中出現(xiàn)停頓,G代碼預(yù)處理程序必須具備對多段微小線段進(jìn)行預(yù)讀的前瞻控制功能,提前優(yōu)化相鄰程序段轉(zhuǎn)接處速度和判別減速區(qū)域[5],實現(xiàn)程序轉(zhuǎn)折和減速區(qū)域的平滑過渡,從而避免沖擊,提高打印成形質(zhì)量。前瞻控制通過提前檢查將在某一特定程序段內(nèi)執(zhí)行的數(shù)據(jù),以驗證控制系統(tǒng)能否處理所要求的路徑,如果檢查結(jié)果顯示存在問題,就要對程序指令中速度進(jìn)行修正,包括相鄰程序段轉(zhuǎn)接處速度優(yōu)化算法、反向速度規(guī)劃算法及熔絲擠出速度優(yōu)化算法等。
1.3.1相鄰程序段轉(zhuǎn)接處速度優(yōu)化算法
已知
則
式中,δ為圖2中OA的長度,本文預(yù)設(shè)δ=0.1mm;θ為相鄰路徑段之間的夾角,即第一條路徑段終點處的進(jìn)給方向與第二條路徑段起點處的進(jìn)給方向之間的夾角。
圖2 連接速度計算示意圖Fig.2 Schematic diagram of connection speed calculation
1.3.2反向速度規(guī)劃算法
對于單個線性程序段來說,在插補(bǔ)過程中需要提前預(yù)測減速點,確定何時進(jìn)入減速區(qū)域,從而保證在系統(tǒng)運行到終點時,速度達(dá)到預(yù)定值[6]。切片軟件生成的G代碼多為微線段,對于連續(xù)微線段的插補(bǔ),由于線段長度很短,則減速點可能在上一個程序段中,甚至在轉(zhuǎn)接點之前多個程序段中,因此在插補(bǔ)過程中僅僅保證本程序段終點速度沒有超過最高限速是不行的。并且由于沒有預(yù)見到后面的減速情況,可能在插補(bǔ)到某個程序段處,基于減速能力的限制,系統(tǒng)無法減速到該程序段終點限制速度,從而產(chǎn)生過沖。
本文為了保證在打印過程中不產(chǎn)生過沖,G代碼預(yù)處理程序采用對所預(yù)讀的程序段進(jìn)行反向速度規(guī)劃的方式進(jìn)行速度規(guī)劃。該過程從預(yù)讀程序段的最后一段Nn開始反向計算各段程序Nj(j=1,2,…,n)所允許的最大初速度,具體計算方法是根據(jù)每段給定的末速度ve及運動距離s,以梯形加減速作為速度曲線進(jìn)行倒推,求得最大初速度vs,并將計算出的第Nj段允許的最大初速度作為第Nj-1段的最大允許末速度。
1.3.3熔絲擠出速度優(yōu)化算法
切層軟件生成的G代碼程序熔絲擠出速率一般為恒定的,然而,沿著刀具路徑的切向速度并不是保持恒定的,在接近程序段轉(zhuǎn)接處要減速,通過程序段轉(zhuǎn)接處又要加速,導(dǎo)致的結(jié)果是多余的熔料可能沉積在相鄰路徑轉(zhuǎn)接處[7]。
本文熔絲擠出速度優(yōu)化算法的目標(biāo)是:根據(jù)打印頭進(jìn)給速度的不同適當(dāng)調(diào)節(jié)熔絲擠出速率。為此,本文假定在打印過程中熔絲擠出速率與打印頭進(jìn)給速率保持一定的比例關(guān)系。具體算法為:預(yù)處理程序先前瞻一定的程序段,根據(jù)1.3.1節(jié)算法,已知前瞻程序段相鄰段之間的夾角,提前計算相鄰程序段轉(zhuǎn)接處速度,然后根據(jù)比例關(guān)系計算出熔絲擠出速率,將計算結(jié)果寫入相關(guān)表格中。由本文算法分析可知,在相鄰程序段轉(zhuǎn)接處,根據(jù)轉(zhuǎn)接處速度大小自動調(diào)整熔絲擠出速率,避免了多余的熔料沉積在轉(zhuǎn)接處,進(jìn)而提高了打印質(zhì)量。
由于本文采用了預(yù)處理機(jī)制,從而需對Marlin固件程序作部分修改,使得Marlin能夠接收及處理預(yù)處理程序完成的文件。由于原始Marlin文件的G代碼處理程序并非只處理打印時的G代碼文件,還包含系統(tǒng)工作時通過下達(dá)G代碼指令的方式執(zhí)行系統(tǒng)參數(shù)變更等工作,所以無法直接使用預(yù)處理程序取代原有的G代碼處理程序。本文采用兩者并存的方式,額外增加預(yù)處理機(jī)制以處理GPRE文件,并保留原有的工作模式,只在進(jìn)行文件讀取時增加了文件類型的判別及處理,而對原有的處理程序并未作任何改變。
預(yù)處理機(jī)制的Marlin文件處理程序如圖3所示,G代碼文件處理流程部分與原來相同。而新增加的GPRE文件處理部分則分為兩個部分,分別為文件封包的讀取及文件封包的處理。
圖3 預(yù)處理機(jī)制文件處理程序Fig.3 Preprocessing mechanism file processing procedure
(1)文件封包的讀取。在Marlin原來的讀取程序上,增加讀取文件類型判斷,若為GPRE文件則會進(jìn)入封包接收模式讀取封包資料,并在接收完成后存入為預(yù)處理機(jī)制新增加的緩沖區(qū)中,等待封包處理程序提取。
(2)文件封包的處理。由于在執(zhí)行預(yù)處理時已將封包分為兩類,因此文件封包的處理只需判斷封包的類型即可,若為直線軌跡,計算文件封包則直接將文件提取存入運動塊緩沖區(qū)交由電機(jī)驅(qū)動程序使用,若為其他指令封包格式,則在判斷指令功能后交由相關(guān)程序執(zhí)行,因為所有指令參數(shù)皆為數(shù)值類型,較原有的G代碼處理程序節(jié)省了字符-數(shù)值間的轉(zhuǎn)換時間,因此減少了處理流程。
本文將G代碼文件結(jié)構(gòu)分為打印前準(zhǔn)備、打印中及打印結(jié)束3個部分,分別分析如下。
(1)打印前準(zhǔn)備。多為設(shè)定指令,用于打印前設(shè)定各項參數(shù)等工作。
(2)打印中。大多由直線移動指令組成,還有些風(fēng)扇設(shè)定指令,用于控制打印時的風(fēng)量及開關(guān)。
(3)打印結(jié)束。與打印前準(zhǔn)備相同,多為設(shè)定指令,用于打印結(jié)束時設(shè)定相關(guān)參數(shù),執(zhí)行關(guān)閉風(fēng)扇并使各軸電機(jī)回零等工作。
為了能夠比較G代碼預(yù)處理機(jī)制與原始處理機(jī)制在程序運作上的效率差異,本文選擇程序執(zhí)行時間作為兩者執(zhí)行效率差異的依據(jù)。由于所有的G代碼指令中,G1移動指令的處理是本文預(yù)處理的重點,其程序執(zhí)行時間最能比較出兩者之間的差異,因此以G1指令處理程序的執(zhí)行時間作為比較量,并且將整個處理程序分為三個階段(圖4)分別測量其執(zhí)行時間,三階段的分段說明如下。
圖4 處理程序執(zhí)行三階段Fig.4 Three stages of processing program execution
(1)指令讀取時間。比較預(yù)處理機(jī)制和原始處理機(jī)制的從系統(tǒng)中讀取程序到將程序發(fā)送到命令緩沖區(qū)的時間。
(2)指令執(zhí)行準(zhǔn)備時間。比較由命令緩沖區(qū)提出,預(yù)處理機(jī)制與原始處理機(jī)制執(zhí)行指令分析處理,到路徑規(guī)劃前的預(yù)備處理時間。
(3)路徑規(guī)劃時間。比較原始處理機(jī)制進(jìn)入路徑規(guī)劃并將數(shù)據(jù)輸入到緩沖區(qū)時間與預(yù)處理機(jī)制進(jìn)入數(shù)據(jù)復(fù)制并將所有參數(shù)輸入到緩沖區(qū)的時間。
實驗以μs作為測量的時間單位,使用文件內(nèi)容只有G1指令的G代碼文件與同樣文件進(jìn)行預(yù)處理轉(zhuǎn)換后的GPRE文件作為測量用的測試文件,分別測量三個階段程序的執(zhí)行時間,每一階段皆取前100次測量時間進(jìn)行記錄,整理各階段平均執(zhí)行時間及總時間,結(jié)果如圖5所示。下面針對每一階段測量結(jié)果進(jìn)行分析和討論。
圖5 程序執(zhí)行階段時間比較圖Fig.5 Time comparison diagram of the program execution phase
(1)指令讀取時間。本文采用串口將經(jīng)過預(yù)處理機(jī)制后的GPRE文件傳輸?shù)組arlin控制器中,在串口傳輸速率設(shè)定為57 600 bit/s時,文件讀取時間為圖5中第一階段黑色柱形圖所表示的時間,而原始G代碼指令讀取時間為第一階段中白色柱形圖所表示的時間。由圖5可以看出,在相同的傳輸條件下,采用預(yù)處理機(jī)制后文件讀取時間較長,這是因為預(yù)處理后的G1文件封包長度(84字節(jié))為原始G代碼G1指令平均長度(28字節(jié))的3倍。
(2)指令執(zhí)行準(zhǔn)備時間。當(dāng)程序進(jìn)入處理程序時,經(jīng)過預(yù)處理后的文件平均處理時間為85 μs,為原始G代碼程序處理時間的20%;由測量結(jié)果發(fā)現(xiàn),預(yù)處理機(jī)制在這一部分只做數(shù)據(jù)轉(zhuǎn)移及判斷的動作,因此大部分的時間固定為85 μs,而原始G代碼處理程序中有許多判斷式,每次的程序流程都不一樣,所以每次時間都不固定,在250~500 μs之間。
(3)路徑規(guī)劃時間。預(yù)處理機(jī)制在這一個階段的執(zhí)行時間平均為50 μs,因為預(yù)處理程序在這個部分只有建立新的運動塊緩沖區(qū)及將數(shù)據(jù)復(fù)制到緩沖區(qū)中的操作,而原始機(jī)制在這個階段需要執(zhí)行路徑規(guī)劃運算,因此平均執(zhí)行時間達(dá)到1 000 μs左右。
雖然預(yù)處理機(jī)制在第一階段耗費的時間較長,但在第二及第三階段耗費的時間明顯比原始G代碼處理機(jī)制時間要少。通過計算分析,由圖5可以看出,預(yù)處理機(jī)制執(zhí)行總時間約為原始G代碼處理機(jī)制執(zhí)行總時間的80%。
本文采用相同打印材料及工況,使用原始機(jī)制及G代碼預(yù)處理機(jī)制分別實際打印同一個三維模型,打印結(jié)果如圖6所示。就打印品質(zhì)來說,經(jīng)過G代碼預(yù)處理后,作品品質(zhì)有了一定的提升,主要表現(xiàn)在圖6b作品的輪廓更完整,外觀平整度更好,在輪廓轉(zhuǎn)接處沒有多余熔料堆積,這主要歸結(jié)于圖6b作品在預(yù)處理機(jī)制中使用了前瞻控制算法。
(a)原始機(jī)制(b)G代碼預(yù)處理機(jī)制圖6 實際打印作品Fig.6 Actual printing works
本文在原有3D打印機(jī)控制系統(tǒng)Marlin固件文件處理架構(gòu)上加以變化,提出將G代碼于PC端進(jìn)行預(yù)處理后再輸入3D打印機(jī)中進(jìn)行打印操作,實驗測量和實際打印結(jié)果表明,此方法改善了打印品質(zhì),同時提升了文件處理的速度及效率,減少了打印機(jī)處理器系統(tǒng)負(fù)擔(dān)并可為控制系統(tǒng)留下更多的擴(kuò)展空間。