opnet學習

1.如何設置全局變量?
在 .h文件裏定義變量,然後在process的HEAD BLOCK 裏include
這個頭文件,就可以使用全局變量了。


2.OPNET中如何更方便的看程序?
1.opnet中的設:
preferences->editor_prog
2.source insight的設置
operation->preferences->symbol Lookups->Project symbol path->Add Project to
Path
(添加自己創建一個包含所有opnet model 和 include目錄的project)
當然,這個有些不足,就是那個sv,tv,hb等中定義的內容,不能進行關聯。


3.OPNET中的函數FIN,FRET以及FOUT都是什麼功能?
爲了使一個用戶定義的函數被執行,該函數必須與一個特殊的堆棧跟蹤代碼相連。堆
棧跟蹤技術靠在函數的入口點和出口點插入預處理器宏
指令完成(一個函數只有一個入口點,但可以有多個出口點(由C語言的return聲明決定
))。這些宏指令爲:FIN、FOUT和FRET。FIN被插入到
函數的入口點,FOUT被插入到函數的出口點,但卻不返回任何值,FRET被插入到函數的
出口點,返回一個值。注意這些宏指令不需要以分號結
束(它們自我包含),FIN的參數中也不需要雙引號。
Opnet提供的所有的示例模型都包含了這些宏指令,並且建議用戶定義的函數也包含這
些宏指令。如果FIN、FOUT、和FRET被正確插入了用戶
代碼中,我們就可以使用op_vuerr來找出程序錯誤的位置,哪怕是在一個嵌套的模型函
數調用中。


4.local statistics和global statistics的區別?
local statistics表示的是本地的統計量,而global statistics是全局的統計量,
比如你做了一個節點模型,此節點發送數據包,然後編程把發送的數據包數分別寫入
一個local statistics和global statistics中,假如你在工程中用到了兩個這樣的
節點,那麼你可以分別view result每一個節點發送的數據包數,而global statistics
則是這兩個節點一共發送的數據包數。


5.Objid和user id的區別?
Objid是系統分配的,全局唯一,整數。user id是自己可以設置的,可以不唯一。


6.如何將模塊添加到OPNET中?
edit - > preferences -> mod_dirs 添加模塊路徑即可。

7.爲什麼每次新建一個project 都給我保存在 c:\op_models 目錄下 ,我想換一個地
方,怎麼設置?
      edit - > preferences -> mod_dirs中,新建一個路徑,並作爲第一路徑即可。

8.想查找一個變量的使用場合,包括不同process,不同node中的header和funtion,如
何做 ?
在OPNET中變量是在一個PROCESS中存在的。不同的PROCESS之間則是通過進程之間的通信
機制來共享信息的。因此你查找變量的作用範圍應該是
在一個PROCESS內的。編譯後每個PROCESS會產生一個C或C++文件。在那個文件裏就可以
查到變量的應用地方。不同的進程可能具有相同的
ATTRIBUTE.而爲了減少NODE的ATTRIBUTE數目可以採用 MERGE/RENAME ATTRIBUTE的方式
。這時這些ATTRIBUTE具體對應到各個PROCESS 的哪個
ATTRIBUTE可以通過NODE INTERFACE菜單下的MERGE/RENAME ATTRIBUTE 找到。

9.請問OPNET怎樣將圖導出來?
一:可以從Topology->Export Topology->……導出Project的幾種圖形,有bitmap,ht
ml等格式。node,process都可以從file中的Export
Bitmap導出拓撲圖。
二:對於分析出來的曲線,按鼠標右鍵,其中有個 Export Graph Data to Spreadshee
t,然後會有提示 說你文件保存在什麼地方,一般缺省
是保存在 c:\op_admin\tmp 目錄下。文件你可以用 UltraEdit 打開來看,是兩列數據
,一列是仿真時間,一列是 仿真數據,然後你就可以想
用什麼工具畫圖就無所謂了。
補充:其實很好用的還有就是直接抓圖,效果不錯。

