OMNeT++中electricityConsumption无法生成.vec文件问题求助
从你的代码和配置来看,有几个关键问题导致没有生成向量记录文件,我来逐一帮你分析:
1. INI配置错误(最关键)
你在.ini里写的:
**.electricityConsumption.result-recording-modes = -vector
这里的-vector是禁用向量记录的意思!OMNeT++的配置语法中,前缀-表示移除该记录模式,这行相当于直接关闭了向量输出,自然不会生成.vec文件。
修复方法:把这行改成启用向量记录:
**.electricityConsumption.result-recording-modes = vector,stats
如果你只需要向量记录,写vector即可,这样就能触发向量文件的生成。
2. 仿真异常终止导致记录不完整
在handleMessage的else分支中,你抛出了cRuntimeError:
else { throw cRuntimeError("self-message not delivered"); cancelEvent(endTxEvent); }
一旦counterSend超过4,仿真会直接崩溃终止,OMNeT++没有机会完成统计文件的写入流程。而且抛出异常后,后面的cancelEvent根本不会执行。
修复方法:移除异常抛出,改成正常终止事件调度:
else { cancelEvent(endTxEvent); EV_INFO << "All consumption values have been sent, stopping transmission events." << endl; }
这样仿真会正常结束,统计系统能完整写入数据到文件。
3. 验证信号发射是否实际执行
虽然你的信号注册逻辑是正确的(registerSignal("electricityConsumption")和NED里的信号定义匹配),但可以添加日志确认emit语句是否被触发。比如在每个case的emit前后加输出:
// 以case 1为例 if(valEConsumption1 > 0.0){ double electricityConsumption = valEConsumption1; EV_DEBUG << "Emitting electricityConsumption (case 1): " << electricityConsumption << endl; emit(electricityConsumptionSingnalId, electricityConsumption); send(EConsumptionRSFMessage->dup(), "outElectricityConsumptionRSF"); }else{ double electricityConsumption = 0.0; EV_DEBUG << "Emitting electricityConsumption (case 1, zero): " << electricityConsumption << endl; emit(electricityConsumptionSingnalId, electricityConsumption); }
运行仿真后查看日志,如果看不到这些输出,说明你的case分支没有被正确执行,可能是counterSend的逻辑有问题,或者XML参数加载失败。
4. 确认模块路径匹配
确保INI里的配置能正确作用到你的EConsumerRSF模块。如果你的模块在特定的子路径下(比如network命名空间对应的模块路径),可以把INI配置改成更明确的路径:
**.EConsumerRSF.electricityConsumption.result-recording-modes = vector,stats
避免全局匹配可能出现的路径不匹配问题。
额外检查点
- 确认XML参数
ElectricityConsumptionRSFLoadProfile正确加载:初始化代码里的EV << "Read value: " << valEConsumption << std::endl;应该输出读取到的数值,如果都是0,那emit的都是0,但即使是0也应该生成.vec文件,只是数据全为0。 - 检查仿真输出目录:默认OMNeT++会把结果文件放在
results文件夹下,确保你找对了位置,或者在INI里用output-dir = ./my_results指定自定义输出目录。
按照以上步骤修改后,应该就能正常生成.vec文件了。
内容的提问来源于stack exchange,提问作者Kerstin

