參考來源:
因為上面的文件內容和實際上的4.x版已經差很多了,用4.6版重新做一次這份教學
V4.6版習作
1. 建立專案 (File –> New –> OMNeT++ Project)
在Project name的地方輸入專案名稱 (demo) ,其他保持預設值
選 Next> 進入 Initial Contents 頁面,選Empty project
選 Next> 進入 C++ Project Type 頁面,保留預設值,
選 Next> 進入 Select Configurations 頁面,保留預設值,然後選 Finish 完成專案建立
2. 指定參考資料庫
這個demo程式將會使用到Queue函式庫來模擬排隊理論裡面的一些現象,因此在進行設計以前需要先將相關的函式庫引入
這裡用到的是queueinglib
(在專案名稱上點滑鼠右鍵 –> Properties –> Project References)
在右邊的專案視窗中找到queueinglib,並將其左方的核定方塊打勾,點擊OK按鈕結束這個回合
3. 建立NED檔案 (在專案名稱上點滑鼠右鍵 –> New –> Network Description File (NED))
在File name的地方輸入檔案名稱,這裡用demo.ned
選 Next> 進入 Initial Contents 頁面,選NED file with one item。這樣會進入到 NED Component Type 選項選單
然後點選 Network 左邊的選取按鈕後點擊OK按鈕結束這個回合。
在 Initial Contents 頁面也可以選 Empty NED file,系統會給你一個空的編輯畫面,一般來說,我個人比較喜歡這個選項。
4. 編輯NED檔
在右方的Submodules中可以找到source 和 queue 兩個元件,這是因為我們在前面引入了queueinglib函式庫所帶來的,
用滑鼠左鍵點擊這兩個元件並按照圖示的樣子擺入一個source 和三個 queue。
再利用Palette中的connection將元件連結起來,如下圖
文字檔內容如下
5. 建立與編輯omnetpp.ini (在專案名稱上點滑鼠右鍵 –> New –> Initialization File (ini))
選擇檔案所要建立的位置,這個範例的專案是在demo資料夾中,也等於專案的名稱
V4.6版的Wizard畫面和線上Flash教學內容略有不同。選 Next> 進入Initial Contents頁面選 Empty Ini File。
選 Next> 進入 ini File Options選擇網路
點Browse會出現可以選的網路,這裡找到剛才建立的Demo網路,然後選 Finish 結束。
會接著顯示omnetpp.int Wizard,這裡需要加入網路的初值設定,如果都不改那就是以預設值來做設定,但有些初值是一定要有的,像這個範例中的例子有四個參數一定要設定。一個簡單的排隊網路需要設定的初始值有:
Source Submodule: interArrivalTime and number of jobs.
Queue Submodule: serviceTime
下圖中的四個未指定參數為三個Queue的serviceTime和一個Source的interArrivalTime
選擇Parameters,點選Add..。先Deselect All,然後將**.source.interArrivalTime 和 **.source.numJobs選進來
設定InterArrivalTime為0,表示所有的jobs(來源資料)都會馬上被送進網路
設定numJobs分別為30和60,表示我們想要觀察送進網路的資料量為30個和60個時的情況。這裡使用的語法為 ${jobs=30,60}
選Queue模組的seviceTime的時候因為這裡有三個Queue,此範例中所有的Queue的serviceTime都是一樣的所以可以一起設定,圈選上圖Pattern style中的 Parameter name only,然後在show選單中選擇Unassigned only。這個範例中就只剩下**.serviceTime選項。
設定為指數分布,由平均值1 ms 到 3ms,間隔 1ms。
語法為:exponential(${serviceMean=1..3 step 1}ms)
NOTE: V4.x版以後基本的時間單位為秒(s),對於所有相關時間的系統參數需要明確的指定時間單位,ms, s等
NOTE: **.serviceTime裡面的**表示wildcard,為所有包含serviceTime這個參數的物件。**.queue1.serviceTime表示在queue1物件中的serviceTime
NOTE: 在模擬中還可以針對同一個組態分別設定seed並執行數次模擬用以取得統計平均,在此模擬範例中省略此步驟
開啟event log紀錄
可以幫助偵錯或是結果分析
設定模擬時間
這裡設定為2秒
設定Console回應時間
這是在命令列模式執行時可以在console上看到系統模擬的狀況,每幾秒回報一次,這個時間是實際時間,非系統模擬時間
最後設定好的omnetpp.ini文字檔內容,如果程式碼熟悉可以直接編輯文字檔
6. 組態設定
在命令列上選Run然後選Run Configuration
Run number 為模擬要執行的次數,這裡我們的參數設定jobs為30, 60,service time 為1, 2, 3,所以總共有2 x 3 = 6 次模擬要執行。選擇 * 表示執行全部。
使用的User Interface設定為Command line模式,預設值會使用GUI模式,會啟動Tkenv,這樣執行速度會比較慢。使用Command line模式後系統還可以利用多核心技術進行平行模擬,這裡設定Processes to run in parallel為2,表示最多可以同時進行兩個模擬。
設定好以後就可以點Run 執行系統模擬,在Console上我們可以看到執行的進度。下圖紅色框框中,Event為事件編號,T表示目前系統模擬的時間,Elapsed為實際上CPU使用的時間,這裡我們在上面的Run Configuration中設定status frequency為500ms,所以系統每0.5秒回報一次,最後是此模擬的完成度為33%
7. 模擬結果觀察
模擬完成,結果會放在results資料夾中
雙擊(double-click)任意一個.sca檔或是.vec檔都可以開啟新建分析檔(Analysis File)視窗,輸入檔名後存檔會在demo目錄下建立一個新的.anf檔案
在.anf檔的Inputs分頁中選擇需要分析的模擬,每次的模擬系統都會給予一個獨一無二的ID,雙擊任何一個.vec檔的ID可以自動將模擬結果帶入Browse Data分頁
在Browse Data裡面的Vectors分頁全選以後點工具列上的繪圖按鈕
可以看到每個Queue的Queue Length結果,這個輸出的參數是系統預定的,日後如果更深入探討可以自行設定其他需要觀測的輸出結果。然後使用工具列上的Zoom工具將橫軸放大方便檢視
在繪圖視窗上點擊右鍵,選Properties… 可設定繪圖參數,這裡練習改變繪圖線條(Lines)的形式
繪圖結果變成
也可以利用統計工具來分析模擬結果,在繪圖區點擊右鍵,選Apply,在選Mean,可以匯出三個Queue的平均值變化情形
如果上面的mean是這個專案裡會反覆使用的,我們可以將它儲存成為”食譜” (recipe),下次只要我們重複這個模擬,當開啟.anf檔時系統就會依照食譜自動繪製出圖形
在繪圖區點擊右鍵,選Convert to Dataset…
存檔即可
8. 事件順序圖 (Sequence chart)
在前面設定omnetpp.ini的時候有勾選開啟紀錄event log。這個紀錄檔的副檔名是.elog,一般是放在results資料夾下,雙擊任一個.elog檔開啟。
橫軸是時間,這裡設定為非線性時間軸,背景標示為灰色的表示同一個時間點。因為我們設定source的interArrivalTime為0,所以在時間0s的時候全部的60個job都被產生出來並且”同時的”進入到queue中。第一個job被source產生被標示為event 1,進入queue的事件被標示為event 3。event的順序是根據系統產生事件的順序,OMNeT++為一個離散事件系統模擬系統,基本上事件編號越小表示越早發生但不為絕對。
event 1到 event 61都在0s時發生,job 1 離開 queue的事件是 event 62,進入 queue 1的事件是 event 63,因為此模型設定線路的延遲為0,所以離開queue的事件和進入queue1的事件是同時發生的(灰色背景表同一時間)
利用event log我們可以清楚的看到事件發生與流動的過程,對於系統的了解以及debug都有很大的幫助。
end of this tutorial