□ 趙仁兵 □ 劉金科
宜賓市普什模具有限公司 四川宜賓 644000
目前,Unigraphics NX軟件擁有強大的計算機輔助設計和計算機輔助制造集成功能[1],應用廣泛。在企業編程部門,由于編程人員的習慣不同,編程規范不同,企業很難制定統一的技術標準。隨著設計產品的復雜化,每個產品加工都需要使用Unigraphics NX軟件輔助編程。Unigraphics NX軟件自帶的后置處理器每次只能處理一個數控程序,并且不對操作中可能包含的錯誤進行檢查。對此,編程人員需對大量程序進行錯誤檢查和后置處理,浪費大量時間和精力。筆者利用Unigraphics NX軟件的二次開發功能,結合Visual Studio 2005開發環境,設計批量后置軟件,提供批量后處理、錯誤預警、刀具報告等功能。應用這一批量后置軟件,可以提高Unigraphics NX軟件后置處理效率,減少加工事故。
Unigraphics NX是一款功能強大的計算機輔助設計與制造軟件,不僅可以通過用戶界面操作來控制、實現功能,而且能夠提供多種應用程序接口對內部對象進行訪問。應用程序接口是Unigraphics NX軟件與外部應用程序之間的接口,是Unigraphics NX軟件二次開發工具提供的一系列函數和過程的集合[2]。通過這些應用程序接口,用戶可以擴展Unigraphics NX軟件的功能,實現與Unigraphics NX軟件的無縫集成。
Unigraphics NX應用程序接口支持多種開發語言和多種操作系統,軟件功能的覆蓋率超過90%,不同Unigraphics NX軟件版本間的一致性良好。
Unigraphics NX軟件內部采用統一對象模型來描述對象及其操作,用戶界面操作和應用程序接口都構建于統一對象模型之上,確保了應用程序接口與用戶界面操作訪問的都是內部統一對象模型[3]。基于不同開發語言的應用程序接口都由同一個內部對象轉化而來,無論用戶采用何種開發語言的應用程序接口,其調用的實質都是同一個內核函數,從而實現了開發語言無關性和平臺無關性,用戶可以選擇自己擅長的開發語言,提高開發速度。
(1) GRIP開發包[4]。GRIP是一種解釋性的編程語言,能實現Unigraphics NX軟件交互界面下的所有功能操作。GRIP具有簡單易學、運行效率高、不長駐內存等特點,深受開發人員喜愛。但是,Unigraphics NX軟件在新版本中停止對GRIP開發包的更新。另一方面,GRIP在交互界面對話框中函數單一,開發較大項目時用戶的交互受限。可見,GRIP適用于簡單的二次開發。
(2) Unigraphics/Open開發包。Unigraphics/Open是基于C語言的二次開發應用程序接口,包括3 000多個C語言函數,功能強大,適合企業高級開發人員使用。Unigraphics/Open直接構建于內部代碼上,運行效率較高,能夠實現Unigraphics NX軟件大部分功能。Unigraphics/Open需要C語言和軟件工程等技術的支持,因此適合中高級用戶使用。
(3) KF開發包。KF是應用于知識熔接技術的由求解需求驅動的解釋性面向對象的語言,是基于知識工程智能化的二次開發應用程序接口,具有靈活、易學、可由知識驅動等特點,適合企業或第三方軟件公司進行專家系統開發。
(4) NXOpen開發包。NXOpen是完全面向對象的二次開發應用程序接口,支持多種操作系統和多種開發語言,涵蓋了Unigraphics NX軟件絕大部分功能。用戶可以通過系統日志功能直接錄制Unigraphics NX軟件操作,生成代碼,用于研究Unigraphics NX軟件的系統架構、運行原理,并可以通過修改代碼來提高開發速度。NXOpen適合企業和第三方公司進行功能定制開發。
在Unigraphics NX軟件計算機輔助制造模塊中,計算機輔助制造導航器包含四個視圖,每個視圖對應不同的操作和功能。在不同的視圖下,用戶可以方便地對程序進行快捷修改和定義。計算機輔助制造導航器視圖如圖1所示。

