大家好,欢迎来到IT知识分享网。
环境配置
- visual studio 2010
- OPNET 14.5
具体安装过程见vjone大神的博客 https://blog.csdn.net/qq_31285709/article/details/87873709
过程
- 创建进程模型
- 创建节点模型
- 定义变量,宏块和状态转移
- 分析仿真结果
实现进程模型
OPNET允许在状态和转移中写入C/C++代码,包括:
- 入口执行代码:当模块转移到一个新状态时执行的代码
- 出口执行代码:当模块离开一个状态时执行的代码
- 状态转移执行代码:在转移过程中顺带执行的代码
- 创建三个状态,分别命名。
- 将init和arrival状态修改为forced状态,转移到绿色状态将依次执行入口执行代码和出口执行代码,然后立即转译为其他状态。idle为unforced状态,转移到该状态的时候,执行完入口执行代码之后,模块将程序的控制权转回仿真核心,模块在此停滞,等待下一个事件到达激活模块。
- 创建状态转移线。
- 创建条件转移需要设置条件属性。只有当一个包到达的时候进程模型才从idle状态转移到arrival状态,因此需要为idle和arrival之间的状态转移设置条件。通过右键转移线,“set Attributes”,设置codition属性为ARRIVAL。之后需要定义ARRIVAL条件为包到达并且进程模型在idle状态。
- 再创建arrival到idle的转移线和idle到自身的转移线。并将idle返回自身的转移线设置为default。(default是OPNET自带的默认条件)
定义条件和变量
定义宏
在OPNET中,经常用宏来替换复杂的转移条件和状态转移执行代码。一般在header block中使用#define定义宏
在HB中加入如下代码:
#define ARRIVAL (op_intrpt_type() == OPC_INTRPT_STRM)
当终端到达仿真核心的时候,仿真核心调用op_intrpt_type()函数,将其返回值与OPC_INTRPT_STRM常量比较,如果相等,则说明中断是由包到达引起的,此时arrival条件满足。
定义两个状态变量
点击SV,申明两个状态变量,一个用来存储包计数器的值,一个用来将计数器的值写入统计量的句柄。
注:定义在SV中的状态变量,当模块将程序控制权交给仿真核心的时候,他们的值受保护。定义在TV中的值是临时变量,不受保护。
申明一个统计量
在interface中选择”Local Statistics”,加入统计量packet count(注意这里,没有线),如下图所示:
创建状态执行代码
点击init的上半部,输入以下代码:
pk_count = 0;
/*注册申明的统计量,得到与它关联的统计量句柄pk_cnt_stathandle*/
pk_cnt_stathandle = op_stat_req ("packet count", OPC_STAT_INDEX_NONE,OPC_STAT_LOCAL);
双击arrival的上半部,输入以下代码:
pk_count = pk_count + 1;
op_pk_destroy (op_pk_get (op_intrpt_strm()));
op_stat_write(pk_cnt_stathandle,pk_count);
op_intrpt_strm:决定中断来自哪个包流,返回包流的索引号。
op_pk_get:返回一个指向包数据结构的指针。
op_pk_destroy:将包指针指向的内存块释放。
第三句将当前计数器值通过核心函数op_stat_write写入状态统计句柄pk_cnt_stathandle
(查看OPNET自带的核心函数说明可以在Help才难中选择Essential Kernel Procedures)
编辑进程界面
编译进程模型
- 单击最右边的编译按钮
- 将进程模型保存为packet_count
注意,在这里,显示的应该是64位的,如果不是,则选择compile process module(advanced)
,将32位取消勾选。
创建节点模型
本例节点模型包含两个包生成模块,他们将包发送到一个处理模块中(即创建的packet_count进程模型)
三个节点的属性设置如下:
创建网络模型
进行仿真
在module statistics中勾选如下:(不知道为什么,node statistics中没有选项)
设置duplicate scenario:
运行仿真,仿真配置如下:
仿真结束如下所示:
constant仿真结果如下:
exponential仿真结果如下:
图中的毛刺是包突发到达(服从指数分布规律)引发的曲线的斜率,而曲线的斜率,即包的吞吐量和包生成速率相符。
遇到的问题以及解决方法
- “string.h”头文件找不到,于是卸载了visual studio 2017,更换为visual studio 2010,目前报错:
参见北邮人论坛https://bbs.byr.cn/#!article/Communications/21855 ,直接将C:\Users\Administrator\op_admin这个目录删除,重启OPNET即可解决该问题。 - 仿真编译的时候,报错如下:
- 按照博客 https://www.2cto.com/kf/201708/663865.html 修改之后,报错如下:
LINK : fatal error LNK1181: 无法打开输入文件“kernel32.lib”
解决方法是在系统变量中加入C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\x64; - 在过一段时间重启OPNET的时候,会报错License失效,解决方法见博客 https://blog.csdn.net/jdzd123/article/details/51142023
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22975.html