概述
網路描述語言又稱NED語言,NED語言使得網路拓撲模型描述可以由大量的部件(信道、簡單/複合模組類型)描述組成,一個網路拓撲模型描述中的信道、簡單/複合模組可以在另一個網路拓撲模型描述中重用。包含網路拓撲模型描述的檔案通常以·ned為後綴名,它可以動態地載人仿真程式或者由NED編譯器翻譯為C++代碼,並連結到可執行程式中。一個完整的NED描述可以包含以下幾個部分:導入命令、信道定義、簡單/複合模組定義和網路定義。
與其他眾多的設計語言一樣,NED語言也有自己的保留字:import,channel,endchannel,simple,endsimple,module,endmodule,error,delay,datarate,const,parameters,gates,submodules,connections,gatesizes,if,for,do,endfor,network,endnetwork,nocheck,ref,ancestor,true,false,like,input,numeric,string,bool,char,xml,xmldoc等。
OMNeT++對模組、信道、網路、子模組、參數、門、信道屬性、函式等按其名字訪問。由於0MNeT++是基於C++的,它在很多方面跟C++類似,包括標識符的命名。標識符必須由英文字母表(a—z,A—Z)、數字和下劃線(很少使用)組成;可以由字母或下劃線開始。標識符由幾個單詞組成時,按慣例大寫每個單詞的首字母,建議大寫模組、信道、網路等標識符的首字母,小寫參數、門、子模組等標識符的首字母。所有標識符區分大小寫。
跟
C++類似,注釋可以放在NED檔案的任何地方,由雙斜線“//”開始,一直延續到這一行的結尾,注釋被NED編譯器忽略。
NED語言還可以通過使用導入命令從其他的網路描述檔案中導人聲明。在導入一個網路描述後,用戶就可以使用在被導入檔案中定義的任何部件(信道、簡單/複合模組類型)。導入檔案時,可以不指定檔案的擴展名,同時檔案名稱中可以包含路徑,或者使用NED編譯器的命令行選項一I<path>指定被導入檔案的目錄。一個檔案被導入,僅僅是其中的聲明被使用,當父檔案被NED編譯器編譯時,被導入的檔案並不會被編譯,即必須編譯和連結每個網路描述檔案,而不僅僅是最上一層的檔案。
信道和簡單模組定義
信道定義是詳細說明連結類型的特徵(屬性),有三個可選屬性可以被賦值:延遲、比特誤率、數據速率。延遲是指傳播延遲,以仿真秒為單位;比特誤率指定比特數據傳輸時發生錯誤的機率;數據速率為信道的頻寬(比特/秒),用來計算數據包的傳輸時間。三個屬性可以以任意順序出現,所賦值應當為常數。信道定義的基本語法為:
channel ChannelName
delay delay value
error error value
datarate datarate value
endchannel
簡單模組通過聲明參數和門來定義。參數可以被簡單模組中的算法使用。比如,一個TrafficGen模組可能有參數numOfMessages,該參數決定多少訊息將被產生。在模組描述的parameters:域列出其名字即可聲明參數,參數類型可以被指定為numeric、numeric const(或簡寫為const)、bool、string和xml等,numeric為預設類型。參數也可以從NED檔案中賦值或者從配置檔案omnetpp.ini 賦值。
門是模組的連結點,模組之間連結的起點和終點就是門。OMNET++只支持單向的連結,於是有輸入門和輸出門之分,在定義時分別用in和out加以區別。OMNET++支持門矢量:包含若干個單一門,與C++中的數組類似。在模組描述的gates:域列出其名字即可聲明門,空的方括弧對[]表示門矢量。和數組一樣,門矢量的元素從0開始編號,門矢量的大小在模組被用作複合模組的部件時給定。簡單模組定義的基本語法為:
simple SimpleModuleTypeName
parameters:parameters list
gates:
in:in gates list;
out:out gates list;
endsimple
複合模組的定義
包含有其他模組的模組即為複合模組,被包含的模組稱為“子模組”,簡單和複合模組都可以被用作子模組。複合模組的定義與簡單模組類似:包括gates:域和parameters:域,不過它還有另外兩個域:submodules:域和connections:域。複合模組的定義語法為:
module CompundModuleTypeName
parameters:parameters list;
gates:gates list;
submodules:
subModuleName:ModuleTypeName
parameters:parameters list;
gatesizes:gatesize list;
connections:connections list
Endmodule
複合模組的參數和門與簡單模組的參數和門一樣地定義和使用。特別地,複合模組的參數可以傳遞給子模組,對子模組的參數初始化,也可以用來描述複合模組的內部結構,子模組的數目、門矢量的大小可藉助複合模組的參數來指定。例如,Router複合模組有若干連線埠,連線埠數由參數numOfPorts指定。影響複合模組內部結構的參數必須聲明為const,保證每次訪問該參數都返回相同值。
子模組是模組類型(簡單模組/複合模組)的實體,在複合模組聲明的submodules:域中定義。子模組的模組類型對NED編譯器必須是可知的,即模組類型必須在該NED檔案中定義過或者從其他的檔案中導入。定義子模組時可以為其參數賦值,如果子模組有門矢量則必須指定其大小。同樣可以定義子模組矢量,其大小可由某個參數值決定。與C++中數組不同的是,NED允許零大小的子模組矢量。
定義網路
模組的模組聲明僅僅是定義模組類型。為了真正產生能夠運行的模型,需要定義網路。網路定義即以一個已有模組類型的實體作為仿真模型。在一個或多個NED檔案中可以有多個網路定義,用到這些NED檔案仿真程式可以運行其中的任何一個,用戶只需在配置檔案中指定所需要的。網路的定義類似於子模組的聲明:
network ModuleType:NetworkName
parameters:parapeters list
end for
自然地,只有那些沒有定義門的模組類型才可用於定義網路。跟在子模組中一樣,不必給所有的參數賦值,沒有賦值的參數可以從配置檔案中獲取其值或互動性輸入。
表達式
在NED語言中,有很多地方允許表達式的出現。表達式具有C語言風格的語法。它們由常用的數學運算符連線在一起,可以傳值或傳引用的方式使用參數,調用函式,包含隨機值或輸入值。當表達式被用來給參數賦值時,每次訪問該參數都將執行一次表達式(除非該參數被聲明為const)。這意味著仿真過程中,簡單模組每次訪問非const參數都可能得到不同值。其他表達式(包括const參數)只被執行一次。
XML類型的參數可用來方便地訪問外部的XML檔案,XML類型的參數可使用xmldoc()為其賦值。
OMNeT++接受
十進制小數或科學記數法表示的數字常量,字元串常量要求使用雙引號,可以直接用數字常量表示時間(以S為單位);也可以指定時間單位,比如ms(毫秒)、min(分鐘)、h(小時)等。
表達式可以使用包含它的複合模組的參數,或者複合模組中是已經定義的子模組的參數。後者的語法為:子模組名.參數名或者是子模組名[index].參數名。關鍵字ancestor和ref可以與參數一起使用,ancestor意味著如果直接複合模組中沒有該參數,則更高層次的模組將被搜尋。使用關鍵字ancestor被認為是不好的習慣,因為它破壞了封裝原則而且只能在運行時間檢查其使用是否正確。它的存在僅僅是為解決少有的確實需要它的情況。Ref則意味著按引用獲取參數值,即運行期間參數的改變將影響到所有按引用獲取參數值的模組。跟aneestor一樣,ref也很少被使用。一種可能的使用情況就是:在運行期間調整整個模型,在最高層次的模組中定義某個參數,並使其他所有模組按引用訪問該參數,這樣運行期間參數的改變將影響整個模型。另一種情形就是使用參數引用向相鄰模組傳遞狀態信息。
NED語言中支持的運算符跟C/C++語言中的類似,不過也有些不同。“∧”表示冪運算,而在C/C++語言中則表示按位“異或”;“#”和“##”在NED語言中則分別表示邏輯“
異或”和按位“異或”。
所有的值都按雙精度型表示。按位運算時,雙精度型被按C/C++語言的內部轉換原則轉換成長整型,運算完成後,再轉換回雙精度型。類似的,對於邏輯運算,運算元被轉換為布爾型,運算結束後再轉換回雙精度型。對於模數運算,運算元被轉換為長整型。NED語言額外提供的sizeof()運算符可以獲得矢量門的大小;運算符index返回當前子模組在模組矢量中的索引(以零起始)。在NED語言表達式中,可以使用C語言中<math.h>的大部分庫函式,如exp()、log()、sin()、COS()、floor()、ceil()等,以及產生隨機數的函式uniform、exponential和normal等。此外還可以使用用戶自定義的函式,只是對於自定義函式具有較多的限制。定義的函式必須含有0~4個雙精度型的參數並返回雙精度值,必須以C/C++語言方式編碼,還必須通過宏Define~Function()進行註冊。