柯 彪,高躍飛,羅炳華,徐鳳軍
(1中北大學機電工程學院,太原 030051;2四川九洲電器集團有限責任公司,四川綿陽 621000)
早期的內(nèi)彈道設計是把內(nèi)彈道設計的相關函數(shù)關系在給定一些條件下編成內(nèi)彈道設計表,然后通過查表來解決實際的內(nèi)彈道設計問題。目前,隨著計算機技術的快速發(fā)展,人們開始編制了多種內(nèi)彈道設計軟件,可以快速進行內(nèi)彈道計算和方案設計,但還是受開發(fā)語言的限制,軟件人機交互性差,專業(yè)性強,不易于集成。為此,文中結(jié)合C#和MATLAB各自的優(yōu)點,利用其混合編程技術,開發(fā)了界面友好、操作簡單、圖形和數(shù)據(jù)管理方便的內(nèi)彈道設計軟件,利用該軟件根據(jù)設計評價標準最終可以選出最佳性能的內(nèi)彈道方案,為后續(xù)的炮身、炮架以及彈藥設計提供了依據(jù),也為未來火炮設計軟件系統(tǒng)的開發(fā)提供了基礎。
Microsoft Visual C#是 Microsoft專門為使用.NET平臺而開發(fā)的一種強大的、面向組件的語言,可用于方便快捷的創(chuàng)建運行在.NET公共語言運行庫(common language runtime,CLR)上的Windows應用程序[1]。但是其在數(shù)值計算分析和曲線繪圖方面的操作繁瑣,功能薄弱。
MATLAB是一種用于數(shù)值計算、可視化及編程的高級語言和交互式環(huán)境,可以分析數(shù)據(jù),開發(fā)算法,創(chuàng)建模型和應用程序。借助其語言、工具和內(nèi)置數(shù)學函數(shù),可以快速簡潔的編制所有的各類計算程序和輸出相應數(shù)據(jù)。但是MATLAB在用戶界面上的開發(fā)功能還比較簡單,執(zhí)行效率低,難以實現(xiàn)底層的數(shù)據(jù)輸入 輸出的管理。
文中以 Visual Studio.Net 2010與 MATLAB R2009a為例,混合編程實現(xiàn)的步驟如下:
1)安裝完Matlab之后,在路徑:Matlab的安裝目錄 oolboxcompilerdeploywin32 下找到 MCRInstall.exe進行安裝;然后點擊:我的電腦 -屬性 -高級 -環(huán)境變量-系統(tǒng)變量-PATH-編輯,在變量值輸入框中,不要刪除以前的字符串,在最前面加入MCR的安裝路徑,然后確定、保存、重啟電腦。否者C#創(chuàng)建Matlab的訪問對象時,出現(xiàn)“xxx的類型初始值設定項引發(fā)異常?!钡腻e誤警告。
2)在MATLAB的命令窗口直接輸入“deploytool”或者單擊 MATLAB中“Start”按鈕,依次展開MATLAB?MATLAB Builder NE?Deployment Tool,即可使用 MATLAB 的.NET 組件生成功能[2]。
3)使用Deployment Tool新建一個類型為MATLAB Builder NE的工程project,命名為IBdesign.prj,工程名就相當于C#中的命名空間,確定后系統(tǒng)自動在工程下生成同名的文件夾,為了與工程名區(qū)分,最好將文件名改為IBdesignclass,該文件名相當于C#中的類名,再向該文件夾下添加已經(jīng)成功編制的一個或多個*m函數(shù)文件,如 IBmixed.m文件,IBmixed類似于C#中類下的方法名。最后就可完成對工程的編譯和打包,只需到工程相應的目錄下(..src)就可以找到 dll動態(tài)鏈接庫文件[3]。
4)C#新建項目并完成界面開發(fā)后,須對剛編譯的dll文件和MWArray.dll文件(在MATLAB安裝目錄 oolboxdotnetbuilderinwin32v2.0文件夾下)進行引用[4],另外還需將位于上路徑下的ManagedCPPAPI.netmodule文件拷貝至C#項目目錄inDebug文件夾下。
5)完成混合編程的前期準備后,即可在C#代碼區(qū)開始編程實現(xiàn)對剛引用的dll進行調(diào)用,混合編程成功的關鍵是C#與MATLAB的.NET FrameWork框架版本要相適應,以及它們之間傳輸參數(shù)個數(shù)的匹配和數(shù)據(jù)類型之間的恰當轉(zhuǎn)換。
典型的內(nèi)彈道設計問題可以歸納為在已知的火炮口徑d、彈丸質(zhì)量m和彈丸初速v0的條件下,選擇適當?shù)淖畲髩毫m、藥室擴大系數(shù)χK以及火藥品種,然后計算出能滿足上述條件的膛內(nèi)構造諸元和裝藥條件等眾多未知量,將是一個多解的問題,但是保證武器能夠具有規(guī)定的初速是內(nèi)彈道設計的根本要求。
根據(jù)內(nèi)彈道設計的思路,采用C#與MATLAB混合編程技術,開發(fā)了內(nèi)彈道設計軟件,實現(xiàn)了權限管理、內(nèi)彈道設計計算、數(shù)值數(shù)據(jù)與圖形處理的功能,具有一定的通用性、可擴展性和可集成的特點。該軟件設計計算部分的核心框架見圖1。
圖1 內(nèi)彈道設計計算的核心框架示意圖
內(nèi)彈道設計軟件在 Windows操作系統(tǒng)下的Visual Studio 2010集成開發(fā)環(huán)境下開發(fā),根據(jù)用戶需要可以很方便的確定軟件所支持的操作系統(tǒng)位數(shù),數(shù)據(jù)庫采用的是 SQL Server 2008,軟件的.Net Framework框架版本根據(jù)C#與MATLAB的版本要求確定。只需將應用程序、數(shù)據(jù)庫安裝包、相同MATLAB版本的MCR運行庫及所需要的.Net Framework獨立安裝包一同打包,通過編寫相應的安裝腳本控制順序安裝,就可以使軟件安裝不依賴客戶端的配置,移植性強。
根據(jù)一般工程設計軟件的要求,內(nèi)彈道設計軟件的功能設計有:權限管理、內(nèi)彈道設計計算、數(shù)據(jù)管理和圖形處理、歷史記錄、意見反饋以及窗體換膚功能。
1)權限管理功能。將軟件使用人員分為系統(tǒng)管理員和一般設計計算員。根據(jù)內(nèi)彈道設計所采用的裝藥類型給不同設計計算員分配各自內(nèi)彈道設計所需權限和自身用戶信息管理權限,彼此獨立,而系統(tǒng)管理員具有查詢、添加、刪除及導出用戶信息和進行所有設計計算的權限。
2)內(nèi)彈道設計計算功能。將以經(jīng)典內(nèi)彈道模型為基礎,適用于簡單形狀火藥(如管狀、帶狀、方片狀等幾種)、多孔火藥(常用的圓柱形七孔、花邊形七孔、花邊形十四孔等幾種)、混合裝藥(以簡單形狀火藥和多孔火藥的混合為例)及鈍感火藥[5]的內(nèi)彈道設計計算的MATLAB程序修改為m函數(shù)文件,另外編程時也考慮了不同火藥對計算參數(shù)的選取要求。其中多孔火藥在減面燃燒階段用來計算與碎粒斷面相當?shù)膬?nèi)切圓半徑ρ的計算系數(shù)與藥形的關系如表1所示。
3)數(shù)據(jù)管理功能。主要利用SQL Server 2008完成用戶信息的查詢、添加和刪除操作,以及用戶歷史操作的記錄和意見反饋的管理,這樣就控制軟件的用戶登錄權限,也為軟件功能的完善提供了基礎,同時特別實現(xiàn)對內(nèi)彈道方案參數(shù)和內(nèi)彈道計算結(jié)果數(shù)據(jù)的備份。
4)圖形處理功能。借助MATLAB強大的圖形處理功能,內(nèi)彈道計算時可以對需要曲線進行實時顯示,計算后分類保存,同時利用C#還特別定制了內(nèi)彈道曲線處理界面,主要實現(xiàn)曲線查看、格式轉(zhuǎn)換、復制與刪除、另存與打印等基本功能。
5)窗體換膚功能。主要考慮了軟件的外觀與用戶使用舒適性,軟件集成了現(xiàn)有56種皮膚外觀。同時用戶自己也可以開發(fā).*ssk(窗體皮膚文件),并將該文件拷貝至程序當前目錄下DebugSkins文件夾下,即可完成窗體皮膚功能的擴展。
內(nèi)彈道設計軟件主界面(見圖2)以內(nèi)彈道參數(shù)錄入、方案評價部分和計算結(jié)果數(shù)據(jù)顯示部分為主體,通過各功能按鈕完成對相應子模塊功能的調(diào)用,整個界面布置整潔、緊湊,操作方便。
表1 藥形和的對照表
表1 藥形和的對照表
藥形 ρ 0.5d0+e1圓柱形七孔 0.2956花邊形七孔 0.1547花邊形十四孔 0.1547花邊形十九孔 0.1547圓柱形十九孔 0.3559正六邊形十九孔 0.1864等圓角六邊形十九孔 0.1977
圖2 內(nèi)彈道設計計算軟件的主界面
編寫相應彈道程序并成功調(diào)式運行后,再將原計算程序中的關鍵常數(shù)均替換為變量,作為Function函數(shù)的輸入?yún)?shù),這樣通過MATLAB Builder NE即可將彈道核心計算部分的程序編譯生成dll動態(tài)鏈接庫文件,也就是C#與MATLAB之間通信的接口。另外只需在保證文件名和輸入輸出參數(shù)不變的條件下將修改后的計算程序重新編譯成dll,并在C#中重新引用,不必修改任何C#語言代碼,即可完成.Net程序的升級更新。
用C#實例化某類型火藥的內(nèi)彈道設計計算類的對象,通過對象來調(diào)用實現(xiàn)計算的方法,在保證計算函數(shù)成功引用和C#與MATLAB之間數(shù)據(jù)恰當轉(zhuǎn)換的前提下,使用C#編寫內(nèi)彈道設計計算部分的功能代碼。(雙斜杠"http://"后的文字為解釋性內(nèi)容和行號,調(diào)試時都不被編譯;“……”號代表省略了不重要或類似的代碼)部分代碼:
①using MathWorks.MATLAB.NET.Arrays;
②using MathWorks.MATLAB.NET.Utility;
③using IBsimplepowderNet;
④……
⑤private void btn內(nèi)彈道計算_Click(object sender,EventArgs e)
⑥{……
⑦switch(裝藥comboBox.SelectedItem.ToString())
⑧{
⑨case"簡單形狀火藥":
⑩try
?{//實例化計算簡單火藥內(nèi)彈道的類
?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輸出列向量轉(zhuǎn)換到C#中
?double[]loc_t=null;
?loc_t=(double[])t.ToVector(MWArray
Component.Real);
?catch(Exception)
?{MessageBox.Show("請檢查輸入?yún)?shù)是否匹配?",……);}
?break;
?case"多孔火藥": //多孔火藥計算部分
?……
?break;
?省略混合、鈍感火藥內(nèi)彈道設計的代碼……
其中第1~2行為C#與MATLAB混合編程必須引用的命名空間,第3行為引用MATLAB編譯了的簡單火藥(其他火藥類似)內(nèi)彈道設計計算程序集,第7行switch語句選擇裝藥類型及藥形,第13行調(diào)用計算簡單火藥內(nèi)彈道的方法,第14~15行取出計算結(jié)果的每個值,并轉(zhuǎn)化為string類型,顯示在窗口中顯示出來,第19行將結(jié)算結(jié)果中的列向量轉(zhuǎn)化為C#中的數(shù)據(jù)類型。程序中try{}catch{}代碼捕獲程序突發(fā)異常和參數(shù)輸入不當異常。
該軟件涉及到的數(shù)據(jù)管理有:用戶信息、歷史記錄與意見反饋,計算數(shù)值結(jié)果與曲線。在軟件底層利用C#編寫連接字符串來連接SQL Server數(shù)據(jù)庫,通過C#開發(fā)的用戶界面即可方便快速的完成數(shù)據(jù)的查詢、添加、刪除、導出與打印等功能,同時直接利用MATLAB強大的繪圖功能和C#強大的文件輸入輸出功能,就可完全的完成計算數(shù)據(jù)的管理。
軟件對100mm加農(nóng)炮(其采用單一管狀藥)、85mm加農(nóng)炮(其采用圓柱形七孔火藥)[6]、122mm榴彈炮(其采用管狀藥和圓柱形七孔火藥的混合裝藥)及35mm高炮(其采用鈍感火藥)的內(nèi)彈道設計計算進行了算例的定制。
下面以采用圓柱七孔火藥的85mm加農(nóng)炮內(nèi)彈道設計計算為例,計算結(jié)果如表2所示,和現(xiàn)有制式同類火炮的評價標準接近,說明 C#與MATLAB混合編程技術在內(nèi)彈道設計計算中應用是可行的。
表2 85mm加農(nóng)炮多孔火藥內(nèi)彈道設計計算評價標準
通過對C#與MATLAB混合編程技術的研究,完成了不同類型火藥的內(nèi)彈道設計計算軟件的開發(fā)。該軟件操作方便快捷,具有良好的人機交互性和集成性,可以為未來火炮設計軟件的開發(fā)提供基礎,另外文中采用的經(jīng)典內(nèi)彈道模型可進一步拓展至其改進型和考慮兩相流的內(nèi)彈道模型,還有該混編技術也可以在外彈道、身管設計計算、炮口制退器、反后坐裝置等火炮常規(guī)計算中推廣使用,為火炮的現(xiàn)代計算機輔助設計提供了一種思路。
[1]馬煜,陳海軍.Visual C#.NET案例開發(fā)集綿[M].北京:電子工業(yè)出版社,2008.
[2]羅炳華,高躍飛,劉榮華,等.基于MATLAB與C#的火炮CAD系統(tǒng)開發(fā)和優(yōu)化設計[J].火炮發(fā)射與控制學報,2010(2):44-47.
[3]鄭暉,王勇.C#與Matlab混合編程技術在數(shù)字地震信號處理軟件中的應用[J].地震地磁觀測與研究,2011,32(2):101-105.
[4]張燕,馬永杰.Visual C#與MATLAB混合編程方法及其實現(xiàn)[J].西北師范大學學報,2008,44(6):34 -37.
[5]劉雙杰,郝永乎.35mm高射炮鈍感發(fā)射藥的內(nèi)彈道仿真[J].彈箭與制導學報,2010,30(1):170 -172.
[6]金志明.槍炮內(nèi)彈道學[M].北京:北京理工大學出版社,2004.