10.在opnet中關於時延的問題。
數據速率是用來和包長結合計算傳輸時延的,而“delay”屬性是用來描述電波的傳播時延的。在點到點鏈路屬性裏,“delay”就是總傳播時
延;在多點鏈路裏,“delay”指單位距 離的傳播時延。用戶可以修改傳播時延的計算
方法,那個“Distance Related”就是表示在自定 義的
傳播時延 pipeline stage裏基於距離計算傳播時延。

11..在opnet中關於統計一些速率方面的參數。
統計流速率的時候,首先應該在Local Statistics中將這個統計項 的Capture Mode設成
sum/time,然後在程序中每次收到一個數據包, 就將
這個包的長度L寫入,比如op_stat_write(handle,L),隨後再馬上 調用一個op_stat_wr
ite(handle, 0)來結束這次寫入,就可以了。

12.關於begin intrpt和endsim intrpt
仿真0時刻時需要進行的初始化,則需要設begin intrpt, 仿真結束時刻需要進行一些工
組,則需要enable endsim intrpt

13.用VC調試的時候,state variable的值無法看到,怎麼辦?
用op_sv_ptr這個指針。它指向了所有的狀態變量。

14.關於Elapsed time and Simulation time ?
一個是仿真程序運行的時間,反映仿真程序執行的速度。而另一個是所仿真的系統的時
間進度,反映當前的仿真執行的進度。
仿真時間的修改是通過事件的發生來進行的。譬如說你在0s時作一件事持續時間爲5秒,
5秒鐘結束後會觸發一個事件,這個事件將系統的仿真
時間改爲5s。你使用OPNET的模型,它在接收到事件時會進行相應的仿真時間的更新。而
你自己也可根據需要更新仿真時間。你採用
op_intrpt_schedule_self(op_sim_time()+需要的時間,intrptcode),就可以在當前時
刻的所需的時間以後產生一箇中斷,從而觸發一個事件
,系統的仿真事件也就被更新爲此時間。OPNET中數據的收集方式是可選的,可以選擇爲
逐點的,也可以選擇按照漏斗進行平滑的根據自己的需
要而定。

15.OPNet運行時無法進行C代碼編譯的解決辦法
當你出現這種情況時, OPNet總是提示說 comp_msvc 不能執行, 因爲Visual C++沒有正
確安裝, 這時你需要修改系統的環境變量。具體方法如
下(Win2000):
1. 正確安裝 VC++, 缺省目錄爲(以下均以缺省目錄爲例)     C:\Program Files\Mic
rosoft Visual Studio
2. 在桌面鼠標右擊"我的電腦"圖標, 選擇"屬性". 在出現的界面中, 選擇"高級", 然
後選擇"環境變量"。
3. 這裏需要修改用戶的"用戶變量",而不是"系統變量"增加下列參數:
變量名 include
變量值 C:\Program Files\Microsoft Visual Studi0\VC98\atl\include;
       C:\Program Files\Microsoft Visual Studio\VC98\mfc\include;
       C:\Program Files\Microsoft Visual Studio\VC98\include
變量名 lib
變量值 C:\Program Files\Microsoft Visual Studio\VC98\mfc\lib
       C:\Program Files\Microsoft Visual Studio\VC98\lib
變量名 MSDevDir
變量值 C:\Program Files\Microsoft Visual Studio\Common\MSDev98
變量名 path
變量值 C:\Program Files\Microsoft Visual Studio\Common\Tools\WinNT
       C:\Program Files\Microsoft Visual Studio\Common\MSDev98\bin
       C:\Program Files\Microsoft Visual Studio\Common\Tools \Program Files\
Microsoft Visual Studio\VC98\bin
4. 按"確定"按鈕, 退出設置.
如果你在安裝 VC 的時候讓安裝程序來修改環境變量就完全可以就避免這些步驟.

