OPNET学习入门指南2_第1页
OPNET学习入门指南2_第2页
OPNET学习入门指南2_第3页
OPNET学习入门指南2_第4页
OPNET学习入门指南2_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第页OPNET学习入门指南1.预备知识这局部给大家介绍一下在参加课题组之后,和正式的投入课题开展工作之前大家需要具备的一些根本的背景知识。这些知识都是在大家以后的课题中或多或少,或明或暗的需要使用到的,打下一个扎实的理论根底对后面工作的开展有极大的好处,这个大家往后一定能够体会到。正所谓“磨刀不误砍柴工〞,大家应该抓住这段珍贵的时间,尽可能针对这些知识有的放矢的多看,多想,多练习,多讨论,多交流。以便于能更快速的上手工作。1.1OPNET安装OPNET安装过程还是比拟复杂的,后面有专门的安装说明,这里主要提醒一下,的,建议使用,因为version高,使用界面更傻瓜一些,而且根本上国内那根本介绍OPNET的书里大多是根据,它能自动找到8.1的license。1.2OPNET书籍选用 国内OPNET的书就那几本,个人感觉都差不多,讲得不够深入。我一开场在书店买的一本是人民邮电出版社出版的,讲得不详细,我只在学习各种编辑器熟悉菜单的时候用到了它。图书馆一共有六本OPNET的书,讲解最详细的一本是清华大学出版的,陈敏编著的,建议采用,我这里也有这个书的电子档。其它几本可以有选择性的看看:李馨,叶明编的?OPNETModeler网络建模与仿真?的OPNET核心函数介绍章节写得比拟好,每个函数的实际应用都写出来了,而且函数也做了相应归类,不多掌握起来快;孟晨编的?OPNET通信仿真开发手册?中的OPNET编程根底局部写得很详实,对一些根本的代码做了介绍,并且对状态机的强制性状态和非强制性状态的区别以及它们的合理使用讲解得很清楚。当然OPNET学习的最好资料还是OPNET自带的英文帮助Tutorial,上面有各种例子,并且有分类好的最全的核心函数。1.3OPNET建模机制和仿真流程学习OPNET之前,熟悉一下OPNET的建模机制和仿真流程是很有好处的,这样更有针对性,不会出现,打完了书上的例子,结果都出来了但是还不清楚自己在干什么的情况。OPNET采用分层建模的机制,从网络物件层次关系看,提供了三个层次的模型,从低到高依次是进程模型——以状态机来描述协议;节点模型——由相应的协议模型构成,反映设备特性;最上层为网络模型,表现网络的拓扑构造。三层模型和实际的协议,设备网络完全对应,最大限度的贴近了实际的网络系统。下面会对OPNET的这三个域——网络域〔networkdomain〕、节点域〔nodedomain〕和进程域〔processdomain〕进展进一步的介绍。OPNET这三个域分别都对应着相应的编辑器。网络域有工程编辑器和链路编辑器用来对整个网络的框架进展设计—工程编辑器设计网络大小,节点摆放;链路编辑器设计网络拓扑构造,链路的各种参数进展设计。节点域有节点编辑器,用于对各个节点内部进展具体的设计,涉及到各个模块的摆放,各个模块属性的设置;进程域有进程编辑器用来对每个模块里所调用的进程进展编程设计,它是最底层的也是设计中的难点所在,进程的编写实现了每个模块的根本功能。另外还有包格式编辑器用来对系统中所用到的数据包进展设计,探针编辑器用来收集感兴趣的统计量,ICI编辑器那么用来创立,查看,编辑接口控制信息。一般opnet系统级仿真的根本流程如下:定义包格式——>定义链路模型——>定义节点模型——>构建网络模型——>收集统计量——>运行仿真,进展程序调试——>观察仿真结果——>进展结果分析当然在这个流程开场之前就要对整个系统有一个全面的设想,这个顺序只是方便软件的使用,防止重复性的工作。1.4OPNET中的一些根本概念.对象〔Object〕Object是Model的一局部,其可以在model中扮演下面的功能:a)定义行为b)创立信息c)储存和管理信息d)处理、修改、转发信息e)对事件作出响应f)包含其他的object1.4.2.object的Attribute和一些允许访问Attribute或者使Attribute生效的程序组成了object的接口。这些程序可以是OPNET自动生成的,也可以是用户编写的。包含有子object的object称之为复合对象〔compoundobject〕。1.4.3.Attribute除了可以描述object外,还可以用在model上用来表示model的参数。model的attributes机制可以提高model的可重用性。具体地说,model的attribute被定义为model的一局部,但同时,他们也出现在object里,他们是在object的model被规定后被object获得的。这是object的本能操作。类似这种modelattribute机制,objectattribute也可以被向上传给model,这种机制就是所谓的attributepromotion。Promotion导致objectattribute不再有值,而是作为model的attribute出现在上层属性中。对于一路promote到所有model之上的attribute,我们可以把它看作是simulation的attribute。从而把研究的系统看成是这些attributes的函数。.衍生模型〔DerivedModels〕有的时候,我们想只改变一个model的一些attributes就可以得到一个新的model。这种机制称为模型的衍生〔modelderivation〕。衍生出的model称为derivedmodel,被衍生的model称为parentmodel,没有parentmodel的model称为basemodel。2.OPNET各域入门介绍网络域networkdomain定义了通信网的拓扑构造。通信的实体是节点nodes。OPNET提供单向和全双工的点到点链路,也提供总线链路用以允许对任意大小的节点组进展播送通信。2.2.节点域 节点域nodedomain用来对通信设备进展建模,诸如路由器、网桥、工作站、终端等等。节点模块Nodemodel是通过节点编辑器NodeEditor生成,通过一些更小的模块〔module〕来表现。一些模块具有一定的功能,这些功能已经定义好了,只用通过配置一组内部参数〔built-inparameters〕就可以了。它们包括各种各样用来在networkdomain连接通信连路的发送器和接收器。还有一些模块:处理器〔processors〕和队列〔queues〕,也是高度可编程的,它们的动作通过进程〔Processmodel〕来描述。2.3.进程域 进程域是最底层的域也是最难上手的域,如果全部使用OPNET自带的进程模块,那么我们永远只能是个OPNET使用者,但如果你想要搭建系统实现自己的一些想法,那么我们必须得学会进程的编写,开发自己的进程模块,上述到软件开发的层次。进程模型nodemodel中的各个module通过三种链接互连,分别是:packetstreams,statisticwires,logicalassociations。Packetstreams传送格式化的消息,我们称为packet。统计线Statisticwire传送简单的数字信号和控制信息,一般用于一个module用来监测其他module的性能和状态。Statisticwire和Packetstream都有参数用来配置它们的行为。Logicalassociations用来确认module之间的绑定。目前,它们只被用在发送器和接收器之间,用来说明它们在接入到Networkdomain上的链路时,应当被当作一对module来使用。一个进程〔process〕可以被认为近似于一个执行程序。OPNET中的Process是基于Processmodel,他们是在ProcessEditor中定义的。进程组〔processgroup〕由许多process组成,这些process都是在同一个processor或者queue中执行。当仿真开场的时候,每个module只能有一个process,称之为rootprocess。这个process之后能够创立新的process,他们之后也能再创立其他的process。在仿真中被创立的process称之为动态进程〔dynamicprocess〕。任何时刻只能有一个process处于执行状态。当一个Process开场执行后,我们说这个process被调用〔invoked〕了。当一个process调用另一个process时,调用〔invoking〕process被暂时挂起直到被调用〔invoked〕process被阻止〔block〕。一个process如果完成了它当前调用的处理就将被阻止。当invokedprocess被阻止时,invokingprocess就将从它挂起的地方继续执行。OPNET中的Process能够对中断〔interrupt〕或者调用〔invocation〕产生响应。Interrupt可能产生自processgroup之外的源,或者processgroup中的其他成员,或者这个process自己。Interrupt一般对应于一些事件,包括消息到达、计时器到时、资源释放或者其他模块的状态改变等等。OPNET的processeditor使用Proto-C的语言来描述processmodel。Proto-C基于状态转移图〔StateTransitionDiagramsSTD〕、一个高级指令库〔kernelProcedures〕和C或C++的通用部件。STD定义了模型的各个process所处的状态,以及使进程在状态之间转移的条件。这种条件称之为transition。KernelProcedures主要一系列的函数包组成,这些包详见参考文档。STD在ProcessEditor中生成。STD除了一些传统的STD具有的能力外,还有一系列扩展:a)状态变量〔StateVariables〕。process可以拥有一些私有statevariables,这些statevariables可以是任意的数据类型,包括OPNET专有的、通用的C/C++、用户定义类型等等。这种能力使得process能够灵活的控制counter、routingtables、与性能相关的statistics、需要转发的message。任意组合的statevariable可以在一个process所有的动作和决定中使用。b)状态执行〔StateExecutives〕。通过C/C++语言描述了process进入和离开状态时的操作,典型的操作包括:修改状态信息,创立或接收消息,更新发送消息的内容,更新统计数据,设置计时器以及对计时器作出响应。c)转移条件〔TransitionConditions〕。通过C/C++语言描述布尔变量,要涉及interrupt的属性以及statevariables的组合。d)转移执行〔TransitionExecutives〕。转移时可能会定义一些通用的操作。3.OPNET进程编程心得3.1.OPNET自带模块介绍OPNET一共有以下几种模块:进程模块〔processor〕,队列模块〔queue〕,各种类型的发射机和接收机。其中支持processmodel的能够自觉编写进程进展建模的模块只有进程模块和队列模块,发射机和接收机等出于方便和功能的原因,已经被预定义了,只需编辑其属性即可。Queue还可以让用户定义内部的子队列(subqueues),以及如何管理这些subqueue的方法。但是它们的根本建模技术还是一样的。

