omnet++学习(2)-tictoc例子补充三

本文介绍了如何在OMNeT++仿真环境中为模块添加输入参数,并通过实例演示了如何使用这些参数来控制模块的行为,包括是否在初始化时发送第一条消息及设置消息发送次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

添加参数:

怎么向仿真中添加输入参数,上一节中的counter是Txc1类的私有变量,这里是作为模块的参数存在。并且添加bool型的参数来决定在初始化函数中是否发送第一条消息。

1.demo.ned文件(简单模块定义文件)中添加两个参数,代码如下:

simple Txc1
{
    parameters:
        bool sendMsgOnInit=default(false);//决定在初始化函数中是否发送第一个消息
        int limit=default(2);
        @display("i=block/routing");//加上这句话以后,图标看起来像路由器。所有Txc1类型的模块均会显示成这个形式
    gates:
        input in;
        output out;
}

2.Txc1.h不发生变化,仍然有私有成员变量counter。

3.在Txc1.cc中,counter的初始化不是原来的直接赋值,而是使用par函数读取在简单模块中定义的参数limit:counter=par("limit");

使用sendMsgOnInit参数来决定是否发送第一条消息: if(par("sendMsgOnInit").boolValue()==true);读取dendMsgOnInit的bool型值,判断是否为true。

代码为:

#include "Txc1.h"

Define_Module(Txc1);

//启动tic-toc-tic-toc过程,一个模块需要发送第一个消息,让我们设定为是tic发送第一个消息

void Txc1::initialize()
{
    counter=par("limit");
    //添加WATCH可以在运行的时候,右键单击模块,选择Inspect as object,查看counter的变化。
    WATCH(counter);
    //判断是Tic还是Toc
    if(strcmp("tic",getName())==0)
    {
        if(par("sendMsgOnInit").boolValue()==true)
        {
            //向out门创建并发送第一个消息,tictocMsg消息
            cMessage *msg = new cMessage("tictocMsg");
            send(msg,"out");
            //添加输出,发出第一个消息
            EV<<"Sending initial message\n";
        }
    }

}
//这个函数每当消息到来的时候调用,这里我们只是将这个消息发送给其它模块(通过out门),因为tic和toc做的是相同的事情,所以消息会在两个模块间回荡
void Txc1::handleMessage(cMessage *msg)
{
    counter--;
    if(counter>=0)
    {
        EV<<"Received message '"<<msg->getName()<<"',sending it out again\n";
        send(msg,"out");
    }
}

由于在简单模块定义的时候,sendMsgOnInit被设置为false,所以运行结果是:

Initializing channel Tictoc1.tic.out.channel, stage 0
Initializing channel Tictoc1.toc.out.channel, stage 0
Initializing module Tictoc1, stage 0
Initializing module Tictoc1.tic, stage 0
Initializing module Tictoc1.toc, stage 0
<!> No more events -- simulation ended at event #1, t=0.
** Calling finish() methods of modules

即没有任何消息发送。

4.下面是两种设置参数的方法:

方法一:在网络文件中设置(即demo2.ned中)下面的程序是在demo2.ned文件中分别设置两个模块中的sendMsgOnInit参数:

package demo;
//
// TODO documentation
//让两个模块看起来不同一点,tic为cyan,toc为yellow
network Tictoc1
{
    submodules:
        tic: Txc1 {
   parameters:
       sendMsgOnInit=true;
       @display("i=,cyan");
             @display("p=62,64");
        }
        toc: Txc1 {
   parameters:
       sendMsgOnInit=false;
       @display("i=,gold");
       @display("p=170,64;is=l");
        }
    connections:
        tic.out --> { delay = 100ms; } --> toc.in;
        toc.out --> { delay = 100ms; } --> tic.in;
}

这样初始化之后会发现来回传送两次消息就停止传送了,这是因为limit的默认值设置成了2.

当然,在网络文件中设置limit的值也是可以的。

方法二:在.ini文件中设置参数值:

在.ini文件中参数设置如下:

 

产生的结果是发送两个来回的消息就结束了,这是因为有一个linit的值设置为了2,这样toc减到0就不向toc发消息了。
如果想要发送5轮消息,则都需要设置为5

或者使用正则表达式的方法:

也可以写成Tictoc1.*.limit或者**.limit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值