我制作了一个带有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
答案 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;
}
感谢帮助!