16..請問opnet中的移動臺的trajectory(即運動軌跡)能否用一個專門的代碼來生成
,而不是用鼠標事先畫出?如何實現opnet與此段代碼的
交互?
要做到運動軌跡的交互性,你得修改一些process和pipeline。 運動的結果無非是和基
站的距離變化,然後利用衰落模型得到snr,ber等參數
,所以你可以修改dra_propdel.ps.c, umts_ue_dra_power, umts_dra_snr等process.
如在dra_propdel.ps.c中把start_pro_distance用自己
的距離函數代替即可。

17.前面提到的隨機性服從一些隨機分佈,如高斯分佈、泊松分佈等等,我想問一下,
opnet 中有沒有現成的概率分佈函數供調用?如何調用

用op_dist_outcome這一類的函數,在online document中介紹的很詳細。

18.對opnet的認識,它是在project、node以及process三個域上進行仿真,而且好像代
碼都是在process域中的進入、退出以及轉化這些地方
編寫,那麼要實現的移動臺隨機產生的代碼好像沒有一個公共的全局性的平臺可以放置
(就像C語言中的全局變量聲明段)?這個問題如何解決

函數應該在process的FB中,FSM只是調用而已,全局變量通常在外部.h中,也可在HB中

19.OPNET 的輸出結果選項“As is”,“Average”,“Time_average”有什麼區別?
在這些選項下得到的曲線不一樣 :
As is ,就是不做任何處理,
Average 就是做平均 
Time_average 就是做時間平均

20.請問OPNET中的animation指什麼?
激活節點變化過程記錄功能並記錄statistic的變化過程 。

21.OPNET中如何刪除一個senario,而保留工程?
在menu->senarios->manage senarios裏。

22.請問OPNET中的animation指什麼?
激活節點變化過程記錄功能,並記錄statistic的變化過程,可以作爲動畫演示。

23.opnet的節點域中處理模塊之間如何共享變量?
可以試試以下2種方法:
1。在HB中定義全局變量
2。添加節點屬性,然後使用op_ima_xxx_xxx()函數,就是那個IMA包。

24.在node interfaces裏面設置屬性爲set,promoted和hidden有什麼意義?
hidden可以在仿真的時候看不到設置的這個參數,promoted可以在仿真的過程中根據需
要改變參數的值

25.我在學習opnet的tutorial的packet switching1 時最後仿真出現下面的錯誤,請問
如何解決?
Creating library PS_pksw_net-scenario1.i0.nt.lib and object PS_pksw_net-
io1.i0.nt.exp
dpt_propdel.i0.ps.o : error LNK2001: unresolved external symbol _link_de
PS_pksw_net-scenario1.i0.nt.so : fatal error LNK1120: 1 unresolved exter
在運行仿真時,選擇declare external   file,將link_delay.h文件包含即可。

26.請問opnet裏如何提取統計信息作爲反饋控制變量?例如將丟失率提取出來後,通過
函數將其反饋回模型中進行控制。
可以試試stat_intrpt函數。

27.模型中的數據線中的src stream [n]和dest stream [n]中括號中的序號n分別表示
什麼意思?
op_pk_get(STRM NUM)的參數,會根據n來選擇數據線的。

28.pipeline stage 的函數是怎麼調用的啊?爲什麼我的數據在被接收端的時候那幾個
pipeline 函數並沒有執行完呢?只執行了3個函數,後
面就沒有了,結果數據不知道扔哪去了,上層也沒有stream中斷是怎麼回事呢?
pipeline state 函數體接口是規定的,由KP調用。在stage 2 有連通性的檢查,如果f
alse ,則以後的stage 都不需執行了。

29.仔細察看了一下程序,FIN和FOUT都是配對的。在一個Idle的狀態中,什麼操作也沒
做。但是程序執行了好長時間之後,突然告訴說
Abnormal function stack function。就是在Idle狀態出的錯。可是哪個狀態根本就是
空操作。而在.pr.c文件中,發現所有的process的.pr.c
文件中的那個最全的函數都是隻有FIN,沒有FOUT的。請問出現上述錯誤還有可能是何原
因?
查看事件列表,有可能是事件列表滿的緣故,你可以試着改變preference裏面的一個ev
ent_speed_parameter參數出現該問題的設置不同,出現
的時間也會不同。

