微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

omn​​et++ 连接复合模块;门都是连接的,没有门留给“++”运算符

如何解决omn​​et++ 连接复合模块;门都是连接的,没有门留给“++”运算符

我是新的 omnet++,在使用复合模块和门时遇到问题。我想创建一个消息经过三个阶段的网络(目前,计划构建一个类似的网络,经过更多阶段)。

在每个阶段,有两个或三个动作要执行;第一阶段和最后阶段有两个动作要执行,中间阶段有三个动作要执行。由于这些操作在每个阶段都有些相似,因此我选择使用复合模块。这是我到目前为止所拥有的;

我的简单模块

simple baseSimpleModule
{
    gates:
        inout ioGates[];
}

simple ActionA extends baseSimpleModule
{
    @class(ActionA);
}

simple ActionB extends baseSimpleModule
{
    @class(ActionB);
}

simple ActionC extends baseSimpleModule
{
    @class(ActionC);
}

我的两种复合模块

module baseModule
{
    gates:
        inout ioGates[];
    submodules:
        actionA: ActionA;
        actionB: ActionB;
    connections:
        actionA.ioGates++ <--> ioGates++;
        actionB.ioGates++ <--> ioGates++;
}

module type1Module extends baseModule
{
    connections:
        actionA.ioGates++ <--> actionB.ioGates++;
}

module type2Module extends baseModule
{
    submodules:
        actionC: ActionC;
    connections:
        actionA.ioGates++ <--> actionC.ioGates++;
        actionC.ioGates++ <--> actionB.ioGates++;
}

最后,我有一个简单的网络如下;

network firstModel
{
    submodules:
        firstStop: type1Module;
        secondStop: type2Module;
        thirdStop: type1Module;
    connections allowunconnected:
        firstStop.ioGates++ <--> secondStop.ioGates++;
        secondStop.ioGates++ <--> thirdStop.ioGates++;
}

我不断收到错误 ioGates[] gates are all connected,no gate left for '++' operator

我期望的轨迹是消息从 firstStop 开始,经过它的每个子模块,跳转secondStop,经过它的每个子模块等等。我不是在其预期用例中使用复合模块,还是我的门的配置方式有问题?

提前致谢!

解决方法

这是一个有点可疑/未开发的示例,这就是您努力在 NED 中对其进行建模的原因。一旦您开始实施各种操作/阶段,您就会意识到您的继承链不正确。几个问题:

  • 在您的“网络”中,您的数据包将在某个明确定义的方向上传播,但是您的 NED 拓扑使用双向连接。这真的很令人困惑,因为一旦收到并处理了消息,您将很难确定将其发送到何处。
  • 您使用相同模块类型建模的某些操作的行为非常不同。例如,firstStopthirdStop 都使用 type1Module 建模,但是它们的行为不同。 firstStop 阶段的第一个动作应该是一个只有一个输出门的消息生成器,而 thirdStop 的第一个动作必须做一些处理并且它必须同时具有输入和输出门,因为它连接到 secondStep
  • 您的操作需要一定数量的门(1 个或 2 个),并且它们应该具有确定的作用(例如接收或发送数据或两者兼有)。使用门阵列对此进行建模令人困惑......(我应该在门 [0] 或门 [1] 上发送我的消息吗???)。在这些情况下,明确命名门要好得多。
  • 在 OMNeT++ 中,网络/模块是从外部 -> 内部方向构建的。即首先你用所有子模块和连接构建网络。完成后,指定内部子模块上的门数(通过门上的 ++ 调用数显式或隐式指定)。此时,门和子模块向量大小已指定。只有在此之后,OMNeT++ 才会开始访问并构建所有子模块的内部结构,因此在子模块内部,您不应在门向量上使用 ++,因为外部模块已经指定了门大小。

长话短说,以下是实现目标的方法: 还有一个聪明的技巧(使用 OMNeT++ 5.6 及更高版本),通过在子类中定义的连接上指定 @reconnect 属性。 这允许重新连接已经在超类中连接的门。这意味着您可以在超类中定义和连接的任何其他模块之间的子类中插入其他模块。在本例中,它在 actionBactionA 之间插入 actionC。门是单向的,并且明确命名。

注意:我强烈建议您查看 OMNeT++ 中的 queuenet 示例,因为该示例与您想要实现的完全一样。从实现中获取一些架构提示。

module Source {
    gates:
        output o;
    connections allowunconnected: // not needed if this is a simple module
}

module Sink {
    gates:
        input i;
    connections allowunconnected: // not needed if this is a simple module
}

module ActionBase {
    gates:
        input i;
        output o;
    connections:
        i --> o;  // dummy shortcut. not needed if this is a simple module
}

module ActionA extends ActionBase { }

module ActionB extends ActionBase { }

module ActionC extends ActionBase { }

module twoActionModule {
    gates:
        input i;
        output o;
    submodules:
        actionA: ActionA;
        actionC: ActionC;
    connections:
        i --> actionA.i;
        actionA.o --> actionC.i;
        actionC.o --> o;
}

module threeActionModule extends twoActionModule {
    submodules:
        actionB: ActionB;
    connections:
        actionA.o --> { @reconnect; } --> actionB.i; // breaks the connection between A and C
        actionB.o --> actionC.i;
}

network net {
    submodules:
        source: Source;
        twoActionStage: twoActionModule;
        threeActionStage: threeActionModule;
        sink: Sink;
    connections:
        source.o --> twoActionStage.i;
        twoActionStage.o --> threeActionStage.i;
        threeActionStage.o --> sink.i;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。