Omnet ++:随机SendInterval发送超出范围

时间:2017-02-20 18:32:14

标签: omnet++ inet

我遇到的问题是我设置的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 +发送间隔

第二个我假设间隔时间与值下的表中的时间相同(代码中显示的行)

enter image description here

然后使用随机的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下的时间不同,如下表所示

enter image description here

这导致主机发送的范围超出0.99ms,1.01ms

1 个答案:

答案 0 :(得分:1)

参数sendIntervalEtherTrafGen.ned中声明为:

volatile double sendInterval @unit(s); 

根据OMNeT++ Simulation Manual

  

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