opnet常见问题

引用地址 http://hqsong722.blog.163.com/blog/static/3674215820101123101313442/

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,html等格式。node,process都可以从file中的ExportBitmap导出拓扑图。 
二:对于分析出来的曲线,按鼠标右键,其中有个 Export Graph Data to Spreadsheet,然后会有提示 说你文件保存在什么地方,一般缺省是保存在 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_write(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\Microsoft 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 就是做时间平均 
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 有连通性的检查,如果false ,则以后的stage 都不需执行了。 
29.仔细察看了一下程序,FIN和FOUT都是配对的。在一个Idle的状态中,什么操作也没做。但是程序执行了好长时间之后,突然告诉说Abnormal function stack function。就是在Idle状态出的错。可是哪个状态根本就是空操作。而在.pr.c文件中,发现所有的process的.pr.c文件中的那个最全的函数都是只有FIN,没有FOUT的。请问出现上述错误还有可能是何原因? 
查看事件列表,有可能是事件列表满的缘故,你可以试着改变preference里面的一个event_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_static_flags:即后面添加/DEBUG。可以从文档中的示意图中看出。记着,中间一定要有空格。 
(3)如出现上述设置上的问题,可以从编译结果中查看问题。(建议可以故意在一个process model中加一条语法错误的语句,然后编译看列出的出错信息。) 
(4)在attach process时,如果看不到任何process,尽量关闭不必要的程序,只留下opnet的project窗口和VC。如果还不行,就要给VC打SP5补丁了。不过有一种更简单的方法,就是在任务管理器中,在进程中找到op_runsim_de v.exe进程,右键,然后调试,即可和VC进行联调。 
(5)修改Simulation model的environment files时,一般不需将Force Compile设为enable,因为调试时一般process model都已编译好。如果把Force Compile设为enable的话,每次启动simulation都会把项目中包含的所有的process model重新编译,会耗很长时间。但是为了保证代码为最新改写过得,建议还是enable为好。 
(6)如果不想让debug窗口自动关闭,可以把consle_exit_pause改为TRUE,仿真完后会提示Press to continue.按两次才会关闭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(TDA)的一组值构成的存储区,当包的传输效果计算进入某一pipeline stage时,系统内核为TDA分配初始值或者根据计算结果来设置TDA值 。这一组TDA值可以为后续的pipeline stage提供计算的依据。 
OPNET将传输信道划分为三种:点对点链路(point to point Link),总线式链路(bus Link)和无线链路(radio Link) 
。每一种链路由若干个标准的,缺省的pipeline stage组成。用户可以对缺省的pipeline stage 进行修改以适应用户所需的信道类型:用户可以在pipeline里定义自己的TDA,还可以调用系统内核里的支持对TDA进行操作的内核过程(KP)来编程实现自己的信道模型。 
OPNET中缺省的pipeline stage模型文件后缀名为.ps.c,经编译后形成的目标文件后缀名为.ps.o。所有的三种信道的缺省 
pipeline stage 文件都存储在/<版本目录>/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。


自己实际操作中碰到的错误提示及解决方法:

  一.第一个提示

oms_string_support.ex.tmp.c
C:\Users\chenshengli\op_admin\tmp\oms_string_support.ex.tmp.c : fatal error C1074: “IDB”是 PDB 文件 的非法扩展
解决的方法是:进入到安装目录下的modeler.exe,将兼容性取消,然后以管理员身份运行。上面的问题就能解决了。(以后每次运行OPNET Modeler都要用管理员身份进行运行)

  二.解决好第一个提示后出现的第二个提示

cannot open include file‘windef.h’:no such file or directory

解决方法:在安装VS的盘里搜索windef.h文件,然后将所在文件夹路径复制添加到右键我的电脑 属性 高级 环境变量 PATH和INCLUDE下面

  三.接下来出现的错误是无法打开文件“kernel32.lib”

解决方法是:在环境变量中对lib进行编辑

D:\Program Files\Microsoft Visual Studio 9.0\VC\lib;D:\Program Files\OPNET\14.5.A\sys\lib;D:\Program Files\OPNET\14.5.A\sys\pc_intel_win32\lib;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib

四.错误提示是缺失MSVCR90.DLL

解决方法是从网上下载一个MSVCR90.DLL,放到 \System32下
  五.出现的错误是runtime error (R6034)

解决方法是:我的是Visual Studio 2008,复制opnet_dir>\sys\pc_intel_win32\bin\manifest_NET2008目录下文件(有5个)到\sys\pc_intel_win32\bin,然后把windows SDK下的bin中的mt.exe文件拷贝到OPNET的bin文件夹下,从开始菜单中运行cmd输入以下命令:

Mt.exe –manifest op_runsim.exe.manifest –outputresource:op_runsim.exe;1回车没有出现错误(Fail)才算通过。

你可能感兴趣的:(闲谈)