本發(fā)明涉及一種模型描述及生成方法,具體地說(shuō)是一種支持組合模型的模型描述及生成方法,屬于模型描述及生成方法領(lǐng)域。
背景技術(shù):
建模技術(shù)是系統(tǒng)仿真過(guò)程最基礎(chǔ)、也是最重要的一個(gè)環(huán)節(jié),一定程度上決定了系統(tǒng)運(yùn)行效率和仿真推演的成功率。仿真系統(tǒng)的模型體系中除指揮決策模型、偵察探測(cè)模型、通信傳輸模型、信息融合模型、仿真實(shí)體模型和戰(zhàn)場(chǎng)環(huán)境模型,還包括作戰(zhàn)行動(dòng)中所涉及的各類(lèi)作戰(zhàn)實(shí)體模型和實(shí)體之間的交互關(guān)系模型等等。
上述模型在邏輯層面存在較大差異,目前市面中難以對(duì)其結(jié)構(gòu)統(tǒng)一,只能依據(jù)實(shí)際業(yè)務(wù)體系,在具體的業(yè)務(wù)中建立支撐體系,無(wú)法實(shí)現(xiàn)仿真界廣義的通用。因此,從底層設(shè)計(jì)的角度對(duì)模型做一個(gè)通盤(pán)統(tǒng)一的考慮,加強(qiáng)系統(tǒng)仿真中建模體系的總體規(guī)劃與設(shè)計(jì),實(shí)現(xiàn)一種通用的模型生成方法,提高模型描述與開(kāi)發(fā)的標(biāo)準(zhǔn)化、規(guī)范化程度,增強(qiáng)模型的獨(dú)立性和可組合性,極大地實(shí)現(xiàn)模型的可復(fù)用性,特別是對(duì)系統(tǒng)集成具有更重要的意義。
技術(shù)實(shí)現(xiàn)要素:
為了解決上述問(wèn)題,本發(fā)明設(shè)計(jì)了一種支持組合模型的模型描述及生成方法,實(shí)現(xiàn)了系統(tǒng)仿真領(lǐng)域內(nèi)的模型通用分類(lèi),將領(lǐng)域內(nèi)模型統(tǒng)一歸類(lèi),通用處理;并實(shí)現(xiàn)了模型的通用描述方法,實(shí)現(xiàn)了模型的構(gòu)件化,所有模型接口、參數(shù)統(tǒng)一標(biāo)準(zhǔn),便于系統(tǒng)中數(shù)據(jù)、指令的通信。
本發(fā)明的技術(shù)方案為:
一種支持組合模型的模型描述及生成方法,包含通用的模型分類(lèi)方法、模型的通用結(jié)構(gòu)組成、支持組合模型的描述方法、模型的通用生成方法四個(gè)部分,具體內(nèi)容如下:
(1)通用的模型分類(lèi)方法
為滿足模型的通用性需求,將系統(tǒng)仿真行業(yè)內(nèi)的所有模型歸類(lèi),分為六類(lèi)模型,包括實(shí)體模型、計(jì)算模型、顯示組件、算子模型、業(yè)務(wù)構(gòu)件和通用插件;其中實(shí)體模型指自然界所有可以獨(dú)立工作,并輸出工作成果的物體集合,比如飛機(jī)模型、火箭模型等。計(jì)算模型是指數(shù)學(xué)領(lǐng)域內(nèi)涉及到的所有計(jì)算公式或者計(jì)算方法共同組成模型,比如求正弦模型、求微積分模型等。顯示組件是指仿真系統(tǒng)中用于形象化展示仿真過(guò)程某一個(gè)或者多個(gè)模型的屬性集信息的組件,此類(lèi)組件有獨(dú)立的界面,并且可人工設(shè)置顯示界面,比如曲線圖顯示組件、二維GIS顯示組件等。算子模型是指為一個(gè)方案或者系統(tǒng)仿真執(zhí)行過(guò)程特殊定制的評(píng)估計(jì)算模型,依據(jù)不同的評(píng)估方法可以生成多種評(píng)估模型,例如飛機(jī)飛行速度分布算子模型。業(yè)務(wù)構(gòu)件一般具有獨(dú)立業(yè)務(wù)性,具有某一項(xiàng)獨(dú)立的功能,大部分業(yè)務(wù)構(gòu)件包含界面,可以響應(yīng)用戶(hù)人機(jī)交互操作,并執(zhí)行預(yù)先編排好的業(yè)務(wù)功能,實(shí)現(xiàn)與其他構(gòu)件或者模型的交互,比如想定工程列表樹(shù)構(gòu)件、日志欄構(gòu)件等。通用插件一般指數(shù)據(jù)指令傳輸、信號(hào)解析、界面預(yù)處理等在仿真系統(tǒng)中常用的中間件,比如網(wǎng)絡(luò)消息中間件插件、單機(jī)仿真引擎插件等。
(2)模型的通用結(jié)構(gòu)組成
所有的模型分為六類(lèi),但是六類(lèi)模型具有通用的結(jié)構(gòu)組成,任意一個(gè)模型都包含基本信息、屬性信息、輸入接口、輸出接口、發(fā)起事件、響應(yīng)事件六大類(lèi)屬性組成。其中基本信息描述創(chuàng)建模型時(shí)的版權(quán)及類(lèi)別信息等;屬性信息描述模型的靜態(tài)信息;輸入接口描述在仿真過(guò)程中模型需要接收的參數(shù)信息;輸出接口描述在仿真過(guò)程中模型能夠提供的參數(shù)信息;發(fā)起事件描述在仿真過(guò)程中滿足觸發(fā)條件或觸發(fā)時(shí)間,模型能夠觸發(fā)的事件集;響應(yīng)事件描述在仿真過(guò)程中模型本體需要響應(yīng)其他模型對(duì)應(yīng)的發(fā)起事件集。模型的各個(gè)屬性結(jié)點(diǎn)中都需要數(shù)據(jù)類(lèi)型的支持,除支持基本類(lèi)型,還可以支持用戶(hù)自定義的數(shù)據(jù)類(lèi)型,因此模型的描述中還需要包含自定義數(shù)據(jù)結(jié)構(gòu),支持設(shè)計(jì)人員按照自身業(yè)務(wù)需要的數(shù)據(jù)定義。
(3)支持組合模型的描述方法
用于依據(jù)實(shí)際的業(yè)務(wù)需要,可以對(duì)已開(kāi)發(fā)模型進(jìn)行任意組合配置,組合后可以當(dāng)成一個(gè)基本模型使用,使用方式與非組合基本模型相同。組合模型中,有且僅有一個(gè)父模型,多個(gè)子模型;父模型屬性結(jié)構(gòu)內(nèi)添加了組合模型的描述信息。
(4)模型的通用生成方法
一、依據(jù)模型的分類(lèi)特征建立通用的工程模板,還可以分別定義各個(gè)模型類(lèi)別的模板,模板中包含模型計(jì)算需要的公共接口,包括數(shù)據(jù)初始化、仿真運(yùn)行、數(shù)據(jù)公布、數(shù)據(jù)訂購(gòu)、狀態(tài)控制等功能接口。在模板中涉及到模型參數(shù)信息的部分,均用<$Name$>的格式替代,其中Name為模板屬性,人為定義生成。模板中需要包含可編譯執(zhí)行的頭文件、源文件、配置文件、工程文件,可以包含不同擴(kuò)展名的工程文件。
二、配置模板與模型的屬性關(guān)聯(lián)映射,模板的屬性是指<$Name$>中Name字段,模型的屬性是指按照上述既定格式定義的模型各個(gè)信息結(jié)點(diǎn)字段,兩類(lèi)屬性的映射關(guān)系為1:1,不允許出現(xiàn)1:N或者M(jìn):N的映射關(guān)系。
三、關(guān)聯(lián)映射完成后,將模型的屬性信息、輸入接口、輸出接口、發(fā)起事件、響應(yīng)事件共五類(lèi)參數(shù)結(jié)構(gòu),按照參數(shù)的可使用范圍、參數(shù)類(lèi)型、參數(shù)值的順序讀取并依據(jù)映射表替代模板的所有屬性字段。
四、若模型的組合模型屬性中有子模型結(jié)點(diǎn),需要將對(duì)應(yīng)的母體模型編號(hào)關(guān)聯(lián)映射,并將母體模型的屬性信息、輸入?yún)?shù)、輸出參數(shù)、發(fā)起事件、響應(yīng)事件實(shí)參映射,即在計(jì)算中母體模型的參數(shù)相當(dāng)于模型本體的參數(shù)來(lái)用;若模型的組合模型屬性中有母體模型結(jié)點(diǎn),需要將對(duì)應(yīng)的所有子模型編號(hào)關(guān)聯(lián)映射,并將子模型的全部屬性信息、輸入?yún)?shù)、輸出參數(shù)、發(fā)起事件、響應(yīng)事件信息映射到母體模型中,作為模型本體的子屬性集合。
五、將模板文件名修改為模型英文名稱(chēng),批量導(dǎo)出文件。至此,成功生成可編譯執(zhí)行的模型工程。
本發(fā)明有如下優(yōu)點(diǎn):以評(píng)估指標(biāo)體系、數(shù)據(jù)評(píng)估分析算子模型和工具為支撐,為各種應(yīng)用數(shù)據(jù)、仿真結(jié)果提供有力的定性定量分析,為決策制定、方案評(píng)估優(yōu)化等提供支持,實(shí)現(xiàn)了系統(tǒng)仿真領(lǐng)域內(nèi)的模型通用分類(lèi),將領(lǐng)域內(nèi)模型統(tǒng)一歸類(lèi),通用處理;并實(shí)現(xiàn)了模型的通用描述方法,實(shí)現(xiàn)了模型的構(gòu)件化,所有模型接口、參數(shù)統(tǒng)一標(biāo)準(zhǔn),便于系統(tǒng)中數(shù)據(jù)、指令的通信。
附圖說(shuō)明
圖1為系統(tǒng)仿真行業(yè)模型通用分類(lèi)圖;
圖2為模型通用結(jié)構(gòu)組成圖;
圖3為模型的通用生成方法步驟圖。
具體實(shí)施方式
以下對(duì)本發(fā)明的優(yōu)選實(shí)施例進(jìn)行說(shuō)明,應(yīng)當(dāng)理解,此處所描述的優(yōu)選實(shí)施例僅用于說(shuō)明和解釋本發(fā)明,并不用于限定本發(fā)明。
實(shí)施例1
一種支持組合模型的模型描述及生成方法,包含通用的模型分類(lèi)方法、模型的通用結(jié)構(gòu)組成、支持組合模型的描述方法、模型的通用生成方法四個(gè)部分,具體內(nèi)容如下:
(1)通用的模型分類(lèi)方法
為滿足模型的通用性需求,將系統(tǒng)仿真行業(yè)內(nèi)的所有模型歸類(lèi),分為六類(lèi)模型,包括實(shí)體模型、計(jì)算模型、顯示組件、算子模型、業(yè)務(wù)構(gòu)件和通用插件,見(jiàn)附圖 1所示。其中實(shí)體模型指自然界所有可以獨(dú)立工作,并輸出工作成果的物體集合,比如飛機(jī)模型、火箭模型等。計(jì)算模型是指數(shù)學(xué)領(lǐng)域內(nèi)涉及到的所有計(jì)算公式或者計(jì)算方法共同組成模型,比如求正弦模型、求微積分模型等。顯示組件是指仿真系統(tǒng)中用于形象化展示仿真過(guò)程某一個(gè)或者多個(gè)模型的屬性集信息的組件,此類(lèi)組件有獨(dú)立的界面,并且可人工設(shè)置顯示界面,比如曲線圖顯示組件、二維GIS顯示組件等。算子模型是指為一個(gè)方案或者系統(tǒng)仿真執(zhí)行過(guò)程特殊定制的評(píng)估計(jì)算模型,依據(jù)不同的評(píng)估方法可以生成多種評(píng)估模型,例如飛機(jī)飛行速度分布算子模型。業(yè)務(wù)構(gòu)件一般具有獨(dú)立業(yè)務(wù)性,具有某一項(xiàng)獨(dú)立的功能,大部分業(yè)務(wù)構(gòu)件包含界面,可以響應(yīng)用戶(hù)人機(jī)交互操作,并執(zhí)行預(yù)先編排好的業(yè)務(wù)功能,實(shí)現(xiàn)與其他構(gòu)件或者模型的交互,比如想定工程列表樹(shù)構(gòu)件、日志欄構(gòu)件等。通用插件一般指數(shù)據(jù)指令傳輸、信號(hào)解析、界面預(yù)處理等在仿真系統(tǒng)中常用的中間件,比如網(wǎng)絡(luò)消息中間件插件、單機(jī)仿真引擎插件等。
(2)模型的通用結(jié)構(gòu)組成
所有的模型分為六類(lèi),但是六類(lèi)模型具有通用的結(jié)構(gòu)組成,結(jié)構(gòu)組成如附圖2所示。任意一個(gè)模型都包含基本信息、屬性信息、輸入接口、輸出接口、發(fā)起事件、響應(yīng)事件六大類(lèi)屬性組成。其中基本信息描述創(chuàng)建模型時(shí)的版權(quán)及類(lèi)別信息等;屬性信息描述模型的靜態(tài)信息;輸入接口描述在仿真過(guò)程中模型需要接收的參數(shù)信息;輸出接口描述在仿真過(guò)程中模型能夠提供的參數(shù)信息;發(fā)起事件描述在仿真過(guò)程中滿足觸發(fā)條件或觸發(fā)時(shí)間,模型能夠觸發(fā)的事件集;響應(yīng)事件描述在仿真過(guò)程中模型本體需要響應(yīng)其他模型對(duì)應(yīng)的發(fā)起事件集。其中,模型的基本信息如表1所示,模型的屬性信息如表2所示,模型的輸入接口如表3所示,模型的輸出接口如表4所示,模型的發(fā)起事件如表5所示,模型的響應(yīng)事件如表6所示。模型的各個(gè)屬性結(jié)點(diǎn)中都需要數(shù)據(jù)類(lèi)型的支持,除支持基本類(lèi)型,還可以支持用戶(hù)自定義的數(shù)據(jù)類(lèi)型,因此模型的描述中還需要包含自定義數(shù)據(jù)結(jié)構(gòu),支持設(shè)計(jì)人員按照自身業(yè)務(wù)需要的數(shù)據(jù)定義,如表7所示。
(3)支持組合模型的描述方法
用于依據(jù)實(shí)際的業(yè)務(wù)需要,可以對(duì)已開(kāi)發(fā)模型進(jìn)行任意組合配置,組合后可以當(dāng)成一個(gè)基本模型使用,使用方式與非組合基本模型相同。組合模型中,有且僅有一個(gè)父模型,多個(gè)子模型;父模型屬性結(jié)構(gòu)內(nèi)添加了組合模型的描述信息,描述信息如表8所示。
(4)模型的通用生成方法
一、依據(jù)模型的分類(lèi)特征建立通用的工程模板,還可以分別定義各個(gè)模型類(lèi)別的模板,模板中包含模型計(jì)算需要的公共接口,包括數(shù)據(jù)初始化、仿真運(yùn)行、數(shù)據(jù)公布、數(shù)據(jù)訂購(gòu)、狀態(tài)控制等功能接口,如表9所示。在模板中涉及到模型參數(shù)信息的部分,均用<$Name$>的格式替代,其中Name為模板屬性,人為定義生成。模板中需要包含可編譯執(zhí)行的頭文件、源文件、配置文件、工程文件,可以包含不同擴(kuò)展名的工程文件。
二、配置模板與模型的屬性關(guān)聯(lián)映射,模板的屬性是指<$Name$>中Name字段,模型的屬性是指按照上述既定格式定義的模型各個(gè)信息結(jié)點(diǎn)字段,兩類(lèi)屬性的映射關(guān)系為1:1,不允許出現(xiàn)1:N或者M(jìn):N的映射關(guān)系。
三、關(guān)聯(lián)映射完成后,將模型的屬性信息、輸入接口、輸出接口、發(fā)起事件、響應(yīng)事件共五類(lèi)參數(shù)結(jié)構(gòu),按照參數(shù)的可使用范圍、參數(shù)類(lèi)型、參數(shù)值的順序讀取并依據(jù)映射表替代模板的所有屬性字段。
四、若模型的組合模型屬性中有子模型結(jié)點(diǎn),需要將對(duì)應(yīng)的母體模型編號(hào)關(guān)聯(lián)映射,并將母體模型的屬性信息、輸入?yún)?shù)、輸出參數(shù)、發(fā)起事件、響應(yīng)事件實(shí)參映射,即在計(jì)算中母體模型的參數(shù)相當(dāng)于模型本身的參數(shù)來(lái)用;若模型的組合模型屬性中有母體模型結(jié)點(diǎn),需要將對(duì)應(yīng)的所有子模型編號(hào)關(guān)聯(lián)映射,并將子模型的全部屬性信息、輸入?yún)?shù)、輸出參數(shù)、發(fā)起事件、響應(yīng)事件信息映射到母體模型中,作為本模型的子屬性集合。
五、將模板文件名修改為模型英文名稱(chēng),批量導(dǎo)出文件。至此,成功生成可編譯執(zhí)行的模型工程,生成流程如圖3所示。
拿實(shí)體模型舉例,新建一個(gè)通信衛(wèi)星實(shí)體模型,將模型的描述文件擴(kuò)展名定義為.mdc,并采用xml的語(yǔ)法結(jié)構(gòu)存儲(chǔ),由于衛(wèi)星模型是單例實(shí)體,非組合模型,所以不包含組合描述結(jié)構(gòu),建成后的結(jié)構(gòu)如下:
<!-- TIS - Model Data Configuration -->
<MDC>
<Basic NameEn="CHINASAT_6" NameCn="通信衛(wèi)星" Type="實(shí)體模型" CLSID="F484F5C9-11BA-485a-825F-6792B42BC9FC" ScenarioID="" NameEnPln="pleSatelliteD" NameCnPln="通信衛(wèi)星" Version="V0.0.0.1" CreateDate="2015-6-22 09:09:26" ModificationDate="2015-8-22 09:40:04" SecurityClassification="Unclassified" Purpose="衛(wèi)星仿真案例" Description="衛(wèi)星仿真案例">
<POC POCName="TIS" POCOrganization="TIS" POCTelephone="13XXXXXXXXX" POCEmail="tis@css.com.cn"/>
<Glyph Path="CHINASAT_6.png" Type="png" Alternate="通信衛(wèi)星" Height="48" Width="48"/>
</Basic>
<Property>
<g n="Schedule" v="true" r="想定參數(shù)">
<pp n="InitPos" t="StPos" u="NULL" r="初始位置"></pp>
</g>
<g n="Basic" v="true" r="基礎(chǔ)屬性">
<pp n="Name" t="string" u="NULL" r="名稱(chēng)">CHINASAT_6</pp>
<pp n="TleFile" t="string" u="NULL" r="兩行星歷參數(shù)文件"> CHINASAT_6.tle</pp>
</g>
</Property>
<Input/>
<Output>
<g n="空間位置" r="當(dāng)前位置">
<op n="CurPos" t="StPos" u="NULL" r="當(dāng)前位置"/>
</g>
</Output>
<Event>
<EI/>
<EO/>
</Event>
<ChildModel/>
<Userdefine>
<s n="StPos" r="空間位置">
<sp n="lon" t="double" u="度" r="lon"/>
<sp n="lat" t="double" u="度" r="lat"/>
<sp n="alt" t="double" u="米" r="alt"/>
</s>
</Userdefine>
</MDC>
生成模型的配置文件后,再定義模型的工程模板文件,拿模型的可編譯頭文件舉例,模板定義為如下結(jié)構(gòu):
//=================================================================
// Copyright(C), CSS Inc. 2015.
// Summary:
// ple 實(shí)體模型 <$Name$>
// Aauthor:
//
// Date:
// 2015-08-12
// Remark:
// <$Name$>實(shí)體模型
// Usage:
// <$Name$>實(shí)體模型
// History:
// <author> <time> <version > <desc>
// 2015/08/12 1.0 build this moudle
//=================================================================
#ifndef _AFX_PLE<$U_Name$>_TIS_CSS_SMILESANGEL_INCLUDED_
#define _AFX_PLE<$U_Name$>_TIS_CSS_SMILESANGEL_INCLUDED_
#include "module/plugininc.h"
#include "pleclsiddefine.h"
class CPle<$Name$> : public ITPleModelBase
{
X3BEGIN_CLASS_DECLARE(CPle<$Name$>, CLSIDple<$Name$>)
X3DEFINE_INTERFACE_ENTRY(ITPlx_Model)
X3END_CLASS_DECLARE()
public:
// 模型初始化
int init(std::wstring strNameEn, std::wstring strDir);
// 仿真運(yùn)行
int run(long long llTime);
// 復(fù)位
int reset(void);
// 更新輸入數(shù)據(jù)
long dataUpdate();
// 更新輸出數(shù)據(jù)
long dataPublish();
// 添加public訪問(wèn)標(biāo)記的通用成員函數(shù)
MEMBER_FUNCS_DECLARE()
protected:
/**********************************************************************
* 函數(shù)名稱(chēng):CPle<$Name$>()
* 函數(shù)功能:構(gòu)造函數(shù)。
* 輸入?yún)?shù):無(wú)。
* 輸出參數(shù):無(wú)。
* 函數(shù)返回:無(wú)。
* 特殊說(shuō)明:無(wú)。
**********************************************************************/
CPle<$Name$>(void);
/**********************************************************************
* 函數(shù)名稱(chēng):~CPle<$Name$>()
* 函數(shù)功能:析構(gòu)函數(shù)。
* 輸入?yún)?shù):無(wú)。
* 輸出參數(shù):無(wú)。
* 函數(shù)返回:無(wú)。
* 特殊說(shuō)明:無(wú)。
**********************************************************************/
~CPle<$Name$>(void);
/**********************************************************************
* 函數(shù)名稱(chēng):setUserDefinePropertyValue()
* 函數(shù)功能:設(shè)置用戶(hù)自定義屬性值。
* 輸入?yún)?shù):strName -- 屬性名稱(chēng)。
* pValue -- 屬性值。
* nBytes -- 屬性值占用的字節(jié)數(shù)。
* 輸出參數(shù):無(wú)。
* 函數(shù)返回:無(wú)。
* 特殊說(shuō)明:在setPropertyValue中被調(diào)用。
**********************************************************************/
void setUserDefinePropertyValue(const std::wstring &strName, char *pValue, int nBytes);
/**********************************************************************
* 函數(shù)名稱(chēng):setUserDefineOutputValue()
* 函數(shù)功能:設(shè)置用戶(hù)自定義輸出參數(shù)值。
* 輸入?yún)?shù):strName -- 輸出參數(shù)名稱(chēng)。
* pValue -- 輸出參數(shù)值。
* nBytes -- 輸出參數(shù)值占用的字節(jié)數(shù)。
* 輸出參數(shù):無(wú)。
* 函數(shù)返回:無(wú)。
* 特殊說(shuō)明:在setOutputValue中被調(diào)用。
**********************************************************************/
void setUserDefineOutputValue(const std::wstring &strName, char *pValue, int nBytes);
/**********************************************************************
* 函數(shù)名稱(chēng):setUserDefineInputValue()
* 函數(shù)功能:設(shè)置用戶(hù)自定義輸入?yún)?shù)值。
* 輸入?yún)?shù):strName -- 輸入?yún)?shù)名稱(chēng)。
* pValue -- 輸入?yún)?shù)值。
* nBytes -- 輸入?yún)?shù)值占用的字節(jié)數(shù)。
* 輸出參數(shù):無(wú)。
* 函數(shù)返回:無(wú)。
* 特殊說(shuō)明:在setInputValue中被調(diào)用。
**********************************************************************/
void setUserDefineInputValue(const std::wstring &strName, char *pValue, int nBytes);
private:
protected:
// 通用數(shù)據(jù)成員
DECLARE_MODELDATA_MAP()
// 模型模板內(nèi)部變量(包括輸入、輸出和屬性)
BEGIN_INTERNAL_VARIABLE_RECD_PART()
<$DeclareModelDataMap$>
// 模型位置變量聲明
MODEL_POSITION_VARIABLE()
END_INTERNAL_VARIABLE_RECD_PART()
// ============== 其他數(shù)據(jù)成員 ===================================
CTFileMPCOperate m_mpcFile; // MPC文件操作類(lèi)對(duì)象
// ============== 模板中的數(shù)據(jù)成員 ===============================
protected:
<$PropertyDefineH$>
};
#endif // _AFX_PLE<$Name$>_TIS_CSS_SMILESANGEL_INCLUDED_
模板中<$Name$>、<$U_Name$>、<$DeclareModelDataMap$>、<$PropertyDefineH$>分別與模型的NameEn、NameEnPln、Basic-Name做映射,再依據(jù)模型的屬性值做替換,應(yīng)用通用的模型生成方法生成模型工程,最后編譯生成模型插件。至此,生成一套完整的模型工程。