□ 趙仁兵 □ 劉金科
宜賓市普什模具有限公司 四川宜賓 644000
目前,Unigraphics NX軟件擁有強(qiáng)大的計(jì)算機(jī)輔助設(shè)計(jì)和計(jì)算機(jī)輔助制造集成功能[1],應(yīng)用廣泛。在企業(yè)編程部門,由于編程人員的習(xí)慣不同,編程規(guī)范不同,企業(yè)很難制定統(tǒng)一的技術(shù)標(biāo)準(zhǔn)。隨著設(shè)計(jì)產(chǎn)品的復(fù)雜化,每個(gè)產(chǎn)品加工都需要使用Unigraphics NX軟件輔助編程。Unigraphics NX軟件自帶的后置處理器每次只能處理一個(gè)數(shù)控程序,并且不對操作中可能包含的錯(cuò)誤進(jìn)行檢查。對此,編程人員需對大量程序進(jìn)行錯(cuò)誤檢查和后置處理,浪費(fèi)大量時(shí)間和精力。筆者利用Unigraphics NX軟件的二次開發(fā)功能,結(jié)合Visual Studio 2005開發(fā)環(huán)境,設(shè)計(jì)批量后置軟件,提供批量后處理、錯(cuò)誤預(yù)警、刀具報(bào)告等功能。應(yīng)用這一批量后置軟件,可以提高Unigraphics NX軟件后置處理效率,減少加工事故。
Unigraphics NX是一款功能強(qiáng)大的計(jì)算機(jī)輔助設(shè)計(jì)與制造軟件,不僅可以通過用戶界面操作來控制、實(shí)現(xiàn)功能,而且能夠提供多種應(yīng)用程序接口對內(nèi)部對象進(jìn)行訪問。應(yīng)用程序接口是Unigraphics NX軟件與外部應(yīng)用程序之間的接口,是Unigraphics NX軟件二次開發(fā)工具提供的一系列函數(shù)和過程的集合[2]。通過這些應(yīng)用程序接口,用戶可以擴(kuò)展Unigraphics NX軟件的功能,實(shí)現(xiàn)與Unigraphics NX軟件的無縫集成。
Unigraphics NX應(yīng)用程序接口支持多種開發(fā)語言和多種操作系統(tǒng),軟件功能的覆蓋率超過90%,不同Unigraphics NX軟件版本間的一致性良好。
Unigraphics NX軟件內(nèi)部采用統(tǒng)一對象模型來描述對象及其操作,用戶界面操作和應(yīng)用程序接口都構(gòu)建于統(tǒng)一對象模型之上,確保了應(yīng)用程序接口與用戶界面操作訪問的都是內(nèi)部統(tǒng)一對象模型[3]?;诓煌_發(fā)語言的應(yīng)用程序接口都由同一個(gè)內(nèi)部對象轉(zhuǎn)化而來,無論用戶采用何種開發(fā)語言的應(yīng)用程序接口,其調(diào)用的實(shí)質(zhì)都是同一個(gè)內(nèi)核函數(shù),從而實(shí)現(xiàn)了開發(fā)語言無關(guān)性和平臺(tái)無關(guān)性,用戶可以選擇自己擅長的開發(fā)語言,提高開發(fā)速度。
(1) GRIP開發(fā)包[4]。GRIP是一種解釋性的編程語言,能實(shí)現(xiàn)Unigraphics NX軟件交互界面下的所有功能操作。GRIP具有簡單易學(xué)、運(yùn)行效率高、不長駐內(nèi)存等特點(diǎn),深受開發(fā)人員喜愛。但是,Unigraphics NX軟件在新版本中停止對GRIP開發(fā)包的更新。另一方面,GRIP在交互界面對話框中函數(shù)單一,開發(fā)較大項(xiàng)目時(shí)用戶的交互受限。可見,GRIP適用于簡單的二次開發(fā)。
(2) Unigraphics/Open開發(fā)包。Unigraphics/Open是基于C語言的二次開發(fā)應(yīng)用程序接口,包括3 000多個(gè)C語言函數(shù),功能強(qiáng)大,適合企業(yè)高級開發(fā)人員使用。Unigraphics/Open直接構(gòu)建于內(nèi)部代碼上,運(yùn)行效率較高,能夠?qū)崿F(xiàn)Unigraphics NX軟件大部分功能。Unigraphics/Open需要C語言和軟件工程等技術(shù)的支持,因此適合中高級用戶使用。
(3) KF開發(fā)包。KF是應(yīng)用于知識(shí)熔接技術(shù)的由求解需求驅(qū)動(dòng)的解釋性面向?qū)ο蟮恼Z言,是基于知識(shí)工程智能化的二次開發(fā)應(yīng)用程序接口,具有靈活、易學(xué)、可由知識(shí)驅(qū)動(dòng)等特點(diǎn),適合企業(yè)或第三方軟件公司進(jìn)行專家系統(tǒng)開發(fā)。
(4) NXOpen開發(fā)包。NXOpen是完全面向?qū)ο蟮亩伍_發(fā)應(yīng)用程序接口,支持多種操作系統(tǒng)和多種開發(fā)語言,涵蓋了Unigraphics NX軟件絕大部分功能。用戶可以通過系統(tǒng)日志功能直接錄制Unigraphics NX軟件操作,生成代碼,用于研究Unigraphics NX軟件的系統(tǒng)架構(gòu)、運(yùn)行原理,并可以通過修改代碼來提高開發(fā)速度。NXOpen適合企業(yè)和第三方公司進(jìn)行功能定制開發(fā)。
在Unigraphics NX軟件計(jì)算機(jī)輔助制造模塊中,計(jì)算機(jī)輔助制造導(dǎo)航器包含四個(gè)視圖,每個(gè)視圖對應(yīng)不同的操作和功能。在不同的視圖下,用戶可以方便地對程序進(jìn)行快捷修改和定義。計(jì)算機(jī)輔助制造導(dǎo)航器視圖如圖1所示。
▲圖1 計(jì)算機(jī)輔助制造導(dǎo)航器視圖
程序順序視圖是計(jì)算機(jī)輔助制造操作的主要視圖,便于數(shù)控程序文檔層次管理,如圖2所示。機(jī)床視圖主要用于刀具定義和管理。幾何視圖主要用于加工坐標(biāo)系和加工過程幾何定義與管理。加工方法視圖主要用于公共銑削參數(shù)管理。
批量后置軟件的設(shè)計(jì)內(nèi)容主要包括人機(jī)交互界面獲取用戶選擇、讀寫用戶配置文件、讀寫后處理配置文件、錯(cuò)誤校驗(yàn)等。批量后置軟件的工作流程如圖3所示。
▲圖2 程序順序視圖▲圖3 批量后置軟件工作流程
獲取用戶選擇的程序指獲取用戶在Unigraphics NX軟件計(jì)算機(jī)輔助制造導(dǎo)航器中選擇的程序。獲取后置器模板指讀取后置文件template_post.dat中的后置器配置列表。獲取.tcl文件配置指讀取后置器所指向的.tcl配置文件,獲取數(shù)控程序后綴。獲取用戶配置指對話框載入時(shí),讀入用戶配置。對話框退出時(shí),保存用戶配置。初始化用戶界面指初始化用戶界面參數(shù),配置用戶的前一次默認(rèn)設(shè)置。安全檢查包括加工坐標(biāo)系、刀具號(hào)、刀具參數(shù)、程序號(hào)檢查等。批量后置輸出報(bào)告指遍歷用戶選取的程序,按規(guī)則對每個(gè)程序做后置處理,輸出程序報(bào)告、刀具報(bào)告、警告信息。
批量后置軟件人機(jī)交互界面設(shè)計(jì)時(shí)使用了Block Styled 用戶界面生成器模塊[5],所設(shè)計(jì)的人機(jī)交互界面如圖4所示。人機(jī)交互界面主要包括后置配置列表、數(shù)控文件輸出目錄、單位定義、錯(cuò)誤校驗(yàn)等控件。Block Styled用戶界面生成器模塊保存對話框內(nèi)容時(shí),會(huì)自動(dòng)生成.dlx文件和.c文件。.dlx文件是對話框二進(jìn)制定義文件,開發(fā)時(shí)復(fù)制到運(yùn)行目錄。.c文件可根據(jù)開發(fā)語言的不同,選擇相應(yīng)的配置來生成對應(yīng)的開發(fā)工具代碼。
▲圖4 批量后置軟件人機(jī)交互界面
在Unigraphics NX軟件計(jì)算機(jī)輔助制造導(dǎo)航器中實(shí)現(xiàn)批量數(shù)控程序后置輸出的基本原理是:獲取用戶在計(jì)算機(jī)輔助制造導(dǎo)航器中選擇的程序,遍歷程序中包含的操作和組,按對應(yīng)程序保存到內(nèi)部鏈表中;對所有操作和組進(jìn)行安全規(guī)則檢查,通過安全規(guī)則檢查后,遍歷獲得的所有操作,獲取操作對應(yīng)的加工坐標(biāo)系和刀具信息[6];按順序后置處理每個(gè)數(shù)控程序,保存到指定文件夾,同時(shí)輸出相關(guān)信息報(bào)表。批量后置軟件運(yùn)行原理如圖5所示。
Unigraphics NX軟件計(jì)算機(jī)輔助制造導(dǎo)航器相關(guān)操作函數(shù)如下:
UFSession.GetUFSession();//獲取會(huì)話[7]。
public void AskApplicationModule(out int module_id);//若module_id的值是16,則為計(jì)算機(jī)輔助制造應(yīng)用模塊。在Unigraphics NX軟件中,相關(guān)函數(shù)必須在相應(yīng)應(yīng)用模塊中才能工作,所以要實(shí)現(xiàn)在計(jì)算機(jī)輔助制造編程操作,必須保證當(dāng)前應(yīng)用模塊為計(jì)算機(jī)輔助制造模塊。
▲圖5 批量后置軟件運(yùn)行原理
public void AskView(out UFUiOnt.TreeMode view);//查詢計(jì)算機(jī)輔助制造導(dǎo)航器中當(dāng)前視圖。
public void SwitchView(UFUiOnt.TreeMode view);//切換當(dāng)前視圖。
public void AskSelectedNodes(out int count,out Tag[]objects);//獲取計(jì)算機(jī)輔助制造導(dǎo)航器視圖中選定的程序,目標(biāo)可能是操作或組,編程時(shí)需進(jìn)行類型判斷,再進(jìn)行不同操作。
public void OptAskPostNames(out int count,out string[]names);//獲取后置文件template_plot.dat中后置器配置列表[8]。
public void AskMemberList(Tag obj_tag,out int count,out Tag[]list);//獲取一個(gè)組中包含的成員列表,可能是組或操作,使用時(shí)需作類型判斷。
public bool IsGroup(CAMObject camObject);//判斷一個(gè)目標(biāo)是否為組。
public void AskSetup(out Tag setup_tag);//查詢當(dāng)前設(shè)置的目標(biāo)。
public void AskProgramNull(Tag setup_tag,out Tag program_null);//查詢當(dāng)前設(shè)置下視圖的空組。
public void AskName(Tag object_id,out string name);//查詢目標(biāo)名稱。
public void AskCutterGroup(Tag oper,out Tag group);//查詢當(dāng)前操作使用的刀具。
public void AskGeomGroup(Tag oper,out Tag group);//查詢當(dāng)前操作使用的加工坐標(biāo)系。
public void GenerateProgram(Tag setup,Tag group,string post_name,string output_filename,UFSetup.outputUnits output_units);//生成數(shù)控程序函數(shù)。使用該函數(shù)時(shí),一個(gè)組下的所有操作會(huì)合并為數(shù)控程序輸出。
public void IsListingWindow Open(out bool response);//查詢信息窗口是否已打開。
public void OpenListingWindow();//打開信息窗口。
public void WriteListingWindow(string _string);//寫文本串到信息窗口。
public void CloseListingWindow()://關(guān)閉信息窗口。
具體代碼如下:
int module ID,select Count;
Tag[]selectObjList;
UFUiOnt.TreeMode treeMode;
UFSession theUfSession = UFSession.GetUFSession();
the UfSession.UF.AskApplicationModule(out moduleID);
if (module ID != 16)//計(jì)算機(jī)輔助制造應(yīng)用環(huán)境。
{
throw new Exception("請切換到計(jì)算機(jī)輔助制造應(yīng)用模塊!");//拋出一個(gè)異常。
}
theUfSession.UiOnt.AskView(out treeMode);
if (!treeMode.Equals(UFUiOnt.TreeMode.Order))
{
theUfSession.UiOnt.SwitchView(UFUiOnt.TreeMode.Order);//切換到程序順序視圖。
throw new Exception("已切換到程序順序視圖,請重新選擇!");
}
theUfSession.UiOnt.AskSelectedNodes(out select Count,out selectObjList);//獲取計(jì)算機(jī)輔助制造導(dǎo)航器選取的程序。
if (selectCount <= 0)
{
throw new Exception("未選擇有效程序組,請重新選擇!");
}
為了保存用戶設(shè)置,需要定義一個(gè)配置文件,文件位置一般為程序執(zhí)行目錄。用戶配置文件格式如圖6所示。
在加載對話框時(shí),首先加載后置器配置列表,然后讀取用戶配置文件來初始化對話框。當(dāng)執(zhí)行結(jié)束后,應(yīng)將當(dāng)前對話框配置信息保存到配置文件中,以供下次調(diào)用。在C語言中沒有專門的類來讀寫配置文件,因此需要通過自定義一個(gè)配置文件操作類來實(shí)現(xiàn)數(shù)據(jù)讀寫,代碼如下:
using System;
using System.Collections.Generic;
using System.Text;
▲圖6 用戶配置文件格式
using System.Runtime.InteropServices;
using System.IO;
using System.Reflection;
namespace BatchPostProcess
{
class IniFileOperate
{
private string iniFilePath;
private StringBuilder returnValue;
private const string fileName = "\BatchPostProcess.ini";
[DllImport("kernel32.dll")]
private static extern long WritePrivateProfileString(string section,string key,string value,string filepath);
[DllImport("kernel32.dll")]
private static extern long GetPrivateProfileString(string section,string key,string def,StringBuilder returnValue,int buffersize,string filepath);
public IniFileOperate()
{
string path;
returnValue = new StringBuilder();
path = Assembly.Get ExecutingAssembly().Location;
FileInfo finfo = new FileInfo(path);
iniFilePath = finfo.Directory.ToString() + fileName;
}
public string ReadValue(string section,string key)
{
GetPrivateProfileString(section,key,"",returnValue,1024,iniFilePath);
return returnValue.ToString();
}
public void WriteValue(string section,string key,string value)
{
WritePrivateProfileString(section,key,value,iniFilePath);
}
}
}
后置文件template_post.dat內(nèi)容如圖7所示。
▲圖7 后置文件內(nèi)容
具體操作代碼如下:
int[]selectRows=newint[1];//列表中當(dāng)前選中的表項(xiàng)索引。
int postCount;//后處理器數(shù)量。
string[] postNames;//后處理器配置列表。
selectRows[0]=1;//默認(rèn)選中第一個(gè)項(xiàng)目。
NXOpen.BlockStyler.ListBox listPost;
theUfSession.Cam.OptAskPostNames(out postCount,out postNames);//獲取后置器配置列表。
listPost.GetProperties().SetStrings("ListItems",postNames);//初始化列表。
listPost.GetProperties().SetIntegerVector("SelectedItems",selectRows);//初始化選中項(xiàng)。
在Unigraphics NX軟件中,后置處理器會(huì)生成三個(gè)文件[9]。.pui文件用于設(shè)定與后置處理器相關(guān)的參數(shù)。.tcl文件為事件處理文件,用于設(shè)定每一個(gè)事件的處理方式。.def文件用于定義事件處理后的數(shù)據(jù)格式。當(dāng)用戶選擇后置器選項(xiàng)時(shí),解析后置處理器相對應(yīng)的.tcl文件,獲取用戶在變量set_mom_sys_output_file_suffix中設(shè)置的后綴名。.tcl文件內(nèi)容如圖8所示。
在后置處理選定的數(shù)控程序時(shí),默認(rèn)的數(shù)控程序號(hào)是當(dāng)前選定的操作或組的名稱。處理前應(yīng)判斷用戶是否已經(jīng)設(shè)置了數(shù)控程序后綴,如果有則去除,并按實(shí)際后置處理器中自定義的后綴來修改,代碼如下:
private string postMachineName;//后處理設(shè)備編號(hào)。
private UFSetup.OutputUnits outputUnits;//輸出單位。
▲圖8 .tcl文件內(nèi)容
private UFSession ufSession;//當(dāng)前會(huì)話。
public void postProcess(Tag[]objList)//傳入操作目標(biāo)列表,每個(gè)程序?yàn)橐粋€(gè)鏈表。
{
Tag tagSetup;
string ncFullName = "",ncName;
int i = 1;
int loction;
foreach (Tag obj in objList)//遍歷所有程序鏈表。
{
ufSession.Setup.AskSetup(out tagSetup);
ufSession.Obj.AskName(obj,out ncName);
loction=ncName.LastIndexOf(".");
if (loction != -1)
{
ncName=nc Name.Remove(loction);
}
ncFullName = outputDirctory + ncName + "." + suffix;//加入后綴判斷,如出現(xiàn)“.”號(hào),則從“.”開始替換程序后綴。
uf Session.Setup.GenerateProgram(tagSetup,obj,postMachineName,ncFullName,outputUnits);//后置每個(gè)鏈表輸出數(shù)控程序。
}
}
經(jīng)過調(diào)試和功能完善,使用Unigraphics NX軟件MenuScript模塊[10]將批量后置軟件添加至Unigraphics NX軟件菜單和工具欄,運(yùn)行效果如圖9所示。
經(jīng)過安全測試和代碼完善,所開發(fā)的批量后置軟件能夠滿足編程人員的編程需求。實(shí)踐表明,使用本批量后置軟件,可以提高后置處理效率70%以上,有效解決了由加工坐標(biāo)、刀具、程序編號(hào)設(shè)定等引發(fā)的錯(cuò)
▲圖9 批量后置軟件運(yùn)行效果
誤問題。通過刀具定義、程序編號(hào)、加工坐標(biāo)定義等強(qiáng)制規(guī)范,能夠形成一套標(biāo)準(zhǔn)的編程習(xí)慣,提高團(tuán)隊(duì)編程協(xié)作效率。