无线传感器网络 第5章_第1页
无线传感器网络 第5章_第2页
无线传感器网络 第5章_第3页
无线传感器网络 第5章_第4页
无线传感器网络 第5章_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

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

文档简介

第5章进程编辑器5.1进程编辑器对象和操作5.2进程编辑器开发界面5.3进程编辑器应用举例——CSMA协议仿真知识点:

进程编辑器的对象和操作

进程编辑器菜单

进程编辑器工具栏

本章导读:

在计算机系统和通信网络中,进程可以看作是一系列作用于数据的逻辑操作以及触发这些操作的条件。在OPNET的三层模型中,进程模型位于最底层。进程编辑器用来创建进程模型。

本章主要学习通过进程编辑器开发进程模型的过程,并通过构建一个共享式以太网CSMA(载波监听多路接入)协议仿真来进一步学习进程编辑器的使用。

5.1进程编辑器对象和操作

利用OPNET进程编辑器创建的图形和代码相结合的进程模型,能够对真实世界中的许多进程事件进行逻辑描述,描述的范围包括:

●通信协议和算法;

●共享资源管理;

●排队规则;

●网络流量生成器;

●统计数据收集;

●操作系统。进程模型使用有限状态机(FSM)来描述进程的逻辑行为。有限状态机使用状态转移图(STD)来表示状态的转移。状态转移图由图标和线条组成,图标代表逻辑状态,线条代表状态转移。一个逻辑状态中还可以包含更下层的状态转移图。

进程模型的相关操作使用C或者C++语言描述,这些描述性代码能够绑定到相应的图标(逻辑状态)和线条(状态转移)中,并通过OPNET提供的文本编辑器对代码进行编辑。

图形和代码相结合的进程模型有机地将进程模型的表示和逻辑分离开来。由图标和线条组成的图形可视化界面使得进程的业务逻辑流向一目了然。绑定到图标和线条上的代码描述使得各个进程状态相对独立,便于集中编程和统一管理。图5-1所示是进程编辑器的图形和代码编辑界面。图5-1进程编辑器的图形和代码编辑界面进程模型中的进程状态分为强制状态和非强制状态。在状态转移图中,强制状态使用绿色(或黑色)的图标表示;非强制状态使用红色(或白色)的图标表示。进程由当前状态转移到强制状态后,执行强制状态的入口执行指令和出口执行指令,接着通过状态转移将控制权交给下一状态。当前状态转移到非强制状态后,先执行完入口执行指令,然后挂起进程并将控制权交给仿真核心,直到相应的中断(例如流中断、超时中断)到来,才唤醒进程从非强制状态的出口执行指令处继续执行。5.1.1进程编辑器对象

在进程编辑器中,进程状态和状态转移用图形对象来表示。表5-1列举了OPNET的进程编辑器对象。表5-1OPNET的进程编辑器

5.1.2进程编辑器主要操作

进程编辑器提供了创建和编辑进程模块的一系列操作,其中主要的操作如表5-2所示。表5-2进程编辑器主要操作

5.2进程编辑器开发界面

5.2.1进程编辑器菜单介绍

进程编辑器为创建节点的进程模型提供了许多操作,这些操作都可以在进程编辑器的菜单栏中找到(如图5-2所示)。菜单栏中的File、Edit、Windows、Help与第4章中介绍的节点编辑器菜单栏类似,这里不再赘述。图5-2进程编辑器的菜单栏

1. Interfaces

Interfaces菜单提供编辑进程模型接口的相关操作,进程模型的接口为其他进程或整个工程提供访问方法,屏蔽内部信息。Interfaces菜单下常用到的操作是:ModelAttributes、ProcessInterfaces、LocalStatistics、GlobalStatistics。这些操作与第4章中节点编辑器Interfaces菜单中的相关操作有类似的含义。

2. FSM

FSM菜单中包括使用有限状态机为进程模型创建状态转移图的操作,主要操作如表5-3所示。表5-3进程编辑器FSM菜单主要操作

3. CodeBlocks

CodeBlocks中的操作用于指定实现进程的C/C++代码,包括创建变量和代码块,主要操作如表5-4所示。

4. Compile

Compile菜单包含了编译和执行进程模块的C/C++代码的操作。常用的菜单操作是CompileCode和CompileCode(Advance),前者生成进程模块的C/C++源代码和目标代码并保存进程模块,后者在前者的基础上增加了一些高级编译选项。表5-4进程编辑器CodeBlocks菜单主要操作