▲圖1 計算機輔助制造導航器視圖
程序順序視圖是計算機輔助制造操作的主要視圖,便于數控程序文檔層次管理,如圖2所示。機床視圖主要用于刀具定義和管理。幾何視圖主要用于加工坐標系和加工過程幾何定義與管理。加工方法視圖主要用于公共銑削參數管理。
批量后置軟件的設計內容主要包括人機交互界面獲取用戶選擇、讀寫用戶配置文件、讀寫后處理配置文件、錯誤校驗等。批量后置軟件的工作流程如圖3所示。

▲圖2 程序順序視圖▲圖3 批量后置軟件工作流程
獲取用戶選擇的程序指獲取用戶在Unigraphics NX軟件計算機輔助制造導航器中選擇的程序。獲取后置器模板指讀取后置文件template_post.dat中的后置器配置列表。獲取.tcl文件配置指讀取后置器所指向的.tcl配置文件,獲取數控程序后綴。獲取用戶配置指對話框載入時,讀入用戶配置。對話框退出時,保存用戶配置。初始化用戶界面指初始化用戶界面參數,配置用戶的前一次默認設置。安全檢查包括加工坐標系、刀具號、刀具參數、程序號檢查等。批量后置輸出報告指遍歷用戶選取的程序,按規則對每個程序做后置處理,輸出程序報告、刀具報告、警告信息。
批量后置軟件人機交互界面設計時使用了Block Styled 用戶界面生成器模塊[5],所設計的人機交互界面如圖4所示。人機交互界面主要包括后置配置列表、數控文件輸出目錄、單位定義、錯誤校驗等控件。Block Styled用戶界面生成器模塊保存對話框內容時,會自動生成.dlx文件和.c文件。.dlx文件是對話框二進制定義文件,開發時復制到運行目錄。.c文件可根據開發語言的不同,選擇相應的配置來生成對應的開發工具代碼。

▲圖4 批量后置軟件人機交互界面
在Unigraphics NX軟件計算機輔助制造導航器中實現批量數控程序后置輸出的基本原理是:獲取用戶在計算機輔助制造導航器中選擇的程序,遍歷程序中包含的操作和組,按對應程序保存到內部鏈表中;對所有操作和組進行安全規則檢查,通過安全規則檢查后,遍歷獲得的所有操作,獲取操作對應的加工坐標系和刀具信息[6];按順序后置處理每個數控程序,保存到指定文件夾,同時輸出相關信息報表。批量后置軟件運行原理如圖5所示。
Unigraphics NX軟件計算機輔助制造導航器相關操作函數如下:
UFSession.GetUFSession();//獲取會話[7]。
public void AskApplicationModule(out int module_id);//若module_id的值是16,則為計算機輔助制造應用模塊。在Unigraphics NX軟件中,相關函數必須在相應應用模塊中才能工作,所以要實現在計算機輔助制造編程操作,必須保證當前應用模塊為計算機輔助制造模塊。

