基于MATLAB与C#的火炮CAD系统开发和优化设计

2010-06-27 00:58罗炳华高跃飞刘荣华
火炮发射与控制学报 2010年2期
关键词:调用代码编程

罗炳华,高跃飞,刘荣华,赵 鹏

(中北大学机电工程学院,山西太原 030051)

MATLAB提供了对.NET平台灵活有效的接口技术,比较常见的是基于COM组件的调用方式[1-3]。本文的方法主要是通过MATLAB Builder for.NET工具,生成.NET程序集供C#调用。程序集是.NET程序的最小组成单位,通常表现为exe或d ll文件,是一种自描述的组件,使用前不需向操作系统注册,提高了程序的重用性和灵活性[4],便于程序的发布和升级。

1 实现方法

1.1 MATLAB程序编译成.NET程序集

使用MATLAB R2009b Builder for.NET编译生成.NET程序集的步骤如下:

1)编写MATLAB源程序。

MATLAB编写的火炮CAD程序较复杂,为了更加清楚地说明问题,本文以简单的矩阵运算[5]为例来介绍,其MATLAB源代码如下:

源程序保存为Ftion_JuZhen.m。

2)配置MATLAB编译器。

在MATLAB命令窗输入mbuild-setup,按提示选择合适的编译器。配置完成后,如果编译器不发生变化,则不需再执行配置。

3)打开Builder for.NET工具并添加类和文件。

在MATLAB命令窗输入 dep loytool[6],打开Deployment Tool,如图1所示,输入生成的工程的名称JuZhen,目标类型选择.NET Assembly。选择Add class并定义生成的类名ClassJuZhen,在Classes栏目下选择Add files添加Ftion_JuZhen.m文件。通过“Add files/directories”可添加其他被引用文件的和路径。

4)编译生成.NET程序集。

使用默认设置[7](生成私有程序集),点击Build,执行编译工作。编译完成后,系统将在当前目录下生成和工程同名的文件夹JuZhen,在其子目录distrib文件夹里包含了生成的C#程序集:JuZhen.d ll。

1.2 C#调用M ATLAB生成的.NET程序集

1)添加文件引用

打开Visual Studio.NET 2008。在解决方案资源管理器里添加引用,选择上一步生成的JuZhen.d ll文件。另外需添加MWA rray动态链接库的引用,它包含了从MATLAB到C#的数据转换方法。Mwarray动态链接库位于MATLAB安装路径下的 oo lboxdotnetbuilderinwin32v2.0文件夹下。

2)编写C#调用代码

编写调用该组件的C#代码其核心代码(不包括序号)如下:

其中,1~3行代码添加命名空间,第7行代码实例化类ClassJuZhen,第9行代码调用类的成员函数Ftion_JuZhen计算并返回计算结果。Resout[0]为计算结果的第1个元素,是输入矩阵A经过LU分解后得到的符合M ATLAB规范的下三角矩阵。第10、11行代码把它转换为符合.NET规范的矩阵。计算过程使用try{}catch{}代码块来捕捉并输出异常信息。

3)编译生成可执行文件

1.3 MATLAB调用C#程序集

通过MATLAB调用 C#程序集,可以利用.NETFramework的强大功能对底层硬件及外围设备进行控制与通信。本文通过一个简单的M ATLAB调用C#类成员函数的例子介绍如下:

1)生成C#程序集。

打开V isual Studio.NET 2008建立一个类库,名称是MatlabCS,具体代码为:

本例演示的是MATLAB调用C#程序集非静态成员函数的方法,调用静态及其他类型函数的方法大同小异,具体可参看MATLAB帮助文件。

2 程序优化

软件在初次执行计算时需要初始化M ATLAB运行时MCR(为程序运行提供基础类库支持),把必要的数据加载到内存。实际使用发现:MCR初始化过程需要15~20 s,资源占用率较高。如果在执行计算时初始化MCR,将大大延长计算时间,且可能会出现假死现象。为突破此瓶颈,笔者试验采用多线程加定时器技术,避开资源占用的高峰期,在软件界面加载后的第10 s后台自动预初始化MCR,使计算速度大大提高。

MCR初始化的方法有两种:间接初始化和直接初始化,分别介绍如下:

1)间接初始化

编写1个空的MA TLAB函数文件(无输入输出参数),采用第2节的方法编译.NET程序集在C#中新建单独线程调用执行。该方法的关键代码是:

其中 1~4行代码定义一个 initionMCR函数对.NET程序集进行调用,调用方法可参照第2节。6~9行代码新建的线程t执行initionMCR函数,t的优先级设为最低,该线程在定时器的控制下运行,设定界面加载时启动定时器。

2)直接初始化

把上面代码第3行换做MCR初始化语句“MWMCR.InitializeApplication()”即可。

