2017-02-20 5 views
1

私が設定したsendIntervalが設定した制限を超えているという問題があります。Omnet ++:ランダムSendInterval送信範囲外

私はちょうど私が私が前回の送信間隔は0.001
IS 0.001 IS固定sendInterval値

**.Host5.app.sendInterval = 1ms 

で最初のテスト

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

をコメントしています2行を追加以下前の時間は0.002です送信間隔は0.001
前の時間は0.003です送信間隔は0.001です

私はインターバル時間を想定2 =前回1 +インターバル

に第を送信前回想定しているから値下の表のものと同じである(ラインコードに示されそしてランダムsendInterval値)

enter image description here

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

前の時間は、送信間隔は0.000998752
前回は0.001999544526送信間隔は0.00100136
前回の送信間隔は0.000997365

前回2 IS 0.002999144069 IS IS IS IS 0.001001856892 IS not equal Previous Time 1 +送信間隔

0.001001856892 + 0.000998 752 = 0.002000608892
0.002000608892から0.001999544526 = 1.064366マイクロ秒

これがその原因となっている

enter image description here

以下の表に示すようにインターバル時間の値が下のものと同じではありませんホストは0.99ms、1.01msの範囲外で送信しています

答えて

1

sendIntervalはで宣言されています

volatile修飾子は、パラメータが 値はシミュレーション中に必要とされるたびに再読み込みされていることを示します:通り:

volatile double sendInterval @unit(s); 

OMNeT++ Simulation Manualによります。

変数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 
    }      
} 
関連する問題