Omnet++新手求助:复合模块门连接至子模块的实现问题
解决OMNeT++复合模块门与子模块的全连接问题
嘿,作为OMNeT++新手,你遇到的这个门绑定问题其实是封装复合模块时的典型场景,我来帮你一步步搞定它~
首先先指出你现有代码里的几个小问题:
- 子模块的NED文件里,你定义的是
simple FloodingNode,但复合模块Node里引用的是floodingModule: FloodingModule,名字不匹配会导致编译报错; - 连接语句里的
g++是动态添加门的语法,但你需要的是把复合模块的所有现有门和子模块的门一一对应连接,这个语法不合适。
下面是修正后的完整实现:
1. 修正子模块NED(FloodingModule.ned)
先把模块名改成和复合模块引用一致的FloodingModule:
simple FloodingModule { parameters: bool sendInitialMessage = default(false); gates: inout g[] @loose; }
2. 调整复合模块的连接逻辑(Node.ned)
这里要使用g[] <--> floodingModule.g[]的语法,确保复合模块的每一个g门都和子模块的对应g门建立双向连接。如果不需要允许未连接的门,可以去掉allowunconnected:
module Node { gates: inout g[]; submodules: floodingModule: FloodingModule; connections: g[] <--> floodingModule.g[]; }
如果你的场景确实需要允许部分门不连接,再把allowunconnected加回去:connections allowunconnected:
3. 完整的网络定义示例(Network.ned)
补全你没写完的网络模块,比如添加几个节点并连接它们:
network FloodingNetworkSmall { submodules: node0: Node; node1: Node; node2: Node; connections: node0.g++ <--> node1.g++; node1.g++ <--> node2.g++; node0.g++ <--> node2.g++; }
额外小技巧:暴露子模块参数到复合模块
如果想在配置网络时直接给复合模块设置sendInitialMessage参数,可以在Node模块里添加参数转发:
module Node { parameters: bool sendInitialMessage = default(false); // 暴露参数到复合模块层级 gates: inout g[]; submodules: floodingModule: FloodingModule { sendInitialMessage = ^.sendInitialMessage; // 将参数转发给子模块 }; connections: g[] <--> floodingModule.g[]; }
这样你在omnetpp.ini里就可以直接写**.node0.sendInitialMessage = true,不用深入到子模块层级配置了。
内容的提问来源于stack exchange,提问作者mapf
相关产品推荐
相关产品推荐