30.請問OPNET的背景路由流量的如何配置?
三種方法:
application configi.
conersation pair
link load

31.怎樣在mac層獲取在pipeline stage中計算的某些參數的數值,如接收功率的數值?

可以用pwr = op_td_get_dbl (pkptr, OPC_TDA_RA_RCVD_POWER)。

32.我對某個pipeline 函數做了一點修改然後以另外一個名字另存了一下,但是在模塊
中卻不能把原來的pipeline函數改成重新命名的
pipeline函數這是怎麼回事啊?
你修改後的文件名要與函數名相同,然後得用OPNET自帶的EXTERNAL INTERFACE提供的工
具編譯就可以了。
OPNET與VC調試經驗總結
基於Debugging in OPNET withMicrosoft Visual C++ 調試的文檔(資料下載區提供)
,有一些經驗總結如下:
(1)修改Preference中的環境變量時,/Od與/Zi之間要有空格,另外注意O不是0。
(2)除了修改bind_shobj_flags、comp_flags、comp_flags_cpp外,還要修改bind_st
atic_flags:即後面添加/DEBUG。可以從文檔中的示意
圖中看出。記着,中間一定要有空格。
(3)如出現上述設置上的問題,可以從編譯結果中查看問題。(建議可以故意在一個p
rocess model中加一條語法錯誤的語句,然後編譯看列
出的出錯信息。)
(4)在attach process時,如果看不到任何process,儘量關閉不必要的程序,只留下
opnet的project窗口和VC。如果還不行,就要給VC打SP5
補丁了。不過有一種更簡單的方法,就是在任務管理器中,在進程中找到op_runsim_de
v.exe進程,右鍵,然後調試,即可和VC進行聯調。
(5)修改Simulation model的environment files時,一般不需將Force Compile設爲e
nable,因爲調試時一般process model都已編譯好。如
果把Force Compile設爲enable的話,每次啓動simulation都會把項目中包含的所有的p
rocess model重新編譯,會耗很長時間。但是爲了保證
代碼爲最新改寫過得,建議還是enable爲好。
(6)如果不想讓debug窗口自動關閉,可以把consle_exit_pause改爲TRUE,仿真完後會
提示Press <ENTER> to continue.按兩次<ENTER>纔會
關閉debug窗口。
(7)編譯的時候產生調試信息的參數是 /Z7 或 /Zi,(注意:/Z8並不是合法的參數)。
調試時還需要關閉編譯器的優化功能,所以還要加
上/Od。連接的時候需要保留調試信息,所以在bind_shobj_flags後面要加上 /DEBUG。

(8) config simulation裏面的debug,目的是讓op_runsim運行在debug模式下,等效
於console下面的 -debug。force_compile的作用是每次
編譯時都重建所有的模塊,以使你在VC下面看到的源程序都是最新的。
(9)在VC調試時,從斷點後開始單步運行,最後總會走到一個向彙編中的機器代碼的地
方。odb那邊也不能敲任何命令。這很正常,那個彙編
的地方就是OPNET的內核之類的東西。不用管它,在VC裏面再選run就行了。程序會運行
到VC的下一個斷點,或者ODB重新可以敲命令了。
(10)最基本的一個問題,在OPNET調試時,報錯:
bind_so_msvc: Unable to execute bind program (Win32 error code: 2)
Check that Visual C++ has been installed correctly, and that
its BIN directory is included in the Path environment variable.
那麼可以按照一般的方法來手動添加環境變量,但是就筆者經驗,即使當時通過,之後
可能還會出現問題。最徹底的辦法就是VC和OPNET重裝一
遍,先安裝VC,安裝時,要選擇註冊環境變量。OPNET也不能偷懶,就一步一步按順序安
裝吧。
      這些都是筆者和一些使用OPNET的朋友的一些總結,有什麼不足還望大家賜教,互
