Omnet ++: случайная отправка SendInterval вне допустимого диапазона

У меня проблема с тем, что значение 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 мксек.

Интервал времени отличается от значения в поле "Значение", как показано в таблице ниже.

введите описание изображения здесь

Это приводит к тому, что хост отправляет сообщения за пределы диапазона 0,99 мс, 1,01 мс.


person Mour_Ka    schedule 20.02.2017    source источник


Ответы (1)


Параметр sendInterval объявлен в EtherTrafGen.ned как:

volatile double sendInterval @unit(s); 

Согласно Руководству по моделированию OMNeT ++:

Модификатор 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
    }                     
}
person Jerzy D.    schedule 21.02.2017