#c #omnet #inet
Вопрос:
Я хотел бы попросить вас о помощи в этом вопросе, с которым я сталкиваюсь. На самом деле, я хочу изменить параметры модуля энергопотребителя во время выполнения. Сценарий заключается в том, что я должен указать количество энергии, когда узлы передают или принимают, в зависимости от состояния радио. Я пришел к этому с помощью этого фрагмента кода. Благодаря этому значения указанных параметров хорошо определены, но проблема в том, что они никогда не вступали в силу по желанию.
Параметризация модуля энергопотребителя заключается в следующем :
cModule *module = getGrandParentModule-gt;getParentModule()-gt;getSubmodule("node",myCHIndex); cModule *energyConsumerCHModule = module-gt;getSubmodule("wlan",0)-gt;getSubmodule("radio")-gt;getSubmodule("energyConsumer"); StateBasedEpEnergyConsumer *energconsumption = check_and_castlt;StateBasedEpEnergyConsumer *gt;(energyConsumerCHModule); cModule *chmodule = module-gt;getSubmodule("generic")-gt;getSubmodule("np"); Sim *chsim = check_and_castlt;Sim *gt;(chmodule); cPar *receivingPower = amp;energconsumption-gt;par("receiverReceivingPowerConsumption"); EV_DEBUG lt;lt;"MY CLUSTER HEAD RECEIVING POWER IS : "lt;lt;receivingPower-gt;doubleValue()lt;lt;endl; EV_DEBUG lt;lt;"NEW VALUE CALCULATED : "lt;lt;((chsim-gt;EnergyCH_RX)*bitrate)/(K)lt;lt;endl; receivingPower-gt;setDoubleValue(((chsim-gt;EnergyCH_RX)*bitrate)/(K)); EV_DEBUG lt;lt;"MY CLUSTER HEAD RECEIVING POWER APPLIED IS : "lt;lt;receivingPower-gt;doubleValue()lt;lt;endl; EV_DEBUG lt;lt;"**************************************************************"lt;lt;endl; cPar *transmittingPower = amp;energyconsumption-gt;par("transmitterTransmittingPowerConsumption"); EV_DEBUG lt;lt;"MY CURRENT TRANSMITTING POWER IS : "lt;lt;amp;energyconsumption-gt;par("transmitterTransmittingPowerConsumption")lt;lt;endl; EV_DEBUG lt;lt;"NEW VALUE CALCULATED : "lt;lt;(EnergyToCH*bitrate)/(K)lt;lt;endl; transmittingPower-gt;setDoubleValue((EnergyToCH*bitrate)/(K)); EV_DEBUG lt;lt;"MY CURRENT TRANSMITTING POWER APPLIED IS : "lt;lt;amp;energyconsumption-gt;par("transmitterTransmittingPowerConsumption")lt;lt;endl;
РЕЗУЛЬТАТ СООТВЕТСТВУЕТ ИЗОБРАЖЕНИЯМ :
Но, как вы можете видеть, никакого потребления энергии не происходит (модуль накопления энергии по-прежнему сохраняет предоставленную начальную энергию в 0,5 Дж), несмотря на некоторое четко определенное значение.
НА СЛЕДУЮЩЕМ ИЗОБРАЖЕНИИ ПОКАЗАНО СОСТОЯНИЕ МОДУЛЯ ХРАНЕНИЯ ЭНЕРГИИ:
Не могли бы вы посоветовать, как мне это обработать?
Большое спасибо за вашу поддержку…
Ответ №1:
StateBasedEpEnergyConsumer
Модуль написан не таким образом, чтобы он ожидал, что определенные параметры изменяются во время выполнения (на самом деле почти ни один из модулей INET не изменяется). Параметр обычно считывается только один раз (обычно на этапе инициализации). После этого они обычно сохраняют значение параметра во внутренней переменной-члене и не заботятся о каких-либо изменениях в будущем. (вы можете это проверить StateBasedEpEnergyConsumer.cc
).
Если вы хотите изменить значения энергопотребления во время выполнения, вам следует написать свой собственный модуль энергопотребления, реализовав power::IEpEnergyConsumer
интерфейс. (или измените текущую реализацию, добавив handleParameterChange()
метод для хранения фактического нового значения в переменной-члене.
Комментарии:
1. Большое спасибо, @Rudi за ваши данные. Я уже читал руководство и слышал об этом
handleParameterChange()
методе, но не смог успешно его реализовать. Теперь вы снова поднимаете это значит идти. Итак, я хотел бы спросить вас, не могли бы вы помочь мне подробнее, объяснив с помощью фрагмента кода, как я могу использовать этот метод.2. Ищите в ИНТЕРНЕТЕ .
handleParameterChange
Вы найдете множество примеров.3. Хорошо, Спасибо. Я вернусь, чтобы дать отзыв.
4. Изменение параметров здесь и там может привести к не лучшей архитектуре программного обеспечения. Я бы предпочел написать пользовательский модуль энергопотребителя, который инкапсулирует всю логику, необходимую для определения фактических значений потребляемой мощности, если они не являются постоянными. Модули, которые неожиданно изменяют параметр другого модуля, могут вызвать непредвиденные ошибки в долгосрочной перспективе.
5. Чтобы предотвратить неожиданности в будущем, мы добавили проверку в omnet (6pre14 или более поздней версии), которая выдаст ошибку, если вы программно измените значение параметра из кода C , если только параметр явно не был отмечен
@mutable
в NED. Это означает, что модели должны явно объявить, что данный параметр может быть изменен в любое время, и код модуля C будет обрабатывать его должным образом. В противном случае параметр должен обрабатываться какconst
, и при попытке его изменения будет выдана ошибка.