Omnet++ - 访问初始化 (.ini) 文件中不同模块的参数并使用 for 循环

Omnet++ - Accessing parameters of a different module in initialization (.ini) file and using for loop

我需要生成流量的泊松到达,因此需要相应地设置客户端中应用程序的启动时间。为此,我需要两件事:

1. access parameters of different modules and use them as input for defining a parameter of another module
2. use a for loop to define parameters of modules

例如- 下面的示例演示了我正在尝试做的事情。 我有 100 个客户,每个客户有 20 个应用程序。我想设置第一个客户端的第一个应用程序的开始时间,剩下的想用循环写。

// iat = interArrivalTime
**.cli[0].app[0].startTime = 1 // define this
**.cli[0].app[1].startTime = <**.cli[0].app[0].startTime> + exponential(<iat>) 
**.cli[0].app[2].startTime = <**.cli[0].app[1].startTime> + exponential(<iat>)
.
.
.
**.cli[n].app[m].startTime = <**.cli[n].app[m-1].startTime> + exponential(<iat>)

我查看了 'ned' 函数,但找不到任何解决方案。

当然我可以写一个脚本来硬编码多个客户端的启动时间,但是脚本会输出一个巨大的文件,如果客户端和应用程序的数量太大,很难管理。

谢谢!

INI 文件基本上是模式匹配器。每次初始化模块时,INI 文件中每一行 = 号的左侧都会与实际模块路径相匹配,从 INI 文件的开头开始。在从头开始的第一个匹配中,行的右侧用作参数的值。

简而言之,这些不是赋值操作,而是告诉每个模块如何初始化其自己的参数的规则。例如,它是未定义的,在初始化期间将以什么顺序使用这些行。 INI 文件中较早的内容不一定在模块初始化期间较早使用。当然,这可以防止您引用其他模块的参数。事实上,您可能根本不使用任何其他参数。

简而言之,INI 文件是声明性的,而不是程序结构,因此不能在此处使用交叉引用、循环和其他程序结构。

如果您想在模块参数之间创建依赖关系,您可以在模块的 initialize() 方法中编写代码,方法是从 C++ 代码中显式初始化一个参数。您可以使用 C++ API 访问任何其他模块的参数。

当然,如果您不想修改现有应用程序,这不是最佳解决方案,但是您可以创建一个单独的模块来负责 'procedural' 初始化,并且该单独的模块可以 运行 通过所有应用程序并根据需要设置所需的参数。这种方法在 INET 中的几个必须计算初始化数据的地方使用。一个没有table的例子是路由table信息的计算。例如Ipv4FlatNetworkConfigurator

另一种方法是使用 python 等脚本语言来设置和配置您的模拟。然而,OMNeT++(还)不支持这一点。

长话短说,编写一个 配置器 模块并在那里进行初始化。