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);
}
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风格的人机交互界面。