通过CPAR在其它模块改变模型参数(Changing model parameters by cPa

2019-10-23 07:11发布

我使用这个模块的层次结构:

  • Node: {udpApp[0]<->udp<->networkLayer->wlan[0]} and wlan[0]: {CNPCBeacon<->mac<->radio}

我给的一些初始参数ini文件udpApp为:

**.host*.numUdpApps = 2
**.host*.udpApp[0].typename = "UDPBasicApp" 
**.host*.udpApp[0].chooseDestAddrMode = "perBurst"
**.host*.udpApp[0].destAddresses = "gw1"
**.host*.udpApp[0].startTime = 1.32s
**.host*.udpApp[0].stopTime = 1.48s

但在运行时我想改变的startTimestopTimeudpAPP[0]通过CNPCBeacon模块。 因此,我改变了CNPCBeacon.cc如下: -

cModule* parentmod = getParentModule();
cModule* grantParentmod = parentmod->getParentModule();
cModule* udpmod;
for (cSubModIterator iter(*grantParentmod); !iter.end(); iter++)
{
    //EV<<"get the modulde "<< iter()->getFullName()<<endl;
    if (strcmp(iter()->getFullName(), "udpApp[0]") == 0)
    {
        udpmod = iter();
        break;
    }
}
cPar& startTime = udpmod->par("startTime");
cPar& stopTime = udpmod->par("stopTime");

而我能够成功接收的值startTimestopTime 。 但是我想电流模块,从而导致错误通过下面的代码中来改变这些值:

udpmod->par("startTime").setDoubleValue(4.2);

任何人都可以请建议我的方式在运行时改变它。

Answer 1:

声明您的参数volatile应该解决您的问题。 但是,以供将来参考下面我将提供进一步的解释


Volatile与非挥发性 :

这取决于你如何想使用这个参数。 主要通过.ini文件有两种类型的参数: volatilenon-volatile

volatile参数的运行过程中每次读取。 如果你想通过一个内置函数生成此参数,例如,woule是有帮助的uniform(0,10)每次这个动荡的参数,会得到不同的值。

在另一方面non-volatile参数读只有一个,因为它们不运行,从运行改变。

使用volatile类型参数不给你充分的灵活性,在这个意义上,你的参数值将在预定义的范围内都倒下.ini


动态变量(参数)重新分配:

相反,你可以做的是使用更可靠的方法,并重新定义了存储该模块的参数,每次有时间这样做值的变量。

例如,在你的情况,你可以做到以下几点:

varHoldingStartTime = par("startTime").doubleValue();
varHoldingStartTime = 4.2;

通过这种方式,实际值将在内部更改,恕不反映到你的跑步。


参数研究:

另外,如果你想被应用到多个运行,你可以通过使用++的OMNeT它允许你进行配备了先进的内置方法参数的这种变化参数研究 。

我在这里解释参数研究如何工作的: https://stackoverflow.com/a/30572095/4786271和这里如何将其与约束的实现等: https://stackoverflow.com/a/29622426/4786271

如果没有按我建议的方法的适合你的情况下,这个问题的答案完全可以解决你的问题: 如何模拟的OMNeT ++中更改网络配置?


编辑:扩大答案大致解释handleParameterChange()

我没用过handleParameterChange()之前一样好,但我从什么可以看到这个功能提供了一个监督功能到使用它的模块。

为了激活该功能首先将void handleParameterChange(const char *parameterName); 已被重新定义。

从本质上说什么,似乎做的是以下几点:

假设我们有两个模块moduleAmoduleBmoduleB具有参数parBmoduleA改变parB ,这时, moduleB反应基于行为的这种变化定义为:

moduleB::handleParameterChange(parB);

该行为可以重新读取原始值parB.ini等。



文章来源: Changing model parameters by cPar in other module
标签: c++ omnet++ inet