OMNeT++ 子模块连接错误
Error in submodule connection in OMNeT++
我在复合模块中有两个子模块。我尝试使用门连接它们,但它会产生此错误:
Error in module(cmodule) wnetwork.host0 during network setup.
Gate 'wnetwork.host[0].gate$i[0]' is not connected to a submodule(or
internally to another gate of the same module)
我的复合模块代码是
wirelessnode.ned:
package core;
import org.mixim.modules.power.battery.BatteryStats;
import org.mixim.modules.power.battery.SimpleBattery;
module wirelessnode
{
parameters:
volatile double Energy @unit(mW) = default(10.0mW);
double Tx_energy @unit(mW) = default(0.8mW);
double Tx_interval @unit(s) = default(0.5s);
@display("bgb=210,450,white;i=device/palm;i2=status/battery;b=40,40,rect");
submodules:
batteryStats: BatteryStats {
@display("p=110,221;i=block/table,#FF8040");
}
battery: SimpleBattery {
@display("p=101,90;i=block/plug,#FF8000");
}
}
wirelessnodehost.ned:
package core;
module wirelessnodehost extends wirelessnode
{
gates:
inout gate[];
}
wnetwork.ned:
package core;
import core.wirelessnodehost;
network wnetwork
{
parameters:
int numDevices=default(3);
submodules:
host[numDevices]: wirelessnodehost;
connections:
for i = 0..numDevices-2 {
host[i].gate++ <--> host[i+1].gate++;
}
}
如何解决这个错误?
如果您检查错误消息,它说:wnetwork.host[0].gate$i[0]
未连接到 子模块 (或在内部连接到同一模块的另一个门)。 (见重点),所以问题不在于连接两个模块是错误的,而是 wirelessnodehost
的内部结构不正确。
具体来说,您将 wirelessnodehost
定义为复合模块(通过将其他模块连接在一起而构建的模块,但您未在其中指定任何子模块)。我假设您有一些 wirelessnodehost
的 C++ 代码。在这种情况下,您必须将其定义为 simple wirelessnodehost
。只有简单的模块才有相应的代码,并且允许它们使用它们的代码处理传入的消息。另一方面,复合模块应该始终将传入消息传递给子模块进行处理,这就是运行时抱怨的原因。您没有在内部连接门,因此运行时不知道将传入消息传递到哪里。
作为旁注,您扩展 wirelessnode
模块(它本身应该有相应的 C++ 代码并且应该定义为 'simple')这一事实是相当可疑的。如果处理节点行为的代码是在 wirelessnode
class 中实现的,那么它对 wirelessnodehost
中定义的门一无所知。我建议更深入地了解 OMNeT++ manual 中描述简单模块和复合模块之间差异的部分。
我在复合模块中有两个子模块。我尝试使用门连接它们,但它会产生此错误:
Error in module(cmodule) wnetwork.host0 during network setup. Gate 'wnetwork.host[0].gate$i[0]' is not connected to a submodule(or internally to another gate of the same module)
我的复合模块代码是
wirelessnode.ned:
package core;
import org.mixim.modules.power.battery.BatteryStats;
import org.mixim.modules.power.battery.SimpleBattery;
module wirelessnode
{
parameters:
volatile double Energy @unit(mW) = default(10.0mW);
double Tx_energy @unit(mW) = default(0.8mW);
double Tx_interval @unit(s) = default(0.5s);
@display("bgb=210,450,white;i=device/palm;i2=status/battery;b=40,40,rect");
submodules:
batteryStats: BatteryStats {
@display("p=110,221;i=block/table,#FF8040");
}
battery: SimpleBattery {
@display("p=101,90;i=block/plug,#FF8000");
}
}
wirelessnodehost.ned:
package core;
module wirelessnodehost extends wirelessnode
{
gates:
inout gate[];
}
wnetwork.ned:
package core;
import core.wirelessnodehost;
network wnetwork
{
parameters:
int numDevices=default(3);
submodules:
host[numDevices]: wirelessnodehost;
connections:
for i = 0..numDevices-2 {
host[i].gate++ <--> host[i+1].gate++;
}
}
如何解决这个错误?
如果您检查错误消息,它说:wnetwork.host[0].gate$i[0]
未连接到 子模块 (或在内部连接到同一模块的另一个门)。 (见重点),所以问题不在于连接两个模块是错误的,而是 wirelessnodehost
的内部结构不正确。
具体来说,您将 wirelessnodehost
定义为复合模块(通过将其他模块连接在一起而构建的模块,但您未在其中指定任何子模块)。我假设您有一些 wirelessnodehost
的 C++ 代码。在这种情况下,您必须将其定义为 simple wirelessnodehost
。只有简单的模块才有相应的代码,并且允许它们使用它们的代码处理传入的消息。另一方面,复合模块应该始终将传入消息传递给子模块进行处理,这就是运行时抱怨的原因。您没有在内部连接门,因此运行时不知道将传入消息传递到哪里。
作为旁注,您扩展 wirelessnode
模块(它本身应该有相应的 C++ 代码并且应该定义为 'simple')这一事实是相当可疑的。如果处理节点行为的代码是在 wirelessnode
class 中实现的,那么它对 wirelessnodehost
中定义的门一无所知。我建议更深入地了解 OMNeT++ manual 中描述简单模块和复合模块之间差异的部分。