OPNET入门2-Basic Process
OPNET入门之基本流程的编写
- 1. 流程概述
- 2. 模型设计
- 2.1 概述
- 2.2 实现
- 2.2.1 实现流程模型
- 2.2.1.1 创建状态转换
- 2.2.1.2 定义条件和变量
- 2.2.1.3 创建状态执行
- 2.2.1.4 编辑流程接口
- 2.2.1.5 编译模型
- 2.2.2 实现节点和网络模型
- 2.2.2.1 创建节点模型
- 2.2.2.2 创建网络模型
- 2.2.2.3 运行仿真
- 2.2.2.4 分析结果
1. 流程概述
在项目编辑器中,网络模型由单个节点组成,节点由模块组成。流程模型定义了模块的行为。通过理解流程模型,您可以构建模块,并将它们组合成符合您的具体规范的节点。如下所示:
流程模型是一个有限状态机(finite state machine-FSM)。它表示模块的逻辑和行为。FSM定义了模块的状态以及改变状态的标准。而且我们可以通过编写程序来定义状态以及状态之间的转换,这钟由特定于opnet的函数扩展的代码称为Proto-C,主要使用在三种场合:
- 进入执行(Enter Executes):当模块进入某个状态时执行的代码(双击状态的上部分);
- 退出执行(Exit Executes):当模块离开某个状态时执行的代码(双击状态的下部分);
- 转换执行:响应特定事件而执行的代码。
当流程模型进入某个状态时,它执行Enter executives,然后,如果状态是非强制的(红色),流程模型停止执行并将控制权返回给模拟。
2. 模型设计
2.1 概述
我们要设计当数据包到达模块时,流程模型必须增加一个计数器,然后释放数据包。因此,模块主要有两种状态:待包裹的到来,包裹到达后处理。我们还需要将适当的变量设置为零的初始化状态。
因此我们要构建的包计数流程模型将包含三种状态:
- 初始化状态
- 空闲状态
- 到达状态。
包计数模型包含三个转换:
- 初始化到空闲
- 空闲到到达
- 到达到空闲
流程模型第一次被调用时(在本例中是在模拟开始时),它从初始化状态开始。初始化(将包计数器变量设置为0)之后,流程模型转换到空闲状态,并等待第一个包到达。流程模型再次被激活后,数据包到达时转换到到达状态,并增加包计数器变量并销毁包。
2.2 实现
2.2.1 实现流程模型
2.2.1.1 创建状态转换
打开OPNET Modeler,选择File→New…,在下拉菜单选择
Process Model
,点击OK;单击Create State工具按钮,并在工作区中放置三个状态,如图所示:
注意:创建好三个状态后,鼠标右键单击空白处结束创建;
注意:创建的第一个状态自动是初始状态,这里用一个加粗的箭头表示。给每个状态一个唯一的名称来描述其功能。
初始化状态将使用名称init,空闲状态将使用名称idle,到达状态将使用名称arrival(右键单击状态,并从下拉框中选择Set Name
,然后分别键入新名称,单击OK即可);改变强制或者非强制状态
右键单击init状态并选择Make state Unforced
,将其更改为强制状态,init状态变成了绿色。对到达状态执行同样的操作,使其变成强制状态。
此时流程模型中有两种状态是强制状态:init状态是强制的,因为它可以在初始化变量之后直接进入空闲状态;arrival状态是强制的,因为在计数和销毁每个数据包之后,进程模型应该返回到空闲状态。
注意:非强制(红色)状态是在执行了输入执行器之后,将模拟的控制权返回给模拟内核的状态。强制(绿色)状态是指不返回控制权,而是立即执行Exit Executes并转换到另一种状态的状态。
默认情况下,新创建的状态是非强制的,在执行Enter Executives之后,流程模型阻塞(即执行Exit Executes并将控制权返回给模拟内核)。下一次调用流程模型时,执行将从上次阻塞的状态再次开始。创建状态转换
点击Create Transition
按钮,左键点击init状态,然后点击idle状态,此时形成了一条直箭头,再次点击idle状态,然后在idle和arrival直接的空白处点击一下,接着再点击arrival,此时形成了一条曲箭头。
右键点击曲箭头,选择Edit Attributes
,然后将条件属性(condition)的值键入ARRIVAL(一定要用大写字母),然后单击OK:
自行完成下图状态转换:
您可能想知道为什么要包含一个从空闲到自身的转换,并将该转换命名为default。当模拟执行时,模拟内核管理要发生的事件的列表。当每个事件到达该列表的顶部(或头部),它就成为一个中断。中断通常被传递到特定的模块,这种情况会激活模块的流程模型。
当您正在构建的流程模型处于空闲状态时,如果到达条件为true,它将转换为到达状态。很快,如果传递到模块的中断是数据包到达中断,那么您将定义ARRIVAL来执行true。但是,如果是不同类型的中断,那么流程模型必须遵循一个转换。默认转换处理这些不同的中断类型。
注意:default必须为全小写。
2.2.1.2 定义条件和变量
宏定义
点击HB(Edit Header Block)按钮
输入如下代码
#define ARRIVAL (op_intrpt_type () == OPC_INTRPT_STRM)
上面测试定义的ARRIVAL以是否当前中断(导致FSM唤醒和执行)是由到达的数据包产生的为条件。它将核心函数
op_intrpt_type()
返回的值与常量 OPC_INTRPT_STRM 进行比较,如果比较的结果为true,表明中断是由包到达了输入流而引起的。
可以在三个地方声明变量。在临时变量块中声明的变量不会在调用FSM之间保留它们的值;在状态变量块中声明的变量在每次调用中都保留它们的值;状态执行器内部声明的变量仅在执行该执行器时定义。
注意:至此我们见识到了opnet的核心函数,关于核心函数我们将在以后的文章里详细介绍。点击File,选择Commit进行保存,然后关闭该编辑框。
下一步是声明两个状态变量。一个将存储数据包计数的值,另一个是用于分析计数的本地统计数据的“handle”。
- 单击SV(Edit State Variables)按钮
- 在对话框里键入如下值,并保存点击OK:
| Type | Name | Comments |
|–|--|–|
| int | pk_count | Counts total packets |
|–|--|–|
| Stathandle | pk_cnt_stathandle | Statistic to record packet count |
在创建统计数据时,必须在记录它的流程模型中声明该统计数据。您将为这个过程创建一个统计数据。
- 单击 Interfaces 选择 Local Statistics,键入如下值,点击OK:
2.2.1.3 创建状态执行
双击 init 状态的上半部分;
输入以下代码来初始化状态变量 pk_count 和 pk_cnt_stathandle
pk_count = 0; pk_cnt_stathandle = op_stat_reg ("packet count", OPC_STAT_INDEX_NONE, OPC_STAT_LOCAL);
前面代码的第二行注册包计数统计信息,并为到达状态设置一个句柄,以便在记录收到的包数量时使用。
pk_count和pk_cnt_stathandle变量是自己定义的状态变量,但是op_stat_reg( )是一个仿真核心函数(Simulation Kernel Procedure(KP),OPNET提供了数百个内置函数,可以用于各种目的,比如操作队列或创建动画)。
每个状态下面显示的数字表示该状态的进入和退出执行程序的行数。现在您已经在init状态的Enter Execs输入了一些代码,init状态图标下面的数字已从0/0变为2/0。如果你不想看这些显示,右键单击流程编辑器空白处并选择 Hide Line Counts,如果你想再次看到他们可以选择Show Line Counts 。
因为有很多函数,所以很难确定最适合某个特定任务的函数。不过有个关于最常用的KP的总结。在本教程的下一步中,当您为处于到达状态的Enter Execs编写代码时,您将回顾此摘要。点击File,选择Commint保存代码,并关闭编辑框。
按照下面的步骤来义arrival状态中发生的情况
和上面一样,双击arrival上半部分打开它的Enter Executes,输入以下程序,保存代码,并关闭编辑框:
++pk_count; op_pk_destroy (op_pk_get (op_intrpt_strm ())); op_stat_write (pk_cnt_stathandle, pk_count);
2.2.1.4 编辑流程接口
要控制节点级别可见的属性,请编辑流程接口,可以设置初始属性值或者隐藏属性。
- 点击Interfaces按钮选择Process Interfaces;
- 将begsim intrpt的Initial Value改为enabled;
➥这将导致仿真内核提供这样一个中断流程模型的仿真实例。 - 验证以下每个属性的初始值都被设置为禁用:endsim intrpt、failure intrpts、intrpt interval、recovery intrpts和super priority;
- 验证 priority属性的初始值为0;
- 对于所有属性,通过在Status列中左键单击并选择hidden,将Status的值更改为hidden,这样属性就不会出现在节点编辑器中,并点击OK:
2.2.1.5 编译模型
- 单击Compile Process Model按钮
- 出现以下对话框,点击Close即可:
- 如果出现错误消息,请关闭错误报告,并验证到之前流程模型输入的代码的正确性;
- 关闭流程编辑器。
2.2.2 实现节点和网络模型
此次实验节点模型有两个数据包生成器模块,它们将数据包发送到通用处理器模块。处理器模块使用前面定义的packet_count进程计算和丢弃数据包,并更新输出统计信息。
请注意,流程模型可以接受任意数量的传入数据包流,因为当中断发生时,它会自动确定正确的流。
2.2.2.1 创建节点模型
首先,创建一个使用packet_count进程的节点模型。
- File→New…→Node Model,单击OK;
- 点击Create Processor按钮,创建三个进程模块;
- 点击Create Packet Stream按钮将模块与包流连接起来,如下所示:
现在更改每个模块的属性。第一个处理器模块改成生成器模块
- 右键单击p_0模块,选择Edit Attributes,将name改为src1,将 process model 属性的值改为simple_source,然后点击OK:
第二个处理器模块将对数据包进行计数
- 右键单击p_1模块,选择Edit Attributes,将name改为count,将 process model 属性的值改为之前命名的packet_count,然后点击OK:
设置第三个处理器模块来生成数据包
- 右键单击p_2模块,选择Edit Attributes,将name改为src2,将 process model 属性的值改为simple_source。
鼠标左键单击Packet Interarrival Time以突出显示属性名称,然后右键单击并选择Promote Attribute to Higher Level,该行右侧的值变成了promoted,然后点击OK即可:
附:两个生成器都发送数据包来计数。第一个生成器以一个包/秒的恒定速率发送数据包,而第二个生成器以可变速率(遵循您将指定的分布)发送数据包。
提升节点层次并重命名
- 选择 Interfaces → Node Statistics ;
- 点击Orig. Name下的第一个框,选择最后一项count.packet count,并点击 Promote;
- 更改Prom. Name 的值为 node packet count;
- 更改Desc. field的值为Number of packets received at the node level ,并点击File→Commit,然后再点击OK来关闭Statistic Promotion对话框:
- 点击File→Save,键入packet_count用来命名该节点模型(节点模型和流程模型可以有相同的名称,因为OPNET自动的添加了.nd.m到每个节点模型和.pr.m表示每个流程模型),然后关闭结点编辑器。
2.2.2.2 创建网络模型
网络模型由使用packet_count节点模型的单个节点组成。在将节点放置到项目编辑器工作区之后,就可以指定要收集的统计信息和动画了。
首先,创建一个新项目
- 点击File→New…,打开一个新的project;
- Project name命名为:packet_count;Scenario name命名为:constant,并点击OK;
- 点击右下角的Quit,退出向导;
然后创建自定义对象面板
- 点击Open Object Palette按钮
- 点击对象面板中左上角的按钮,将对象面板切换到图标视图:
- 单击Configure Palette,然后在出现的对话框中单击Clear按钮,从Palette中除去除默认图标之外的所有图标;子网图标仍然保留;(如果有无线模块,移动和卫星子网的图标也会保留):
- 点击Node Models,在出现的对话框中找到packet_count,单击它的Status值,使其变为include,然后点击OK,再点击OK,并命名为packet_count:
将节点放置在工作区中,并选择适当的统计信息进行收集
在工作区中放置一个packet_count固定节点,然后关闭对象面板:
右键单击节点打开其对象弹出菜单,然后选择 Choose Individual DES Statistics
选择 Animations → Node Animation
选择 Node Statistics → node packet count checkbox
右键node packet count checkbox,点击Record Statistic Animation
点击OK关闭该对话框。
接下来为属性指定分派
- 右键单击该节点,选择Edit Attributes;
- 点击第四行的constant,验证:
Distribution name 的值是 constant ;
Mean outcome 的值是 1.0;
然后点击OK,
接着继续点击OK;
配置仿真
- 选择DES → Configure/Run Discrete Event Simulation…
- 在对话框中输入以下:
Duration: 100 seconds
Seed: 1471
Values per statistic: 100
然后点击左侧树状表中的Outputs,接着点击Animation再点击2D,查看右边的Send animation to history file 复选框是否被选中,
如果选中了,就点击Apply来应用上述数据,然后点击Cancel关闭对话框。
要研究不同pdf的效果,可以基于此创建新场景。在仿真它们之后,可以进行比较。
此时要创建一个新的场景并设置PDF
- 点击Scenarios→Duplicate Scenario…创建一个新的场景,并且命名为exponential ,点击OK进行保存
- 接着右键点击结点,选择 Edit Attributes ,在出现的对话框里的点击src2.Packet Interarrival Time的Value值,在出现的对话框中选择exponential,点击OK,再点击OK以保存
- 点击OK,接着保存该项目为packet_count;
2.2.2.3 运行仿真
现在准备去配置并运行仿真。
配置存储库:
- 选择Edit→Preferences;
- 验证Network Simulation Repositories的值是否为(),然后单击Cancel,如果不是空的,删除所有条目并单击OK关闭对话框;
运行仿真
- 选择Scenarios→Manage Scenarios…,将每个场景的Results值由uncollected改为collect;
- 单击OK仿真开始运行。
➥ DES Execution Manager对话框打开,显示两个仿真场景。每当一个仿真执行时,对话框中都会更新仿真的信息:可以关闭DES Execution Manager对话框了。
2.2.2.4 分析结果
- 右键单击结点,选择View Results;
- 左下角复选框里选择Object Statistics→node_0→node packet count:
- 左上方复选框选择Current Project
- 右下方复选框选择Overlaid Statistics此时就可以将两个场景下的仿真结果放在一起看。
查看在仿真过程中创建的动画
- 选择DES→Play 2D Animation
- 想要查看包动画,选择Windows→Animation Viewer→top.node_0 packet flow;
- 点击File→Exit,退出动画。
通过本次实验,我们应该能够很好地理解如何通过创建自定义流程模型来控制节点行为。下一次,将学习分组交换,探索分组交换网络的创建。
OPNET入门2-Basic Process相关推荐
- OPNET入门——小型局域网仿真
一.实验目的 1. 了解OPNET Modeler的特点,熟悉OPNET工作环境,理解OPNET场景的概念,了解进程编辑器.节点编辑器以及工程编辑器的使用方法,认识统计量的收集与分析过程. 2. 了解 ...
- 9. OD-PEID的入门及BASIC(VB)开发的程序破解
使用peid可以快速查看PE程序信息,比如连接器12.0,表示vs2003,基址为入口点,偏移地址为文件偏移等基本信息. Ctrl+n ,打开输入输出表 输入查找vbaVarTstEq 下断点 记下注 ...
- RPA之家手把手带你入门Blue Prism教程系列5_认识Process Studio Object Studio
RPA之家手把手带你入门Blue Prism Process Studio Object Studio -本文章由RPA之家(rpazj.com)提供, 学习交流群QQ群465620839 微信交流群 ...
- 数据分析从头学_数据新闻学入门指南:让我们从头开始构建故事
数据分析从头学 by Mina Demian 由Mina Demian 数据新闻学入门指南:让我们从头开始构建故事 (A Beginner's Guide to Data Journalism: Le ...
- OPNET学习笔记(一):创建一个小型局域网工程、场景并对比统计数据
OPNET学习笔记(一):创建一个小型局域网并对比统计数据 前言 1.创建工程 2.配置场景 3.创建场景 4.选择统计量 5.结果显示 6.创建对比场景并对比 7.总结 前言 关于OPNET的安装教 ...
- 什么是计算机编程,以及vb软件的介绍及教程,[计算机软件及应用]vb编程入门.ppt...
[计算机软件及应用]vb编程入门 第2章 VB编程入门 Visual Basic 程序设计教程 本章将介绍有关VB程序的构成和数据类型以及变量的定义和使用.表达式以及基本的输入输出操作.这些知识是编程 ...
- python统计行号_利用Python进行数据分析(第三篇上)
上一篇文章我记录了自己在入门 Python 学习的一些基础内容以及实际操作代码时所碰到的一些问题. 这篇我将会记录我在学习和运用 Python 进行数据分析的过程: 介绍 Numpy 和 Pandas ...
- mvp内粗泄露问题_如何在一天内从MVP转到生产服务器
mvp内粗泄露问题 by Yisroel Yakovson 通过伊斯洛尔·雅科夫森 如何在一天内从MVP转到生产服务器 (How to go from MVP to Production Server ...
- 基于springboot的毕业设计管理系统
摘要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息.为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,毕业 ...
最新文章
- java date 加一天_Java 8中的时间JAVA成长之路
- iOS 滚动图滚动到顶部汇总
- java版扫雷下载_Java 实现扫雷游戏(MineSweeper)
- webpack文章(持续更新)
- MySQL数据库:事务和ACID实现原理
- 阿德莱德大学计算机语言班,阿德莱德大学——英语语言中心
- 一直误解的memset函数
- 跨境电商shopify独立站如何引流量
- 硬盘安装Windows 7
- Python之猜数字游戏
- CASS 10.1.6 安装教程
- Ragel学习笔记(一)
- 必读的 Android 文章
- 计算机指令load是什么意思,overload
- sg11解密 php解密 SourceGuardian解密sg_load解密去除域名IP授权
- html怎么偏左居中,word文档偏左怎么调到中间
- 一文读懂 delete和delete[ ]
- Linux 异常:The following signatures couldn‘t be verified because the public key is not available
- 《深度学习从0开始》
- 为什么中国难以诞生像SAP、甲骨文一样的企业级服务公司?
热门文章
- linux 向日葵 使用方法,远程控制工具——Centos7上向日葵安装使用
- PEAP认证环境搭建及认证的大体流程
- vue 日期格式化-将时间2020-11-10T12:01:50.942转换成2020-11-10 12:01
- 那么如何求出这个长轴和短轴呢?于是线性代数就来了
- Excel技巧—开始菜单之剪切的高级用法
- Python 爬虫实战:分析豆瓣中最新电影的影评
- 设计模式 -- 访问者模式(Visitor)
- 计算机烧毁,终极:计算机主板烧毁了吗?为什么会燃烧?
- 轻小说搜索及下载(基于8wenku)-python
- iPhone指环贴:你手机的防盗专家