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是系统分配的,全局{wy},整数。user id是自己可以设置的,可以不{wy}。


6.如何将模块添加到OPNET中?
edit - > preferences -> mod_dirs 添加模块路径即可。

7.为什么每次新建一个project 都给我保存在 c:\op_models 目录下 ,我想换一个地
方,怎么设置?
      edit - > preferences -> mod_dirs中,新建一个路径,并作为{dy}路径即可。

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 的时候让安装程序来修改环境变量就xx可以就避免这些步骤.

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指什么?
xx节点变化过程记录功能并记录statistic的变化过程 。

21.OPNET中如何删除一个senario,而保留工程?
在menu->senarios->manage senarios里。

22.请问OPNET中的animation指什么?
xx节点变化过程记录功能,并记录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 时{zh1}仿真出现下面的错误,请问
如何解决?
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重新编译,会耗很长时间。但是为了保证
代码为{zx1}改写过得,建议还是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下面看到的源程序都是{zx1}的。
(9)在VC调试时,从断点后开始单步运行,{zh1}总会走到一个向汇编中的机器代码的地
方。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。传输时延描述的是{dy}个比特发送时间
到{zh1}一个比特发送时间之间的时间间隔。
计算方法:从包里读取传输该包的信道的标志号(ID); 有了信道ID后,即可读取信道
的数据速率; 读取包的长度;传输时延=包长/数据速
率; 把计算而得的传输时延值写到包的TDA里。
2) 传播时延阶段:模型文件dpt_propdel.ps.c。传播时延描述的是{dy}个比特开始发
送时间到{dy}个比特到达时间之间的时间间隔 。
计算方法: 从包里读取传输该包的链路标志号(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组成,其中{dy}个阶段针对每个传输只计算一次,而后面
的五个阶段针对各个可能接收到这次传输的接收器分别
计算一次。
具体描述如下:
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。
在某个包的整个接收时间内({dy}个比特到达时间到{zh1}一个比特到达时间之间的时间
间隔),可能会发生多次传输事件,于是对于该包来说
,可能要遭遇多次冲突事件。在OPNET中,每当发生一次冲突事件,就调用本pipeline
stage一次,以记录这次冲突事件。
这个pipeline stage对每个包传输不是总要调用,它只是在发生冲突时调用,而是否发
生冲突是由系统内核来判别的。这个计算进程区别于其
他的pipeline stage,有两个包指针参数:{dy}个是先到的分组,第二个是后到的分组
(就是触发冲突事件的那一个)。
计算方法:如果前一个包刚好在后一个包开始传输时结束了接收,则不考虑为一次冲突
。因此读取前一个包的结束时间,将其与当前仿真时间
进行比较。如果相等或小于则不认为冲突。如果大于,则将前后两个包的记录冲突次数
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。

已投稿到:
郑重声明:资讯 【opnet 学习_风中一叶_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——