INET框架StateBasedEpEnergyConsumer运行时修改参数不生效问题咨询
问题根因
INET框架的StateBasedEpEnergyConsumer模块在初始化阶段就会将NED参数中配置的各类功耗值读取并缓存到类的内部成员变量中,后续运行时计算能耗直接读取缓存的成员变量,不会主动重新读取cPar的最新值。你直接修改cPar的数值不会同步到内部缓存的成员变量,因此参数修改看起来成功但实际不会生效。
可行解决方案
方案1:调用模块内置更新接口(适配INET 4.4及以上版本)
较新的INET版本已经为StateBasedEpEnergyConsumer提供了公开的功耗参数设置方法,直接调用对应方法更新即可,无需修改cPar:// 替换原有修改cPar的代码 energconsumption->setReceiverReceivingPowerConsumption(W(((chsim->EnergyCH_RX)*bitrate)/(K))); energconsumption->setTransmitterTransmittingPowerConsumption(W((EnergyToCH*bitrate)/(K)));调用方法后模块会自动触发功率重新计算,更新当前的能耗消耗速率。
方案2:自定义继承扩展(适配旧版本INET)
如果你使用的INET版本没有提供公开的setter方法,可以自行继承StateBasedEpEnergyConsumer类扩展功能:class CustomStateBasedEpEnergyConsumer : public inet::power::StateBasedEpEnergyConsumer { public: // 接收功耗设置接口 void setReceiverReceivingPower(W power) { receiverReceivingPowerConsumption = power; // 可选:主动触发功率更新 emit(powerConsumptionChangedSignal, getTotalPowerConsumption()); } // 发射功耗设置接口 void setTransmitterTransmittingPower(W power) { transmitterTransmittingPowerConsumption = power; emit(powerConsumptionChangedSignal, getTotalPowerConsumption()); } };之后将NED文件中radio节点下的energyConsumer类型替换为你自定义的类,运行时将模块指针转换为自定义类指针,调用对应set方法即可生效。
注意事项
- 你贴出的代码存在变量名拼写错误:前面定义的指针变量名为
energconsumption,修改发射功率时使用的是energyconsumption(多了字母y),请先检查实际运行的代码不存在该拼写问题,避免指针访问异常。 - 如果修改参数时Radio已经处于收发状态,需要先调用
energconsumption->getPowerConsumption()强制结算当前状态的已产生能耗,再修改参数避免计算偏差。 - 确认参数修改完成后有实际的收发动作触发能耗计算,如果Radio一直处于IDLE状态,不会产生收发功耗的扣除。
内容的提问来源于stack exchange,提问作者Gérard KPONHINTO
相关产品推荐
相关产品推荐

