李 陽 毛世峰 葉民友
(中國科學(xué)技術(shù)大學(xué)工程與應(yīng)用物理系 安徽 合肥 230026)
中國聚變工程實驗堆CFETR[1]是我國正在研究設(shè)計的新型超導(dǎo)托卡馬克裝置,旨在彌補ITER[2]和DEMO之間的差距并開展聚變堆關(guān)鍵技術(shù)的測試,對未來實現(xiàn)商用聚變堆的設(shè)計和建造有重要意義。作為一個復(fù)雜的工程系統(tǒng),CFETR需要經(jīng)歷漫長且復(fù)雜的設(shè)計過程,設(shè)計過程中將產(chǎn)生大量的設(shè)計文件。為了提高CFETR的設(shè)計效率,對這些設(shè)計文件進行有效管理是一個關(guān)鍵的問題。
隨著計算機軟件技術(shù)的進步,文檔管理系統(tǒng)被廣泛地應(yīng)用在工程領(lǐng)域。位于法國的國際熱核聚變實驗堆ITER開發(fā)了一套文檔管理系統(tǒng)IDM[3]。這套系統(tǒng)基于開源框架Zope開發(fā),具有易用性、安全性的特點,且具備強大的搜索功能。國內(nèi)的全超導(dǎo)托卡馬克實驗裝置EAST為了應(yīng)對爆炸式增長的項目文檔,開發(fā)了基于LDAP和RBAC的文檔管理系統(tǒng)[4-5],具備文檔管理、在線查看、用戶管理以及權(quán)限控制的功能。從功能上看,這些管理系統(tǒng)都提供了優(yōu)良的文檔管理功能,但缺乏對設(shè)計文件之間依賴關(guān)系管理的功能。
依賴關(guān)系在CFETR設(shè)計過程中起到重要的作用。CFETR包含13個子系統(tǒng),各子系統(tǒng)之間存在復(fù)雜的約束關(guān)系,即某個子系統(tǒng)的設(shè)計往往依賴于其他子系統(tǒng)。如果子系統(tǒng)設(shè)計之間發(fā)生依賴沖突,這樣的設(shè)計必然是錯誤的。傳統(tǒng)設(shè)計過程中,設(shè)計間的依賴關(guān)系通過設(shè)計人員閱讀設(shè)計文檔來保障。這種方式缺乏對依賴關(guān)系的系統(tǒng)管理,設(shè)計人員的失誤會帶來嚴重的后果。
考慮到設(shè)計文件是對物理部件的直接體現(xiàn),其與物理部件具有一一對應(yīng)的關(guān)系,因此物理部件之間的依賴關(guān)系也自然地對應(yīng)在設(shè)計文件上。通過管理設(shè)計文件的依賴關(guān)系,可以巧妙地解決物理部件之間的依賴問題。本文針對CFETR的設(shè)計需求,在CFETR集成設(shè)計平臺[6-7]上設(shè)計并實現(xiàn)了一套具備依賴管理功能的文檔管理系統(tǒng)。該系統(tǒng)首先基于達索公司的ENOVIA系統(tǒng),搭建了安全、穩(wěn)定、可靠的文檔管理服務(wù),用以存儲原始設(shè)計文件。在此基礎(chǔ)上,通過開發(fā)設(shè)計包管理服務(wù),封裝了設(shè)計文檔、管理了設(shè)計文件的依賴關(guān)系,并能全局地查看設(shè)計文件間的依賴關(guān)系。
CFETR設(shè)計文檔管理系統(tǒng)架構(gòu)如圖1所示。該系統(tǒng)由兩部分組成:用于管理原始數(shù)據(jù)的基礎(chǔ)文檔管理模塊和用于管理設(shè)計依賴關(guān)系的設(shè)計包管理模塊。
圖1 CFETR設(shè)計文檔管理系統(tǒng)架構(gòu)
數(shù)據(jù)文件是文檔管理系統(tǒng)的核心,任何一個文檔管理系統(tǒng)必須能保證數(shù)據(jù)的安全性??紤]到開發(fā)周期、人力成本以及可靠性要求,選擇經(jīng)過市場檢驗的商業(yè)軟件能帶來穩(wěn)定性和數(shù)據(jù)安全性的優(yōu)勢。CFETR文檔管理系統(tǒng)引入ENOVIA來存儲和管理原始數(shù)據(jù)。ENOVIA具有用戶友好的交互界面,同時還能夠和設(shè)計開發(fā)環(huán)境CATIA有機結(jié)合,用戶可以在瀏覽器端上傳、下載模型文件,也可以在CATIA軟件中直接傳輸、查看模型。
雖然ENOVIA具備優(yōu)良的文檔管理功能,但是不具備管理文檔依賴關(guān)系的功能。為了解決文檔依賴管理,CFETR設(shè)計文檔管理系統(tǒng)引入了“設(shè)計包”的概念。設(shè)計包是滿足某個特定設(shè)計要求的完整文件集合,其封裝了設(shè)計需求文檔、設(shè)計模型文件以及設(shè)計開發(fā)文檔等必要文件,并具有描述依賴關(guān)系的屬性。設(shè)計包是一個邏輯上不可拆分的實體,一旦生成就不能新增或刪除文件,這就保證了設(shè)計文檔的完整性和一致性。
在設(shè)計包的基礎(chǔ)上,開發(fā)了設(shè)計包管理模塊。設(shè)計包管理模塊由設(shè)計包數(shù)據(jù)庫、設(shè)計包管理程序和依賴沖突檢測程序組成。設(shè)計包數(shù)據(jù)庫記錄了系統(tǒng)中的數(shù)據(jù)包信息、系統(tǒng)中用戶信息以及數(shù)據(jù)包的依賴關(guān)系。設(shè)計包管理程序是用戶創(chuàng)建、查看、審批和銷毀設(shè)計包的程序。依賴沖突檢測程序?qū)崿F(xiàn)了依賴沖突檢測算法,能在引入依賴關(guān)系時檢測是否存在沖突。
C/S結(jié)構(gòu)和B/S結(jié)構(gòu)是常用的應(yīng)用系統(tǒng)軟件結(jié)構(gòu)。B/S結(jié)構(gòu)采用瀏覽器作為客戶端,無需部署客戶端程序,具有天然的跨平臺屬性。C/S結(jié)構(gòu)需要專門編寫客戶端程序,能充分發(fā)揮客戶端PC的處理能力,并能帶來更好的人機交互體驗和更靈活的操作流程。在CFETR設(shè)計文檔管理系統(tǒng)中,設(shè)計包管理程序采用了C/S架構(gòu),而原始數(shù)據(jù)存儲、管理所依賴的ENOVIA系統(tǒng)則采用了B/S架構(gòu)。
ENOVIA是達索公司開發(fā)的產(chǎn)品生命周期管理程序,兼具優(yōu)良的文檔管理功能。相較于其他文檔管理軟件,ENOVIA的優(yōu)勢在于其和三維建模軟件CATIA深度結(jié)合[8]。ENOVIA提供了豐富的配置工具,可以自由地配置軟件功能。同時,它也提供了可供二次開發(fā)的接口。在CFETR設(shè)計文檔管理系統(tǒng)中,設(shè)計包管理模塊就充分利用了ENOVIA的接口,實現(xiàn)了從ENOVIA中讀取、寫入數(shù)據(jù)的功能。
CFETR設(shè)計文檔管理系統(tǒng)采用Java語言和JavaFX技術(shù)開發(fā)了設(shè)計包管理程序,可以運行在Windows和Linux終端上。Java作為一門廣泛使用的計算機編程語言,擁有跨平臺、面向?qū)ο蟆⒎盒途幊痰奶匦?,并且具有豐富的開源庫,適合開發(fā)大型項目[9]。JavaFX是由甲骨文公司推出的和Java語言無縫結(jié)合的圖形界面技術(shù),擁有豐富的圖形API,相較于AWT、SWING等舊有的圖形庫,更容易地創(chuàng)建具有現(xiàn)代風(fēng)格的程序。JavaFX在語言層面實現(xiàn)了邏輯和界面的分離,其在控制器內(nèi)編寫邏輯代碼,在FXML文件內(nèi)構(gòu)建圖形化界面,因而易于編寫符合MVC框架的代碼[10]。CFETR文檔管理系統(tǒng)使用關(guān)系型數(shù)據(jù)庫MySQL管理數(shù)據(jù),具有性能高、成本低和可靠性好的特點。
由于原始數(shù)據(jù)存放在ENOVIA系統(tǒng)中,設(shè)計包無需再次存儲這些數(shù)據(jù)。在設(shè)計包管理系統(tǒng)中,使用文件指針的方式表明設(shè)計包數(shù)據(jù)文件的地址。此外,設(shè)計包還要有標志符、名稱、審核狀態(tài)、版本、所有者、創(chuàng)建時間、依賴關(guān)系等屬性,其中依賴關(guān)系是用分號分隔開的一系列設(shè)計包標志符,表明該設(shè)計包所依賴的設(shè)計包。設(shè)計包的數(shù)據(jù)結(jié)構(gòu)如圖2所示。
圖2 設(shè)計包的數(shù)據(jù)結(jié)構(gòu)
CFETR文檔管理系統(tǒng)在數(shù)據(jù)庫中創(chuàng)建了三張表,分別是設(shè)計包表、用戶表和依賴關(guān)系表。
2.2.1 設(shè)計包表
設(shè)計包表記錄了系統(tǒng)中的設(shè)計包信息,其表結(jié)構(gòu)如表1所示。
表1 design_package表結(jié)構(gòu)
2.2.2 用戶表
用戶數(shù)據(jù)表存儲了用戶信息,包括用戶名、密碼、郵箱以及用戶角色信息,其表結(jié)構(gòu)如表2所示。
表2 user表結(jié)構(gòu)
2.2.3 依賴關(guān)系表
依賴關(guān)系表存儲了設(shè)計包之間的依賴關(guān)系,每一條記錄對應(yīng)一個依賴關(guān)系,其表結(jié)構(gòu)如表3所示。
表3 依賴關(guān)系表
設(shè)計包的生命周期可分為三個階段:設(shè)計人員的創(chuàng)建階段,審核人員的審批階段以及設(shè)計作廢時的銷毀階段。
設(shè)計包管理程序客戶端基于Java和JavaFX技術(shù)開發(fā),針對設(shè)計包的生命周期,提供了可視化的操作界面。設(shè)計包管理程序通過WebService技術(shù)實現(xiàn)了和ENOVIA之間的文件傳輸,可以直接讀取存儲在ENOVIA中的文件。
設(shè)計包管理程序服務(wù)器端使用Socket編程處理客戶端發(fā)送的請求,通過調(diào)用依賴沖突檢查程序檢查依賴沖突,并能操作數(shù)據(jù)庫來實現(xiàn)數(shù)據(jù)的增刪改查。
2.3.1 設(shè)計包的創(chuàng)建
用戶將原始設(shè)計數(shù)據(jù)上傳到ENOVIA后,就可以在設(shè)計包管理程序中創(chuàng)建新的設(shè)計包,如圖3所示。用戶在該界面中填入設(shè)計包的名稱,指定設(shè)計包所屬的子系統(tǒng),并從左側(cè)的ENOVIA文件瀏覽器中選擇文件(設(shè)計需求文檔,設(shè)計文件,設(shè)計報告等)到右側(cè)的文件列表中,最后添加設(shè)計所依賴的設(shè)計包。
圖3 創(chuàng)建設(shè)計包的界面
用戶點擊保存按鈕后,數(shù)據(jù)將被提交給服務(wù)器端程序。服務(wù)器端程序在后臺創(chuàng)建設(shè)計包,其流程如圖4所示。用戶提交的設(shè)計包將首先進行依賴沖突檢測,若檢測存在沖突,系統(tǒng)終止該設(shè)計包的創(chuàng)建過程,并返回錯誤信息給客戶端;若不存在沖突,系統(tǒng)將在數(shù)據(jù)庫中新增記錄,并通過和ENOVIA開發(fā)的接口鎖定原始數(shù)據(jù),保證數(shù)據(jù)不會被刪除或修改。
圖4 創(chuàng)建設(shè)計包時服務(wù)器端程序的流程
2.3.2 設(shè)計包的審批
審批是設(shè)計過程中的重要環(huán)節(jié),任何設(shè)計人員創(chuàng)建的數(shù)據(jù)包在經(jīng)過項目主管的審核后方能被其他設(shè)計包依賴。設(shè)計包管理程序的審批界面如圖5所示。項目主管登錄進入該界面后,可以點選列出的設(shè)計包,并查看設(shè)計包對應(yīng)的文件。點擊“通過審核”按鈕后,程序?qū)⑻峤辉撜埱蠼o服務(wù)器端程序。服務(wù)器端程序在數(shù)據(jù)庫中修改該設(shè)計包為“已審核”狀態(tài),并分配版本號給該設(shè)計包,這個版本號將比同模塊設(shè)計包的最大版本號大1。
圖5 審核設(shè)計包的界面
2.3.3 設(shè)計包的查看
為了能全局地查看系統(tǒng)中所有的設(shè)計包,設(shè)計包管理程序提供了設(shè)計包查看界面。利用JavaFX豐富的繪圖功能,在設(shè)計包界面中有層次地展示了系統(tǒng)中通過審核的設(shè)計包。
2.3.4 設(shè)計包的銷毀
對于過時且不再會被使用的設(shè)計包,系統(tǒng)允許管理員對其進行刪除操作。刪除設(shè)計包可能會帶來依賴關(guān)系的破壞,因而系統(tǒng)會列出所有直接或間接依賴該設(shè)計包的其他設(shè)計包,并要求同時刪除這些依賴。
設(shè)計包管理程序在處理新增、修改設(shè)計包任務(wù)時,需要調(diào)用依賴沖突檢測程序。依賴檢測程序是一個使用Java編寫的獨立程序,其使用mybatis框架對數(shù)據(jù)庫進行讀寫操作,并實現(xiàn)了依賴沖突檢測算法。
2.4.1 設(shè)計包和依賴關(guān)系的形式化表示
設(shè)計包及其依賴關(guān)系可視為一個有向圖[11],記為G=(V,E),其中:V是圖G的頂點集;E是圖G的邊集。圖中的頂點對應(yīng)設(shè)計包,有向邊E對應(yīng)設(shè)計包的依賴關(guān)系。頂點可由一個二元組
對于設(shè)計包來說,存在兩種依賴沖突:版本沖突和循環(huán)引用沖突。
存在版本沖突的充分必要條件是?w∈V??x,y∈w的連通分量,使得x.m=y.m且x.v≠y.v。其意義是系統(tǒng)中某個設(shè)計包同時依賴了兩個相同模塊的不同版本設(shè)計包。
存在循環(huán)引用沖突的充分必要條件是圖中存在環(huán),其意義是系統(tǒng)中某個設(shè)計包依賴了自身。
圖6和圖7分別為版本沖突和循環(huán)引用沖突的示意圖。
圖6 版本沖突示意圖
圖7 循環(huán)引用沖突
2.4.2 依賴沖突檢測算法
本節(jié)將介紹版本沖突檢測算法和循環(huán)引用檢測算法。由于系統(tǒng)需要保持無沖突出現(xiàn),因此算法只需考慮在一個沒有依賴沖突的系統(tǒng)中,檢測新增、修改或刪除單個設(shè)計包時引發(fā)的沖突。
對于一個沒有依賴沖突的系統(tǒng),增加一個設(shè)計包,可能產(chǎn)生版本沖突,例如圖6在新增頂點
對于一個沒有依賴沖突的系統(tǒng),修改一個設(shè)計包的依賴關(guān)系,意味著該頂點關(guān)聯(lián)的邊可以任意調(diào)整,則可能產(chǎn)生版本沖突和循環(huán)引用沖突。
對于一個沒有依賴沖突的系統(tǒng),刪除一個設(shè)計包,即刪除一個設(shè)計包及它所有的依賴關(guān)系。依賴關(guān)系的減少必然不會導(dǎo)致依賴沖突,但可能會導(dǎo)致其他設(shè)計包的依賴關(guān)系無法滿足,不在本節(jié)的討論范圍。
經(jīng)過以上分析,本文設(shè)計了版本沖突檢測算法和循環(huán)引用檢測算法,如算法1和算法2所示。
算法1版本沖突檢測算法
Step 1 使用深度優(yōu)先搜索算法DFS,得到所有和N連通的頂點集合S
Step 2 初始化一個空的映射M
Step 3 若S不為空,取出S中的第一個元素e;否則,返回?zé)o版本沖突的結(jié)果,算法結(jié)束
Step 4 在M中查找是否有鍵為e.m的鍵值對,如果存在這樣的鍵值對p,則轉(zhuǎn)向Step 5,否則轉(zhuǎn)向Step 6
Step 5 若p.v≠e.v,則返回有版本沖突的結(jié)果,算法結(jié)束;否則,轉(zhuǎn)向Step 3
Step 6 在M中插入鍵值對
算法2循環(huán)引用檢測算法
Step 1 初始化一個空的集合S
Step 2 將頂點N加入集合S中
Step 3 對頂點N使用深度優(yōu)先搜索算法DFS,在遍歷過程中,將遍歷到的頂點嘗試添加到集合S中;若該頂點已在S中,則返回有循環(huán)引用沖突的結(jié)果,算法結(jié)束
Step 4 返回?zé)o循環(huán)引用沖突的結(jié)果,算法結(jié)束
CFETR設(shè)計文檔管理系統(tǒng)的測試環(huán)境如表4所示。在應(yīng)用服務(wù)器上部署了ENOVIA以及設(shè)計包管理程序的服務(wù)器端。數(shù)據(jù)庫服務(wù)器上安裝了MySQL服務(wù)器,并建立了數(shù)據(jù)庫。在客戶端上部署了設(shè)計包管理程序的客戶端。
表4 測試環(huán)境
引入一個CFETR設(shè)計的實際場景,涉及到CFETR中三個子系統(tǒng):真空室(VV)、環(huán)向場線圈(TF)和極向場線圈(PF)。
首先,在三維建模軟件CATIA中完成模型的繪制并將模型文件上傳到ENOVIA中。隨后,使用設(shè)計人員測試賬號登錄進入設(shè)計包管理系統(tǒng),創(chuàng)建VV、TF和PF的設(shè)計包。創(chuàng)建設(shè)計包時,通過ENOVIA文件瀏覽器添加必要的文件,并設(shè)定好依賴關(guān)系。表5列出了測試中部分設(shè)計包所包含的文件和依賴的設(shè)計包。
表5 算法性能測試
使用審核人員測試賬號登錄系統(tǒng),系統(tǒng)中列出了所有的設(shè)計包;逐個選擇并通過設(shè)計包;通過的設(shè)計包得到了一個版本號;進入設(shè)計包查看界面,可以查看所有的設(shè)計包信息以及依賴關(guān)系,如圖8所示。
3.3.1 正確性驗證
由于依賴檢測算法是基于已有的設(shè)計包無依賴沖突而設(shè)計的,為了測試依賴沖突檢測程序的正確性、健壯性及時間效率,需要生成一個無依賴沖突的設(shè)計包數(shù)據(jù)表。本文構(gòu)造了一個由5個模塊、15個設(shè)計包、14條依賴關(guān)系組成的設(shè)計包數(shù)據(jù)庫,如圖9所示。
圖9 測試數(shù)據(jù)表
本文測試了典型的依賴關(guān)系并獲得通過:
測試1:嘗試插入
測試2:嘗試插入
測試3:嘗試修改的依賴,使其依賴于
接下來,構(gòu)造了具有30個設(shè)計包,60條依賴關(guān)系的數(shù)據(jù)庫,并設(shè)計了20個測試樣例。算法準確識別了所有的依賴沖突。由于測試原理相同,在此不再贅述。
3.3.2 算法性能測試
為了測試算法的效率,需要構(gòu)造一張具有相當(dāng)數(shù)據(jù)量的設(shè)計包數(shù)據(jù)表。為此實現(xiàn)了自動生成無依賴沖突數(shù)據(jù)表的算法,如算法3所示。
算法3生成無依賴沖突數(shù)據(jù)表算法
輸入:生成設(shè)計包個數(shù)N,依賴數(shù)量參數(shù)K
輸出:無依賴沖突的設(shè)計包表和依賴關(guān)系表
過程:
Step 1 若N>0,隨機生成一個設(shè)計包A添加到設(shè)計包表中,N=N-1;否則算法結(jié)束
Step 2 在設(shè)計包表中隨機選擇至多K個設(shè)計包,生成集合S
Step 3 若S不為空,取出S中的第一個元素X;否則返回Step 1
Step 4 嘗試使A依賴于X,使用依賴沖突檢測程序判斷是否沖突,若無沖突,添加此依賴關(guān)系到依賴關(guān)系表中。返回Step 3。
本文測試了在不同規(guī)模的模塊數(shù)、設(shè)計包數(shù)和依賴數(shù)下的算法效率。測試方法為:將一個隨機生成設(shè)計包加入到系統(tǒng)中,記錄依賴沖突算法的執(zhí)行時間。每種情況進行了三次測試并取平均耗時,如表6所示。
從表6可以看出,算法的時間開銷在可接受范圍內(nèi),并且其性能在不同規(guī)模下是穩(wěn)定的。
表6 算法性能測試
本文分析了國內(nèi)外工程設(shè)計中文檔管理系統(tǒng)的現(xiàn)狀,提出了一套基于依賴管理的CFETR文檔管理系統(tǒng)。通過管理設(shè)計文件的依賴關(guān)系,體現(xiàn)了設(shè)計部件之間的約束關(guān)系,提高了設(shè)計效率。本文首先給出了系統(tǒng)的總體架構(gòu),并提出了設(shè)計包的概念以及依賴檢測算法,說明了設(shè)計包管理依賴關(guān)系的過程。其次,給出了系統(tǒng)的技術(shù)方案:基礎(chǔ)文檔管理模塊基于成熟的商業(yè)軟件ENOVIA開發(fā),設(shè)計包管理模塊基于C/S架構(gòu),使用Java語言開發(fā),實現(xiàn)了設(shè)計包的創(chuàng)建、審批、銷毀功能,并能調(diào)用依賴沖突檢測程序。最后本文測試了系統(tǒng)的各項功能,并對依賴檢測算法進行了正確性和性能測試。