5.2.2进程编辑器工具栏介绍

进程编辑器工具栏提供了进程编辑器常用操作的图形化快捷方式。图5-3显示了OPNET进程编辑器的工具栏。

进程编辑器各工具栏按钮的主要功能在表5-5中已列举。图5-3进程编辑器工具栏表5-5进程编辑器工具栏操作

5.3进程编辑器应用举例——CSMA协议仿真

下面通过CSMA协议仿真的具体例子来学习进程编辑器的使用。在这个例子中,将对Aloha和CSMA这两种信道访问协议建模。通过在总线型信道上建立Aloha的随机信道访问模型和1-坚持(1-Persistent)的CSMA模型,来分析CSMA协议的共享信道访问机制,并对两个模型进行比较。在进行仿真前,先来熟悉一下该模型的层次结构(如图5-4所示)。这个例程中,Aloha和CSMA模型都采用相同的网络模型cct_net。这个网络模型包括若干发信机节点模型,用来发送数据包;包含一个收信机节点模型,用来接收数据包和进行网络监控。通过修改发信机节点模型的进程模型属性,可以使仿真在Aloha和CSMA方式之间快速切换。

发信机产生、处理数据包,并将数据包发送到网络总线上。发信机可设计为由相对独立的三个进程模块组成:产生数据包的数据包发生器(generator)、处理数据的处理机(processor)、发送数据包到总线的总线发信机(bustransmitter)。图5-5所示是发信机节点的节点模型。图5-4CSMA协议仿真模型的层次结构图5-5发信机节点的节点模型总线发信机应具备完整的内部队列机制,以保证所有发送到总线上的数据包按先进先出(FIFO)的顺序发送。5.3.1建立进程模型

1.建立Aloha发信机的数据处理机进程模型

Aloha发信机的数据处理机进程从信源采集数据,并将数据发送到网络上。数据处理机进程模型需要一个非强制状态来等待从信源采集来的数据。

(1)启动OPNET主程序,执行File>New命令,新建一个ProcessModel模型,将该模型命名为aloha_tx,并保存。

(2)在打开的进程模型编辑器工具栏中,单击“CreateState”按钮,在工作区中放置三个进程状态对象。

(3)右击,在弹出的快捷菜单中选择“SetName”,将第一个进程对象更名为init。接着右击,选择MakeStateForced,将该进程变为强制状态。

(4)按照同样的方式,将第二个进程对象更名为idel,保持其非强制状态;将第三个进程对象更名为tx_pkt,并将其变为强制状态。

设置完毕的状态对象应如图5-6所示。图5-6初始化的处理机进程模型

(5)在工具栏中单击“CreateTransition”按钮,按照如图5-7所示连接各进程对象。

(6)在idle状态到tx_pkt状态的转移线上右击,在弹出的快捷菜单中选择“EditAttribute”,在弹出的对话框中将Condition设置为PKT_ARVL。这样,当非强制状态idle收到事件PKT_ARVL后,就将其状态转移到tx_pkt。图5-7处理机进程模型的状态转移

(7)下面定义PKT_ARVL宏。在工具栏中单击编辑头块代码按钮,在头块的代码编辑器中写入如下代码并保存:

/*Inputstreamfromgeneratormodule*/

#defineIN_STRM0

/*Outputstreamtobustransmittermodule*/

#defineOUT_STRM0

/*Conditionalmacros*/

#definePKT_ARVL(op_intrpt_type()==OPC_INTRPT_STRM)

/*GlobalVariable*/

externint

subm_pkts;这段代码中,首先定义IN_STRM和OUT_STRM常量,代表发包和收包的流索引,以便调用内核进程来进行数据包的收发。流索引的定义要与将来在模型节点级中的定义一致。接着定义宏PKT_ARVL,当进程收到的中断类型是流中断时,触发PKT_ARVL事件。最后使用extern关键字定义一个全局变量subm_pkts,代表发包数量的全局计数。

(8)在工具栏中单击编辑状态变量按钮,添加变量max_packet_count,类型为int(如图5-8所示)。该变量记录一次仿真中最多能处理的包的数量。它将从仿真属性中提取,并与实际的收发包数量相比较。图5-8为发信机进程模型添加状态变量

(9)单击“init”状态的上半部分(如图5-9所示),编辑其入口执行指令块中的代码。在弹出的代码编辑器中输入如下代码并保存:

