Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Omnet++ Omnet++;:随机发送间隔发送超出范围_Omnet++_Inet - Fatal编程技术网

Omnet++ Omnet++;:随机发送间隔发送超出范围

Omnet++ Omnet++;:随机发送间隔发送超出范围,omnet++,inet,Omnet++,Inet,我遇到的问题是,我正在设置的sendInterval超出了我为其设置的限制 下面我只是添加了两行我要评论的内容 void EtherTrafGen::scheduleNextPacket(simtime_t previous) { simtime_t next; if (previous == -1) { next = simTime() <= startTime ? startTime : simTime(); timerMsg->s

我遇到的问题是,我正在设置的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
    }                     
}
前一时间为0.001发送间隔为0.001
前一时间为0.002,发送间隔为0.001
前一时间为0.003,发送间隔为0.001

由此我假设上一次2=上一次1+发送间隔

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

然后使用随机发送间隔值

**.Host5.app.sendInterval = 1ms
**.Host5.app.sendInterval = uniform(0.99ms,1.01ms)
上一时间为0.001001856892,发送间隔为0.000998752
前一时间为0.0019995426发送间隔为0.00100136
上一时间为0.002999144069,发送间隔为0.000997365

上一次2不等于上一次1+发送间隔

0.001001856892+0.000998752=0.002000608892
0.002000608892-0.0019995426=1.064366 usec

间隔时间与下表所示的值下的间隔时间不同


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

参数
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
    }                     
}
void EtherTrafGen::ScheduleNextPackage(simtime\u t previous)
{
simtime\u t next;
double sendIntervalTemp=sendInterval->doubleValue();//一次读取
如果(上一个==-1){
next=simTime()setKind(开始);
}
否则{
下一步=上一步+发送间隔温度;
电动汽车