【问题标题】:Omnet++ compound module: connect 1 input gate to multiple submodulesOmnet++ 复合模块:将 1 个输入门连接到多个子模块
【发布时间】:2020-09-24 16:30:24
【问题描述】:

我做了一个简单的复合模块,有 1 个输入和两个子模块:

module System
{
    parameters:
    gates:
        input sensorDataIn;
    submodules:
        metric1: Metric1 {
            @display("p=30,26");
        }
        metric2: Metric2 {
            @display("p=30,26");
        }

    connections:
        sensorDataIn --> metric1.metricIn;
        sensorDataIn --> metric2.metricIn;
}

当我开始模拟时,我收到门已连接的错误。那么如何将进入我的复合模块的数据传递给两个子模块呢?

感谢和亲切的问候,

坦克也

【问题讨论】:

    标签: omnet++


    【解决方案1】:

    首先,将sensorDataIn 定义为门向量,将其更改为:

    gates:
      input sensorDataIn[2];
    

    其次,门使用++运算符,即:

    connections:
      sensorDataIn++ --> metric1.metricIn;
      sensorDataIn++ --> metric2.metricIn;
    

    第三,在你的 NED 文件中进行网络更改:

     connections allowunconnected:
    

    门向量的大小可以省略,因为运算符++ 会自动扩展门向量的大小。

    【讨论】:

    • 谢谢你,但现在模拟崩溃了,“sensorDataIn[] 门都已连接,'++' 运算符没有门”
    • 我已经通过定义sensorDataIn 的大小以及将注释allowunconnected 添加到您的主NED 文件来编辑我的答案。但是,我不确定您的目标到底是什么。模块System 是否应该有一个输入,并且在此输入上接收到的消息应该转发到metric1metric2?如果是,则无法通过这种方式实现。仅使用连接无法将消息复制并发送到多个输入。可以使用System 中的一个输入和其他简单模块来完成,该模块将复制消息并将一份副本发送到metric1,第二个发送到metric2
    • "模块系统是否应该有一个输入,并且在该输入上接收到的消息应该转发到 metric1 和 metric2?"这正是我想要实现的。我一开始只使用一个指标,直到我添加第二个指标时一切正常。所以解决方案是在具有 output[nrOfMetrics] 的复合模型中添加一个新组件并将它们连接到指标?如果我理解正确,这个模块必须在内部制作副本并发送它们。
    【解决方案2】:

    Jerzy D. 的提示下,我得出了以下解决方案:

    一个简单的消息分发模块:

    simple Distributor
    { 
        parameters:
            int numOutputs = default(1);  
        gates:
            input dataIn @labels(SensorData/up);
            output dataOut[numOutputs];
    }
    

    在其实现中,它将消息转发到所有连接的指标:

    void Distributor::handleMessage(cMessage *msg)
    {
        // TODO - Generated method body
        for (int i=0; i<gateSize("dataOut"); i++) {
            cMessage *copy = msg->dup();
            send(copy, "dataOut", i);
        }
        delete msg;
    }
    

    最后将我的系统更改为: 模块系统 { 参数: 大门: 输入传感器数据输入;

    submodules:
        distributor: Distributor{
            parameters:
                numOutputs = 2;
        }
        metric1: Metric1 {
            @display("p=30,26");
        }
        metric2: Metric2 {
            @display("p=30,26");
        }
    
    connections:
        sensorDataIn --> distributor.dataIn;
        distributor.dataOut[0] --> metric1.metricIn;
        distributor.dataOut[1] --> metric2.metricIn;
    }
    

    感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多