▲圖5 批量后置軟件運行原理
public void AskView(out UFUiOnt.TreeMode view);//查詢計算機輔助制造導航器中當前視圖。
public void SwitchView(UFUiOnt.TreeMode view);//切換當前視圖。
public void AskSelectedNodes(out int count,out Tag[]objects);//獲取計算機輔助制造導航器視圖中選定的程序,目標可能是操作或組,編程時需進行類型判斷,再進行不同操作。
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);//獲取一個組中包含的成員列表,可能是組或操作,使用時需作類型判斷。
public bool IsGroup(CAMObject camObject);//判斷一個目標是否為組。
public void AskSetup(out Tag setup_tag);//查詢當前設置的目標。
public void AskProgramNull(Tag setup_tag,out Tag program_null);//查詢當前設置下視圖的空組。
public void AskName(Tag object_id,out string name);//查詢目標名稱。
public void AskCutterGroup(Tag oper,out Tag group);//查詢當前操作使用的刀具。
public void AskGeomGroup(Tag oper,out Tag group);//查詢當前操作使用的加工坐標系。
public void GenerateProgram(Tag setup,Tag group,string post_name,string output_filename,UFSetup.outputUnits output_units);//生成數控程序函數。使用該函數時,一個組下的所有操作會合并為數控程序輸出。
public void IsListingWindow Open(out bool response);//查詢信息窗口是否已打開。
public void OpenListingWindow();//打開信息窗口。
public void WriteListingWindow(string _string);//寫文本串到信息窗口。
public void CloseListingWindow()://關閉信息窗口。
具體代碼如下:
int module ID,select Count;
Tag[]selectObjList;
UFUiOnt.TreeMode treeMode;
UFSession theUfSession = UFSession.GetUFSession();
the UfSession.UF.AskApplicationModule(out moduleID);
if (module ID != 16)//計算機輔助制造應用環境。
{
throw new Exception("請切換到計算機輔助制造應用模塊!");//拋出一個異常。
}
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);//獲取計算機輔助制造導航器選取的程序。
if (selectCount <= 0)
{
throw new Exception("未選擇有效程序組,請重新選擇!");
}
為了保存用戶設置,需要定義一個配置文件,文件位置一般為程序執行目錄。用戶配置文件格式如圖6所示。
在加載對話框時,首先加載后置器配置列表,然后讀取用戶配置文件來初始化對話框。當執行結束后,應將當前對話框配置信息保存到配置文件中,以供下次調用。在C語言中沒有專門的類來讀寫配置文件,因此需要通過自定義一個配置文件操作類來實現數據讀寫,代碼如下:
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內容如圖7所示。

▲圖7 后置文件內容
具體操作代碼如下:
int[]selectRows=newint[1];//列表中當前選中的表項索引。
int postCount;//后處理器數量。
string[] postNames;//后處理器配置列表。
selectRows[0]=1;//默認選中第一個項目。
NXOpen.BlockStyler.ListBox listPost;
theUfSession.Cam.OptAskPostNames(out postCount,out postNames);//獲取后置器配置列表。
listPost.GetProperties().SetStrings("ListItems",postNames);//初始化列表。
listPost.GetProperties().SetIntegerVector("SelectedItems",selectRows);//初始化選中項。
在Unigraphics NX軟件中,后置處理器會生成三個文件[9]。.pui文件用于設定與后置處理器相關的參數。.tcl文件為事件處理文件,用于設定每一個事件的處理方式。.def文件用于定義事件處理后的數據格式。當用戶選擇后置器選項時,解析后置處理器相對應的.tcl文件,獲取用戶在變量set_mom_sys_output_file_suffix中設置的后綴名。.tcl文件內容如圖8所示。
在后置處理選定的數控程序時,默認的數控程序號是當前選定的操作或組的名稱。處理前應判斷用戶是否已經設置了數控程序后綴,如果有則去除,并按實際后置處理器中自定義的后綴來修改,代碼如下:
private string postMachineName;//后處理設備編號。
private UFSetup.OutputUnits outputUnits;//輸出單位。

▲圖8 .tcl文件內容
private UFSession ufSession;//當前會話。
public void postProcess(Tag[]objList)//傳入操作目標列表,每個程序為一個鏈表。
{
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;//加入后綴判斷,如出現“.”號,則從“.”開始替換程序后綴。
uf Session.Setup.GenerateProgram(tagSetup,obj,postMachineName,ncFullName,outputUnits);//后置每個鏈表輸出數控程序。
}
}
經過調試和功能完善,使用Unigraphics NX軟件MenuScript模塊[10]將批量后置軟件添加至Unigraphics NX軟件菜單和工具欄,運行效果如圖9所示。
經過安全測試和代碼完善,所開發的批量后置軟件能夠滿足編程人員的編程需求。實踐表明,使用本批量后置軟件,可以提高后置處理效率70%以上,有效解決了由加工坐標、刀具、程序編號設定等引發的錯

▲圖9 批量后置軟件運行效果
誤問題。通過刀具定義、程序編號、加工坐標定義等強制規范,能夠形成一套標準的編程習慣,提高團隊編程協作效率。