相交流,共同進步!
OPNET信道模型概述
           在OPNET模型中,當包被傳送到發送器請求發送後,實際中的情況是包將立
即被髮送到通信信道上進行傳輸,因此OPNET必須對通信
信道進行建模,也就是在模型中要實現物理層的特徵,以便將信道對包產生的傳輸效果
考慮進整個網絡模型。OPNET將信道對包產生的傳輸效果
建模爲若干個計算階段(稱爲pinpeline stage),最終來判斷該包能否被接收到。
              Pipeline的典型參數是一個packet指針,也就是說,pipeline是針對每
個包來計算它在物理信道上的傳輸效果的。爲了承載
pipiline所需或計算的信道參數,每個包都包含着由transmission data attribute(T
DA)的一組值構成的存儲區,當包的傳輸效果計算進入某
一pipeline stage時,系統內核爲TDA分配初始值或者根據計算結果來設置TDA值 。這一
組TDA值可以爲後續的pipeline stage提供計算的依據

              OPNET將傳輸信道劃分爲三種:點對點鏈路(point to point Link),
總線式鏈路(bus Link)和無線鏈路(radio Link)
。每一種鏈路由若干個標準的,缺省的pipeline stage組成。用戶可以對缺省的pipeli
ne stage 進行修改以適應用戶所需的信道類型:用戶可
以在pipeline裏定義自己的TDA,還可以調用系統內核裏的支持對TDA進行操作的內核過
程(KP)來編程實現自己的信道模型。
             OPNET中缺省的pipeline stage模型文件後綴名爲.ps.c,經編譯後形成的
