Omnet++复合模块:将1个输入门连接到多个子模块

Omnet++ compound module: connect 1 input gate to multiple submodules

我制作了一个带有 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;
}

当我开始模拟时,我收到一条错误消息,提示门已连接。那么我怎样才能将进入我的复合模块的数据传递给两个子模块呢?

谢谢和亲切的问候,

坦克

首先,将sensorDataIn定义为门的向量,变为:

gates:
  input sensorDataIn[2];

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

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

三、在你的网络NED文件中改成:

 connections allowunconnected:

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

根据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;
}

感谢帮助!