黃繼威,林述溫,周小宇
(福州大學(xué) 機(jī)械工程及自動(dòng)化學(xué)院,福建 福州 350116)
開(kāi)放式數(shù)控系統(tǒng)的出現(xiàn)為智能數(shù)控技術(shù)的發(fā)展創(chuàng)造了有利條件。堅(jiān)持走數(shù)控系統(tǒng)開(kāi)放化的技術(shù)路線,跟蹤掌握數(shù)控技術(shù)的最新進(jìn)展,解決其中的關(guān)鍵技術(shù),有利于為新一代國(guó)產(chǎn)開(kāi)放式數(shù)控系統(tǒng)的研制打下堅(jiān)實(shí)的基礎(chǔ)[1-2]。解釋器是數(shù)控系統(tǒng)的核心部分之一,數(shù)控系統(tǒng)解釋器通過(guò)獲取ISO標(biāo)準(zhǔn)的數(shù)據(jù)指令,并將其轉(zhuǎn)換為內(nèi)部命令用來(lái)控制機(jī)床和執(zhí)行數(shù)控系統(tǒng)的輔助功能。數(shù)控機(jī)床采用G代碼來(lái)完成這些操作[3-4]。如何準(zhǔn)確、高效地對(duì)數(shù)控程序代碼進(jìn)行譯碼就成為數(shù)控系統(tǒng)開(kāi)發(fā)過(guò)程中的關(guān)鍵問(wèn)題。
鑒于高速高精、大數(shù)據(jù)量處理要求和開(kāi)放式數(shù)控系統(tǒng)發(fā)展趨勢(shì),基于Linux平臺(tái)開(kāi)發(fā)了一種低成本、柔性化、可配置的開(kāi)放式數(shù)控系統(tǒng)?,F(xiàn)有的數(shù)控譯碼解釋器進(jìn)行譯碼的方式主要有兩種:編譯式譯碼和解釋式譯碼。編譯式一次性解析所有加工程序,速度快,但占用較大的系統(tǒng)資源。解釋式每次只解析一段加工程序,結(jié)構(gòu)簡(jiǎn)單,要求譯碼速度足夠快以滿足后續(xù)插補(bǔ)模塊對(duì)加工數(shù)據(jù)的要求,這種方式對(duì)實(shí)時(shí)性的要求較為苛刻。
為滿足本數(shù)控系統(tǒng)粗精異步插補(bǔ)的需求,實(shí)現(xiàn)高速高精運(yùn)動(dòng)控制,通過(guò)對(duì)以上兩種方式的分析,結(jié)合其各自的優(yōu)點(diǎn),采用緩沖區(qū)中斷機(jī)制進(jìn)行分段預(yù)讀譯碼,避免了資源浪費(fèi)和實(shí)時(shí)性要求高的問(wèn)題,并開(kāi)發(fā)不同類型的五軸譯碼解釋器以滿足數(shù)控系統(tǒng)的可配置功能要求。
目前,國(guó)際上通用的數(shù)控機(jī)床的加工程序主要基于標(biāo)準(zhǔn) ISO 6983 的G、M代碼語(yǔ)言編寫(xiě)而成的。最常用的程序段字地址格式如下所示:
Nxxx Gxx Xxx Yxx Zxx Fxx Sxx Txx Mxx
解釋器譯碼流程如圖1所示。首先,在本數(shù)控系統(tǒng)中數(shù)控程序的文件格式為***.ncc,解釋器識(shí)別該格式文件的并初始化寄存器,然后逐行讀取數(shù)控程序代碼文件,經(jīng)預(yù)處理過(guò)濾去除掉多余的注釋信息和空格,得到有效的字符程序段;接著執(zhí)行詞法分析和語(yǔ)法分析,若出現(xiàn)錯(cuò)誤則返回錯(cuò)誤編號(hào)進(jìn)行錯(cuò)誤處理并在人機(jī)界面顯示錯(cuò)誤信息,否則,將計(jì)算結(jié)果保存在預(yù)讀寄存器中。若有刀具補(bǔ)償指令就調(diào)用刀具補(bǔ)償模塊進(jìn)行刀具補(bǔ)償;計(jì)算并將底層控制指令存儲(chǔ)到執(zhí)行寄存器中,最后將指令添加到命令緩沖區(qū)中,若命令緩沖區(qū)的數(shù)據(jù)未達(dá)設(shè)定的值,那么就繼續(xù)讀取下一行數(shù)控程序代碼,若緩沖區(qū)已滿,則譯碼模塊處于等待狀態(tài),等待任務(wù)管理器的再次調(diào)用。
圖1 數(shù)控程序解釋器譯碼流程
編譯式譯碼是一次性地將加工程序進(jìn)行譯碼工作,譯碼完成后得到的數(shù)據(jù)全部交給后續(xù)模塊。當(dāng)代碼量大時(shí),一次性地將代碼進(jìn)行譯碼處理需要耗費(fèi)較多時(shí)間,對(duì)系統(tǒng)實(shí)時(shí)性要求較高,增加系統(tǒng)成本。
解釋式譯碼是將一行的數(shù)控程序代碼作為每一次譯碼的處理對(duì)象,完成當(dāng)前代碼行的譯碼后,立即將譯碼數(shù)據(jù)交由后續(xù)模塊進(jìn)行處理,機(jī)床執(zhí)行動(dòng)作,如此往復(fù),直至整個(gè)代碼文件翻譯完畢。整個(gè)譯碼的過(guò)程是以串行方式運(yùn)行,譯碼模塊必須為插補(bǔ)模塊及時(shí)提供足夠的數(shù)據(jù),如果某條指令譯碼過(guò)程耗費(fèi)的時(shí)間比較長(zhǎng),而插補(bǔ)模塊已無(wú)數(shù)據(jù)可用,就會(huì)造成數(shù)控機(jī)床短時(shí)暫停。
經(jīng)過(guò)對(duì)編譯式和解釋式的分析比較,提出了中斷型預(yù)讀譯碼方式。如圖2所示,首先在數(shù)控系統(tǒng)中設(shè)置預(yù)讀段數(shù)(M+N),數(shù)控加工時(shí),譯碼模塊先讀取(M+N)段代碼,并將譯碼后的數(shù)據(jù)按順序存儲(chǔ)到軌跡命令環(huán)形緩沖區(qū)中,但執(zhí)行完N段數(shù)控代碼后,產(chǎn)生中斷命令,系統(tǒng)再次調(diào)用譯碼模塊進(jìn)行譯碼,確保緩沖區(qū)不被插補(bǔ)模塊讀空,保證插補(bǔ)模塊運(yùn)行的連續(xù)性。
為了確保命令的連續(xù)性,本研究中的M值由前瞻速度處理段數(shù)決定,為了使得指令獲取命令隊(duì)列連貫,實(shí)驗(yàn)中的N選取為M的2倍;由于本數(shù)控系統(tǒng)前瞻速度處理段數(shù)為7,故設(shè)置1個(gè)先進(jìn)先出的環(huán)形緩沖區(qū),該緩沖區(qū)大小為21,緩沖區(qū)的管理采用指針來(lái)實(shí)現(xiàn)。當(dāng)人機(jī)界面調(diào)用譯碼子模塊進(jìn)行加工前軌跡模擬時(shí)則采用類似于編譯式譯碼方式逐段解析全部的數(shù)控代碼,但解析一行代碼后的數(shù)據(jù)并不進(jìn)行存儲(chǔ),而是直接將數(shù)據(jù)送到加工仿真界面進(jìn)行顯示,如此反復(fù)直到所有刀位點(diǎn)連接為加工軌跡,提前檢查加工軌跡的正確性。
圖2 中斷型譯碼機(jī)制
中斷型預(yù)讀式譯碼的核心思想就是在數(shù)控加工流程中在譯碼模塊數(shù)據(jù)生產(chǎn)和插補(bǔ)模塊消費(fèi)之間設(shè)置一定的緩存區(qū),并采用中斷機(jī)制,用緩存區(qū)的空間占有和中斷機(jī)制來(lái)降低譯碼模塊和插補(bǔ)模塊的同步要求,加大操作時(shí)域裕度,避免了整體式譯碼引起的系統(tǒng)資源浪費(fèi)問(wèn)題,并且克服了解釋式譯碼由于實(shí)時(shí)性差造成的譯碼數(shù)據(jù)獲取不連貫導(dǎo)致數(shù)控機(jī)床短時(shí)暫停的問(wèn)題,提高了系統(tǒng)的運(yùn)行效率。
在解釋器中,設(shè)計(jì)了3個(gè)寄存器用于存儲(chǔ)譯碼數(shù)據(jù)。按照數(shù)據(jù)流方向分別為數(shù)控代碼預(yù)讀寄存器、當(dāng)前狀態(tài)寄存器和執(zhí)行寄存器,這3個(gè)寄存器用來(lái)存儲(chǔ)解釋器執(zhí)行過(guò)程中產(chǎn)生的所有譯碼數(shù)據(jù)。其中,預(yù)讀寄存器是用來(lái)存儲(chǔ)將要執(zhí)行的下一行的數(shù)控程序代碼;當(dāng)前狀態(tài)寄存器是用來(lái)存儲(chǔ)當(dāng)前數(shù)控系統(tǒng)的運(yùn)行狀態(tài)信息;執(zhí)行寄存器是用來(lái)存儲(chǔ)已完成分類封裝的可以用于控制層執(zhí)行的底層控制指令。
1) 預(yù)讀寄存器
如圖3所示,預(yù)讀寄存器中主要用來(lái)存儲(chǔ)經(jīng)過(guò)詞法分析和語(yǔ)法分析后,提取一行數(shù)控程序代碼的有效加工信息,存儲(chǔ)一行數(shù)控程序中出現(xiàn)的所有詞并保存相應(yīng)的參數(shù)數(shù)值。在數(shù)控程序語(yǔ)言中最小的語(yǔ)法單位是一個(gè)“詞”,一個(gè)G代碼、M代碼、軸坐標(biāo)或者其他加工參數(shù)都稱為一個(gè)詞。并且當(dāng)前程序段的代碼、程序段說(shuō)明等也將進(jìn)行存儲(chǔ),并保留了當(dāng)前有效模態(tài)代碼、代碼和運(yùn)動(dòng)代碼的空間。由于在一行數(shù)控程序中所有的詞不太可能同時(shí)出現(xiàn),因此在數(shù)據(jù)結(jié)構(gòu)中一個(gè)詞對(duì)應(yīng)著兩個(gè)不同的變量,開(kāi)關(guān)類型的變量表示該詞是否出現(xiàn),參數(shù)類型用來(lái)保存相應(yīng)的參數(shù)值。
預(yù)讀寄存器中存儲(chǔ)的代碼段結(jié)構(gòu)體CNC_LINECODE_STRUCT的基本定義如以下代碼所示:
typedef struct CNC_LINECODE_STRUCT
{
int nNumber; //行號(hào)
int gCodes[G_GROUP] ; // 存儲(chǔ)G代碼
int mCodes[M_GROUP] ; // 存儲(chǔ)M代碼
ON_OFF aFlag; //是否有A坐標(biāo)值的標(biāo)志
double aNumber; // A坐標(biāo)值
…
char comment[COMMENT_LEN] ; // 存儲(chǔ)程序段注釋
}LineCodeStruct;
圖3 預(yù)讀寄存器結(jié)構(gòu)
2) 當(dāng)前狀態(tài)寄存器
如圖4所示,當(dāng)前狀態(tài)寄存器是一個(gè)用來(lái)存儲(chǔ)解釋器的全局信息和所有加工參數(shù)的全局?jǐn)?shù)據(jù),解釋器內(nèi)所有模塊都將對(duì)該數(shù)據(jù)進(jìn)行相應(yīng)的操作。主要的數(shù)據(jù)有:G代碼文件名、當(dāng)前有效的模態(tài)G代碼和M代碼、加工點(diǎn)的當(dāng)前坐標(biāo)、當(dāng)前編程坐標(biāo)系原點(diǎn)偏移、刀位點(diǎn)所處平面等主要信息。
與該寄存器相對(duì)應(yīng)的當(dāng)前狀態(tài)數(shù)據(jù)結(jié)構(gòu)體CNC_SETTING_STRUCT的基本定義如下:
typedef struct CNC_SETTING_STRUCT
{
char filename[NAME_LEN] ; // 程序文件名
int gCodes[G_GROUP] ; // G代碼
int mCodes[M_GROUP] ; // M代碼
double xCurrent; // 加工點(diǎn)當(dāng)前x坐標(biāo)
…
double xOriginOffset; //編程坐標(biāo)系原點(diǎn)x軸偏移
ACTIVE_PLANE plane; //刀位點(diǎn)所處平面
}SettingStruct;
圖4 當(dāng)前狀態(tài)寄存器結(jié)構(gòu)
3) 執(zhí)行寄存器
如圖5所示,執(zhí)行寄存器中主要存儲(chǔ)控制層可以直接識(shí)別并執(zhí)行的命令消息,解釋器執(zhí)行過(guò)程中通過(guò)NML提供的append(NMLmsg) 函數(shù)將命令消息送到執(zhí)行寄存器中。其主要存儲(chǔ)了直線運(yùn)動(dòng)指令、圓弧運(yùn)動(dòng)指令、延時(shí)指令、換到指令、開(kāi)關(guān)量控制指令等。以圓弧運(yùn)動(dòng)指令為例,
class CNC_TRAJ_CIRCLE_MOVE:public CNC_TRAJ_CMD_MSG
{
public:
CNC_TRAJ_CIRCLE_MOVE():
CNC_TRAJ_CMD_MSG(CNC_TRAJ_CIRCLE_MOVE_TYPE,
sizeof(CNC_TRAJ_CIRCLE_MOVE));
void update(CMS * cms); // 狀態(tài)更新函數(shù)
PoseStruct endPt; //圓弧終點(diǎn)
CartesianStruct center; //圓弧圓心
CartesianStruct normal; //圓弧法向
int turn; //圓弧方向
int type; //圓弧類型
double vel,maxVel,acc; //速度,最大速度,加速度
};
圖5 執(zhí)行寄存器結(jié)構(gòu)
在Linux系統(tǒng)平臺(tái)上,搭建了基于PC+可編程IO卡的開(kāi)放式數(shù)控系統(tǒng)?;谝陨蠈?duì)解釋器譯碼的研究,對(duì)解釋器相應(yīng)的寄存器、預(yù)處理模塊、詞法分析模塊、語(yǔ)法分析模塊等進(jìn)行了擴(kuò)展,開(kāi)發(fā)了五軸X-Y-Z-A-C型、X-Y-Z-A-B型解釋器,用以支持五軸數(shù)控系統(tǒng)譯碼功能,并為數(shù)控系統(tǒng)的可配置功能提供配置項(xiàng)。
如圖6所示,數(shù)控系統(tǒng)解釋器正在執(zhí)行1個(gè)五軸數(shù)控加工程序的譯碼。將X-Y-Z-A-C型譯碼解釋器配置到所開(kāi)發(fā)的數(shù)控系統(tǒng)中。從圖6(a)中可以看出,該數(shù)控程序解釋編譯并未發(fā)現(xiàn)錯(cuò)誤。而當(dāng)數(shù)控加工程序中出現(xiàn)“B”或“b”時(shí),如圖6(b)所示,人機(jī)界面中出現(xiàn)錯(cuò)誤提示“其他非法的數(shù)控代碼或符號(hào)存在”,并且準(zhǔn)確定位到所處行數(shù)。這是由于所開(kāi)發(fā)的解釋器是X-Y-Z-A-C型的,無(wú)法識(shí)別含“B”或“b”字符的數(shù)控加工程序,所以在詞析階段就顯示錯(cuò)誤提示。
圖6 解釋器X-Y-Z-A-C型五軸譯碼結(jié)果比較
同樣,如圖7所示,在所開(kāi)發(fā)的數(shù)控系統(tǒng)中的譯碼解釋器配置為X-Y-Z-A-B型。在圖7(a)中該解釋器能夠識(shí)別數(shù)控程序中的“B”代碼并完成譯碼功能。在圖7(b)無(wú)法識(shí)別“C”代碼,故在人機(jī)界面中提示第9行有錯(cuò)誤:“其他非法的數(shù)控代碼或符號(hào)存在”。并且系統(tǒng)能夠及時(shí)地識(shí)別出不符合規(guī)則的代碼段,如第6行錯(cuò)誤:“同一行中存在兩個(gè)字符B”,第8行錯(cuò)誤:“B字符后面不存在數(shù)字”。
圖7 解釋器X-Y-Z-A-B型五軸譯碼結(jié)果比較
如圖8所示,以X-Y-Z-A-C型為例,將譯碼成功的五軸加工程序輸送到加工仿真模塊進(jìn)行模擬仿真。實(shí)驗(yàn)結(jié)果證明:所開(kāi)發(fā)的解釋器符合預(yù)期的要求,能夠較好地實(shí)現(xiàn)五軸數(shù)控加工程序的譯碼并進(jìn)行仿真加工。
圖8 解釋器X-Y-Z-A-C型五軸模擬仿真
為了驗(yàn)證本譯碼解釋器能夠?yàn)楹罄m(xù)的處理模塊提供正確的譯碼數(shù)據(jù),采用圖8中的五軸數(shù)控程序,以直線加減速算法為例進(jìn)行了仿真實(shí)驗(yàn)。直線加減速參數(shù)設(shè)定為:進(jìn)給速度F為500mm/min,各直線軸的最大允許速度為3 000mm/min,各軸最大加速度為1 000mm/s2。如圖9所示為所獲得的進(jìn)給速度曲線圖??芍?,解釋器為后續(xù)的速度處理模塊提供了正確的譯碼數(shù)據(jù),能夠滿足數(shù)控系統(tǒng)的加工需求。
圖9 進(jìn)給速度曲線圖
基于Linux平臺(tái)開(kāi)發(fā)了數(shù)控程序解釋器,該解釋器采用緩沖區(qū)中斷機(jī)制進(jìn)行分段預(yù)讀譯碼,避免了PC機(jī)資源浪費(fèi)和由于實(shí)時(shí)性差導(dǎo)致的指令獲取不連續(xù)的問(wèn)題;并且該解釋器根據(jù)模塊化設(shè)計(jì)思路,采用面向?qū)ο蠹夹g(shù)進(jìn)行開(kāi)發(fā)不同類型的五軸譯碼解釋器,滿足可配置功能需求。程序結(jié)構(gòu)簡(jiǎn)單明了,代碼簡(jiǎn)潔高效,具有良好的開(kāi)放性和通用性。經(jīng)過(guò)實(shí)驗(yàn)證明,該解釋器實(shí)現(xiàn)了對(duì)數(shù)控機(jī)床各種指令和功能的正確解釋譯碼,完全可以用于計(jì)算機(jī)實(shí)際加工和仿真。該編譯器在開(kāi)放式數(shù)控系統(tǒng)的開(kāi)發(fā)、可配置功能的實(shí)現(xiàn)和數(shù)控虛擬仿真軟件的開(kāi)發(fā)方面有很好的應(yīng)用前景。