INET EnergyConsumer 模块的参数新值在运行时永远不会生效
INET EnergyConsumer module's parameters new value never takes effect at runtime
我会请求你帮助解决我面临的这个问题。实际上,我想在 运行 时间更改 energyConsumer 模块的参数。
场景是我应该根据无线电的状态指定节点传输或接收时的能量。
我是在这段代码的帮助下完成的。多亏了它,指定参数的值已经确定了,但问题是它们并没有如愿。
energyConsumer模块的参数化如下:
cModule *module = getGrandParentModule->getParentModule()->getSubmodule("node",myCHIndex);
cModule *energyConsumerCHModule = module->getSubmodule("wlan",0)->getSubmodule("radio")->getSubmodule("energyConsumer");
StateBasedEpEnergyConsumer *energconsumption = check_and_cast<StateBasedEpEnergyConsumer *>(energyConsumerCHModule);
cModule *chmodule = module->getSubmodule("generic")->getSubmodule("np");
Sim *chsim = check_and_cast<Sim *>(chmodule);
cPar *receivingPower = &energconsumption->par("receiverReceivingPowerConsumption");
EV_DEBUG <<"MY CLUSTER HEAD RECEIVING POWER IS : "<<receivingPower->doubleValue()<<endl;
EV_DEBUG <<"NEW VALUE CALCULATED : "<<((chsim->EnergyCH_RX)*bitrate)/(K)<<endl;
receivingPower->setDoubleValue(((chsim->EnergyCH_RX)*bitrate)/(K));
EV_DEBUG <<"MY CLUSTER HEAD RECEIVING POWER APPLIED IS : "<<receivingPower->doubleValue()<<endl;
EV_DEBUG <<"**************************************************************"<<endl;
cPar *transmittingPower = &energyconsumption->par("transmitterTransmittingPowerConsumption");
EV_DEBUG <<"MY CURRENT TRANSMITTING POWER IS : "<<&energyconsumption->par("transmitterTransmittingPowerConsumption")<<endl;
EV_DEBUG <<"NEW VALUE CALCULATED : "<<(EnergyToCH*bitrate)/(K)<<endl;
transmittingPower->setDoubleValue((EnergyToCH*bitrate)/(K));
EV_DEBUG <<"MY CURRENT TRANSMITTING POWER APPLIED IS : "<<&energyconsumption->par("transmitterTransmittingPowerConsumption")<<endl;
输出与图像一致:
但如您所见,尽管有一些明确定义的值,但没有发生能量消耗(energyStorage 模块仍保持提供的初始能量,0.5J)。
下图是储能模块的状态:
请问我该如何处理?
非常感谢您的支持...
StateBasedEpEnergyConsumer
模块的编写方式并未预期某些参数在运行时会发生变化(事实上几乎 none 的 INET 模块都是如此)。一个参数通常只读一次(通常在初始化阶段)。在那之后,他们通常将参数的值存储在内部成员变量中,并且他们不关心将来的任何更改。 (您可以在 StateBasedEpEnergyConsumer.cc
中查看)。
如果你想在运行时改变能量消耗值,你应该通过实现power::IEpEnergyConsumer
接口来编写你自己的EnergyConsumer模块。 (或者通过添加一个 handleParameterChange()
方法来修改当前的实现,以将实际的新值存储在成员变量中。
我会请求你帮助解决我面临的这个问题。实际上,我想在 运行 时间更改 energyConsumer 模块的参数。 场景是我应该根据无线电的状态指定节点传输或接收时的能量。 我是在这段代码的帮助下完成的。多亏了它,指定参数的值已经确定了,但问题是它们并没有如愿。
energyConsumer模块的参数化如下:
cModule *module = getGrandParentModule->getParentModule()->getSubmodule("node",myCHIndex);
cModule *energyConsumerCHModule = module->getSubmodule("wlan",0)->getSubmodule("radio")->getSubmodule("energyConsumer");
StateBasedEpEnergyConsumer *energconsumption = check_and_cast<StateBasedEpEnergyConsumer *>(energyConsumerCHModule);
cModule *chmodule = module->getSubmodule("generic")->getSubmodule("np");
Sim *chsim = check_and_cast<Sim *>(chmodule);
cPar *receivingPower = &energconsumption->par("receiverReceivingPowerConsumption");
EV_DEBUG <<"MY CLUSTER HEAD RECEIVING POWER IS : "<<receivingPower->doubleValue()<<endl;
EV_DEBUG <<"NEW VALUE CALCULATED : "<<((chsim->EnergyCH_RX)*bitrate)/(K)<<endl;
receivingPower->setDoubleValue(((chsim->EnergyCH_RX)*bitrate)/(K));
EV_DEBUG <<"MY CLUSTER HEAD RECEIVING POWER APPLIED IS : "<<receivingPower->doubleValue()<<endl;
EV_DEBUG <<"**************************************************************"<<endl;
cPar *transmittingPower = &energyconsumption->par("transmitterTransmittingPowerConsumption");
EV_DEBUG <<"MY CURRENT TRANSMITTING POWER IS : "<<&energyconsumption->par("transmitterTransmittingPowerConsumption")<<endl;
EV_DEBUG <<"NEW VALUE CALCULATED : "<<(EnergyToCH*bitrate)/(K)<<endl;
transmittingPower->setDoubleValue((EnergyToCH*bitrate)/(K));
EV_DEBUG <<"MY CURRENT TRANSMITTING POWER APPLIED IS : "<<&energyconsumption->par("transmitterTransmittingPowerConsumption")<<endl;
输出与图像一致:
但如您所见,尽管有一些明确定义的值,但没有发生能量消耗(energyStorage 模块仍保持提供的初始能量,0.5J)。
下图是储能模块的状态:
请问我该如何处理?
非常感谢您的支持...
StateBasedEpEnergyConsumer
模块的编写方式并未预期某些参数在运行时会发生变化(事实上几乎 none 的 INET 模块都是如此)。一个参数通常只读一次(通常在初始化阶段)。在那之后,他们通常将参数的值存储在内部成员变量中,并且他们不关心将来的任何更改。 (您可以在 StateBasedEpEnergyConsumer.cc
中查看)。
如果你想在运行时改变能量消耗值,你应该通过实现power::IEpEnergyConsumer
接口来编写你自己的EnergyConsumer模块。 (或者通过添加一个 handleParameterChange()
方法来修改当前的实现,以将实际的新值存储在成员变量中。