经实际测试发现:直接初始化只向系统确认MCR处于可用状态,而笔者提出的间接初始化方法除了确认可用还会提前向内存加载数据,效果明显优于直接初始化。通过采用多线程预初始化技术进行优化,程序的计算速度提高6倍以上,作用显著。

3 安装、升级和应用

由于采用了自描述的.NET程序集,只要在目标机器上安装.NET Framework及MCR运行时即可脱离特定环境运行本方法开发的软件。当对MATLAB算法程序修改后,如果接口(输入输出变量)未变,对同一工程重新编译生成新的DLL文件,拷贝覆盖旧的DLL文件即完成升级。

笔者基于以上所介绍的方法,开发了一个火炮结构辅助设计系统。图2所示为该CAD系统的主界面。该界面的开发过程仅需要把相应控件从工具箱中拖放到图中位置,然后按需要修改控件属性即可。

该CAD系统采用树形结构组织各个计算模块,可以快速定位。目前已经完成的功能模块有内弹道、身管设计,炮口制退器和反后坐装置等。

在混合编程模式下,借助M ATLAB语言强大的数据可视化功能,可以使数据结果更加直观,便于分析。图3所示为计算的某火炮无炮口制退器时的炮口超压场分布图。该系统还提供了数据打印和导出到Excel的接口。

该CAD系统其他几个主要特点如下:

1)人机交互方式智能化和人性化。充分考虑了新结构、新理论的使用。部分页面有智能和可控两种模式。智能模式依照现有理论对计算过程中的关键参数进行自动取舍。而当出现新结构,新理论突破陈规时,使用可控模式可以使设计更加灵活。

2)该系统可以对输入参数进行动态解释说明。

对输入错误以及计算结果的合理性进行判断。

3)该系统采用许可证机制,另外设立用户密码,只能在获得许可的机器上由特定用户运行,符合行业的保密要求。

4 结 论

本文介绍的MATLAB和C#语言基于.NET程序集混合编程的方法可以实现二者相互调用,简单易行,适用范围广,非计算机专业人士也可以较快掌握。它使开发者更专注于高级算法的开发及计算精度的提高。基于该方法开发的软件具有界面美观、智能化程度高、执行速度快、程序稳定、使用以及升级方便的特点。应用M ATLAB与C#语言混合编程开发火炮CAD系统,充分结合了二者的优点,降低了开发门槛,提高了开发效率,同时还可以保护源代码的完整和安全性。该方法可以推广到其他工程应用领域,是开发工程应用软件的一个新捷径。

[1] 张志涌.精通MATLAB 6.5版[M].北京:北京航空航天大学出版社,2003:78-82.ZHANG Zhi-yong.Mastering M ATLAB 6.5 edition[M].Beijing:Beihang University Press,2004:78-82.(in Chinese)

[2] 刘烨,季石磊.C#编程及应用程序开发教程[M].2版.北京:清华大学出版社,2007:167-201.LIU Ye,JIShi-lei.C#p rogramming and app lication development tutorial[M].2nd ed.Beijing:Tsinghua University Press,2007:167-201.(in Chinese)

[3] 姚光强,陈立平.基于COM 技术的C#与M ATLAB混合编程[J].计算机工程,2008,34(14):87-88.YAO Guang-qiang,CH EN Li-ping.Integrated programm ing between C#and MATLAB based on component object model[J].Computer Engineering,2008,34(14):87-88.(in Chinese)

[4] WATSON,NAGEL.C#入门经典[M].3版.北京:清华大学出版社,2006:306-341.WATSON,NAGEL.Beginning visual C#2005[M].3rd ed.Beijing:Tsinghua University Press,2006:306-341.(in Chinese)

[5] 薛定宇,陈阳泉.高等应用数学问题的MAT LAB求解[M].北京:清华大学出版社,2004:167-173.XUEDing-yu,CHEN Yang-quan.So lution of the advanced applied mathematics prob lems by M ATLAB[M].Beijing:Tsinghua University Press,2004:167-173.(in Chinese)

[6] 范建中,陈蕴.基于C共享库的MATLAB与 Visual C#混合编程[J].计算机工程与设计,2006,27(14):26-29.FAN Jian-zhong,CHEN Yun.MATLAB and visual C#m ixed programm ing based on C shared library[J].Com puter Engineering and Design,2006,27(14):26-29.(in Chinese)

[7] 张燕,马永杰,袁秋林.V isual C#与M ATLAB混合编程方法及其实现[J].西北师范大学学报,2008,44(6):34-37.ZHANG Yan,MA Yong-jie,YUAN Qiu-lin.Themethod and implementation ofmixed programm ing with visual C#and MATLAB[J].Journal of Northw estNormal University,2008,44(6):34-37.(in Chinese)

猜你喜欢
调用代码编程
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
纺织机上诞生的编程
核电项目物项调用管理的应用研究
系统虚拟化环境下客户机系统调用信息捕获与分析①
创世代码
创世代码
创世代码
创世代码