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