如何在OMNeT ++模拟过程中更改网络配置?

时间:2015-04-13 19:31:20

标签: c++ omnet++ inet

我想在模拟运行期间修改OMNeT ++中元素的 .ini 文件的一些参数,比如节点的传输速率,例如:当节点收到一些控制消息时。

我发现信息说有可能以某种方式循环配置为: some_variable = $ {多个值},但中没有条件子句.ini 文件,无法将任何来自C ++函数的数据传递给这些文件(据我所知)。

我使用INET,但也许其他一些模型的用户已经遇到过这样的问题。

3 个答案:

答案 0 :(得分:3)

  

我发现信息说有可能以某种方式循环配置为:some_variable = $ {几个值},但.ini文件中没有条件子句并且无法传递给那些从C ++函数中提取任何数据(据我所知)。

实际上,您可以在INI文件中使用内置的constraint表达式。这将允许您在遵循指定的约束(条件)的同时为给定配置创建运行。

但是,此约束仅适用于.ini文件中指定的参数,例如,如果您尝试更改的变量是作为代码的一部分动态计算的,则无法帮助您

下面,我从.ini文件中给你一个相当复杂的“代码片段”,它使用了你提到的许多内置函数(变量迭代,条件等)。

                # Parameter assignment using iteration loops and constrains #
# first define the static values on which the others depend #
scenario.node[*].application.ADVlowerBound = ${t0= 0.1}s
scenario.node[*].application.aggToServerUpperBound = ${t3= 0.9}s
#
## assign values to "dependent" parameters using variable names and loop iterations #
scenario.node[*].application.ADVupperBound = ${t1= ${t0}..${t3} step 0.1}s        # ADVupperBound == t1; t1 will take values starting from t0 to t3 (0.1 - 0.9) iterating 0.1
scenario.node[*].application.CMtoCHupperBound = ${t2= ${t0}..${t3} step 0.1}s
#
## connect "dependent" parameters to their "copies" -- this part of the snippet is only variable assignment.
scenario.node[*].application.CMtoCHlowerBound = ${t11 = ${t1}}s
scenario.node[*].application.joinToServerLowerBound = ${t12 = ${t1}}s
#
scenario.node[*].application.aggToServerLowerBound = ${t21 = ${t2}}s
scenario.node[*].application.joinToServerUpperBound = ${t22 = ${t2}}s
#
constraint = ($t0) < ($t1) && ($t1) < ($t2) && ($t2) < ($t3)
                # END END END #

上面的代码会为t0t3创建所有可能的时间值组合,他们可以在0.10.9之间取值。

t0t3分别是起点和终点。 t1t2根据这些值获取值。

每次t1递增时,

t0将在t30.1之间取值(请参阅上面的语法)。 t2也是如此。

但是,我希望t0始终小于t1t1小于t2t2小于t3。我在constraint部分指定了这些条件。

我相信,仔细阅读本手册的this部分,可以帮助您找到解决方案。

答案 1 :(得分:1)

如果要在模拟过程中更改某些值,可以在C ++代码中执行此操作。类似的东西:

handleMessage(cMessage *msg){
  if(msg->getKind() == yourKind){  // replace yourKind with the one you are using for these messages
    transmission_rate = new_value;
}

您所指的是 some_variable = $ {几个值} 可用于执行具有不同参数的多次运行。例如,一个以1s的速率运行,一个以2s运行,一个以10s运行。那将是:

transsmission_rate = ${1, 2, 10}s

有关如何使用此类值(如执行循环)的更多详细信息,请参阅OMNeT++ User Manual

中的相关部分

答案 2 :(得分:0)

虽然您当然可以手动更改volatile parameters,但OMNeT ++(据我所知)不提供在运行时自动更改参数的集成支持。

但是,您可以编写一些changes volatile parameters programatically

的模型代码