OPNET常用编译器使用实例和相关问题

OPNET常用编译器使用实例和相关问题过程创建进程模型创建节点模型定义变量,宏块和状态转移分析仿真结果设计进程模块OPNET允许在状态和转移中写入C/C++代码,包括:入口执行代码:当模块转移到一个新状态时执行的代码出口执行代码:当模块离开一个状态时执行的代码状态转移执行代码:在转移过程中顺带执行的代码实现进程模型创建三个状态,分别命名。将init和arrival状态修改为forced状态,转移到绿色…

大家好,欢迎来到IT知识分享网。

环境配置

  1. visual studio 2010
  2. OPNET 14.5
    具体安装过程见vjone大神的博客 https://blog.csdn.net/qq_31285709/article/details/87873709

过程

  • 创建进程模型
  • 创建节点模型
  • 定义变量,宏块和状态转移
  • 分析仿真结果

实现进程模型

OPNET允许在状态和转移中写入C/C++代码,包括:

  • 入口执行代码:当模块转移到一个新状态时执行的代码
  • 出口执行代码:当模块离开一个状态时执行的代码
  • 状态转移执行代码:在转移过程中顺带执行的代码
  1. 创建三个状态,分别命名。
  2. 将init和arrival状态修改为forced状态,转移到绿色状态将依次执行入口执行代码和出口执行代码,然后立即转译为其他状态。idle为unforced状态,转移到该状态的时候,执行完入口执行代码之后,模块将程序的控制权转回仿真核心,模块在此停滞,等待下一个事件到达激活模块。
  3. 创建状态转移线。
  4. 创建条件转移需要设置条件属性。只有当一个包到达的时候进程模型才从idle状态转移到arrival状态,因此需要为idle和arrival之间的状态转移设置条件。通过右键转移线,“set Attributes”,设置codition属性为ARRIVAL。之后需要定义ARRIVAL条件为包到达并且进程模型在idle状态。
  5. 再创建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)

编辑进程界面

在这里插入图片描述

编译进程模型

  1. 单击最右边的编译按钮
  2. 将进程模型保存为packet_count
    在这里插入图片描述
    注意,在这里,显示的应该是64位的,如果不是,则选择compile process module(advanced),将32位取消勾选。
    在这里插入图片描述

创建节点模型

本例节点模型包含两个包生成模块,他们将包发送到一个处理模块中(即创建的packet_count进程模型)
在这里插入图片描述
三个节点的属性设置如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建网络模型

在这里插入图片描述

进行仿真

在module statistics中勾选如下:(不知道为什么,node statistics中没有选项)
在这里插入图片描述

设置duplicate scenario:

在这里插入图片描述
运行仿真,仿真配置如下:
在这里插入图片描述
仿真结束如下所示:
在这里插入图片描述
constant仿真结果如下:
在这里插入图片描述
exponential仿真结果如下:
图中的毛刺是包突发到达(服从指数分布规律)引发的曲线的斜率,而曲线的斜率,即包的吞吐量和包生成速率相符。
在这里插入图片描述

遇到的问题以及解决方法

  1. “string.h”头文件找不到,于是卸载了visual studio 2017,更换为visual studio 2010,目前报错:
    在这里插入图片描述
    参见北邮人论坛https://bbs.byr.cn/#!article/Communications/21855 ,直接将C:\Users\Administrator\op_admin这个目录删除,重启OPNET即可解决该问题。
  2. 仿真编译的时候,报错如下:
    在这里插入图片描述
  3. 按照博客 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;
  4. 在过一段时间重启OPNET的时候,会报错License失效,解决方法见博客 https://blog.csdn.net/jdzd123/article/details/51142023

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22975.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信