Reputation: 17
I try to record the values of electricityConsumption. For that I build the NED file like this:
simple EConsumerRSF
{
parameters:
volatile xml ElectricityConsumptionRSFLoadProfile;
volatile double sendIaTime @unit(s);
@signal[electricityConsumption](type="double");
@statistics[electricityConsumption](title="Electricity Consumption RSF Unit 1";source="electricityConsumption"; record=vector,stats; interpolationmode=none);
gates:
output outElectricityConsumptionRSF;
}
My c++ class and header file looks like this:
#ifndef __VISIONSIMULATIONOFPED_ECONSUMERRSF_H_
#define __VISIONSIMULATIONOFPED_ECONSUMERRSF_H_
#include <omnetpp.h>
#include <stdio.h>
#include <string.h>
//#include "EConsumptionRSFMessage_m.h"
using namespace omnetpp;
namespace network {
/**
* Network EConsumerRSF; see NED file for more info.
*/
//class EConsumerRSF : public EConsumptionRSFMessage
class EConsumerRSF : public cSimpleModule
{
public:
EConsumerRSF();
virtual ~EConsumerRSF();
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
// virtual void setValEConsumption(double valEConsumption);
private:
int counterSend = 1;
int counterMessage = 1;
double valEConsumption1;
double valEConsumption2;
double valEConsumption3;
double valEConsumption4;
simsignal_t electricityConsumptionSingnalId;
//double electricityConsumption;
double valEConsumption;
double aggregationOfElectricityConsumptionRSF = 0;
cMessage *endTxEvent;
cMessage *EConsumptionRSFMessage;
};
}; //namespace
#endif
#include "EConsumerRSF.h"
#include <stdio.h>
#include <string.h>
//#include "EConsumptionRSFMessage_m.h"
using namespace omnetpp;
namespace network {
Define_Module(EConsumerRSF);
EConsumerRSF::EConsumerRSF()
{
endTxEvent = nullptr;
}
EConsumerRSF::~EConsumerRSF()
{
cancelAndDelete(endTxEvent);
}
void EConsumerRSF::initialize()
{
electricityConsumptionSingnalId = registerSignal("electricityConsumption");
//Get param XMLElectricity file from simple module
cXMLElement *rootelementEConsumption = par("ElectricityConsumptionRSFLoadProfile");
cXMLElementList paramsEConsumption = rootelementEConsumption->getChildrenByTagName("param");
//Loop to iterate through all elements called param
for (const auto & element : paramsEConsumption) {
const char* valueEConsumption = element->getNodeValue();
valEConsumption = atof(valueEConsumption);
EV << "Read value: " << valEConsumption << std::endl;
if (valEConsumption > 0.0) {
//Calculation of electricity supply through utility
aggregationOfElectricityConsumptionRSF = aggregationOfElectricityConsumptionRSF + valEConsumption;
}
switch(counterMessage)
{
case 1:
valEConsumption1 = valEConsumption;
counterMessage++;
break;
case 2:
valEConsumption2 = valEConsumption;
counterMessage++;
break;
case 3:
valEConsumption3 = valEConsumption;
counterMessage++;
break;
case 4:
valEConsumption4 = valEConsumption;
counterMessage++;
break;
}
}
EConsumptionRSFMessage = new cMessage("valEConsumption");
endTxEvent = new cMessage("send/endTx");
scheduleAt(simTime(), endTxEvent);
}
void EConsumerRSF::handleMessage(cMessage *msg)
{
// Check if self message is received
if(endTxEvent->isSelfMessage()){
if(counterSend <= 4){
switch(counterSend)
{
case 1:
if(valEConsumption1 > 0.0){
double electricityConsumption = valEConsumption1;
emit(electricityConsumptionSingnalId, electricityConsumption);
send(EConsumptionRSFMessage->dup(), "outElectricityConsumptionRSF");
}else{
double electricityConsumption = 0.0000000;
emit(electricityConsumptionSingnalId, electricityConsumption);
}
counterSend++;
scheduleAt(simTime()+par("sendIaTime").doubleValue(), endTxEvent);
break;
case 2:
if(valEConsumption2 > 0.0){
double electricityConsumption = valEConsumption2;
emit(electricityConsumptionSingnalId, electricityConsumption);
send(EConsumptionRSFMessage->dup(), "outElectricityConsumptionRSF");
}else{
double electricityConsumption = 0.0000000;
emit(electricityConsumptionSingnalId, electricityConsumption);
}
counterSend++;
scheduleAt(simTime()+par("sendIaTime").doubleValue(), endTxEvent);
break;
case 3:
if(valEConsumption3 > 0.0){
double electricityConsumption = valEConsumption3;
emit(electricityConsumptionSingnalId, electricityConsumption);
send(EConsumptionRSFMessage->dup(), "outElectricityConsumptionRSF");
}else{
double electricityConsumption = 0.0000000;
emit(electricityConsumptionSingnalId, electricityConsumption);
}
counterSend++;
scheduleAt(simTime()+par("sendIaTime").doubleValue(), endTxEvent);
break;
case 4:
if(valEConsumption4 > 0.0){
double electricityConsumption = valEConsumption4;
emit(electricityConsumptionSingnalId, electricityConsumption);
send(EConsumptionRSFMessage->dup(), "outElectricityConsumptionRSF");
}else{
double electricityConsumption = 0.0000000;
emit(electricityConsumptionSingnalId, electricityConsumption);
}
counterSend++;
//cancelEvent(endTxEvent);
scheduleAt(simTime()+par("sendIaTime").doubleValue(), endTxEvent);
break;
default:
cancelEvent(endTxEvent);
break;
}
}else {
throw cRuntimeError("self-message not delivered");
cancelEvent(endTxEvent);
}
}
}
}; //namespace
and I enabled the recording in the .ini file like this:
[Config EConsumerRSF]
**.serviceTime = 1s
**.electricityConsumption.result-recording-modes = -vector
It does not even build the .vec file when I run the simulation. What am I doing wrong? Is it not possible to record results in handleMessage()? Or do I miss something?
Could please someone help me with this issue?
Thanks in advance!
Upvotes: 0
Views: 1176
Reputation: 7002
There are two mistakes in the presented code:
@statistic
(instead of @statistics
). Actually in omnetpp.ini
in the line:
**.electricityConsumption.result-recording-modes = -vector
you have turned off recording of vectors (a minus sign means disabling). To turn on recording of vector change it to +vector
or simply remove this line.
Upvotes: 1