金攀峰
(揚(yáng)州大洋造船有限公司技術(shù)部,揚(yáng)州 225107)
摘 要:本文結(jié)合實(shí)例,簡(jiǎn)介了NAPA宏語言的組成、編寫方法以及NAPA函數(shù)、數(shù)組、程序調(diào)試方法等,供使用者編制、應(yīng)用NAPA宏語言程序作為參考。
關(guān)鍵詞:NAPA;NAPA MACRO;NAPA宏語言編寫;NAPA二次開發(fā)
中圖分類號(hào):U662.9 文獻(xiàn)標(biāo)識(shí)碼:A
1 前言
NAPA系統(tǒng)是一個(gè)專業(yè)的、綜合性的船舶性能設(shè)計(jì)工具軟件。NAPA的發(fā)展,早期由于受計(jì)算機(jī)軟硬件技術(shù)發(fā)展的限制,僅能工作在命令行模式,沒有圖形窗口,操作方式類似于DOS操作系統(tǒng),每一個(gè)操作都是通過鍵盤輸入命令來實(shí)現(xiàn)的,這種重復(fù)輸入命令的交互方式會(huì)耗費(fèi)用戶大量的時(shí)間。如果把需要的命令按照先后次序集合在一起,使用批處理的方式進(jìn)行操作就會(huì)更高效、更準(zhǔn)確,通常將這種操作方式稱為宏,其本質(zhì)是一種簡(jiǎn)化的腳本語言。
隨著計(jì)算機(jī)技術(shù)的發(fā)展,視窗化的交互方式僅需要鼠標(biāo)點(diǎn)擊就能完成操作,這種方式更受到了人們的歡迎。NAPA系統(tǒng)經(jīng)過逐漸發(fā)展變得更易于操作,結(jié)合循環(huán)、判斷等控制命令的宏語言,在專業(yè)應(yīng)用上可以實(shí)現(xiàn)比視窗化點(diǎn)擊操作更加高效的操作,有著無可比擬的優(yōu)勢(shì)。NAPA系統(tǒng)開放性較好,用戶在編制宏程序時(shí)可以使用系統(tǒng)內(nèi)置的大量函數(shù)和NAPA命令,操作NAPA數(shù)據(jù)庫(kù)中的任何數(shù)據(jù),因而可以根據(jù)用戶自己的需求進(jìn)行各類宏程序的二次開發(fā),實(shí)現(xiàn)各種新功能,輸出各類圖形與表的組合,而不必僅拘泥于NAPA系統(tǒng)提供的基本功能。
2 宏的組成和格式
簡(jiǎn)單說來,NAPA宏程序可以由幾個(gè)簡(jiǎn)單的NAPA命令組合,也可以是一個(gè)包括輸入、輸出、跳轉(zhuǎn)、循環(huán)、計(jì)算函數(shù)、子程序調(diào)用等復(fù)雜的程序。下面以一個(gè)輸出裝載工況的宏程序?yàn)槔?,通過循環(huán)命令、變量、數(shù)組、子系統(tǒng)函數(shù)的使用等,可以一鍵輸出裝載工況組中的所有工況的浮態(tài),而不論工況組里有多少裝載工況。
@@PLEASE DEFINE THE LOADING GROUP FIRST
!END;LD
!HEAD GET EMPTY
@GROUP=ARR(3)
@GROUPNAME=.... WHAT IS THE NAME OF THE LOADING GROUP?
@GROUP=LD.GROUPMEMBERS(GROUPNAME)
@FOR STEP=1 RSIZE(GROUP)
GET @GROUP(STEP)
@EX=LD.NOTE()
TYPE LOAD CONDITION @GROUP(STEP) : ( @EX )
LIS FLOAT NH
TYPE TLCF @LD.QNT('TLCA' 'F=5.2') m
TYPE
NP
@NEXT
@END
裝載工況組中的一個(gè)工況輸出結(jié)果如圖1所示:
由上例可以看到,在宏程序中每一行一條命令:開頭沒有特殊標(biāo)識(shí)的是普通的NAPA命令;以!開頭的是NAPA透明命令,可以在任何子系統(tǒng)下運(yùn)行;以@符號(hào)開頭的是NAPA BASIC命令、變量和表達(dá)式;以@@開頭的是用來作為注釋說明行。@符號(hào)作為標(biāo)識(shí)符只能放在行的開頭,而不能放在中間,多余的@符號(hào)會(huì)被忽略或者會(huì)導(dǎo)致運(yùn)行錯(cuò)誤。如果在一行中需要寫多條命令,需要用“;”分號(hào)將命令分隔開,如要避免一行過長(zhǎng)可以在行末尾添加逗號(hào)“,”手工換行,運(yùn)行時(shí)系統(tǒng)將逗號(hào)之后的視作為一行。
3 宏的編寫
宏的編寫主要有兩種方式:一種是在NAPA系統(tǒng)Tools菜單下的Text Editor工具中,按照規(guī)定的格式和語法直接編寫;另一種是將運(yùn)行過的命令收集或記錄下來。
第二種方式,系統(tǒng)提供了三個(gè)命令:
(1)!L +20 此命令可以列出使用過的20個(gè)命令,20表示需要列出命令的個(gè)數(shù),可以根據(jù)需要進(jìn)行更改,然后可以將這些命令復(fù)制到Text Editor中進(jìn)行編輯,即可形成一個(gè)簡(jiǎn)單的宏程序;
(2)TASK?>SCA 此命令可以將運(yùn)行過的命令記錄保存到項(xiàng)目數(shù)據(jù)庫(kù),運(yùn)行該命令后出現(xiàn)SEARCH CRITERION?>提示直接回車,會(huì)顯示出一個(gè)列表,在 SELECT?>后輸入列表中類型為L(zhǎng)OG所在行前的數(shù)字,然后在SCAN?>提示符后輸入MACRO mymacro,即可將這個(gè)命令記錄以mymacro名稱保存到項(xiàng)目數(shù)據(jù)庫(kù),可以用Text Editor中打開對(duì)其進(jìn)行編輯;
(3)!MACRO DEMO 此命令也是透明命令,與!MACRO END命令配對(duì)使用,用來收集直至用戶輸入!MACRO END前輸入過的命令并保存至項(xiàng)目數(shù)據(jù)庫(kù)DEMO文件中,DEMO為保存的宏名稱,同樣也可用Text Editor打開編輯。
為了便于識(shí)別,宏的命名通常按照宏程序的功能進(jìn)行區(qū)分,名稱中可用“.”或“_”符號(hào)進(jìn)行分隔。例如CP.SND.L、OUT_LD,從名稱就可以看出為艙容測(cè)深表輸出和裝載工況輸出。
4 宏的運(yùn)行
宏有兩種運(yùn)行方式:一種是用Text Editor打開宏,點(diǎn)擊工具條上的“RUN”按鈕,宏就會(huì)完整的運(yùn)行。如果只想運(yùn)行此宏中的部分語句,用鼠標(biāo)高亮選擇需要運(yùn)行的部分,再點(diǎn)“RUN”即可;另外一種是用命令!ADD加上要運(yùn)行的宏名稱,如!ADD CP.SND.L即可運(yùn)行這個(gè)名為CP.SND.L的宏,只要這個(gè)宏存在于數(shù)據(jù)庫(kù)中,這種命令方式也可用在宏中用來調(diào)用另外一個(gè)宏。
5 變量
使用變量代替具體的數(shù)據(jù),可以增加宏程序的執(zhí)行效率和靈活性。NAPA變量無需預(yù)先定義,給變量賦值(字符串或者數(shù)值)時(shí),NAPA會(huì)自動(dòng)創(chuàng)建這個(gè)變量。變量分成字符串型和數(shù)值型,不同類型的變量相互是不兼容的。變量通常以@符號(hào)開頭來表示,但變量出現(xiàn)在表達(dá)式里的時(shí)候則要去掉@符號(hào)。
需要注意變量和普通字符串的區(qū)別,字符串用單引號(hào)或者雙引號(hào)表示。當(dāng)可能會(huì)引起歧義的時(shí)候,變量的結(jié)尾可以用下劃線“_”來表示結(jié)束,如定義一個(gè)變量@S=‘WL,那么用命令CUR使用這個(gè)變量時(shí)需要注意CUR @S1和CUR @S_1這兩個(gè)寫法的區(qū)別的,CUR @S1系統(tǒng)直接認(rèn)為變量是S1,而CUR @S_1由于使用了“_”下劃線,表示變量結(jié)束系統(tǒng)認(rèn)為@S_1是WL1。
定義變量也可以通過彈出對(duì)話框讓用戶輸入數(shù)據(jù),通過下面的賦值語句來彈出對(duì)話框,比如:
@name=.... Enter the name of the ROOM
系統(tǒng)在運(yùn)行到這一行就停止,彈出如圖2所示的對(duì)話框等待用戶輸入,輸入的數(shù)據(jù)會(huì)被賦給變量@name,....后面是說明文字,將顯示在輸入對(duì)話框上。點(diǎn)的個(gè)數(shù)不同,表示要求輸入的內(nèi)容是不同的:@X=...三個(gè)點(diǎn)表示僅接受數(shù)值輸入;@name=.... 四個(gè)點(diǎn)表示僅接受字符串輸入,會(huì)自動(dòng)轉(zhuǎn)換成大寫;@text=.....五個(gè)點(diǎn)表示僅接受字符串,但保留輸入時(shí)的大小寫。
變量賦值后可以通過下列命令查看變量數(shù)據(jù):
!CAL var 計(jì)算變量,var可由具體的變量代替;
!VAR list 列出所有的變量。
6 數(shù)組
一個(gè)數(shù)組代表一組數(shù)據(jù),和變量不同,使用數(shù)組需要預(yù)先定義。有一些命令能夠自動(dòng)創(chuàng)建數(shù)組,如用!SEL從數(shù)據(jù)庫(kù)中選擇對(duì)象時(shí),默認(rèn)創(chuàng)建的數(shù)組名為L(zhǎng)IST。
數(shù)組分為三種類型:整數(shù)型(1)、實(shí)數(shù)型(2)、字符串型(3)。如示例中的@GROUP=ARR(3),即為將數(shù)組@GROUP定義為字串型數(shù)組??梢杂妹睿AR LIST GROUP或者用!cal GROUP(1)(數(shù)字1表示數(shù)組中記錄的第1個(gè)數(shù))來查看數(shù)組中的數(shù)據(jù)。用命令!SEL ...從數(shù)據(jù)庫(kù)中選擇對(duì)象,NAPA會(huì)自動(dòng)創(chuàng)建數(shù)組LIST并儲(chǔ)存選中的對(duì)象,用命令!Cat查看對(duì)象,也會(huì)自動(dòng)創(chuàng)建數(shù)組CATALOG。
7 NAPA BASIC命令
NAPA BASIC命令是用來控制宏程序運(yùn)行的,可以使程序執(zhí)行循環(huán)、選擇或者跳轉(zhuǎn)等功能。也有一些命令可以定義變量的可見性及macro的調(diào)用和參數(shù)傳遞。
常用的NAPA BASIC命令有:
@ FOR … @NEXT
@IF… @THEN
@WHILE…@ENDWHILE
@END
@GOTO
@GOSUB… @RETURN
@LOCAL & GLOBAL
@PARAMETERS
NAPA BASIC
!COM B.f
!EX B.id
8 計(jì)算函數(shù)和子系統(tǒng)函數(shù)
NAPA系統(tǒng)里提供超過1300個(gè)函數(shù),函數(shù)功能非常廣泛,主要分為計(jì)算函數(shù)和子系統(tǒng)函數(shù)兩大類。
標(biāo)準(zhǔn)計(jì)算函數(shù)包括:數(shù)學(xué)函數(shù)、日期函數(shù)、艙容函數(shù)、字符串函數(shù)等類型。如通過CG('APTP',1) 標(biāo)準(zhǔn)函數(shù)可以獲取APTP艙的xcg值。
子系統(tǒng)函數(shù)與計(jì)算函數(shù)不同,每個(gè)子系統(tǒng)下都有相對(duì)應(yīng)的一些函數(shù),通過子系統(tǒng)函數(shù)可以直接獲取這個(gè)子系統(tǒng)的某些數(shù)據(jù)或者完成某些操作。子系統(tǒng)函數(shù)名稱格式為ss.funct(parameters),funct為函數(shù)名稱,括號(hào)中為參數(shù),如果參數(shù)為空,這一對(duì)括號(hào)也應(yīng)保留。計(jì)算函數(shù)和子系統(tǒng)函數(shù)功能和用法,可以通過下列命令在主窗口命令提示符下獲取詳細(xì)的說明:
!COM C.F 列出所有標(biāo)準(zhǔn)計(jì)算函數(shù);
!EXP C.id 解釋某個(gè)計(jì)算函數(shù),id為計(jì)算函數(shù)名稱,如!EXP C.AREA;
!COM ss.F 列出子系統(tǒng)函數(shù),ss為子系統(tǒng)名稱,如!COM GM.F;
!EXP ss.id 解釋某個(gè)子系統(tǒng)函數(shù),id為函數(shù)名稱,如!EXP LD.NOTE;
9 宏的調(diào)試
宏程序編制過程中,可以以單步運(yùn)行模式(STEPMODE)進(jìn)行程序的調(diào)試。在此模式下,在主界面按回車鍵,宏程序?qū)⒁恍幸恍械谋粓?zhí)行,并且執(zhí)行一行前會(huì)將這行的內(nèi)容顯示出來。有多種方法可以進(jìn)入STEPMODE模式:
(1)在Text editor窗口選擇options菜單下的stepmode;
(2)用!ADD運(yùn)行宏程序的時(shí)候,加上參數(shù)S,如!ADD 宏名稱 S;
(3)在宏程序里的首行頂格大寫加入ENTER STEPMODE;
推薦調(diào)試宏程序時(shí)在首行加入@ONERR STEPMODE命令,該命令會(huì)在運(yùn)行宏程序遇到錯(cuò)誤的時(shí)候自動(dòng)進(jìn)入到SETPMODE模式。
在STEPMODE模式下,可以運(yùn)行下面幾個(gè)常用的命令:
C 取消單步模式,以正常模式運(yùn)行完宏程序;
!S 跳過當(dāng)前行;
Q 終止宏運(yùn)行,可以用!ADD *繼續(xù)運(yùn)行;
!VL 同!VAR LIST;
!VC 同!VAR CHECK。
進(jìn)入單步運(yùn)行模式后也可輸入宏程序中定義的數(shù)組名,就可列出數(shù)組中的元素。
在宏程序調(diào)試過程中會(huì)碰到各種各樣的問題,此時(shí)善用幫助資源有助于問題的盡快解決,NAPA系統(tǒng)主要提供了三種幫助資源:
(1)系統(tǒng)命令提示符下用!EX 命令,解釋單個(gè)命令;
(2)系統(tǒng)Help菜單下的Help Viewer,提供有關(guān)命令、函數(shù)等用法查閱;
(3)系統(tǒng)自帶的Napa Manual,當(dāng)前最新版提供PDF和CHM兩種格式方便查閱。
10 結(jié)束語
NAPA作為強(qiáng)大的船舶性能設(shè)計(jì)軟件,目前已被廣泛應(yīng)用到全球各大設(shè)計(jì)公司、大型船廠,其計(jì)算結(jié)果也為各大船級(jí)社所認(rèn)可。由于NAPA的開放性,使其具有強(qiáng)大的二次開發(fā)優(yōu)勢(shì),而且其命令及內(nèi)置函數(shù)相對(duì)易學(xué)易用,設(shè)計(jì)人員能夠根據(jù)不同的實(shí)際需求,充分利用系統(tǒng)提供的函數(shù)、命令開發(fā)出適應(yīng)不同復(fù)雜情況的宏程序,極大提高工作效率。
參考文獻(xiàn)
[1] NAPA MANUAL 2015.4. NAPA LTD
[2]蔡智波,張利,陳超.NAPA在散裝谷物穩(wěn)性計(jì)算中的應(yīng)用[J].廣東造船,2011(3).
[3]王彩蓮.淺談船舶應(yīng)用軟件NAPA[J].船舶,2004(3).