您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 综合/其它 > OPNET入门学习教程
OPNET入门学习教程•创建进程和节点模型•定义变量,宏(Macros)和过渡•运行仿真•分析仿真结果概念:一个进程模型是一个有限状态机(finitestatemachine,FSM),它代表了一个模块的逻辑和行为。一个有限状态机定义了模型的状态和改变状态的标准。OPNET采用增强的C/C++修改FSM,称为Proto-C(原始C)。使用Proto-C的三种场合:1.EnterExecutive进入执行2.ExitExecutive退出执行3.TransitionExecutive转移执行模型设计:1.打开OPNET,选择FileNew...,然后通过下拉菜单选ProcessModel,单击“OK”。2.点击“CreatState”,在工作区放置3个状态。其中第一个状态会自动设为initialstate(带有箭头)。3.右击initialstate,选择“Setname”,修改名称:init,确定。4.其余2个状态分别命名为idle(空闲)和arrival(到达)。OPNET进程模型里,包括非强制状态(红色)和强制状态(绿色)。非强制状态(红色)是指状态执行完之后,将控制权返回给SimulationKernel。强制状态(绿色)是指状态执行完之后,立即执行退出操作或者转移到其他状态,并不返回控制权。由于arrival状态需要统计包数,并销毁数据包,然后回到空闲状态,因此,arrival状态应该是一个强制状态。另外,init状态必须转移到idle状态,因此它也应该是强制状态。1.右击init状态,选择MakeStateForced。2.右击arrival状态,选择MakeStateForced。创建状态转移:状态转移分为无条件转移和条件转移(unconditionalandconditional)。1.单击“CreateTransition”。2.先点initstate,后点idlestate。3.绘制曲线状态转移线,先点idlestate,然后在idle和arrival之间点一下,再点arrivalstate。右击完成绘制。4.在idle和arrival之间的状态转移线上右击(先选中,再右击),选择EditAttributes,在condition的value中输入“ARRIVAL”(一定要大写)。确定。这是就条件转移。5.点击CreateTransition,绘制从arrival到idle的转移。6.绘制从idle到它自己的转移。右击完成绘制。7.右击idle到它自己的状态转移线,选择EditAttributes。8.修改condition的value为“default”(小写),确定。下面定义ARRIVAL宏:1.点击“EditHeaderBlock”。打开editpad。2.输入:#defineARRIVAL(op_intrpt_type()==OPC_INTRPT_STRM)3.点击关闭,保存。下面声明两个变量:一个用于存储数据包计数,另一个用于“handle”局部统计分析数据包。1.点击EditStateVariables。2.输入:TypeNameCommentsintpk_countCountstotalpacketsStathandlepk_cnt_stathandleStatistictorecordpacketcount3.点击OK,保存,关闭。统计量是用于后面的数据分析,在进程模型中是需要声明的。4.选择InterfaceLocalStatistics。5.在StatName处输入packetcount。后面自动设为Single和N/A。6.单击Desc.(Description),输入Numberofpacketsreceived,并保存。7.单击OK。创建状态执行:1.双击init状态的上半部分,进入EnterExecutives。2.要初始化pk_count和pk_cnt_stathandle,输入:pk_count=0;pk_cnt_stathandle=op_stat_reg(packetcount,OPC_STAT_INDEX_NONE,OPC_STAT_LOCAL);3.关闭,保存。上面pk_count和pk_cnt_stathandle变量是你定义的状态变量,但op_stat_reg()函数是一个仿真内核程序(组)。OPNET内包括了几百个内核函数可供调用。每个状态下面的数字表示状态执行“Enter/Exit”操作的指令行数。例如init状态开始是0/0,现在是3/0。可以在空白处右击,选择显示/隐藏行计数。对arrival状态的设置:1.双击arrival状态的上半部分。2.要增加数据包计数,输入:++pk_count;3.要丢弃得到的数据包,输入:op_pk_destroy(op_pk_get(op_intrpt_strm()));4.对数据包的统计记录,输入:op_stat_write(pk_cnt_stathandle,pk_count);5.保存,退出。上面这些基本内核程序的调用,可参考HelpEssentialKernelProcedures。很有用的!KPs是KernelProcedures的缩写。编辑进程接口:1.选择InterfacesProcessInterfaces。2.将begsimintrpt的InitialValue改为enabled。(产生中断)3.将endsimintrpt,failureintrpts,intrptinterval,recoveryintrpts,和superpriority的InitialValue设为disabled。4.将priority的InitialValue设为0。5.将所有参数的Status属性改为hidden。6.保存,退出。编译模型:(每个进程模型在使用前都必须进行编译)1.点击编译进程模型。2.保存,命名为initial_packet_count。3.关闭编译状态对话框。4.关闭进程编辑器。建立网络和节点模型建立节点模型:1.选择FileNew...,然后选NodeModel,确定。2.点击CreateProcessor,创建3个节点。3.点击CreatePacketStream,建立如下连接:4.右击p_0,EditAttributes,修改名字为src1,修改processmodel为simple_source。确定。5.右击p_1,EditAttributes,修改名字为count,修改processmodel为initials_packet_count。确定。6.右击p_2,EditAttributes,修改名字为src2,修改processmodel为simple_source。在PacketInterarrivalTime属性栏的位置右击,选择Promote(提升)AttributetoHigherLevel。确定。1.选择InterfacesNodeStatistics。2.点击Orig.Name,选择count.packetcount,然后点Promote。3.把Prom.Name改为nodepacketcount。4.把Desc.改为Numberofpacketsreceivedatthenodelevel。关闭窗口。保存。5.选择FileSave,命名为initials_packet_count。(节点和进程的名字可以相同,但后缀名不同)。6.关闭节点编辑器。创建网络:1.新建项目,项目名initials_packet_count,场景constant。Quit。2.打开对象面板,,进入图标视图,点击ConfigurePalette...3.点击clear,点击右边的NodeModels,设置initials_packet_count的Status为included。保存为initials_packet_count。4.放置initials_packet_count节点,关闭对象面板。5.右击节点,选择ChooseIndividualDESStatistics。下面将:•创建一个包内的节点流量(动画节点动画)动画。•指定节点包计数统计收集(节点统计节点的数据包数)。•指定节点包计数统计动画(animation)。6.选择AnimationsNodeAnimation。再选择NodeStatisticsnodepacketcount。7.右击NodeStatisticsnodepacketcount,选择RecordStatisticAnimation。确定,关闭窗口。8.右击节点,EditAttributes,点击src2.PacketInterarrivalTime的value为promoted。确保Distribution为constant,Meanoutcome为1.0。确定,保存。仿真配置:1.选择DESConfigure/RunDiscreteEventSimulation...2.设置:◦Duration:100seconds◦Seed:1471◦Valuesperstatistic:1003.展开Outputs,Animation。点击2D,再确保Sendanimationtohistoryfile被选中。点击Apply。再点Cancel,关闭Configure/RunDES对话框,不进行仿真。下面新建一个场景进行对比:1.选择ScenariosDuplicateScenario...(复制场景)。2.命名新场景exponential,点击OK。3.右击节点,EditAttributes。点击src2.PacketInterarrivalTime的value栏,打开对话框。4.在Distributionname中选择exponential,确保Meanoutcome是1.0。确定,确定。保存项目initials_packet_count。运行仿真:1.在管理场景对话框中,可以同时运行两个仿真。选择EditPreferences,确保NetworkSimulationRepositories是(),如果不是,就删除所有内容。确定。2.选择ScenariosManageScenarios...,把两个Results都改为collect。3.确定,运行仿真。完成后,关闭DESExecutionManager。分析结果:1.在项目编辑器中查看结果,如果要切换场景的话,选择ScenariosSwitchToScenarioexponential.2.右击node_0,ViewResults,打开ResultsBrowser。3.选择ObjectStatisticsnode_0nodepacketcount。点Show。4.在20s到1min之间,可以选择一个方框进行放大。可以查看细节。5.关闭图表,delete。6.在ResultsBrowser中,在Resultsfor:中找到CurrentProject。7.要切换到constant场景,点击initials_packet_countexponential,然后选择initials_packet_countconstant,显示ObjectStatisticsnode_0nodepacketcount。可以放大查看。8.在图表上右击,选择DrawStyleDiscrete。显示离散图。离散图形显示了仿真内核(SimulationKernel)每秒发送2个数据包,但分别计数。该图也表明了仿真核基于事件运行的性质。同时发生的事件(每秒钟到达多个包)造成仿真核提前了仿真时间一次,但调用packet_count两次。而且,packet_count进程每次被调用时都递增一次数据包统计数。9.关闭图表,delete。关闭ResultsBrowser。1.DESPlay2DAnimation。2.要查看包的动画,WindowsAnimation
本文标题:OPNET入门学习教程
链接地址:https://www.777doc.com/doc-4904006 .html