柯 彪,高躍飛,羅炳華,徐鳳軍
(1中北大學機電工程學院,太原 030051;2四川九洲電器集團有限責任公司,四川綿陽 621000)
早期的內彈道設計是把內彈道設計的相關函數關系在給定一些條件下編成內彈道設計表,然后通過查表來解決實際的內彈道設計問題。目前,隨著計算機技術的快速發展,人們開始編制了多種內彈道設計軟件,可以快速進行內彈道計算和方案設計,但還是受開發語言的限制,軟件人機交互性差,專業性強,不易于集成。為此,文中結合C#和MATLAB各自的優點,利用其混合編程技術,開發了界面友好、操作簡單、圖形和數據管理方便的內彈道設計軟件,利用該軟件根據設計評價標準最終可以選出最佳性能的內彈道方案,為后續的炮身、炮架以及彈藥設計提供了依據,也為未來火炮設計軟件系統的開發提供了基礎。
Microsoft Visual C#是 Microsoft專門為使用.NET平臺而開發的一種強大的、面向組件的語言,可用于方便快捷的創建運行在.NET公共語言運行庫(common language runtime,CLR)上的Windows應用程序[1]。但是其在數值計算分析和曲線繪圖方面的操作繁瑣,功能薄弱。
MATLAB是一種用于數值計算、可視化及編程的高級語言和交互式環境,可以分析數據,開發算法,創建模型和應用程序。借助其語言、工具和內置數學函數,可以快速簡潔的編制所有的各類計算程序和輸出相應數據。但是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框架版本要相適應,以及它們之間傳輸參數個數的匹配和數據類型之間的恰當轉換。
典型的內彈道設計問題可以歸納為在已知的火炮口徑d、彈丸質量m和彈丸初速v0的條件下,選擇適當的最大壓力pm、藥室擴大系數χK以及火藥品種,然后計算出能滿足上述條件的膛內構造諸元和裝藥條件等眾多未知量,將是一個多解的問題,但是保證武器能夠具有規定的初速是內彈道設計的根本要求。
根據內彈道設計的思路,采用C#與MATLAB混合編程技術,開發了內彈道設計軟件,實現了權限管理、內彈道設計計算、數值數據與圖形處理的功能,具有一定的通用性、可擴展性和可集成的特點。該軟件設計計算部分的核心框架見圖1。

圖1 內彈道設計計算的核心框架示意圖
內彈道設計軟件在 Windows操作系統下的Visual Studio 2010集成開發環境下開發,根據用戶需要可以很方便的確定軟件所支持的操作系統位數,數據庫采用的是 SQL Server 2008,軟件的.Net Framework框架版本根據C#與MATLAB的版本要求確定。只需將應用程序、數據庫安裝包、相同MATLAB版本的MCR運行庫及所需要的.Net Framework獨立安裝包一同打包,通過編寫相應的安裝腳本控制順序安裝,就可以使軟件安裝不依賴客戶端的配置,移植性強。
根據一般工程設計軟件的要求,內彈道設計軟件的功能設計有:權限管理、內彈道設計計算、數據管理和圖形處理、歷史記錄、意見反饋以及窗體換膚功能。
1)權限管理功能。將軟件使用人員分為系統管理員和一般設計計算員。根據內彈道設計所采用的裝藥類型給不同設計計算員分配各自內彈道設計所需權限和自身用戶信息管理權限,彼此獨立,而系統管理員具有查詢、添加、刪除及導出用戶信息和進行所有設計計算的權限。
2)內彈道設計計算功能。將以經典內彈道模型為基礎,適用于簡單形狀火藥(如管狀、帶狀、方片狀等幾種)、多孔火藥(常用的圓柱形七孔、花邊形七孔、花邊形十四孔等幾種)、混合裝藥(以簡單形狀火藥和多孔火藥的混合為例)及鈍感火藥[5]的內彈道設計計算的MATLAB程序修改為m函數文件,另外編程時也考慮了不同火藥對計算參數的選取要求。其中多孔火藥在減面燃燒階段用來計算與碎粒斷面相當的內切圓半徑ρ的計算系數與藥形的關系如表1所示。
3)數據管理功能。主要利用SQL Server 2008完成用戶信息的查詢、添加和刪除操作,以及用戶歷史操作的記錄和意見反饋的管理,這樣就控制軟件的用戶登錄權限,也為軟件功能的完善提供了基礎,同時特別實現對內彈道方案參數和內彈道計算結果數據的備份。
4)圖形處理功能。借助MATLAB強大的圖形處理功能,內彈道計算時可以對需要曲線進行實時顯示,計算后分類保存,同時利用C#還特別定制了內彈道曲線處理界面,主要實現曲線查看、格式轉換、復制與刪除、另存與打印等基本功能。
5)窗體換膚功能。主要考慮了軟件的外觀與用戶使用舒適性,軟件集成了現有56種皮膚外觀。同時用戶自己也可以開發.*ssk(窗體皮膚文件),并將該文件拷貝至程序當前目錄下DebugSkins文件夾下,即可完成窗體皮膚功能的擴展。
內彈道設計軟件主界面(見圖2)以內彈道參數錄入、方案評價部分和計算結果數據顯示部分為主體,通過各功能按鈕完成對相應子模塊功能的調用,整個界面布置整潔、緊湊,操作方便。
表1 藥形和的對照表

