我遇到的问题是我设置的sendInterval超出了我为它设置的限制。
下面我刚刚添加了两条我正在评论的行
void EtherTrafGen::scheduleNextPacket(simtime_t previous)
{
simtime_t next;
if (previous == -1) {
next = simTime() <= startTime ? startTime : simTime();
timerMsg->setKind(START);
}
else {
next = previous + sendInterval->doubleValue();
EV << "THE PREVIOUS TIME IS " << previous << " THE SEND INTERVAL IS " << sendInterval->doubleValue() << endl; // Testing
timerMsg->setKind(NEXT);
}
if (stopTime < SIMTIME_ZERO || next < stopTime)
{
scheduleAt(next, timerMsg);
emit(sigSendInterval,sendInterval->doubleValue()); // Vector collect Send Interval Time
}
}
我首先使用固定的sendInterval值
进行测试**.Host5.app.sendInterval = 1ms
上一个时间是0.001发送间隔是0.001 上一个时间是0.002发送间隔是0.001 上一个时间是0.003发送间隔是0.001
由此我假设上一次2 =上一次1 +发送间隔
第二个我假设间隔时间与值下的表中的时间相同(代码中显示的行)
然后使用随机的sendInterval值
**.Host5.app.sendInterval = uniform(0.99ms,1.01ms)
以前的时间是0.001001856892发送间隔是0.000998752
上一个时间是0.001999544526发送间隔是0.00100136
上一个时间是0.002999144069发送间隔是0.000997365
上一个时间2不相等上一个时间1 +发送间隔
0.001001856892 + 0.000998752 = 0.002000608892
0.002000608892 - 0.001999544526 = 1.064366 usec
间隔时间与Value下的时间不同,如下表所示
这导致主机发送的范围超出0.99ms,1.01ms
答案 0 :(得分:1)
参数sendInterval
在EtherTrafGen.ned
中声明为:
volatile double sendInterval @unit(s);
volatile修饰符表示每次都重新读取参数 模拟过程中需要一个值。
变量sendInterval
被声明为指向有权访问sendInterval
参数的对象的指针。因此,每次读取sendInterval
的值时,都会返回一个新的随机值。
为了控制sendInterval
的当前值,我建议只读一次并将结果存储在临时变量中,例如:
void EtherTrafGen::scheduleNextPacket(simtime_t previous)
{
simtime_t next;
double sendIntervalTemp = sendInterval->doubleValue(); // one time read
if (previous == -1) {
next = simTime() <= startTime ? startTime : simTime();
timerMsg->setKind(START);
}
else {
next = previous + sendIntervalTemp ;
EV << "THE PREVIOUS TIME IS " << previous <<
" THE SEND INTERVAL IS " << sendIntervalTemp << endl; // Testing
timerMsg->setKind(NEXT);
}
if (stopTime < SIMTIME_ZERO || next < stopTime)
{
scheduleAt(next, timerMsg);
emit(sigSendInterval, sendIntervalTemp); // Vector collect Send Interval Time
}
}