1、強制與非強制
強制:執行完後馬上離開。(綠色)
非強制:執行完後等待其它條件觸發離開。(紅色)
2、定義變量
HB:頭區域,定義常量,頭文件,宏,全局變量,數據結構,數據類型及函數聲明。
SV:狀態變量區,定義狀態變量,狀態變量在不同的進程切換之間,保持值不變。
TV:狀態變量區,定義臨時變量,臨時變量在不同的進程切換之間,無法保持值不變。
FB:函數區域,定義和進程相關函數。
DB:診斷區域,定義C/C++語句,將診斷信息輸出到標準輸出設備中。
TB:終止區域,定義C/C++語句,這些語句將在進程銷燬時執行,一般爲釋放內存等語句。
HB中定義全局變量,而SV是狀態變量。全局變量是在項目裏保持的,而狀態變量是在單個進程裏保持的。同一項目中的不同進程中的HB定義的變量不可重複初始化。SV爲整個進程範圍的“全局變量”,它的值在進程範圍內(強制和非強制狀態)保留,狀態變量爲每個進程保持個性化提供機制。TV是臨時狀態,當離開一個狀態後,值原則上不會保留;另外,TV變量只有在從某個狀態轉到內核時,TV變量才被系統自動銷燬(除自己動態分配內存的),即有兩個連續的強制狀態,TV變量在兩者之中是保留的。
統計量用來記錄感興趣的值,仿真結束後,這些值可以自動轉化爲圖形以供分析。
當需將一個進程模型的狀態變量複製到本進程模塊時,可以在SV中點Edit ASCII,來複制代碼。
進程中將不讓用戶隨便動的屬性設成hidden,這樣在節點中就看不到了。
在init 狀態的上半部雙擊鼠標,打開它的入口代碼。
在init 狀態的下半部雙擊鼠標,打開它的出口代碼。
轉移描述從一種狀態到另一種狀態的過程和條件。包括四個組件:源狀態,目的狀態,轉移條件和轉移執行代碼。
仿真核心爲整個仿真有秩序地運行維護了一個事件列表,當一個事件到達事件列表的隊首時它變成一箇中斷,並調度給指定的模塊。
狀態與狀態之間通過轉移線transitions 相連。轉移線可以是帶條件的(必須滿足條件才能轉移)或者無條件的(直接轉移)。
3、average/time_average
時間順序: T1----->T3--------->T2
在T1到T2這個時間段,收到m個包。其中,T1到T3收到m1個包,T3到T2收到m2個包。其中T1 < T3 < T2。
1)average:
average表示m/(T2 - T1)。
2)time_average
time_average表示m1/(T3 - T1) + m2/(T2 - T3)。
也就是說time_average與分佈有關。
4、與VC的調試
一般的方法是ODB初始化以後,打開VC,在Debug 菜單下單擊attach to process,然後選擇op_runsim_dev.exe(或者op_runsim_opt.exe),這樣就可以利用VC 提供的調試功能進行OPNET 程序調試。一般情況下attach to process 選項框爲空,這可
能不是VC和OPNET程序本身的問題,因爲有些應用軟件的進程和op_runsim_dev.exe(或者op_runsim_opt.exe)進程衝突,如一些殺毒軟件,acrobat 等,或者是其他進程開得過多所致。
這時打開任務管理器,找到op_runsim_dev.exe,右鍵選擇調試。這時會彈出VC。
彈出來的VC工程沒有原代碼,需要自己手打打開過程原代碼,然後在代碼中設置斷點。
回到ODB中點擊continue即可在斷點出停止。
5、統計
兩種方法:
1)進程域:node statistics
2)自定義:
(1)在狀態變量(SV)中定義統計值。
(2)註冊統計量。
(3)寫入到變量。
下面是我自定義統計量的操作步驟:
1.打開一個進程模型(process model),在進程模型的菜單Interfaces 下拉選項中有局部或者全局統計量
Local Statistics 和Global Statistics 的操作步驟一樣,故 本文以Global Statistics 爲例來說明情況。
假定,建立了一個名爲:packet_size的全局統計量。
2.必須爲這個全局統計量建立一個統計句柄,此不操作需在狀態變量塊(SV)中操作,創建一個統計句柄(Stathandle),命名爲PZ;
3 前面兩部分別創建了全局統計量packet_size和統計句柄PZ,但是必須讓兩者聯繫起來才能起到想要的作用,故必須用
opnet的核心函數進行統計量註冊,此步驟一般在有限狀態機(FSM)的init中的入口代碼中實現。
註冊代碼爲:PZ =op_stat_reg("pakcet_size",OPC_STAT_INDEX_NONE, OPC_STAT_GLOBAL);
註冊好統計變量後就可以使用了。
4。在你需要使用此統計量的函數塊,編寫相應的代碼,賦值給這個統計句柄PZ,就可以收集到全局統計量 packet_size 了。
這裏我們假設變量abcde由你感興趣的值。
double abcde;
…… // 如何取得abcde得值要看你的需要了。
op_stat_write (PZ, abcde);
附帶的統計量用到的:
關於統計量類型文件的兩種描述(矢量文件和標量文件)。
op_stat_annotate()爲矢量輸出文件中的一個狀態統計增加一個標籤。
op_stat_rename(),對矢量輸出文件中的一個狀態統計重命名。
op_stat_reg()根據進程模塊中統計量的名字(在Process Model 編輯器中的Interfaces菜單中選擇Local Statistics或Global Statistics定義的Stat Name屬性)返回一個統計量句柄(Statistic handle),它作爲進程寫入本地或全局統計量的依據。
op_stat_obj_reg()與op_stat_reg()類似,但不侷限於應用在進程模塊,它還可以用來訪問鏈路、路徑、子模塊的本地統計量。
op_stat_dim_size_get()得到進程模塊中定義的統計量的維數(Dimension),而op_stat_obj_dim_size_get()還可以得到路徑、鏈路等對象的統計量的維數。
op_stat_write()在當前時刻將結果寫給某個指定的統計量。
op_stat_write_t()在某個指定的時間將結果寫給某個指定的統計量。標量統計量可以在仿真過程的任何時間寫入。對於每個標量統計量只對應一個值,它與仿真時間無關,只和當前整個仿真有關,
op_stat_scalar_write()直接將結果寫入標量輸出文件中。除了以上將統計量寫入文件的操作,進程模塊還支持讀取輸入統計量的操作(此時進程模塊爲狀態線信息的目的地),
op_stat_local_read()可以得到指定狀態線的當前值,這種方法是進程模塊(或與其他節點模型內對象)間的一種通信機制。