/*Getthemaximumpacketcount,*/

/*setatsimulationrun-time*/

op_ima_sim_attr_get_int32(“maxpacketcount”,&max_packet_count);

这段代码表示在仿真一开始,就使用op_ima_sim_attr_get_int32()函数得到变量max_packet_count的值。注意,前面已经在全局状态变量中定义了max_packet_count。图5-9编辑状态的入口执行指令

(10)单击tx_pkt状态的上半部分,编辑其入口执行指令块中的代码。在弹出的代码编辑器中输入如下代码并保存:

/*Outgoingpacket*/

Packet*out_pkt;

/*Apackethasarrivedfortransmission.Acquire*/

/*thepacketfromtheinputstream,sendthepacket*/

/*andupdatetheglobalsubmittedpacketcounter.*/

out_pkt=op_pk_get(IN_STRM);

op_pk_send(out_pkt,OUT_STRM);

++subm_pkts;

/*Comparethetotalnumberofpacketssubmittedwith*/

/*themaximumsetforthissimulationrun.Ifequal*/

/*endthesimulationrun.*/

if(subm_pkts==max_packet_count)

{

op_sim_end(“maxpacketcountreached.”,“”,“”,“”);

}

这段代码从输入流中接收数据包,向模型外发送数据包,并改变发包计数器全局变量subm_pkts的值。subm_pkts是发包数量的全局计数器,在后面的cct_rx进程模型中被定义。为了能够在本进程模块中被访问,必须在头块代码中将其声明为extern类型。当aloha_tx进程收到仿真核心产生的流中断后,状态转移到tx_pkt,并执行其入口执行指令。执行完毕后,由于tx_pkt状态没有出口执行指令,状态直接转移到idle态。因为整个进程模型中除了idle态之外没有其他的非强制进程状态,所以进程最终总是会停留在idle态,以等待下一个数据包的到来。

为了能在仿真前设置最大可以发送的数据包数目,应添加一个最大包数量的全局变量属性。

(11)在进程编辑器窗口中执行Interfaces>GlobalAttributes命令,在弹出窗口中添加名为“maxpacketcount”的属性,该属性类型为integer,默认值是0,如图5-10所示。这个属性作为调用op_ima_sim_attr_get_int32函数的第一个参数。

(12)在进程编辑器窗口中,执行Interfaces>ProcessInterfaces命令,将“begsim

intrpt”设置为enable,并将所有属性的Status字段值设置为hidden,单击“OK”按钮确定,如图5-11所示。

(13)在工具栏中单击“CompileProcessModel”按钮,编译该进程模块,并保存退出。图5-10为发信机进程模型添加全局属性图5-11为发信机进程模型添加接口

2.建立通用收信机的数据处理机进程模型

通用收信机的数据处理机进程模型的主要功能是进行数据包计数和记录统计信息。

(1)在OPNET主程序中执行File>New命令,新建一个ProcessModel模型,将该模型命名为cct_rx并保存。

(2)在进程编辑器中首先放置两个进程状态对象,分别将两个对象命名为init和idle。

(3)右击“init”进程状态对象,并在弹出的快捷菜单中选择“makestateforced”,将其改为强制状态。

(4)按照图5-12所示方式画五条状态转移线。图5-12收信机进程模型的状态转移

(5)在init进程状态到idle进程状态之间的第一条状态转移线(如图5-12中的直线所示)附近单击鼠标右键,选择EditAttributes,将condition属性设置为PKT_RCVD,将executive属性设置为proc_pkt()。这样,该进程模型在init状态下接收到PKT_RCVD的事件中断,就转移到idle状态,同时执行proc_pk()函数代码。

(6)采用同样方法,将其他各条状态转移线的condition和executive属性分别设置成如图5-12所示。

(7)设置头块(HeaderBlock)和状态变量(StateVariables)。在工具栏中单击编辑头块代码按钮,在代码编辑器中写入下面的代码并保存:

/*Inputstreamfrombusreceiver*/

#defineIN_STRM0

/*conditionalmacros*/

#definePKT_RCVD(op_intrpt_type()==OPC_INTRPT_STRM)

#defineEND_SIM(op_intrpt_type()==OPC_INTRPT_ENDSIM)

/*Globalvariable*/

int

