1 前言
UG作為通用支撐軟件系統(tǒng),具有強(qiáng)大的建模,裝配和工程分析功能,利用UG能夠創(chuàng)建數(shù)字化虛擬儀表的三維造型,但是卻滿足不了虛擬儀表的動(dòng)態(tài)仿真方面的要求。本文對UG系統(tǒng)進(jìn)行二次開發(fā),設(shè)計(jì)出界面友好、使用方便的虛擬儀表的動(dòng)態(tài)仿真系統(tǒng)。著重介紹了應(yīng)用UG/OPEN API、MFC以及輔助開發(fā)模塊UG/0pen MenuScript聯(lián)合開發(fā)的方法。同時(shí)用一個(gè)應(yīng)用實(shí)例進(jìn)行簡單的說明。
2 UG/OPEN API以及UG/0pen MenuScript
UG/OPEN API又稱User Function,是一個(gè)允許程序訪問并改變UG對象模型(UG Object Modal)的程序集。提供一個(gè)UG所共容的編譯和連接程序的方式.它支持C/C++語言,頭文件(Header Files),支持ANSI C,使用Micorosfot Visual C++編程環(huán)境。UG/OPEN API程序可以在兩種不同的環(huán)境中運(yùn)行,即Internal與External環(huán)境.External模式可以直接在操作系統(tǒng)下運(yùn)行獨(dú)立于UG系統(tǒng)。Internal模式只能運(yùn)行在UG環(huán)境下 。 為實(shí)現(xiàn)軟件系統(tǒng)和UG的無縫封裝,一般采用Internal環(huán)境。
UG/Open MenuScript實(shí)現(xiàn)了對UG菜單的操作。可以用ASCII碼編輯器來編輯、刪除、添加已有的UG菜單條,為自己的應(yīng)用程序建立專門的菜單條.MenuScript可以執(zhí)行宏文件、UG/OPEN API或者UG/Open GRIP所編寫的程序,通過這種方式可以把自己開發(fā)的應(yīng)用程序無縫地嵌入到UG系統(tǒng)中,滿足用戶要求的交互式操作。
3 虛擬儀表的動(dòng)態(tài)仿真
所謂虛擬儀表(Virtual Instrument) 就是利用PC機(jī)實(shí)現(xiàn)原來物理儀表的功能,并且要求功能更強(qiáng)。不僅可以實(shí)現(xiàn)數(shù)字顯示、棒圖顯示、曲線顯示,而且可以實(shí)現(xiàn)歷史查詢、事故追憶等。 操作人員通過友好的圖形用戶界面以及圖形化編程語言來控制儀器的運(yùn)行,以完成對被測試量的采集、分析、判斷、顯示、存儲以及數(shù)據(jù)生成。
UG具有強(qiáng)大的設(shè)計(jì)和表達(dá)能力,能夠逼真地表現(xiàn)儀表的外觀和幾何造型,應(yīng)用UG開發(fā)虛擬儀表實(shí)現(xiàn)產(chǎn)品的數(shù)字化設(shè)計(jì),縮短了設(shè)計(jì)周期。通過應(yīng)用本文論述的基于UG二次開發(fā)的虛擬儀表的動(dòng)態(tài)仿真系統(tǒng),使得產(chǎn)品的設(shè)計(jì)表現(xiàn)更加有力,還可以應(yīng)用在機(jī)械人機(jī)界面的設(shè)計(jì)評價(jià)中。
4 利用UG/OPEN API和MFC聯(lián)合開發(fā)應(yīng)用程序結(jié)論
盡管UG使用了Micorosfot Visual C++作為編譯器,但UG/OPEN API沒有直接提供對MFC的支持,所以在UG中還不能直接調(diào)用MFC 。 Visual C++提供了豐富的MFC資源,其編程環(huán)境的集成度和靈活性遠(yuǎn)遠(yuǎn)超出了UG/OPEN API。UG應(yīng)用程序基本上都是采用UG提供的應(yīng)用程序向?qū)G/Open AppWizard創(chuàng)建的,但是用該向?qū)?chuàng)建的應(yīng)用程序本身不支持MFC。為了讓程序支持MFC我們采用MFC AppWizard(dll)向?qū)В趹?yīng)用程序中加入U(xiǎn)G Internal模式的入口函數(shù),編譯生成動(dòng)態(tài)連接文件,最后通過菜單調(diào)用該程序。其實(shí)現(xiàn)的具體步驟如下:
1)在Visual C++中新建MFC AppWizard(dll) 類型工程,輸入工程名。點(diǎn)擊OK。
2)在向?qū)У牡谝徊竭x擇應(yīng)用程序類型為Regular DLL using shared MFC DLL,其它選項(xiàng)保持默認(rèn)即可,點(diǎn)擊Finish。完成創(chuàng)建該向?qū)А?
3)在Visual C++中進(jìn)行編譯設(shè)置,選擇菜單Project ->Setting。在project setting對話框的Link選項(xiàng)卡Object/library modules中設(shè)置庫文件(libufun.lib,libugopenint.lib),也可以在Tools->Options 的directories中設(shè)置。在project setting對話框的Debug選項(xiàng)卡Excutable for debug session中輸入ugraf.exe的全路經(jīng)。
4)編制程序,在程序中添加UG的用戶入口函數(shù)ufsta()。添加MFC對話框資源和控件,設(shè)計(jì)人機(jī)界面 (user computer interface)。添加所需要的Windows消息,在消息處理函數(shù)中添加代碼。
5)編譯連接,生成.dll文件。通過UG菜單調(diào)用程序。
5 光柱表動(dòng)態(tài)仿真控制系統(tǒng)實(shí)例
5.1 人機(jī)界面設(shè)計(jì)及程序代碼分析
應(yīng)用程序二次開發(fā)的一個(gè)重要的方面就是人機(jī)界面的設(shè)計(jì),實(shí)現(xiàn)用戶和軟件系統(tǒng)的數(shù)據(jù)交換。在這里我們在應(yīng)用程序中使用模式對話框,添加標(biāo)準(zhǔn)控件。
在Visual C++創(chuàng)建MFC AppWizard(dll)工程,工程名為VirInstrument,在應(yīng)用程序中添加UG入口函數(shù),用MFC設(shè)計(jì)對話框類CGZInstrument,在話框類中設(shè)計(jì)控制函數(shù)On_PutOn(),On_PutOff()。添加Windows消息WM_TIMER,生成消息處理函數(shù)OnTimer()。用在On_PutOff()函數(shù)調(diào)用KillTimer()函數(shù)撤銷計(jì)時(shí)器。編譯連接生成VirInstrument.dll文件。部分代碼如下:
extern "C" DllExport void ufsta( char *param, int *returnCode, int rlen )
{ //UG函數(shù)入口
int errorCode = UF_initialize();//初始化API環(huán)境
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
CGZInstrument GZdlg;
GZdlg.DoModal(); //調(diào)用虛擬儀表控制面板
if ( 0 == errorCode )
{
errorCode = UF_terminate(); //釋放API的執(zhí)行許可
}
}
extern "C" int ufusr_ask_unload( void )
{
return( UF_UNLOAD_UG_TERMINATE );
}
void CMyDlg::On_PutOn() //開始執(zhí)行仿真程序
{
m_nTimer=this->SetTimer(1,temp_tmslics*1000,NULL);//設(shè)置監(jiān)控時(shí)間間隔
}
void CMyDlg::OnTimer(UINT nIDEvent)
{ …
uc1601(char *cp1, int ip2 );//超出安全范圍調(diào)用報(bào)警函數(shù)
…
UF_MODL_edit_exp(char * expr_str );//更新光柱表的數(shù)值
UF_MODL_update( void );//更新視圖
…
CDialog::OnTimer(nIDEvent);
}
圖1 對話框界面
5.2 MenuScript應(yīng)用
5.2.1 設(shè)置環(huán)境變量
在UG安裝目錄下的UGII文件夾中打開ugii_evn.dat文件,其中有一條語句是用來設(shè)置用戶自己二次開發(fā)內(nèi)容的目錄——#UG_USER_DIR=$[HOME]。在用戶目錄下建立兩個(gè)子目錄startup和application。startup文件夾存放UG啟動(dòng)時(shí)需要加載的動(dòng)態(tài)共享庫及菜單腳本文件;application文件夾存放具體的功能擴(kuò)展程序文件。
要使自定義菜單起作用,必須修改custom_dirs.dat文件。該文件在安裝目錄的UGII menus文件夾中。在文件的最后加入用戶自定義的二次開發(fā)目錄的全路經(jīng)。
5.2.2 菜單腳本文件
本例是在主菜單 [Help]的前面添加自定義菜單[虛擬儀表仿真系統(tǒng)],該菜單下有一個(gè)子菜單[光柱表控制]。菜單文件的文件名為main_menu.men。
VERSION 120
EDIT UG_GATEWAY_MAIN_MENUBAR
BEFORE UG_HELP
CASCADE_BUTTON MENU_ID_1
LABEL 虛擬儀表仿真系統(tǒng)
END_OF_BEFORE
MENU MENU_ID_1
BUTTON MENU_ID_1_0
LABEL 光柱表控制
ACTIONS VirInstrument.dll
END_OF_MENU
5.2.3 實(shí)現(xiàn)菜單功能
為了實(shí)現(xiàn)菜單和對話框連結(jié)功能,在相應(yīng)的UG_USER_DIR startup和UG_USER_DIR application目錄中復(fù)制main_menu.men文件和VirInstrument.dll文件。UG加載DLL文件成功后,用戶可調(diào)入已建完模型的光柱表,并通過菜單調(diào)用對話框,就實(shí)現(xiàn)了虛擬儀表的動(dòng)態(tài)仿真功能(如 圖2)。
圖2 定制的UG菜單及仿真控制界面
6 結(jié)論
對UG進(jìn)行動(dòng)態(tài)仿真功能的開發(fā),在產(chǎn)品虛擬現(xiàn)實(shí)的設(shè)計(jì)和評價(jià)中有重要意義。本文探討了利用UG/OPEN API、MFC及UG/Open MenuScript對UG聯(lián)合開發(fā)進(jìn)行動(dòng)態(tài)仿真的方法。并通過一個(gè)例子加以簡單說明。該方法具有開發(fā)速度快,界面簡單統(tǒng)一,編程簡潔,功能強(qiáng)大的特點(diǎn)。本文稍有不足的是,沒有使用UIStyler來創(chuàng)建UG風(fēng)格的人機(jī)交互界面。