3.2.OPNET进程驱动原理所有进程process由interrupt驱动。所以process的第一个操作就是判断interrupt的类型,进而解析interrupt的属性。各种中断详见书本。进程在阻止(Blocked)和活动(Active)两个状态间循环,如果interrupt来了那么由blocked进入active,完成操作后回到blocked。3.3.OPNET中各种变量的区分OPNET中有三种变量全局变量,状态变量和临时变量。全局变量生存期最长,作用范围最大,它在仿真的任何时刻,在仿真系统的任何进程都是可见的,因而它经常被用来定义各个进程想要共享公用的一些变量。比方在仿真EPON时,我将OLT的时钟定义成全局变量,方便各个进程对其的调用。全局变量是在进程的HB中定义的,它在某一个进程里被主声明,在其它需要调用它的进程中用“extern〞进展外部声明。状态变量是专属于该进程的,只要该进程被调用它就存在,但是别的进程不能直接访问它,当然通过调用一些函数它还是能够被获知的,它在SV中被定义。节点的一些统计变量一般采用状态变量,比方EPON仿真中各个ONU内处理模块发送的数据量和数据包的个数等都是用的状态变量。临时变量生成期最短,它不需要在进程的两次调用之间保持不变,比方for循环中自加变量i,因为只是使用上的需要,并不对它运行的结果关注所以用了临时变量3.4.各进程间数据共享机制有三种机制用来作为multipleprocessess下,各个process之间的通信方式:a)modulememory同模块共享内存:通过函数op_pro_modmem_install()和op_pro_modmem_access()访问。为了保证process间通信机制,各个process应当遵循sharedmemory的数据类型,这就要求process都要知道,因而sharedmemory的数据构造定义应当房子外部定义".h"文件中,并包含在每个process的headerblock中。sharedmemory一开场是没有的,是由process来决定什么时候分配以及分配多大,这些通过op_pro_modmem_access()来完成。内存的分配一般是通过op_prg_meme_alloc()来完成。b)父子共享内存:只有以父子关系联系在一起的process才能访问的私有共享内存。这种共享内存只能在childprocess由op_pro_create()产生时由op_prg_mem_alloc()分配,且不能被替换。通过op_pro_parmem_access()访问。通过op_pro_invoke()通知对方对共享内存的内容进展的修改和,以及对内容的检查。c)参数内存(argumentmemory)将内存地址作为op_pro_invoke()的参数传给别的进程用以通信,通过op_pro_argmem_access()来完成访问。与前两个不同的是,这局部内存不是永恒的。3.5.进程中输入输出流当packet从inputstream到达时,接收模块的一个process由于streaminterrupt而被调用。这个process通过op_intrpt_strm()来得悉这个packet是从哪个stream里来的。Inputstream通常用非负的整数作为标号(index)。process通过op_pk_get()和streamindex来获得packets。通过op_strm_pksize()得悉仍然留在inputstream中的packet的数量。对于outputstream来说,跟inputstream类似,也有一些函数:op_pk_send(),op_pk_send_delayed(),op_pk_send_forced(),op_pk_send_quiet()。也是用非负整数用来作标号。3.6.进程中状态图3.6.1process在任意时刻只能处在一个状态下。process可以根据它收到的interrupt在状态之间转移。每个状态的执行过程分为两个局部。进入执行(enterexecutives)和离开执行(exitexecutives),分别在进入和离开该状态的时候执行。Process定义了两种状态,称之为强制状态(forcedstates)和非强制状态(unforcedstates),分别用绿色和红色表示。Unforcedstates允许在process在enter和exit之间暂停。一旦process执行完unforcedstates下的enterexecutives,就被block,并将控制权交还给调用它的其他process。如果这个process是被SimulationKernel调用的,block就意味着这个event的完毕。但是此时这个process依然被挂起,直到下一个新的调用产生使得它进入当前状态的exitexecutives。Forcedstates是不允许process等待的。所以一般它的exitexecutives是空白的。这是它与Unforcedstates的最大区别。3.6initialstates是process被第一次调用时的起始位置。通过setinitialstate或makeinitialstate来设置。beginsimulationinterrupts是一种moduleattribute,用来完成对initialstate的进入。通过module的begsimintrpt属性来选择。当然也可以不选择使用beginsimulationinterrupts而使用普通的interrupt(不推荐)。3.6.3.对于状态转移的规定有四个组成局部:源状态、目的状态、条件表达式、执行表达式。可以这样解读:当处在源状态下,如果条件是真,那么执行操作,并且转移到目的状态。转移条件是布尔表达式。表达式可能是很多东西复杂东西的组合。所有支持条件表达式的计算都必须在exitexecutives的末尾执行,因为它们马上就要在后面的计算条件表达式的值时用到。 常用的是使用宏来定义复杂或循环表达式,几乎所有Proto-C的宏都是在headerblock中定义的,宏也可以在外部文件".h"中定义。然后通过在headerblock中用#include包含进来。宏的定义是#define。(跟C几乎一模一样)3.7.OPNET中ODB调试经历 调试程序应该是新手最花时间的一局部,刚开场那些五花八门的错误甚至可能让人丧失信心,所幸OPNET自带的调试工具已经很强大了。从错误日志里头可以很清楚的看到一些语法错误。最难发现的是逻辑错误,对于逻辑

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论