subm_pkts=0;这段代码定义了PKT_RCVD和END_SIM两个宏。PKT_RCVD验证到达进程的中断是否是一个流中断,因为这里只可能有一种类型的流中断到达,所以不需要再做进一步的流中断类型判断。END_SIM验证到达进程的中断是否是一个仿真内核发出的仿真结束(end-of-simulation)中断。IN_STRM是总线收信机输入流的流索引。subm_pkts用于记录每个数据包发送节点各自的发包次数总和,它是全局变量,作用域是整个仿真过程。

(8)在工具栏中单击编辑状态变量按钮,添加变量rcvd_pkts,类型为int。该变量记录一次仿真中收集到的合法数据包的个数,如图5-13所示。图5-13为收信机进程模型添加状态变量

(9)编写收信机进程模块的函数块(FunctionBlock)。在工具栏中单击编辑函数块代码按钮,在代码编辑器中写入下面的代码并保存:

/*Thisfunctiongetsthereceivedpacket,destroys*/

/*it,andlogstheincrementedreceivedpackettotal*/

staticvoidproc_pkt(void)

{

Packet*in_pkt;

FIN(proc_pkt());

/*Getpacketfrombusreceiverinputstream*/

in_pkt=op_pk_get(IN_STRM);

/*Destroythereceivedpacket*/

op_pk_destroy(in_pkt);

/*Incrementthecountofreceivedpacket*/

++rcvd_pkts;

FOUT;

}

/*Thisfunctionwritestheend-of-simulationchannel*/

/*trafficandchannelthroughputstatisticstoa*/

/*scalarfile*/

staticvoidrecord_stats(void)

{

doublecur_time;

FIN(record_stats());

cur_time=op_sim_time();

/*Recordfinalstatistics*/

op_stat_scalar_write(“ChannelTrafficG”,(double)subm_pkts/cur_time);

op_stat_scalar_write(“ChannelThroughputS”,(double)rcvd_pkts/cur_time);

FOUT;

}这段代码中,proc_pkt()函数从总线发信机接收每一个数据包,然后将其销毁,并对接收到的数据包个数进行累加。record_stat()将仿真结束时的信道流量和信道吞吐率的统计信息写入标量统计文件,这个函数在仿真结束前被调用。注意,op_stat_scalar_write()是一个OPNET的核心函数,用于生成标量统计信息的记录。

(10)编辑进程状态对象的代码。单击“init”状态的上半部分,编辑其入口执行指令块中的代码。在弹出的代码编辑器中输入如下代码并保存:

/*Initializeaccumulator*/

rcvd_pkts=0;

(11)定义进程模型的接口。在进程编辑器窗口中,执行Interfaces>ProcessInterfaces命令,将“endsim

intrpt”设置为enable,并将所有属性的Status字段值设置为hidden,单击“OK”按钮确定,如图5-14所示。

(12)在工具栏中单击“CompileProcessModel”按钮,编译该进程模块,并保存退出。图5-14为收信机进程模型添加接口5.3.2建立节点模型

1.建立通用发信机节点模型

下面建立一个支持Aloha的通用发信机节点模型。

(1)在OPNET主窗口中执行File>New命令,新建一个NodeModel模型,将该模型命名为cct_tx并保存。

(2)在打开的节点模型编辑器工具栏中单击“CreateProcessor”按钮,在工作区中放置两个处理机模块。单击“CreateBusTransmitter”按钮,在工作区中放置一个总线发信机模块。

(3)在模块上右击,在弹出的快捷菜单中选择“SetName”,将两个处理机模块分别命名为gen和tx_proc,将总线发信机模块命名为bux_tx。单击“CreatePacketStream”按钮,使用数据包流连线将三个节点模块连接起来,如图5-15所示。连接时应注意包流的方向。

(4)在gen模块上右击,在弹出的快捷菜单中选择“EditAttributes”,在弹出的属性设置窗口中将“processmodel”属性设置为simple_source,如图5-16所示。

为了能够在仿真时动态设置产生数据包的间隔时间,需要对数据包到达间隔时间属性进行提升。图5-15通用发信机节点模型图5-16设置gen模块的进程模型

(5)选择“PacketInterarrivalTime”,右击,并在弹出的快捷菜单中选择“PromoteAttributeToHigherLevel”,这时PacketInterarrivalTime的值变为promoted,如图5-17所示。

