Omnet++ Omnet++;:随机发送间隔发送超出范围
我遇到的问题是,我正在设置的sendInterval超出了我为其设置的限制 下面我只是添加了两行我要评论的内容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
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(开始);
}
否则{
下一步=上一步+发送间隔温度;
电动汽车