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
参数sendInterval
在EtherTrafGen.ned
中声明为:
volatile double sendInterval @unit(s);
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
}
}
我遇到问题,我设置的 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
参数sendInterval
在EtherTrafGen.ned
中声明为:
volatile double sendInterval @unit(s);
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
}
}