(6)在tx_proc模块上右击,从弹出的快捷菜单中选择EditAttributes,在弹出的属性设置窗口中将“processmodel”属性设置为前面刚刚创建的进程模型aloha_tx。图5-17提升数据包到达间隔时间属性

(7)按住键盘上的“Ctrl”键,单击两条数据包流连线,同时选中后右击,在弹出的快捷菜单中选择“EditAttributes”。在弹出窗口中将srcstream设置为srcstream[0],将deststream设置为deststream[0],并选中“Applychangestoselectedobjects”复选项,单击“OK”按钮确定(如图5-18所示)。注意,这两个属性要与前面在aloha_tx进程模块的头块(HeaderBlock)中定义的包流索引一致。图5-18设置数据包流连线属性

2.改进通用发信机节点模型

到目前为止,设计的通用发信机节点模型已经包含了aloha_tx进程模型,但还没有实现CSMA协议的相应进程模型,还需要改进这个节点模型,给它添加新的模块。新的节点模型增加了一个总线收信机模块(以支持CSMA协议的全双工工作模式),一个接收(sink)模块(接收和销毁从总线收信机收到的数据包),以及一条统计线(用于在CSMA模式中通知tx_proc进程模块总线信道的状态,并在信道发生变化时向tx_proc进程模块产生中断信号),如图5-19所示。图5-19改进的通用发信机节点模型

(1)在节点模型编辑器工具栏中单击“CreateProcessor”按钮,在工作区中放置一个处理机模块。单击“CreateBusReceiver”按钮,在工作区中放置一个总线收信机模块。分别将两个模块命名为sink和bus_rx。

(2)单击“CreatePacketStream”按钮,使用数据包流连线建立从bus_rx模块到sink模块的连接。单击“CreateStatisticWire”按钮,使用统计线建立从bux_rx模块到tx_proc模块的连接。

(3)右击统计线,在弹出的快捷菜单中选择“EditAttributes”,打开其属性窗口。将risingedgetrigger和fallingedgetrigger都设置为disabled,如图5-20所示。图5-20设置统计线属性

(4)右击tx_proc模块,在弹出的快捷菜单中选择“ShowConnectivity”,现在tx_proc模块的连接信息应与图5-21中所示的信息一致。

(5)右击gen和tx_proc模块间的包流连线,选择“EditAttributes”,检查srcstream的属性是否已经设置为srcstream[0]。

(6)右击bux_rx和tx_proc模块间的状态线,选择“EditAttributes”,将deststat的属性改为instat[0]。

下面定义节点模型的接口属性。图5-21tx_proc模块的连接信息

(7)在节点编辑窗口中执行Interfaces>NodeInterfaces命令,将NodeTypes表中mobile和satellite的supported属性设置为no,表示该节点模型不支持移动和卫星接口类型。将attributes表中除了gen.Packet

InterarrivalTime外的所有status属性设置为hidden。而gen.Packet

InterarrivalTime的status设置为promoted,表示从底层提升得来。

(8)保存该节点模型。

3.建立通用收信机节点模型

建立通用收信机节点模型的操作步骤如下:

(1)在OPNET主窗口中执行File>New命令,新建一个NodeModel模型,将该模型命名为cct_rx并保存。

(2)在打开的节点模型编辑器工具栏中,单击“CreateProcessor”按钮,在工作区中放置一个处理机模块。单击“CreateBusReceiver”按钮,在工作区中放置一个总线收信机模块。将两个模块分别命名为rx_proc和bus_recv。

(3)单击“CreatePacketStream”按钮,画一条从bus_recv到rx_proc的数据包流连线,如图5-22所示。图5-22通用收信机节点模型

(4)在rx_proc模块上单击鼠标右键,选择EditAttributes,在弹出的属性设置窗口中将其Processmodel属性设置为cct_rx。

接下来定义该节点模型的接口属性。

(5)在节点编辑窗口中执行Interfaces>NodeInterfaces命令,将NodeTypes下mobile和satellite的supported属性设置为no,表示该节点模型不支持移动和卫星接口类型。将attributes表中所有status属性设置为hidden(如图5-23所示)。

(6)保存该节点模型。图5-23设置通用收信机节点模型接口属性5.3.3建立总线型以太网网络

1.新建一个链路模型

现在来学习链路模型的创建。例如要创建一个自定义的总线型链路模型,其管道阶段(PipelineStage)使用默认总线模型。总线模型的各个管道阶段列举在表5-6中。关于创建链路模型和链路编辑器的使用将在第6章中详细介绍,这里暂不做系统说明。表5-6总线收发信机的管道模型阶段

