如何在OMNeT++中提取消息常量值并生成直方图统计结果
从OMNeT++自定义消息提取常量并生成直方图的实现方法
1 常量字段访问说明
你在.msg文件中定义的msgCLAS消息的固定值字段,会被OMNeT的消息编译器自动生成对应C类的静态常量,无需实例化消息即可直接调用,调用格式为消息类名::常量名,例如msgCLAS::Singclas即可直接获取数值2206。
2 模块头文件配置
在你的统计功能所属简单模块的头文件中,引入生成的消息头和OMNeT++统计工具,声明直方图对象:
#include <omnetpp.h> #include "msgCLAS_m.h" // 消息编译器生成的头文件,名称与你的.msg文件名对应 using namespace omnetpp; class YourStatModule : public cSimpleModule { private: cHistogram clasValHist; // 直方图统计对象 protected: virtual void initialize() override; virtual void handleMessage(cMessage *msg) override; virtual void finish() override; };
3 统计逻辑实现
3.1 静态常量统计
如果你需要统计的是消息定义中所有预设常量的分布,直接在初始化函数中录入所有常量值即可:
void YourStatModule::initialize() { clasValHist.setName("msgCLAS常量值分布"); // 可根据你的常量范围配置分桶规则,也可以留空使用默认自动分桶 clasValHist.setRange(0, 7000); clasValHist.setNumBins(20); // 录入所有需要统计的常量字段值 clasValHist.collect(msgCLAS::Singclas); clasValHist.collect(msgCLAS::Singlial); clasValHist.collect(msgCLAS::Verifclas); clasValHist.collect(msgCLAS::Veriflial); clasValHist.collect(msgCLAS::Aggreclas); clasValHist.collect(msgCLAS::Aggrelial); clasValHist.collect(msgCLAS::Verifagclas); clasValHist.collect(msgCLAS::Verifaglial); }
3.2 运行时消息字段统计
如果你需要统计仿真运行过程中,收到的msgCLAS实例对应字段的出现频率,在handleMessage中加入统计逻辑:
void YourStatModule::handleMessage(cMessage *msg) { // 判断是否为目标消息类型 msgCLAS *receivedMsg = dynamic_cast<msgCLAS*>(msg); if (receivedMsg) { // 按需统计对应字段的数值 clasValHist.collect(receivedMsg->getSingclas()); // 其他字段统计逻辑同理 } // 消息后续处理逻辑(转发/删除等) send(msg, "outputPort"); }
4 结果输出与查看
在finish函数中调用记录接口,将统计结果写入仿真结果文件:
void YourStatModule::finish() { clasValHist.record(); }
仿真运行结束后,打开生成的.sca标量结果文件,在OMNeT++自带的结果分析工具中,选中msgCLAS常量值分布统计项,切换为直方图视图即可展示统计结果。
内容的提问来源于stack exchange,提问作者Mohamed Ha
相关产品推荐
相关产品推荐

