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