首先创建一条新的链路。

(1)在OPNET主窗口中执行File>New命令,新建一个LinkModel模型,将该模型命名为cct_link并保存。

(2)在弹出的链路模型编辑器中找到SupportedLinkTypes表,将ptsimp和ptdup的Supported属性设置为no,即本链路模型不支持点到点单工和点到点双工链路,如图5-24所示。

(3)关闭链路模型编辑器。图5-24修改链路模型属性

2.创建网络模型

下面创建一个网络模型,以便分析Aloha和CSMA协议。

Aloha模型在理论上假设数据包以指数分布的时间间隔到达网络。但本例程中,网络模型中只有有限个节点,而这些节点在前一事件处理完毕之前总是缓冲数据包。因此,为了逼真地模拟Aloha模型,网络总线上需要安排大量发信机。

(1)在OPNET工程窗口中执行File>New命令,新建一个Project。将工程命名为cct_network,场景命名为aloha,并保存。

(2)在工程创建向导中,按表5-7所示的参数完成各个步骤。表5-7在工程向导中配置工程参数

(3)在对象面板中创建一个自定义面板。在打开的对象面板中单击“ConfigurePalette”按钮(如果对象面板没有打开,请单击工具栏上的按钮),弹出ConfigurePalette对话框。

(4)在对话框中单击“Clear”按钮,然后单击“LinkModels”按钮,从列表中找到cct_link并将其Status属性设置为included,单击“OK”按钮确定,如图5-25所示。

(5)在ConfigurePalette对话框中单击“NodeModels”按钮,从列表中找到cct_rx和cct_tx,并将其Status属性设置为included,单击“OK”按钮确定,如图5-26所示。图5-25创建自定义对象面板1图5-26创建自定义对象面板2

(6)单击“Saveas…”按钮,将自定义面板命名为cct并保存。

关闭ConfigurePalette对话框后,自定义面板cct就可以使用了。下面利用OPNET的网络拓扑快速配置来创建一个总线型网络。

(7)在OPNET工程窗口中执行Topology>RapidConfiguration...命令,并选择Bus,单击“OK”按钮。

(8)按照图5-27来填写RapidConfiguration窗口中的各个参数,并单击“OK”按钮确定。图5-27配置RapidConfiguration的参数

(9)在工作区中,OPNET自动创建出的总线网络拓扑如图5-28所示,这个网络总共有20个cct_tx发信机节点。

(10)现在需要为这个总线型拓扑网络添加一个收信机节点。从对象面板中将收信机节点cct_rx拖放到工作区。在对象面板中选择cct_link,画一条从总线到收信机的链路。完整的总线模型如图5-29所示。

(11)保存该网络模型,使用默认名cct_network。图5-28OPNET自动创建的总线网络拓扑图5-29为总线网络拓扑添加收信机节点5.3.4参数选择和仿真

首先明确仿真的目的是观察协议性能随信道模型的变化情况。下面,将通过改变参数interarrivaltime进行12次仿真,分析结果并得出结论。

(1)在OPNET工程窗口中执行Scenarios>ScenarioComponents>Import...命令,从下拉菜单中选择SimulationSequence,并在列表中选择cct_network-CSMA(如图5-30所示)。单击“OK”按钮,并保存工程。图5-30导入仿真序列

(2)在OPNET工程窗口中,执行DES>Configure>RunDiscreteEventSimulation(Advanced)命令, 打开SimulationSequence窗口。此时在窗口中看到一个仿真序列的图标,表示刚才导入的仿真序列。一个仿真序列中可包含多次不同的仿真。

(3)右击仿真序列图标,在弹出的快捷菜单中选择EditAttributes,设置Advanced标签下的Files标签页,将Network下拉菜单设置为cct_network-aloha,将Probefile下拉菜单设置为NONE,并将Scalarfile设置为cct_a,如图5-31所示。

由于工程中使用了统计量创建函数op_stat_scalar_write(),因而不需要Probefile。op_stat_scalar_write()函数产生的统计标量文件将命名为cct_a。图5-31设置仿真序列的属性

(4)单击General标签下的GlobalAttributes标签页,设置maxpacketcount的值为1000(如图5-32所示);单击General标签下的ObjectAttributes标签页,可以观察到OfficeNetwork.*.gen.Packet

