C#与MATLAB混合编程在内弹道设计中的应用*
2013-12-10高跃飞罗炳华徐凤军
柯 彪,高跃飞,罗炳华,徐凤军
(1中北大学机电工程学院,太原 030051;2四川九洲电器集团有限责任公司,四川绵阳 621000)
0 引言
早期的内弹道设计是把内弹道设计的相关函数关系在给定一些条件下编成内弹道设计表,然后通过查表来解决实际的内弹道设计问题。目前,随着计算机技术的快速发展,人们开始编制了多种内弹道设计软件,可以快速进行内弹道计算和方案设计,但还是受开发语言的限制,软件人机交互性差,专业性强,不易于集成。为此,文中结合C#和MATLAB各自的优点,利用其混合编程技术,开发了界面友好、操作简单、图形和数据管理方便的内弹道设计软件,利用该软件根据设计评价标准最终可以选出最佳性能的内弹道方案,为后续的炮身、炮架以及弹药设计提供了依据,也为未来火炮设计软件系统的开发提供了基础。
1 C#与MATLAB混合编程技术
1.1 C#与 MATLAB的简介
Microsoft Visual C#是 Microsoft专门为使用.NET平台而开发的一种强大的、面向组件的语言,可用于方便快捷的创建运行在.NET公共语言运行库(common language runtime,CLR)上的Windows应用程序[1]。但是其在数值计算分析和曲线绘图方面的操作繁琐,功能薄弱。
MATLAB是一种用于数值计算、可视化及编程的高级语言和交互式环境,可以分析数据,开发算法,创建模型和应用程序。借助其语言、工具和内置数学函数,可以快速简洁的编制所有的各类计算程序和输出相应数据。但是MATLAB在用户界面上的开发功能还比较简单,执行效率低,难以实现底层的数据输入 输出的管理。
1.2 C#与MATLAB混合编程的实现
文中以 Visual Studio.Net 2010与 MATLAB R2009a为例,混合编程实现的步骤如下:
1)安装完Matlab之后,在路径:Matlab的安装目录 oolboxcompilerdeploywin32 下找到 MCRInstall.exe进行安装;然后点击:我的电脑 -属性 -高级 -环境变量-系统变量-PATH-编辑,在变量值输入框中,不要删除以前的字符串,在最前面加入MCR的安装路径,然后确定、保存、重启电脑。否者C#创建Matlab的访问对象时,出现“xxx的类型初始值设定项引发异常。”的错误警告。
2)在MATLAB的命令窗口直接输入“deploytool”或者单击 MATLAB中“Start”按钮,依次展开MATLAB≫MATLAB Builder NE≫Deployment Tool,即可使用 MATLAB 的.NET 组件生成功能[2]。
3)使用Deployment Tool新建一个类型为MATLAB Builder NE的工程project,命名为IBdesign.prj,工程名就相当于C#中的命名空间,确定后系统自动在工程下生成同名的文件夹,为了与工程名区分,最好将文件名改为IBdesignclass,该文件名相当于C#中的类名,再向该文件夹下添加已经成功编制的一个或多个*m函数文件,如 IBmixed.m文件,IBmixed类似于C#中类下的方法名。最后就可完成对工程的编译和打包,只需到工程相应的目录下(..src)就可以找到 dll动态链接库文件[3]。
4)C#新建项目并完成界面开发后,须对刚编译的dll文件和MWArray.dll文件(在MATLAB安装目录 oolboxdotnetbuilderinwin32v2.0文件夹下)进行引用[4],另外还需将位于上路径下的ManagedCPPAPI.netmodule文件拷贝至C#项目目录inDebug文件夹下。
5)完成混合编程的前期准备后,即可在C#代码区开始编程实现对刚引用的dll进行调用,混合编程成功的关键是C#与MATLAB的.NET FrameWork框架版本要相适应,以及它们之间传输参数个数的匹配和数据类型之间的恰当转换。
2 软件设计
典型的内弹道设计问题可以归纳为在已知的火炮口径d、弹丸质量m和弹丸初速v0的条件下,选择适当的最大压力pm、药室扩大系数χK以及火药品种,然后计算出能满足上述条件的膛内构造诸元和装药条件等众多未知量,将是一个多解的问题,但是保证武器能够具有规定的初速是内弹道设计的根本要求。
根据内弹道设计的思路,采用C#与MATLAB混合编程技术,开发了内弹道设计软件,实现了权限管理、内弹道设计计算、数值数据与图形处理的功能,具有一定的通用性、可扩展性和可集成的特点。该软件设计计算部分的核心框架见图1。
图1 内弹道设计计算的核心框架示意图
2.1 开发环境与安装要求
内弹道设计软件在 Windows操作系统下的Visual Studio 2010集成开发环境下开发,根据用户需要可以很方便的确定软件所支持的操作系统位数,数据库采用的是 SQL Server 2008,软件的.Net Framework框架版本根据C#与MATLAB的版本要求确定。只需将应用程序、数据库安装包、相同MATLAB版本的MCR运行库及所需要的.Net Framework独立安装包一同打包,通过编写相应的安装脚本控制顺序安装,就可以使软件安装不依赖客户端的配置,移植性强。
2.2 软件功能设计
根据一般工程设计软件的要求,内弹道设计软件的功能设计有:权限管理、内弹道设计计算、数据管理和图形处理、历史记录、意见反馈以及窗体换肤功能。
1)权限管理功能。将软件使用人员分为系统管理员和一般设计计算员。根据内弹道设计所采用的装药类型给不同设计计算员分配各自内弹道设计所需权限和自身用户信息管理权限,彼此独立,而系统管理员具有查询、添加、删除及导出用户信息和进行所有设计计算的权限。
2)内弹道设计计算功能。将以经典内弹道模型为基础,适用于简单形状火药(如管状、带状、方片状等几种)、多孔火药(常用的圆柱形七孔、花边形七孔、花边形十四孔等几种)、混合装药(以简单形状火药和多孔火药的混合为例)及钝感火药[5]的内弹道设计计算的MATLAB程序修改为m函数文件,另外编程时也考虑了不同火药对计算参数的选取要求。其中多孔火药在减面燃烧阶段用来计算与碎粒断面相当的内切圆半径ρ的计算系数与药形的关系如表1所示。
3)数据管理功能。主要利用SQL Server 2008完成用户信息的查询、添加和删除操作,以及用户历史操作的记录和意见反馈的管理,这样就控制软件的用户登录权限,也为软件功能的完善提供了基础,同时特别实现对内弹道方案参数和内弹道计算结果数据的备份。
4)图形处理功能。借助MATLAB强大的图形处理功能,内弹道计算时可以对需要曲线进行实时显示,计算后分类保存,同时利用C#还特别定制了内弹道曲线处理界面,主要实现曲线查看、格式转换、复制与删除、另存与打印等基本功能。
5)窗体换肤功能。主要考虑了软件的外观与用户使用舒适性,软件集成了现有56种皮肤外观。同时用户自己也可以开发.*ssk(窗体皮肤文件),并将该文件拷贝至程序当前目录下DebugSkins文件夹下,即可完成窗体皮肤功能的扩展。
2.3 软件界面设计
内弹道设计软件主界面(见图2)以内弹道参数录入、方案评价部分和计算结果数据显示部分为主体,通过各功能按钮完成对相应子模块功能的调用,整个界面布置整洁、紧凑,操作方便。
表1 药形和的对照表
表1 药形和的对照表
药形 ρ 0.5d0+e1圆柱形七孔 0.2956花边形七孔 0.1547花边形十四孔 0.1547花边形十九孔 0.1547圆柱形十九孔 0.3559正六边形十九孔 0.1864等圆角六边形十九孔 0.1977
3 关键技术及代码
3.1 .NET程序集的生成
图2 内弹道设计计算软件的主界面
编写相应弹道程序并成功调式运行后,再将原计算程序中的关键常数均替换为变量,作为Function函数的输入参数,这样通过MATLAB Builder NE即可将弹道核心计算部分的程序编译生成dll动态链接库文件,也就是C#与MATLAB之间通信的接口。另外只需在保证文件名和输入输出参数不变的条件下将修改后的计算程序重新编译成dll,并在C#中重新引用,不必修改任何C#语言代码,即可完成.Net程序的升级更新。
3.2 C#调用 MATLAB
用C#实例化某类型火药的内弹道设计计算类的对象,通过对象来调用实现计算的方法,在保证计算函数成功引用和C#与MATLAB之间数据恰当转换的前提下,使用C#编写内弹道设计计算部分的功能代码。(双斜杠"//"后的文字为解释性内容和行号,调试时都不被编译;“……”号代表省略了不重要或类似的代码)部分代码:
①using MathWorks.MATLAB.NET.Arrays;
②using MathWorks.MATLAB.NET.Utility;
③using IBsimplepowderNet;
④……
⑤private void btn内弹道计算_Click(object sender,EventArgs e)
⑥{……
⑦switch(装药comboBox.SelectedItem.ToString())
⑧{
⑨case"简单形状火药":
⑩try
⑪{//实例化计算简单火药内弹道的类
⑫IBsimplepowderClass simplepowder=new IBsimple powderClass();
⑬MWArray[]result1=simplepowder.IBsimple
(16,(MWNumericArray)d,(MWNumericArray)v0,……);
⑭MWNumericArray pm=(MWNumericArray)result1[0];
⑮pm_txt.Text=pm.ToScalarDouble(). ToString();
⑯……
⑰MWNumericArray t=(MWNumericArray)result1[8];
//将matlab输出列向量转换到C#中
⑱double[]loc_t=null;
⑲loc_t=(double[])t.ToVector(MWArray
Component.Real);
⑳catch(Exception)
㉑{MessageBox.Show("请检查输入参数是否匹配?",……);}
㉒break;
㉓case"多孔火药": //多孔火药计算部分
㉔……
㉕break;
㉖省略混合、钝感火药内弹道设计的代码……
其中第1~2行为C#与MATLAB混合编程必须引用的命名空间,第3行为引用MATLAB编译了的简单火药(其他火药类似)内弹道设计计算程序集,第7行switch语句选择装药类型及药形,第13行调用计算简单火药内弹道的方法,第14~15行取出计算结果的每个值,并转化为string类型,显示在窗口中显示出来,第19行将结算结果中的列向量转化为C#中的数据类型。程序中try{}catch{}代码捕获程序突发异常和参数输入不当异常。
3.3 数据管理
该软件涉及到的数据管理有:用户信息、历史记录与意见反馈,计算数值结果与曲线。在软件底层利用C#编写连接字符串来连接SQL Server数据库,通过C#开发的用户界面即可方便快速的完成数据的查询、添加、删除、导出与打印等功能,同时直接利用MATLAB强大的绘图功能和C#强大的文件输入输出功能,就可完全的完成计算数据的管理。
4 计算分析实例
软件对100mm加农炮(其采用单一管状药)、85mm加农炮(其采用圆柱形七孔火药)[6]、122mm榴弹炮(其采用管状药和圆柱形七孔火药的混合装药)及35mm高炮(其采用钝感火药)的内弹道设计计算进行了算例的定制。
下面以采用圆柱七孔火药的85mm加农炮内弹道设计计算为例,计算结果如表2所示,和现有制式同类火炮的评价标准接近,说明 C#与MATLAB混合编程技术在内弹道设计计算中应用是可行的。
表2 85mm加农炮多孔火药内弹道设计计算评价标准
5 结论
通过对C#与MATLAB混合编程技术的研究,完成了不同类型火药的内弹道设计计算软件的开发。该软件操作方便快捷,具有良好的人机交互性和集成性,可以为未来火炮设计软件的开发提供基础,另外文中采用的经典内弹道模型可进一步拓展至其改进型和考虑两相流的内弹道模型,还有该混编技术也可以在外弹道、身管设计计算、炮口制退器、反后坐装置等火炮常规计算中推广使用,为火炮的现代计算机辅助设计提供了一种思路。
[1]马煜,陈海军.Visual C#.NET案例开发集绵[M].北京:电子工业出版社,2008.
[2]罗炳华,高跃飞,刘荣华,等.基于MATLAB与C#的火炮CAD系统开发和优化设计[J].火炮发射与控制学报,2010(2):44-47.
[3]郑晖,王勇.C#与Matlab混合编程技术在数字地震信号处理软件中的应用[J].地震地磁观测与研究,2011,32(2):101-105.
[4]张燕,马永杰.Visual C#与MATLAB混合编程方法及其实现[J].西北师范大学学报,2008,44(6):34 -37.
[5]刘双杰,郝永乎.35mm高射炮钝感发射药的内弹道仿真[J].弹箭与制导学报,2010,30(1):170 -172.
[6]金志明.枪炮内弹道学[M].北京:北京理工大学出版社,2004.