目標文件後綴名爲.ps.o。所有的三種信道的缺省
pipeline stage 文件都存儲在<opnet目錄>/<版本目錄>/models/std/links/文件夾下面
。用戶若要自己編寫pipeline stage來代替缺省模型
,則需先編寫.ps.c後綴的c或c++文件,然後編譯形成.ps.o目標文件。
點對點鏈路的pipeline模型
由四個缺省的pipeline stage組成,具體描述如下:
1) 傳輸時延階段:模型文件dpt_txdel.ps.c。傳輸時延描述的是第一個比特發送時間
到最後一個比特發送時間之間的時間間隔。
計算方法:從包裏讀取傳輸該包的信道的標誌號(ID); 有了信道ID後,即可讀取信道
的數據速率; 讀取包的長度;傳輸時延=包長/數據速
率; 把計算而得的傳輸時延值寫到包的TDA裏。
2) 傳播時延階段:模型文件dpt_propdel.ps.c。傳播時延描述的是第一個比特開始發
送時間到第一個比特到達時間之間的時間間隔 。
計算方法: 從包裏讀取傳輸該包的鏈路標誌號(ID);有了鏈路ID,即可讀取鏈路的"
delay"屬性值; 把該傳播時延值寫進包的TDA中;
3) 誤碼數目分配階段:模型文件dpt_error.ps.c。
計算方法:讀取鏈路的標誌號(ID);讀取鏈路的誤碼率"ber"屬性值,即單個比特可能
誤碼的概率;讀取包長;計算"正好發生k個比特誤碼"
的概率P(k),那麼可以得到"至多發生k個比特誤碼"的概率P=P(0)+P(1)+……+P(
k);產生一個在{0,1}內平均分佈的隨機數r;如果隨
機數r小於等於"至多發生k個比特誤碼"的概率P,那麼就"認定"k就是這個包在信道上傳
輸的誤碼數目;如果r大於P,那麼就將k的值加1,反覆
計算以得到算法能夠接受的誤碼數目;將誤碼數目寫進包的TDA裏。
4) 糾錯階段:模型文件dpt_ecc.ps.c。
計算方法:讀取接收器的標誌號(ID);讀取接收器能糾正的誤碼數目門限值"ecc thr
eshold"屬性值;讀取前面計算的錯誤數目;將錯誤數目
與糾錯門限"ecc threshold"比較,判決該包是否能被正確接收;將判斷結果寫進包的
TDA裏。
總線鏈路的pipeline模型
由六個缺省的pipeline stage組成,其中第一個階段針對每個傳輸只計算一次,而後面
的五個階段針對各個可能接收到這次傳輸的接收器分別
計算一次。
具體描述如下:
1) 傳輸時延階段:模型文件dbu_txdel.ps.c。
計算方法:與點對點鏈路情況一致。
2) 封閉性計算階段:模型文件dbu_closure.ps.c。
這個階段的意義在於判斷各個接收器節點是否能夠接收到這次傳輸, 即鏈路的封閉性。
針對每個接收器都有一個判斷結果。有了這個結果以後
系統內核就可以決定是否再爲該接收器執行後面的計算進程。這個判斷的好處是提高了
仿真效率,因爲若已知某接收器不能接收到這次傳輸,
就不必爲其計算傳播時延,衝突等值,避免了進行不必要的計算。
計算方法:缺省認爲所有bus上的站點都能接收到這次傳輸,因此直接把判斷值寫進包的
TDA裏。
3) 傳播時延階段:模型文件dbu_propdel.ps.c。
計算方法:讀取鏈路的標誌號(ID);讀取鏈路的單位距離的傳播時延"delay"屬性值。
注意在這裏的delay屬性與點對點鏈路的delay屬性意義
不一樣。這裏指的是單位距離的傳播時延,而點對點鏈路中的delay直接指的是總傳播時
延。因爲點對點只涉及到單條鏈路的傳播時延,而總線
鏈路要針對不同接收器即不同的傳播距離計算出多個傳播時延;讀取收發器之間的距離
間隔;二者乘積值即爲傳播時延,將其寫進包的TDA裏。
4) 衝突檢測階段:模型文件dbu_coll.ps.c。
在某個包的整個接收時間內(第一個比特到達時間到最後一個比特到達時間之間的時間
間隔),可能會發生多次傳輸事件,於是對於該包來說
,可能要遭遇多次衝突事件。在OPNET中,每當發生一次衝突事件,就調用本pipeline
stage一次,以記錄這次衝突事件。
這個pipeline stage對每個包傳輸不是總要調用,它只是在發生衝突時調用,而是否發
生衝突是由系統內核來判別的。這個計算進程區別於其
他的pipeline stage,有兩個包指針參數:第一個是先到的分組,第二個是後到的分組
(就是觸發衝突事件的那一個)。
計算方法:如果前一個包剛好在後一個包開始傳輸時結束了接收,則不考慮爲一次衝突
。因此讀取前一個包的結束時間,將其與當前仿真時間
進行比較。如果相等或小於則不認爲衝突。如果大於,則將前後兩個包的記錄衝突次數
TDA都加一。
5) 誤碼數目分配階段:模型文件dbu_error.ps.c。
計算方法:與點對點鏈路的計算方法一致,根據誤碼率計算誤碼數目。
6) 糾錯階段:模型文件dbu_ecc.ps.c。
包能被正確接收的判斷標準與點對點鏈路稍有不同。首先是要求包未經衝突,然後將誤
碼數目與糾錯門限比較判斷可正確接收與否。
計算方法:讀取包的衝突數目;如果衝突數目不爲0或節點被disabled,則直接判斷爲不
能正確接收;將誤碼數目與糾錯門限比較以決定能否正
確接收,將判斷結果寫進包的TDA裏。具體步驟與點對點鏈路一致。
關於application模塊的一些心得
在這裏把自己看application模塊的一些筆記整理一下貼出來,和大家一起交流。
說到application模塊,首先得先說說application configure和profile configure。
在online document中有着詳細的介紹(Main Menu中的Models->Model descriptions->
Methodologies & Case Studier->Configuring
Application and Profiels)。
這裏簡單說一說:profile用來描述用戶的行爲的:用戶使用什麼類型的應用,什麼時候
使用這樣應用,使用多久?
application具體描述應用的動作,比如說http應用,就規定每次取得頁面的大小和時間
間隔。一個profile可以包含多個application。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章