InterarrivalTime属性下总共已经生成了12个不同的仿真参数。

(5)单击“Apply”按钮,保存设置。

现在开始仿真。

(6)单击“Run”按钮或在SimulationSequence窗口的工具栏上执行仿真序列图标,系统提示本次仿真序列包含12次仿真,确定后仿真开始运行。图5-32编辑仿真全局属性5.3.5仿真结果分析

1.分析Aloha仿真结果

Aloha的信道性能可以通过成功接收到的数据包数量随发送数据包数量变化的函数来度量,即在本网络中,信道吞吐量(ChannelThroughput)是表征网络性能的典型参数。

在仿真完成后,OPNET将在标量文件cct_a中记录每次仿真的结果。标量文件使用AnalysisConfiguration编辑器来分析查看。

(1)在OPNET工程窗口中执行File>New命令,从下拉菜单中选择AnalysisConfiguration,单击“OK”按钮确定。

(2)在新窗口中执行File>LoadOutputScalarFile…命令,并选中文件cct_a。注意,选择cct_a的时候没有任何该文件被选中的提示。

(3)下面绘制结果分析图形。在工具栏中单击“CreateaGraphofTwoScalars”按钮,设置Horizontal为ChannelTrafficG,设置Vertical为ChannelThroughputS,如图5-33所示。

(4)单击“OK”按钮,绘制出的结果分析图形如图5-34所示。图5-33设置图形的横坐标和纵坐标图5-34Aloha协议信道吞吐量随信道流量的变化从图5-34中可以看出,在信道流量较低的时候,信道吞吐量也较低,数据包冲突少;随着流量增加,吞吐量逐渐增加,并在G=0.5左右出现峰值约为0.18。此后,随着冲突加剧,吞吐量反而不断下降。

计算机通信网络的相关理论分析指出,在纯Aloha系统中,信道吞吐量S是信道流量G的函数,并且有

S=Ge-2G

且S有极限:

可见,实际仿真结果与理论分析是基本一致的。

(5)关闭绘图窗口和AnalysisConfiguration编辑器。

2.改进aloha_tx进程模型

CSMA协议在Aloha随机信道访问的基础上增加了载波监听的功能,从而显著提高了Aloha协议的性能。在CSMA协议中,源节点在发送数据包之前先监听信道,只有当信道空闲时才发送,否则采取一定的策略延迟发送数据包。

下面对aloha_tx进程模型进行改进,以便其满足CSMA协议中原节点的要求。

(1)打开aloha_tx进程模型。

(2)按照图5-35修改aloha_tx进程模型,注意新添加的状态wt_free为非强制状态。图5-35改进aloha_tx进程模型接下来修改头块,以便进程在监视到信道空闲时才发送数据。判断信道是否空闲应使用核心函数op_stat_local_read(),如果返回信道忙,则进入wt_free状态,直到收到“信道重新空闲”的中断。

注意,在节点模型级选中统计线的fallingedgetrigger属性,则当busy统计量变为0.0时(信道空闲),统计线被激活。

(3)打开头块编辑器,在头块代码的末尾添加如下代码并保存:

/*inputstatisticindices*/

#defineCH_BUSY_STAT0

/*Conditionalmacros*/

#defineFREE(op_stat_local_read(CH_BUSY_STAT)==0.0)

#definePKTS_QUEUED(!op_strm_empty(IN_STRM))

#defineCH_GOES_FREE(op_intrpt_type()==OPC_INTRPT_STAT)

(4)执行File>SaveAs…命令,将新的进程模型保存为csma_tx。

(5)编译该进程模型,并关闭进程编辑器。

3.改进通用发信机节点模型

通过改进通用发信机节点模型,总线收信机模块的busy统计量值从1.0(信道忙)改变为0.0(信道空闲)时,该模块将向处理机模块发送一个下降沿统计中断。

(1)打开cct_tx节点模型。

(2)编辑统计线属性,将fallingedgetrigger属性改为enable,并单击“OK”按钮确定。

(3)编辑处理机模块tx_proc的属性,将processmodel属性改为csma_tx。

(4)执行File>SaveAs…命令,将新的节点模型保存为cct_csma_tx并关闭节点编辑器。

4.修改网络模型

在创建支持CSMA协议的进程和节点模型后,继续修改网络模型。

(1)在工程窗口中执行Scenarios>

温馨提示

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

评论

0/150

提交评论