OPNET入门之基本流程的编写
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:
自行完成下图状态转换:
您可能想知道为什么要包含一个从空闲到自身的转换