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

Omnet++ : random SendInterval sending out of range

我遇到问题,我设置的 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

THE PREVIOUS TIME IS 0.001 THE SEND INTERVAL IS 0.001
THE PREVIOUS TIME IS 0.002 THE SEND INTERVAL IS 0.001
THE PREVIOUS TIME IS 0.003 THE SEND INTERVAL IS 0.001

由此我假设前一个时间 2 = 前一个时间 1 + 发送间隔

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

然后用随机的sendInterval值

**.Host5.app.sendInterval = uniform(0.99ms,1.01ms)

THE PREVIOUS TIME IS 0.001001856892 THE SEND INTERVAL IS 0.000998752
THE PREVIOUS TIME IS 0.001999544526 THE SEND INTERVAL IS 0.00100136
THE PREVIOUS TIME IS 0.002999144069 THE SEND INTERVAL IS 0.000997365

前一个时间2不等于前一个时间1 + 发送间隔

0.001001856892 + 0.000998752 = 0.002000608892
0.002000608892 - 0.001999544526 = 1.064366 usec

间隔时间与下图Value下的不一样table

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

参数sendIntervalEtherTrafGen.ned中声明为:

volatile double sendInterval @unit(s); 

根据 OMNeT++ Simulation Manual:

The volatile modifier indicates that a parameter is re-read every time a value is needed during simulation.

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