表1 藥形和的對照表
藥形 ρ 0.5d0+e1圓柱形七孔 0.2956花邊形七孔 0.1547花邊形十四孔 0.1547花邊形十九孔 0.1547圓柱形十九孔 0.3559正六邊形十九孔 0.1864等圓角六邊形十九孔 0.1977

圖2 內彈道設計計算軟件的主界面
編寫相應彈道程序并成功調式運行后,再將原計算程序中的關鍵常數均替換為變量,作為Function函數的輸入參數,這樣通過MATLAB Builder NE即可將彈道核心計算部分的程序編譯生成dll動態鏈接庫文件,也就是C#與MATLAB之間通信的接口。另外只需在保證文件名和輸入輸出參數不變的條件下將修改后的計算程序重新編譯成dll,并在C#中重新引用,不必修改任何C#語言代碼,即可完成.Net程序的升級更新。
用C#實例化某類型火藥的內彈道設計計算類的對象,通過對象來調用實現計算的方法,在保證計算函數成功引用和C#與MATLAB之間數據恰當轉換的前提下,使用C#編寫內彈道設計計算部分的功能代碼。(雙斜杠"http://"后的文字為解釋性內容和行號,調試時都不被編譯;“……”號代表省略了不重要或類似的代碼)部分代碼:
①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{}代碼捕獲程序突發異常和參數輸入不當異常。
該軟件涉及到的數據管理有:用戶信息、歷史記錄與意見反饋,計算數值結果與曲線。在軟件底層利用C#編寫連接字符串來連接SQL Server數據庫,通過C#開發的用戶界面即可方便快速的完成數據的查詢、添加、刪除、導出與打印等功能,同時直接利用MATLAB強大的繪圖功能和C#強大的文件輸入輸出功能,就可完全的完成計算數據的管理。
軟件對100mm加農炮(其采用單一管狀藥)、85mm加農炮(其采用圓柱形七孔火藥)[6]、122mm榴彈炮(其采用管狀藥和圓柱形七孔火藥的混合裝藥)及35mm高炮(其采用鈍感火藥)的內彈道設計計算進行了算例的定制。
下面以采用圓柱七孔火藥的85mm加農炮內彈道設計計算為例,計算結果如表2所示,和現有制式同類火炮的評價標準接近,說明 C#與MATLAB混合編程技術在內彈道設計計算中應用是可行的。

表2 85mm加農炮多孔火藥內彈道設計計算評價標準
通過對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.