OPNET学习笔记
OPNET学习笔记
OPNET学习笔记OPNET结构(OPNET Architecture)(注:此部分可参考OPNET Documentation: Main Menu->Modeling Concepts->Modeling Overview->OPNET Architecture)OPNET 为通信网络和分布式系统的性能评估提供了一个全面的开发环境。
由许多工具组成,这些工具暗中建模和仿真的步骤分为三个门类:定制(Specification),数据收集和仿真(Data Collection and Simulation),分析(Analysis)。
1.模型定制(Model Specification)1.1定制编辑器(Specification Editors)a)Project Editor:定义网络模型(network models),network models由子网(subnets)和节点模型(node models)。
Project editor具有基本的仿真和分析能力(还包括统计)。
b)Node Editor:定义节点模型(node models),node models是network models中的一部分。
Node models由一系列模块(modules)组成,这些模块内部含有进程模型(Process models)。
模块还有可能包含参数模型(?! parameter models)。
c)Process Editor:定义进程模型。
进程模型控制module 的行为,也有可能会涉及parameter models(?!)。
d)Link Model Editor:创建,编辑,查看链路模型(link models)。
e)Packet Format Editor:定义包格式模型(packet formats models)。
packet format指明packet所存储的信息的结构和顺序。
2021年CCNA笔记 IP路由(二)
CCNA笔记 IP路由(二)我们来了解下距离向量协议的启动过程:当router启动的时候,只有那些与它们直接相连的网络号出现在它们自己的路由表里,当距离向量协议在每个router上启动后,路由表将从相邻router获得更新信息来更新自己的路由表.每个router将完整的路由表,包含网络号,出口接口和跳数,发送给相邻router.接下来,路由表包含了完整的网络信息,达到汇聚(converged)状态.另外,在汇聚期间,没有数据将会被传送,所以说,快速汇聚就成了1个必不可少的话题Routing Loops距离向量协议通过向所有接口周期性的广播路由更新来跟踪整个网络的变化,这些广播包括了完整的路由表.这样看上不错,但是它却给CPU增加了负荷和占用了额外的带宽.而且,汇聚过慢的话容易导致路由表的不一致性和容易产生路由循环(routing loops)路由循环的例子:假如网络5出问题了,不工作了,E就发送更新给C汇报情况,于是,C 开始停止通过E来路由信息到网络5,但是这个时候A,B和D还不知道网络5出问题了.所以它们仍然继续发送更新信息.C发送更新给B 说停止路由到网络5.但是此时A和D还没有更新,所以它们觉得网络5仍然可用,而且跳数为3.接下来,A发送更新说:嘿!网络5还可用.B和D接受到A发来的更新后,没办法,也相同的觉得可用经过A 到达网络5,并且认为网络5可用.所以就这样,1个目标网络是网络5的数据包将进过A到B,然后又回到A……Maximum Hop Count路由循环的问题也可用描述为跳数无限(counting to infinity).其中的1个解决办法就是定义最大跳数( ___ximum hop count).RIP 是这样定义最大跳数的:最大跳数为15,第16跳为不可达.但是这样不能根本性的祛除路由循环的问题Split Horizon另外1个解决办法就是水平 ___(split horizon),它规定由1个接口发送出去的路由信息不能再朝这个接口往回发送.这个办法减少了路由信息的不正确性和负载Route Poisoning路由破坏(route poisoning)也用于避免不一致的更新信息来阻止网络循环.由刚才的拓扑图,当网络5不可用了,E将把这条线路的度变为16,即不可达,破坏这条线路.这样C就不会发送错误的更新了.当C收到E的route poisoning信息,,C发送个叫做poison reverse的更新给E,这样保证了所有的线路都知道那条破坏线路的信息,来防止循环Holddowns抑制计时(holddown): 一条路由信息无效之后,一段时间内这条路由都处于抑制状态,即在一定时间内不再接收关于同一目的地址的路由更新.如果,路由器从一个网段上得知一条路径失效,然后,立即在另一个网段上得知这个路由有效.这个有效的信息往往是不正确的,抑制计时避免了这个问题,而且,当一条链路频繁起停时,抑制计时减少了路由的浮动,增加了网络的稳定性.它使用了触发更新(trigger update)来重新设定holddown计时器触发更新:和一般的更新不一样,当路由表发生变化时,更新报文立即广播给相邻的所有路由器,而不是等待30秒的更新周期.同样,当一个路由器刚启动RIP时,它广播请求报文.收到此广播的相邻路由器立即应答一个更新报文,而不必等到下一个更新周期.这样,网络拓扑的变化会最快地在网络上传播开,减少了路由循环产生的可能性触发更新重新设定计时器的几个情况: 1.计时器超时 2.收到1个拥有更好的度的更新 3.刷新时间(flush time)Routing Infor ___tion Protocol(RIP)RIP是一种距离向量路由协议,使用跳数作为度,最大15跳,它每30秒向外发送整个路由表的信息.RIP适合于小型网络.RIP版本1(RIPv1)使用分级路由(classful routing),意思是在网络的所有设备必须使用相同的子网掩码;而RIP版本2(RIPv2)使用无分类路由(classless routing).我们这里讨论RIPv1RIP TimersRIP使用3种不同的计时来调节它的性能: 1.路由更新计时(route update timer) 2.路由无效计时(route invalid timer) 3.保持计时器(holddown timer) 4.路由刷新时间(route flush timer)路由更新计时:router发送路由表副本给相邻router的周期性时间,30秒路由无效计时:如果经过180秒,一个路由的选项都没有得到确认,router就认为它已失效了保持计时器:当router得知路由无效后,router将进如holddown状态,默认时间是180秒,如果在这180秒里,router接收到路由更新以后或者超过180秒,保持计时器停止计时路由刷新时间: 如果经过240秒,路由表的选项仍没有得到确认,它就被从路由表中删除Configuring RIP Routing配置RIP:Router Network Address Inte ___ ___ Address RouterA 192.168.10.0 fa0/0 192.168.10.1 192.168.20.0 s0/0 192.168.20.1 RouterB 192.168.20.0 s0/0 192.168.20.2 192.168.40.0 s0/1 192.168.40.1 192.168.30.0 fa0/1 192.168.30.1 RouterC 192.168.40.0 s0/0 192.168.40.2 192.168.50.0 fa0/0 192.168.50.1由,如下:RouterA(config)#no ip route 192.168.30.0 255.255.255.0 192.168.20.2 RouterA(config)#no ip route 192.168.40.0 255.255.255.0 192.168.20.2 RouterA(config)#no ip route 192.168.50.0 255.255.255.0 192.168.20.2使用RIP配置命令为router rip,起用RIP,接下来使用work命令配置需要进行通告(advertise)的网络号,注意router的提示符,如下:RouterA(config)#router rip RouterA(config-router)#work 192.168.10.0 RouterA(config-router)#work 192.168.20.0 RouterA(config-router)#^Z RouterA#注意配置的网络号,是直接相连的网络,而通告非直接相连的网络任务,就交给RIP来做.还有就是要注意RIPv1是classful routing,意思是假如你使用B类172.16.0.0/24,子网172.16.10.0,172.16.20.0和172.16.30.0,在配置RIP的时候,你只能把网络号配置成work 172.16.0.0下: RouterB(config)#no ip route 192.168.50.0255.255.255.0 192.168.40.2 RouterB(config)#no ip route 192.168.10.0 255.255.255.0 192.168.20.1RouterB(config)#router rip RouterB(config-router)#work 192.168.20.0 RouterB(config-router)#work 192.168.30.0 RouterB(config-router)#work 192.168.40.0 RouterB(config-router)#^Z RouterB#配置RouterC,由于AD的问题,所以要先去掉之前的默认路由,如下: RouterC(config)#no ip route 0.0.0.0 0.0.0.0 192.168.40.1配置RIP: RouterC(config)#router rip RouterC(config-router)#work 192.168.50.0 RouterC(config-router)#work 192.168.40.0 RouterC(config-router)#^Z RouterC#Verifying the RIP Routing Tables验证配置好的路由信息,如下: RouterA#sh ip route (略) R 192.168.50.0 [120/2] via 192.168.20.2, 00:00:23,Serial0/0 (略) 注意R代表的是RIP,[120/2]分别代表AD和度,在这里,度即为跳数.假如说你在这个信息里看到的是[120/15],那么下1跳为16,不可达,这条路由线路也将随之无效,将被丢弃Holding Down RIP Propagation如果你想阻止RIP更新信息传播到LANs和WANs上,可以使用passive-inte ___ ___命令,这条命令可以防止RIP更新信息广播从你定义了的接口上发送出去,但是这个接口仍然可以接受到更新信息,如下: RouterA(config)#router rip RouterA(config-router)#work 192.168.10.0 RouterA(config-router)#passive-inte ___ ___ s 0/0Interior Gateway Routing Protocol(IGRP)IGRP是Cisco私有的距离向量路由协议,意思是说只有Cisco的routers才可以运行IGRP.IGRP的一些特点有:最大跳数255,默认100跳,这样就比较适合中大型网络.而且,IGRP默认使用带宽和延迟(delay)作为度来寻找最佳路径,这样的度就叫复合度(posite metric).当你配置IGRP的时候,你必须以AS号作为配置参数,所有的routers必须使用相同的AS号来共享路由表信息. IGRP支持6条链路的均衡负载下面是一些你在RIP中找不到的,IGRP专有的特征: 1.IGRP可以在1个大型组网中使用到 2.使用AS号 3.每90秒发送完整的路由更新 4.使用带宽和延迟作为度 IGRP TimersConfiguring IGRP RoutingRouter Network Address Inte ___ ___ Address RouterA192.168.10.0 fa0/0 192.168.10.1 192.168.20.0 s0/0 192.168.20.1 RouterB 192.168.20.0 s0/0 192.168.20.2 192.168.40.0 s0/1 192.168.40.1 192.168.30.0 fa0/1 192.168.30.1 RouterC 192.168.40.0 s0/0 192.168.40.2 192.168.50.0 fa0/0 192.168.50.1配置RouterA,注意AS号的范围为1到65535,如下:RouterA(config)#router igrp ? Autonomous system number RouterA(config)#router igrp 10 RouterA(config-router)#w 192.168.10.0 RouterA(config-router)#w 192.168.20.0 RouterA(config-router)#^Z RouterA#记住IGRP也是classful routing,而且配置网络号是与它直接相连的网络配置RouterB,如下:RouterB(config)#router igrp 10 RouterB(config-router)#w 192.168.20.0 RouterB(config-router)#w 192.168.30.0 RouterB(config-router)#w 192.168.40.0 RouterB(config-router)#^Z RouterB#配置RouterC,如下:RouterC(config)#router igrp 10 RouterC(config-router)#w 192.168.40.0 RouterC(config-router)#w 192.168.50.0 RouterC(config-router)#^Z RouterC# 注意RouterA,RouterB 和RouterC使用相同的AS号Verifying the IGRP Routing Tables我们来验证下: RouterA#sh ip route (略) I192.168.50.0 [100/170420] via 192.168.20.2, Serial0/0 (略) I代表IGRP[100/170420]为AD和复合度,度越低越好Verifying Your Configurations一些验证性的命令: show protocols:显示所有的可路由协议和查看接口及其相关协议,如下: RouterB#sh protocols Gloabal values: Inter Protocol routing is enabled FastEther0 is up, line protocol is up Inter Address is 192.168.30.1/24 Serial0/0 is up, line protocol is up Inter Address is 192.168.20.2/24 Serial0/1 is up, line protocol is up Inter Address is 192.168.40.1/24 RouterB#show ip protocols:显示router上配置好了的路由协议,如下: RouterB#sh ip protocols Routing Protocols is “rip”(略)debug ip rip:发送控制台消息显示有关在router接口上收发RIP数据包的信息,关闭debug,使用undebug all或者no debugall命令,如下: RouterB#debug ip rip RIP protocol debugging is on RouterB# 07:12:56: RIP: re ___ived v1 update from 192.168.40.2 on Serial0/1 07:12:56:192.168.50.0 in 1 hops (略) RouterB#undebug all All possible debugging has been turned off RouterB#debug ip igrp events:提供在网络中运行的IGRP路由选择信息的概要,关闭使用undebug ip igrp events或undebug all命令,如下:RouterB#debug ip igrp events IGRP event debugging is on 07:13:50: IGRP: re ___ived request from 192.168.40.2 onSerial0/1 07:13:50: IGRP: sending update to 192.168.40.2 via Serial1(192.168.40.1) 07:13:51: IGRP: Update contains 3 interior, 0 system, and 0 exterior routes 07:13:51: IGRP: Total route in update: 3 (略) RouterB#un allAll possible debugging has been turned offdebug ip igrp transactions:显示相邻router要求更新的请求消息和由router发到相邻router的广播消息,关闭使用undebugall,如下:RouterB#debug ip igrp transactions 07:14:05: IGRP: re___ived request from 192.168.40.2 on Serial1 07:14:05: IGRP: sending update to 192.168.40.2 viaSerial1(192.168.40.1) 07:14:05: sub 192.168.30.0,metric=1100 07:14:05: sub 192.168.20.0, metric=158250(略) RouterB#un all All possible debugging has been turned off RouterB#。
OPNET网络仿真入门实例
OPNET网络仿真入门实例OPNET简介OPNET最早出自麻省理工学院的两个博士之手,最终得以商业化。
OPNET被广泛应用于精确模拟领域,例如网络设备制造领域的企业商Cisco以及运营商AT&T,都采用OPNET来做各种各样的网络环境模拟和调试。
在OPNET的各类产品中,Modeler几乎包含其他产品的所有功能,针对不同领域,主要的用途如下:(1)对于企业网的模拟,Modeler 调用自带的已经建好的标准模型组建网络,在某些业务应用达不到事先预想结果或服务质量未及规定要求,比如说网上电子交易过程中交易延迟、数据库服务等业务响应时间慢于正常情况时,Modeler捕捉重要的流量进行分析,从业务、网络、服务器三方面来找出瓶颈。
(2)对于比企业网更复杂的运行商(ISP)网络的模拟,Modeler把焦点放在整个业务层、流量的模拟,使得运营商可以有效地查出业务配置中产生的错误,例如网络中的哪些服务器配置不够妥善,让黑客容易攻击,有哪些业务的参数配置不合适等情形。
(3)针对研发的需要,Modeler提供了一个开放的环境,使用户能够建立新的协议和配备,并且能够将细节定义并模拟出来。
为使读者有一个生动、形象、更明确的理解,我们再进行如下说明解释:Modeler 所能应用的各种领域主要包括三个方面即端到端结构、新的协议开发和优化、网络和业务层配合如何达到最好的性能。
举例来说明一下吧,假设我们要将现有的IPv4的网络升级到IPv6的网络,需要确定采用哪种技术方式对转移效果来说比较好,这就属于端到端结构上的应用;新协议的开发,比如说目前流行的3G无线协议的开发,在系统级的仿真中,可以分析一种新的路由或调度算法如果使路由器或交换机达到QoS;在网络和业务之间如何优化方面,可以分析新引进的业务对整个网络的影响、网络对业务的要求,实际应用中网络和业务是对矛盾,通过Modeler模拟来查找网络和业务之间所能达到的最好的指标。
opnet第2章
第2章 OPNET Moduler 体系结构
2.1 建立模型规范 2.2 建模通信机制 2.3 数据收集和仿真 2.4 数据分析
第2章 OPNET Moduler 体系结构
知识点:
模型简介 建模通信机制 数据采集和仿真 数据分析
第2章 OPNET Moduler 体系结构
本章导读:
OPNET Modeler为通信网络和分布式系统的建模及性能 评估提供了一个综合的开发环境和分析平台。OPNET软件 包由许多工具组成,每一个具体工具关注建模任务的一个具 体方面。对应于项目建模和仿真流程的三个阶段(规范说明 阶段、数据收集阶段、仿真分析阶段),这些工具也可划分 为三个主要类别:规范说明工具、数据收集工具和仿真分析 工具。
第2章 OPNET Moduler 体系结构
图2-5 外部系统编辑器
第2章 OPNET Moduler 体系结构
图2-6 需求编辑器
第2章 OPNET Moduler 体系结构
6. 路径编辑器
路径用来定义业务流量和数据路由,用户使用路径编辑 器(如图2-7所示)可创建新的路径对象。任何使用逻辑连接或 虚电路连接的协议,如MPLS、ATM、帧中继等,都可以使 用路径对象来定义路由和业务流流量。 7. 链路模型编辑器 链路模型编辑器(如图2-8所示)用于创建、编辑和查看链 路模型。用户创建的每种新链路都可以具有不同的属性和接 口。同时,用户还可以向新创建的链路模型添加注解和关键 字,以使其更容易识别和使用。
第2章 OPNET Moduler 体系结构
2.1.2 建模域
在OPNET中,网络、节点、进程和外部系统建模环境 横跨了一个模型的所有层次,有时统称为建模域。主要的模 型规范编辑器有其对应的建模域,一个建模域拥有它的建模 焦点,即建模的主要任务。表2-1中列举了OPNET软件中的 四种建模域以及对应的模型规范编辑器。
opnet学习笔记
Opnet学习笔记---lzm 1.Opnet给模块添加注释方法?解决方法:注释分为两种,一种是同一页面的注释.另一种是不同页面的注释。
同一页面的注释:1)Topology->Open Annotation Palette;2)选择你需要添加的注释类型(图形框、线条还是文字)。
不同页面的注释:1)新建一子网络(subnet);2)选择子网络,点击右键,选择“Advanced Edit Attributes”;3)选择Icon Name,选择Readme图标,并设定子网络名称为Readme或“说明文档”;4)进入子网络按同一页面的注释的方式进行添加注释。
2.Opnet14.0 开启ODB模式?解决方法:勾选ODB选项,多个仿真序列一起仿真时不会弹出ODB窗口,需要模式选择development模式,如下图所示:多个仿真序列不能弹出ODB窗口时,删除一些序列留下一个即可弹出ODB窗口。
3.Opnet14.0与VC连调问题?解决方法:需要安装VC6.0 sp6补丁,否则看不到关联进程。
DEVUG模式下运行Opnet,出现ODB界面如下图所示:出现此界面后,打开VC,选择Build→Start Debug→Attach to process,选择Op_runsim_dev 进程,点击next或者continue即可进行调试,如下两图所示。
4.Link_delay错误?解决方法:Link_delay错误的解决方法有两种:1)选择Edit→Preferences,弹出窗口,输入repositories指令,出现图下所示情况,将empty修改为标准模式stdmod,但此模式下修改opnet自带模型不起作用。
任意打开工程中的一个进程模型,选择File→Declared External Files,在弹出窗口中选择声明文件link_delay,如下图所示。
问题得到解决,此模式为empty模式,修改opnet自带模型起作用。
OPNET学习入门指南
OPNET学习⼊门指南OPNET学习⼊门指南1.预备知识这部分给⼤家介绍⼀下在加⼊课题组之后,和正式的投⼊课题开展⼯作之前⼤家需要具备的⼀些基本的背景知识。
这些知识都是在⼤家以后的课题中或多或少,或明或暗的需要使⽤到的,打下⼀个扎实的理论基础对后⾯⼯作的开展有极⼤的好处,这个⼤家往后⼀定能够体会到。
正所谓“磨⼑不误砍柴⼯”,⼤家应该抓住这段宝贵的时间,尽可能针对这些知识有的放⽮的多看,多想,多练习,多讨论,多交流。
以便于能更快速的上⼿⼯作。
1.1OPNET安装OPNET安装过程还是⽐较复杂的,后⾯有专门的安装说明,这⾥主要提醒⼀下,在安装之前⼀定要记得把VC的环境变量进⾏设置,具体的设置⽅式⽹上能搜到,书上也有介绍。
另外我这⾥的安装⽂件有8.1和10.0的,建议使⽤10.0,因为version⾼,使⽤界⾯更傻⽠⼀些,⽽且基本上国内那基本介绍OPNET的书⾥⼤多是根据10.0做介绍的。
要先安装8.1获得了license再安装10.0,它能⾃动找到8.1的license。
1.2OPNET书籍选⽤国内OPNET的书就那⼏本,个⼈感觉都差不多,讲得不够深⼊。
我⼀开始在书店买的⼀本是⼈民邮电出版社出版的,讲得不详细,我只在学习各种编辑器熟悉菜单的时候⽤到了它。
图书馆⼀共有六本OPNET的书,讲解最详细的⼀本是清华⼤学出版的,陈敏编著的,建议采⽤,我这⾥也有这个书的电⼦档。
其它⼏本可以有选择性的看看:李馨,叶明编的《OPNET Modeler⽹络建模与仿真》的OPNET核⼼函数介绍章节写得⽐较好,每个函数的实际应⽤都写出来了,⽽且函数也做了相应归类,不多掌握起来快;孟晨编的《OPNET通信仿真开发⼿册》中的OPNET编程基础部分写得很详实,对⼀些基本的代码做了介绍,并且对状态机的强制性状态和⾮强制性状态的区别以及它们的合理使⽤讲解得很清楚。
当然OPNET学习的最好资料还是OPNET⾃带的英⽂帮助Tutorial,上⾯有各种例⼦,并且有分类好的最全的核⼼函数。
第4章 OPNET Modeler使用基础pdf
4 OPNET Modeler仿真结果处理
4.2 标量统计量的收集
标量输出文件可以收集由许多仿真共同产生的 结果。 标量文件的收集是由用户手动完成的,因为对 于一次仿真,一个标量统计量只有一个值。 所以一般将某个仿真属性设置为多个取值,然 后运行仿真序列(Simulation Sequence), 这时OPNET会根据设定值的个数运行相应次 数的仿真,每次仿真对应一种参数设置并产生 一个结果值。 在进程模型中每次仿真结束时将这些单个结果 值写入标量文件中,多个仿真就有一系列值。 (The End)
第4章 OPNET Modeler使用基础
主要内容
主要内容
OPNET Modeler的通信仿真机制 OPNET Modeler的安装与设置 OPNET Modeler的业务设置 OPNET Modeler的仿真结果处理
2
1 OPNET Modeler的通信仿真机制
1 OPNET Modeler的通信仿真机制
13
5
1 OPNET Modeler的通信仿真机制
1.4 点对点和总线管道阶段
OPNET支持3种链路形式,分别是点对点链路、总线 链路和无线链路,为了描述它们的物理特性上的各个 特点,分别采用一系列管道阶段去模拟。 点对点链路经历4个管道阶段计算:(1)传输延时阶 段计算传播封包所用的处理延时,根据链路处理速度 (data rate)来定;(2)传播延时,可以指定固定 延时,也可以根据链路的长度来定;(3)错误分 配,需要根据ber 属性设定的错误分配概率来决定封 包有多少位出错;(4)错误纠正纠错,根据错误分 配阶段计算的比特错误位数和ecc 纠错极限来决定是 否丢包。
2 OPNET Modeler安装与设置
OMNetpp学习笔记
OMnetpp作为一种仿真工具(与ns2,opnet并列),在P2P仿真方面具有很大的优势。
模块概念模块OMnetpp中功能被封装为一个个的模块。
简单模块(simple modules)为基本模块,每个simple module完成一个基本功能。
Compound module由多个simple module组成。
Messages, Gates, Linksmassage是模块之间通信的媒介,可以包含复杂的结构体。
Gates are the input and output interfaces of modules; messages are sent out through output gates and arrive through input gates.Each connection (also called link) is created within a single level of the module hierarchy: within a compound module, one can connect the corresponding gates of two submodules, or a gate of one submodule and a gate of the compound module。
包传输模拟connections可以使用物理链路模拟。
支持的参数有:data rate, propagation delay, bit error rate and packet error rate, and may be disabled. 这些参数在channel对象中。
参数Modules 可以拥有参数。
Parameters can be assigned in either the NED files or the configuration file .Topology Description MethodThe user defines the structure of the model in NED language descriptions (Network Description).Programming the AlgorithmsSimulation objects (messages, modules, queues etc.) are represented by C++ classes.They have been designed to work together efficiently, creating a powerful simulation programming framework. The following classes are part of the simulation class library:>>module, gate, parameter, channel>>message, packet>>container classes . queue, array)>>data collection classes>>statistic and distribution estimation classes (histograms, P2 algorithm for calculating quantiles etc.)>>transient detection and result accuracy detection classes使用OMNetppbuilding and running simulations一个OMNetpp model 由以下几部分组成:1. NED语言拓扑描述(.ned 文件):使用参数,gates等描述module结构。
OPNET入门学习教程二BasicProess
OPNET⼊门学习教程⼆BasicProess第⼆课 Basic Processes在本课中,你学会做以下事情:创建进程和节点模型定义变量,宏(Macros)和过渡运⾏仿真分析仿真结果这个课程介绍如何建⽴⼀个模块,统计它接收的数据包数,然后把这个数字进⾏制图统计。
对于每⼀个收到的数据包,进程模型递增⼀个变量并记录变量的值。
概念:⼀个进程模型是⼀个有限状态机(finite state machine ,FSM),它代表了⼀个模块的逻辑和⾏为。
⼀个有限状态机定义了模型的状态和改变状态的标准。
OPNET 采⽤增强的C/C++修改FSM,称为Proto-C(原始C)。
使⽤Proto-C的三种场合:1.Enter Executive 进⼊执⾏2.Exit Executive 退出执⾏3.Transition Executive 转移执⾏模型设计:1. 打开OPNET,选择File>New...,然后通过下拉菜单选ProcessModel,单击“OK”。
2. 点击“Creat State”,在⼯作区放置3个状态。
其中第⼀个状态会⾃动设为initial state(带有箭头)。
3. 右击initial state,选择“Set name”,修改名称:init,确定。
4. 其余2个状态分别命名为idle(空闲)和arrival(到达)。
OPNET进程模型⾥,包括⾮强制状态(红⾊)和强制状态(绿⾊)。
⾮强制状态(红⾊)是指状态执⾏完之后,将控制权返回给Simulation Kernel。
强制状态(绿⾊)是指状态执⾏完之后,⽴即执⾏退出操作或者转移到其他状态,并不返回控制权。
由于arrival状态需要统计包数,并销毁数据包,然后回到空闲状态,因此,arrival状态应该是⼀个强制状态。
另外,init 状态必须转移到idle状态,因此它也应该是强制状态。
1.右击init 状态,选择Make State Forced。
OPNET实验手册要点
OPNET网络实验指导书洛阳理工学院计算机与信息工程系实验目录实验一建立一个简单的网络模拟 (1)实验二基本进程 (14)实验三导入和使用SCE服务器数据用Windows Perfmon表示的特点 (27)实验四主机工作量特点 (36)实验五预测主机性能 (47)实验六部署应用 (54)实验七TCP窗口大小在文件传送过程中的影响 (67)实验八用高级逻辑脚本模拟一个应用 (72)实验一建立一个简单的网络模拟实验目的:了解OPNET Modeler的特点,熟悉OPNET工作环境,理解OPNET场景的概念,了解进程编辑器、节点编辑器以及工程编辑器的使用方法,认识统计量的收集与分析过程。
实验内容:1.快速建立一个公司场景下的星型网络;2.收集网络延迟、负载统计量;3.在原有网络基础上增加另一星型网络;4.对原有网络与扩建网络分别进行模拟仿真,比较并分析两者的性能。
实验步骤:一. 建立新的网络工程1.启动OPNET Modeler,出现界面(图1.1)图1.1 OPNET启动2. 点击菜单栏FILE——>NEW…3.在下拉菜单中选择Project,并点击OK图1.2 新建工程4.给定项目名称Project Name和场景名称,在本次实验中,我们将Project Name取名为My_Sm_Int,将Senario name 取名为first_floor。
图1.3 工程和场景命名5.单击图1.3的OK按钮,进入开始向导,依次设置各个网络属性值如表1.1所示,最后在“Review”对话框中检查每项设置是否正确,之后点击“Finish”完成,出现“Object Palette”对话框,如图1.4所示。
表1.1 网络属性值设置图1.4 对象模板注意:一个指定大小的工作空间被创建,你指定的对象面板在一个独立的窗体中被打开。
二. 建立网络用来自对象面板的节点和链路在项目编辑器中创建网络模型。
用快捷配置拓扑:1. 选择Topology>Rapid Configuration…,从下拉菜单里面选择Star,然后点击“OK”。
OPNET学习小结
学生 2006.4.10
主要内容
一、网络仿真技术概述 二、OPNET 仿真平台简介 三、OPNET Modeler的使用 四、举例
一、网络仿真技术概述
网络仿真技术是一种通过建立网络设备和 网络链路的统计模型, 并模拟网络流量的 传输, 从而获取网络设计或优化所需要的 网络性能数据的仿真技术。
子网
OPNET的子网和TCP/IP的子网不 是同一概念 OPNET的子网只是将网络中的一 些元素抽象到一个对象中去。子 网可以是固定子网、移动子网或 卫星子网。 子网不具备任何行为,只是为了 表示大型网络而提出的一个逻辑 实体。 子网可将一个大型网络拆分成彼 此独立的几个部分,拆分原则是: 依照相似性(例:将相似的节点 作为一个子网)或依照联通性 (例:根据地域的区别对子网进 行划分)。
进程模型编辑器 非强制状态 用于创建进程模 型,它用于节点 模型编辑器中模 块的功能实现。 进程模型使用有 限状态机(FSM) 表示,图标表示 状态,用线表示 状态之间的转移。 注:你所创建的第 一个状态自动成 为初始状态,由 一个粗箭头指示。
初始状态
状态转移
强制状态
进程模型编辑器
红色是非强制状态,它在执行完入口代码后将控制权返还给仿真核 心。一个新创建的状态默认是非强制的。在执行完入口代码后,进 程模型被锁住(即,停止执行将控制权返还给仿真核心)。在下次 进程模型被激活时,执行从上一次被锁的地方开始。 绿色是强制状态,它在执行完入口代码后不将控制权返还给仿真核 心,而是立即执行出口代码,并转换到另一个状态。
节点编辑器
节点编辑器用于定义节点模型,它们用于描述 在一个网络对象内部的数据流动。使用不同的 模块来定义,每一个模块完成一部分节点的行 为,像:数据产生、数据存储等等。 模块通过包流或状态线相连。其中包流连接两 个模块,并且在源和目的之间传送数据包,它 代表了在实际通信节点中的硬件接口;状态线 可实现对模块特定参数变化的监视。
OPNET入门学习教程一MM1队列
M\M\1 队列1.关闭任何现有的项目。
2.创建一个新的项目和一个新的场景。
命名新项目:<initials>_mm1net,场景:mm1。
点击确定。
3.在启动向导中,单击退出。
你会在节点模型建立后,再设置场景。
4.选择“文件”>“新建... ”,然后从下拉列表中选“节点模型”。
点击确定。
节点编辑器打开一个新窗口。
1. 点选“创建处理器”工具按钮。
2. 在工作区中点选你想要放置模块的位置,单击后,一个处理器节点出现在节点编辑器工作区。
右击,结束操作。
就像在项目编辑器中需要设置网络对象的属性一样,在节点编辑器模块,要指定处理器的生成率,生成分配,平均包大小和数据包大小分布。
你必须在处理器模块设置这些属性的。
1. 右击处理器模块,然后选择“编辑属性”。
2. 在“数值栏”左键单击,修改属性的名称为“src”(作为源),然后按回车键。
3. 修改属性中“process model”项为“simple_source”。
您可能需要滚动滚轮才能看到这个模型。
之后,Generator的属性出现在属性列表。
4. 在数据包间隔时间(Packet Interarrival Time)数值列单击,打开“数据包间隔时间”说明对话框。
5. 从下拉菜单中选择“指数分布(exponential)”。
这样产生数据包的间隔时间服从指数分布,是一个泊松过程。
6. 确保平均输出设置为1.0,然后单击确定。
这将设置一个数据包的平均间隔时间为1秒。
7. 改变包的大小“Packet Size”属性,确保分布的名字是“指数exponential”和“平均输出Mean outcome”是9000。
8.点击确定关闭说明对话框。
这样设置了生成的数据包服从指数分布,且每包的平均大小为9000bit。
9.点击确定,关闭属性对话框。
下一步是创建一个队列模块,模拟无限缓冲区和的M/M/1队列服务器,内容如下:1. 单击创建队列模块按钮。
2. 在generator module模块右边放置queue module,右击完成放置。
OPNET网络仿真--包交换资料
一、实验目的1.学习熟悉使用OPNET仿真软件,实现对网络场景的仿真。
学习并掌握包交换有线网络的基本知识。
2.数据包建模。
学习并掌握数据包建模的基本方法和技能。
3.有线链路建模。
学习并掌握有线链路建模的基本方法和技能。
4.中心交换节点建模学习并掌握中心交换节点建模的基本方法和技能。
包括hub进程建模和包流的连接。
5.周边节点建模学习并掌握周边节点建模的基本方法和技能,包括: src进程建模; sink进程建模; proc进程建模;包流的连接。
6.网络建模。
学习并掌握包交换有线网络建模的基本方法技能。
7.配置参数、运行和调试仿真学习并掌握收集统计量、配置参数、运行和调试仿真的基本方法和技能。
8.仿真结果分析。
学习并掌握仿真结果分析的基本方法和技能。
二、实验过程专题1:实现包交换1、定义包格式(1)从File 菜单列表中选择Packet Format,单击OK 按钮。
这时打开包格式编辑器。
(2)单击Create New Field 工具按钮,然后将光标移到编辑窗口中,单击鼠标左键,接着单击右键。
这时一个新的包域出现在编辑窗口中。
设置包域的属性,定义好的包域名称和大小。
图1.包格式定义(3)从File 菜单中选择Save,命名包格式。
2、定义链路模型(1)从File 菜单列表中选择Link Model,打开链路模型编辑器。
(2)找到链路类型支持属性框,设置支持的包格式,除了ptdup 外的链路类型对应的Supported属性设置为no,表明该链路只支持点对点双工连接。
(3)在packet formats 属性右边对应的Initial Value 栏中单击鼠标左键。
“Supports All Packet Formats”和“Supports Unformatted Packets”复选框取消,同时将新增加包设置为Support。
图2.链路模型定义3、创建中心节点定义节点模型,中心交换节点:四对发信机和收信机(每对收发信机对应一个周边节点),一个中心交换处理进程(按地址转交包)。
opnet学习
local output statistics用来报告用户定义的各个QP专有的统计量。
1.1进程环境(Process Environment)
1.1.1中断驱动执行(Interrupt-Driven Execution)
process由interrupt驱动。所以process的第一个操作就是判断interrupt的类型,进而解析interrupt的属性。进程在阻止(Blocked)和活动(Active)两个状态间循环,通过interrupt由blocked进入active,完成操作后回到blocked。
b)父子共享内存:
只有以父子关系联系在一起的process才能访问的私有共享内存。这种共享内存只能在child process由op_pro_create()产生时由op_prg_mem_alloc()分配,且不能被替换。通过op_pro_parmem_access()访问。通过op_pro_invoke()通知对方对共享内存的内容进行的修改和,以及对内容的检查。
当packet从input stream到达时,接收QP的一个process由于stream interrupt而被调用。这个process通过op_intrpt_strm()来获悉这个packet是从哪个stream里来的。Input stream通常用非负的整数作为标号(index)。process通过op_pk_get()和stream index来获得packets。通过op_strm_pksize()获悉仍然留在input stream中的packet的数量。
OPNET学习笔记
OPNET 14.5打开ODB调试窗口首先点击运行仿真的小人图表。
•在打开的窗口中如图示,先设置simulation kernel 为development.3. 在左边树状结构中找到Execution->debugger.4. 然后点击Run就可以了看到如下:5. 接下来就可以进行调试。
OPNET 14.5 与VC联调搞了好些天,头大!书上的内容全是10.0以前版本的设置方法,14.5版本变化太大,已经完全不适用了。
现在终于弄明白opnet 14.5如何和VC联调。
其实opnet14.5与VC联调不再需要另外特别的设置,不用再到edit—preference中去找这个找那个。
只需要设置好opnet和VC的环境变量就好。
一般的方法是ODB初始化以后,打开VC,在Debug 菜单下单击attach to process,然后选择op_runsim_dev.exe(或者op_runsim_opt.exe),这样就可以利用VC 提供的调试功能进行OPNET 程序调试。
一般情况下attach to process 选项框为空,这可能不是VC和OPNET程序本身的问题,因为有些应用软件的进程和op_runsim_dev.exe(或者op_runsim_opt.exe)进程冲突,如一些杀毒软件,acrobat 等,或者是其他进程开得过多所致。
这时打开任务管理器,找到op_runsim_dev.exe,右键选择调试。
这时会弹出VC。
弹出来的VC工程没有原代码,需要自己手打打开过程原代码,然后在代码中设置断点。
回到ODB中点击continue即可在断点出停止。
其实……就是这么简单……今天放弃了opnet 14.5 安装了10.0,可是安装后发现licence需要用opnet8.1的破解,又安装了8.1并破解,然后果断卸载,后来因为感觉缺少了不少功能,又使用11.5的破解程序,可是licence只有60个了,再次安装8.1,问题出现了,程序无法运行,纠结了一上午,发现,原来第一次卸载不彻底,第二次安装路径和第一次又不同,于是……解决方法:1,启动Modeler,观察dos窗口(用alt+prtscr,如果滚屏太快的话),记下错误的路径名。
OPNET的节点域
OPNET学习心得(3): OPNET的节点域节点域(Node Domain) (不全,有待进一步补充)(参考Main Menu->Modeling Concept->Node Domain)1.模块定义(Module Definitions)modules表示通信节点中产生、消耗、处理数据的部分。
有以下几种类型:processors, queues, generators, receivers, transmitters。
1.1处理器模块(Processor Modules)1.2队列模块(Queue Modules)Queue和Processor之间最主要的区别是:Queue还有一个附加资源,称之为子队列(subqueue)。
subqueue大大地方便了缓存和管理数据包的收集。
之后详述。
subqueue作为queue的一个object,以queue的attribute中compound attribute的形式体现。
1.3发送模块(Transmitter Modules)有三种发送模块:point-to-point, bus, radio。
transmitter从一个或者多个输入流中收集packet,然后把它们转发到相应通信链路上的channel中去。
在某个给定的输入流收到的数据被发送到同一个标号的channel上去。
每个channel都有自己的数据率。
如果packet 到的时候,相应的channel正在处理之前的packet,那么该packet将被自动放到一个buffer中排队等待,这个buffer是无尽的。
Channels是transmitter的下属object。
同样,也是作为一个compound attribute。
transmitter也有一些统计功能,可以通过statistics wire和statistics probe 获取。
1.4接收模块(Receiver Modules)也有三种接收模块,跟发送模块对应。
OPNET入门学习教程
OPNET入门学习教程•创建进程和节点模型•定义变量,宏(Macros)和过渡•运行仿真•分析仿真结果概念:一个进程模型是一个有限状态机(finite state machine ,FSM),它代表了一个模块的逻辑和行为。
一个有限状态机定义了模型的状态和改变状态的标准。
OPNET 采用增强的C/C++修改FSM,称为Proto-C(原始C)。
使用Proto-C的三种场合:1.Enter Executive 进入执行2.Exit Executive 退出执行3.Transition Executive 转移执行模型设计:1. 打开OPNET,选择File>New...,然后通过下拉菜单选Process Model,单击“OK”。
2. 点击“Creat State”,在工作区放置3个状态。
其中第一个状态会自动设为initial state(带有箭头)。
3. 右击initial state,选择“Set name”,修改名称:init,确定。
4. 其余2个状态分别命名为idle(空闲)和arrival(到达)。
OPNET进程模型里,包括非强制状态(红色)和强制状态(绿色)。
非强制状态(红色)是指状态执行完之后,将控制权返回给Simulation Kernel。
强制状态(绿色)是指状态执行完之后,立即执行退出操作或者转移到其他状态,并不返回控制权。
由于arrival状态需要统计包数,并销毁数据包,然后回到空闲状态,因此,arrival状态应该是一个强制状态。
另外,init 状态必须转移到idle状态,因此它也应该是强制状态。
1.右击init 状态,选择Make State Forced。
2.右击arrival 状态,选择Make State Forced。
创建状态转移:状态转移分为无条件转移和条件转移(unconditional and conditional)。
1.单击“Create Transition”。
Opnet 使用入门
三、OPNET Modeler安装
四、OPNET Modeler 原理 五、实例讲解——配置一个简单的网络 六、模块间通信机制——基于包的通信 七、实例讲解——创建一个包交换网络 八、实例讲解——创建一个移动无线网络
三、OPNET Modeler安装
节点模型
分类包括处理机processors 、队列queues 、收发机transceivers 。 处理机根据数据包处理方式不同可以实现完全定制编程; 队列缓冲和管理数据包; 收发机是节点的接口; 节点之间信息交换是通过包流和统计线实现的。
进程模型
包括: 状态转移框图State transition diagrams; 状态转移线; 由Proto-C构造的函数Blocks of C code; 状态变量State variables; 临时变量Temporary variables;
六、模块间通信机制——基于包的通信 七、实例讲解——创建一个包交换网络 八、实例讲解——创建一个移动无线网络
五、实例讲解—配置一个简单的网络
重要概念 1.项目(Project)与场景(Scenario)
一个项目就是一组仿真环境,一个场景就是其中的一个仿真环境。场景是网络 的一个实例,一种配置,具体来说就是拓扑结构、协议、应用、流量以及仿真 设置。在Modeler仿真时,最高层次永远是一个项目,每个项目底下至少包含 一个仿真场景,代表网络模型,它是具体的网络仿真环境配置。项目的提出初 衷是方便对不同的场景的仿真结果进行比较。项目提供场景复制功能,可以对 场景进行备份,通过改变新场景的参数运行仿真来测试系统各方面的功能及是 否存在瓶颈。
2.按照Opnet8.1软件包下的read me文档顺序安装。 3.破解之后生成3500 Licenses。
OPNET常见问题总结
OPNET常见问题总结1.如何设置全局变量?在.h文件里定义变量,然后在process的HEAD BLOCK里include 这个头文件,就可以使用全局变量了。
2.OPNET中如何更方便的看程序?1.opnet中的设置:preferences->editor_prog2.source insight的设置operation->preferences->symbol Lookups->Project symbol path->Add Project to Path(添加自己创建一个包含所有opnet model 和include目录的project)当然,这个有些不足,就是那个sv,tv,hb等中定义的内容,不能进行关联。
3.OPNET中的函数FIN,FRET以及FOUT都是什么功能?为了使一个用户定义的函数被执行,该函数必须与一个特殊的堆栈跟踪代码相连。
堆栈跟踪技术靠在函数的入口点和出口点插入预处理器宏指令完成(一个函数只有一个入口点,但可以有多个出口点(由C语言的return 声明决定))。
这些宏指令为:FIN、FOUT和FRET。
FIN被插入到函数的入口点,FOUT被插入到函数的出口点,但却不返回任何值,FRET被插入到函数的出口点,返回一个值。
注意这些宏指令不需要以分号结束(它们自我包含),FIN的参数中也不需要双引号。
Opnet提供的所有的示例模型都包含了这些宏指令,并且建议用户定义的函数也包含这些宏指令。
如果FIN、FOUT、和FRET被正确插入了用户代码中,我们就可以使用op_vuerr来找出程序错误的位置,哪怕是在一个嵌套的模型函数调用中。
4.local statistics和global statistics的区别?local statistics表示的是本地的统计量,而global statistics是全局的统计量,比如你做了一个节点模型,此节点发送数据包,然后编程把发送的数据包数分别写入一个local statistics和global statistics中,假如你在工程中用到了两个这样的节点,那么你可以分别view result每一个节点发送的数据包数,而global statistics则是这两个节点一共发送的数据包数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OPNET学习笔记simple_source模块的功能是按照配置产生包,包括不同的包格式和产生速率,也是比较简单的进程模型。
参考了《opnet process model:simple_source分析》/ebinghaus/blog/item/c7cade9228876c83a877a405.html 该模块有4个local statistic,注意有5个model attribute,分别是Packet Interarrival Time,Packet Size,Packet Format,Start Time,Stop Time,这些是在使用该模块时需要配置的,当然也可以使用默认配置。
状态机也很简单:在header block中定义了/* Include files. */#include <oms_dist_support.h>//注意该模块使用了外部文件《oms_dist_support》和《oms_string_support》/* Special attribute values. */#define SSC_INFINITE_TIME -1.0//定义无穷大时间为-1/* Interrupt code values. *///注意这里的中断代码是自定义的,为了在产生自中断是使用#define SSC_START 0#define SSC_GENERATE 1#define SSC_STOP 2/* Node configuration constants. */#define SSC_STRM_TO_LOW 0//发送的stream index,默认的,该模块只有一个stream连接,所以不需要动态获取stream index/* Macro definitions for state transitions.*///转换条件为中断代码是自定义的常量:#define START (intrpt_code == SSC_START)#define DISABLED (intrpt_code == SSC_STOP)#define STOP (intrpt_code == SSC_STOP)#define PACKET_GENERATE (intrpt_code == SSC_GENERATE)/* Function prototypes. */static void ss_packet_generate (void);//产生包的函数,在function block中定义一,INIT的入口代码:/* At this initial state, we read the values of source attributes *//* and schedule a selt interrupt that will indicate our start time *//* for packet generation. *//* Obtain the object id of the surrounding module. */own_id = op_id_self ();//首先得到surrounding objid,应该是自己的objid,后面根据objid获取对象的属性/* Read the values of the packet generation parameters, i.e. the *//* attribute values of the surrounding module. *///用op_ima_obj_attr_get()得到对象的属性的值,是产生包的参数。
注意interarrival_str和size_str是临时变量,还是char数组类型。
op_ima_obj_attr_get (own_id, "Packet Interarrival Time", interarrival_str);op_ima_obj_attr_get (own_id, "Packet Size", size_str);op_ima_obj_attr_get (own_id, "Packet Format", format_str);op_ima_obj_attr_get (own_id, "Start Time", &start_time);op_ima_obj_attr_get (own_id, "Stop Time", &stop_time);/* Load the PDFs that will be used in computing the packet *//* interarrival times and packet sizes. *///装入PDF,用于前两个参数,得到包产生和包大小的分布,函数是oms_dist_load_from_string(),这样很方便的使用string类型的参数。
//获得的是分布函数的句柄,注意两个句柄都是state variable,类型为Omst_dist_handle。
interarrival_dist_ptr = oms_dist_load_from_string (interarrival_str);pksize_dist_ptr = oms_dist_load_from_string (size_str);/* Verify the existence of the packet format to be used for generated packets. */if (strcmp (format_str, "NONE") == 0)//检查是否是无格式包{/* We will generate unformatted packets. Set the flag. */generate_unformatted = OPC_TRUE;}else{/* We will generate formatted packets. Turn off the flag. */generate_unformatted = OPC_FALSE;//不是无格式包/* Get the list of all available packet formats. *///用prg_tfile_name_list_get()得到所有可用的包格式pk_format_names_lptr = prg_tfile_name_list_get (PrgC_Tfile_Type_Packet_Format); /* Search the list for the requested packet format. */format_found = OPC_FALSE;for (i = prg_list_size (pk_format_names_lptr); ((format_found == OPC_FALSE) && (i > 0)); i--){/* Access the next format name and compare with requested format name */ found_format_str = (char *) prg_list_access (pk_format_names_lptr, i - 1);if (strcmp (found_format_str, format_str) == 0)format_found = OPC_TRUE;//找到了需求的包格式}if (format_found == OPC_FALSE){/* The requested format does not exist. Generate unformatted packets. */generate_unformatted = OPC_TRUE;/* Display an appropriate warning. */op_prg_odb_print_major ("Warning from simple packet generator model (simple_source):","The specified packet format", format_str,"is not found. Generating unformatted packets instead.", OPC_NIL);}/* Destroy the lits and its elements since we don't need it *//* anymore. */prg_list_free (pk_format_names_lptr);prg_mem_free (pk_format_names_lptr);}/* Make sure we have valid start and stop times, i.e. stop time is not earlier than start time. */if ((stop_time <= start_time) && (stop_time != SSC_INFINITE_TIME))//开始/结束时间不合法,设置开始仿真时间为无穷大{/* Stop time is earlier than start time. Disable the source. */start_time = SSC_INFINITE_TIME;/* Display an appropriate warning. */op_prg_odb_print_major ("Warning from simple packet generator model (simple_source):","Although the generator is not disabled (start time is set to a finite value),","a stop time that is not later than the start time is specified.","Disabling the generator.", OPC_NIL);}/* Schedule a self interrupt that will indicate our start time for *//* packet generation activities. If the source is disabled, *//* schedule it at current time with the appropriate code value. *///产生自中断,以指示开始产生包的时间,如果停止产生包时刻小于开始产生包的时刻(这时开始产生包的时间是无限大)在当前仿真时刻产生中断号为SSC_STOP中断if (start_time == SSC_INFINITE_TIME){op_intrpt_schedule_self (op_sim_time (), SSC_STOP);//马上给出自中断}else{op_intrpt_schedule_self (start_time, SSC_START);//自中断,在开始时间,中断号为SSC_START/* In this case, also schedule the interrupt when we will stop *//* generating packets, unless we are configured to run until *//* the end of the simulation. */if (stop_time != SSC_INFINITE_TIME){op_intrpt_schedule_self (stop_time, SSC_STOP);//当结束时间不是无限大时,在结束时间产生自中断,中断号为SSC_STOP}next_intarr_time = oms_dist_outcome (interarrival_dist_ptr);//通过分布函数句柄计算产生下一个包的时间间隔,这里是state variable/* Make sure that interarrival time is not negative. In that case it will be set to 0.*/ if (next_intarr_time <0){next_intarr_time = 0.0;//保证间隔时间不小于0}}/* Register the statistics that will be maintained by this model. *///注册局部统计量,返回局部统计量的句柄bits_sent_hndl = op_stat_reg ("Generator.Traffic Sent (bits/sec)", OPC_STAT_INDEX_NONE, OPC_STAT_LOCAL);packets_sent_hndl = op_stat_reg ("Generator.Traffic Sent (packets/sec)", OPC_STAT_INDEX_NONE, OPC_STAT_LOCAL);packet_size_hndl = op_stat_reg ("Generator.Packet Size (bits)", OPC_STAT_INDEX_NONE, OPC_STAT_LOCAL);interarrivals_hndl = op_stat_reg ("Generator.Packet Interarrival Time (secs)", OPC_STAT_INDEX_NONE, OPC_STAT_LOCAL);二,由于初始状态是非强制状态,进程执行完入口代码后,停留在该状态等待中断触发转移状态,仿真时刻到10s(属性start_time设置的值)时将产生中断号为SSC_START中断,中断产生后将首先执行当前状态的出口代码,初始状态的出口代码如下:intrpt_code = op_intrpt_code ();//得到当前的中断代码这时条件START满足,进程将从初始状态转换到generate状态,转移时首先执行转移函数ss_packet_generate (void),在function block中定义的转移函数如下:static void ss_packet_generate (void){Packet* pkptr;double pksize;/** This function creates a packet based on the packet generation **//** specifications of the source model and sends it to the lower layer. **/FIN (ss_packet_generate ());/* Generate a packet size outcome. */pksize = (double) ceil (oms_dist_outcome (pksize_dist_ptr));//通过分布函数句柄得到包大小,再通过ceil()函数向上舍入,得到包大小/* Create a packet of specified format and size. */if (generate_unformatted == OPC_TRUE){/* We produce unformatted packets. Create one. */pkptr = op_pk_create (pksize);//使用op_pk_creat()函数产生无格式包}else{/* Create a packet with the specified format. */pkptr = op_pk_create_fmt (format_str);//使用op_pk_creat_fmt()函数产生有格式包op_pk_total_size_set (pkptr, pksize);//置有格式包的总大小}/* Update the packet generation statistics. *///通过局部统计量句柄更新统计量,注意xxx/sec的量都是在更新后马上清零op_stat_write (packets_sent_hndl, 1.0);op_stat_write (packets_sent_hndl, 0.0);op_stat_write (bits_sent_hndl, (double) pksize);op_stat_write (bits_sent_hndl, 0.0);op_stat_write (packet_size_hndl, (double) pksize);op_stat_write (interarrivals_hndl, next_intarr_time);/* Send the packet via the stream to the lower layer. */op_pk_send (pkptr, SSC_STRM_TO_LOW);//发送包到定义好的stream index,默认为0FOUT;三,执行完转移函数后将跳到generate状态,并首先执行入口代码,如下:/* At the enter execs of the "generate" state we schedule the *//* arrival of the next packet. */next_intarr_time = oms_dist_outcome (interarrival_dist_ptr);//通过分布函数句柄得到下一个包的产生时间间隔/* Make sure that interarrival time is not negative. In that case it will be set to 0.*/if (next_intarr_time <0){next_intarr_time = 0;}//在当前时间+间隔时间后,产生自中断,中断号为SSC_GENERATE,注意返回值为Evhandle类型next_pk_evh = op_intrpt_schedule_self (op_sim_time () + next_intarr_time, SSC_GENERATE);四,执行完入口代码后,进程将停留在generate状态等待中断,当下一个中断发生,进行状态转换,首先执行generate状态的出口代码:intrpt_code = op_intrpt_code ();//得到中断号然后判断转移条件。