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

时间:2020-09-24 16:30:24

标签: omnet++

我制作了一个带有1个输入和2个子模块的简单复合模块:

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

当我开始仿真时,我得到一个错误,即门已经连接。那么如何将复合模块中包含的数据获取到两个子模块中?

感谢和亲切问候,

tanktoo

2 个答案:

答案 0 :(得分:1)

首先,通过将sensorDataIn定义为门的向量,

gates:
  input sensorDataIn[2];

第二,对门使用++运算符,即:

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

第三,在您的NED文件中将网络更改为:

 connections allowunconnected:

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

答案 1 :(得分:0)

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

最后将我的系统更改为: 模块系统 { 参数: 闸门: 输入sensorDataIn;

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

感谢帮助!