1.
在OPNET中产生随机整数的方法如下
Distribution * random_integer_dist = op_dist_load("uniform_int",lowbound,upbound);
int rn =op_dist_outcome(random_integer_dist);
说明:
1、先用函数op_dist_load产生一个特定分布:uniform_int指定该分布为均匀整数分布
lowbound 指定分布的下界
upbound 指定分布的上界
然后用Distribution * 类型的变量指向该分布
特别指出, 这样产生的分布式 包含下界和上界的。
2、再用函数 op_dist_outcome(Distribution * var) 即可取得满足要求的随机整数
(2) 包类核心函数
包的操作有三类:创建和销毁包;设置和得到包中的内容;析取包的相关信息和属性。
op_pk_create(): 创建一个无格式的包,括号中的参数指示包的大小,这个函数可以看成是根据指定的规格(容器的容积)产生一个空的容器。
op_pk_create_fmt(): 创建一个有格式的包,这个包的规格必须在包格式编辑器( Packet Format Editor )中定义好。
op_pk_destroy() :销毁包
op_pk_type(): 判断包的类型
op_pk_copy(): 可以复制一个包头和内容和原始包一模一样新包, 惟一不同的是包的创建时间和包的标识号( Packet ID )。
op_pk_stamp() :仿真核心标志创建时间为当前的仿真时间,地点为创建包的进程所对应的对象标识号( Objid ) 。
调用函数 op_pk_creation_time _get() 和 op_pk_creation _mod _get() 来分别得到包的原始创建时间和地点。
OPNET 规定包传输的两种方式,分别是“发送( sending )”和“传递( delivering )”。 Sending 是通过连接模块与模块的包流( packet stream )来实现,而 delivering 不需要实际的物理连接。
对于 sending ,有下面 4 种方式:
( 1 )常用的发送方式是调用 op_pk_send() ,当包沿着输出包流到达目的模块时立即向目的模块触发流中断。整个过程没有时延,所以包到达的时刻也是包发送的时刻。
( 2 )与第一种方式相比,如果要模拟包在包流传输过程的延时,以此来仿真模块有限的处理速度, 这时可以调用 op_pk_send_delayed() 函数, 包将滞后指定的时间到达目的模块。
( 3 )前面两种传输方式对于目的模块来说是被动的,因为包的到达会强加一个流中断通知它接收。如果目的模块希望隔一定的时间间隔主动地去从输入队列中取出一个包,此时包到达引起的时间上不规则的中断显得无意义。
( 4 )考虑到目的模块的这种要求,源模块应该调用 op_pk_send_quiet() 函数,采取一种静默的方式发送包。
1、两种发送packet的方式:
一种是使用主动的,也就是A要发packet给B的时候直接用op_pk_send()(或者加上时延、forced等)。那么在B就会收到一个OPC_INITRPT_STRM中断,B响应这个流中断时就把packet取出来。
一种是被动的,就是A不主动给B发packet,因为B可能还没准备好接收。那么等B准备好接收后就通过op_strm_access()告诉A我准备好了,要packet。op_strm_access()产生一个OPC_INTRPT_ACCESS中断。A响应这个access intrpt才把packet发给B。这时候用op_pk_send_quiet()来发送,就不会给B一个strm intrpt。那么B如何知道packet什么时候到来呢?因为是B自己要求发packet的,那么它已经做好了接收packet的准备,在它响应下一个中断的时候可以用op_strm_empty()来判断是否有pacekt来了。
举个例子如下
a、源端:
if (!op_subq_empty (0))
{
/* access the first packet in the subqueue /
pkptr = op_subq_pk_remove (0, OPC_QPOS_HEAD);
/ forward it to the destination /
/ without causing a stream interrupt */
op_pk_send_quiet (pkptr, 0);
}
b、目的端:
alloc_instrms = op_strm_max_index_in ();
/* loop through each allocated stream /
for (i = 0; i <= alloc_intstrms; i++)
{
/ if an input stream is connected, and… /
if (op_strm_connected (OPC_STRM_IN, i) == OPC_TRUE)
{
/ if an input stream is connected, access a packet from the source module. /
op_strm_access (i);
/ Collect and forward the packet onto the bus, if one was obtained. */
if (op_strm_empty (i) == OPC_FALSE)
op_pk_send (op_pk_get (i), OUTSTRM_BUS);
}
}
OPNET软件使用
1.6.1、菜单栏介绍
在子网模块界面,OPNET菜单栏工具栏如图所示。
第一部分:文件操作
点击File,弹出如图1-9所示。
(1)点击New,弹出新建内容窗口,会有多种创建内容选择。点击Open和Save以及Save As同样会有不同的文件格式类型。OPNET文件、名称与功能对应如图1-10所示。
(2)点击Declare External Files,可以进行外部文件声明。
声明外部文件主要针对,在c语言函数中调用了外部函数时,需要将调用的文件声明到当前进程中,如本书末尾实例2中,引入光纤链路时,需要声明部分外部文件,才能保证光纤链路的管道模型正常运行。声明只需在相应文件名选中即可。
(3)点击Manage Model Files可实现模型文件管理。
在模型文件管理中存在如图1-12所示的快捷操作。由于OPNET在打开时会按照所包含的模型目录扫面模型文件,在模型目录外的模型是不会被OPNET识别的。所以当我们创建了新的项目时,需要将存在模型的目录使用Add Model Directories添加到OPNET的模型目录中,这样,下次启动OPNET就会自动扫描其中的文件。当然还可以通过删除模型文件,更新模型目录等操作。
对模型目录的操作,还有一种方法,在Edit菜单栏中,选择preference,在输入框中输入mod_点击Find,出现如图1-13所示结果。
点击Model Directories属性值的位置出现如图1-14所示的模型目录,在这里添加删除模型目录,调整模型目录顺序,第一个模型目录为默认打开文件对话框。
第二部分:场景操作
场景操作请参考2.2章节
第三部分:拓扑操作
拓扑操作请参照2.8章节
第四部分:DES介绍
点击DES,弹出如图1-15所示的菜单选项。
1)Choose Individual Statistics为选择自定义统计量,点击后进入统计量选择,可以选择全局统计量,节点统计量以及链路统计量。在子网模型空白处单击右键选择Choose Individual DES Statistics同样可以进入这个窗口。
2)Choose Statistics(Advanced)为高级统计量设计,点击后进入各类型的探针设计界面。如图1-16所示,其中包含了Global Statistic Probes全局统计量探针,Node Statistics Probes节点统计量探针,Link Statistic Probes链路统计量探针,Path Statistic Probe路径统计量探针,Demand Statistic Probes业务统计量探针,Attribute Probes属性探针,Automatic Animation Probes自动动画探针,Statistic Animation Probes统计量动画探针,Custom Animation Probes自定义动画探针。
3)Configure/Run Discrete Event Simulation为仿真环境配置,点击后仿真环境配置界面。参考4.1章节调试部分。
4)Configure/Run Discrete Event Simulation(Advanced)为高级仿真环境配置,参考4.1章节调试部分。
5)Run Discrete Event Simulation运行离散时间仿真,等同于在仿真配置界面点击Run按钮,运行仿真。
6)Open DES Log打开DES调试日志
7)Results查看各种结果和调试报告
8)Play 2D Animation为播放2D动画,在设置了动画探针,并在仿真输出中设置了存储动画文件时有效。
1.6.2、工具栏介绍