1.5 仿真概念
- OMNet++模型由使用消息(message) 传递通信达模块组成。模块使用C++编写,简单模块可以分组为复合模块等,模块的层次级别可以是无限的。一个仿真模型在OMNeT中称为 网络(network),其本质也是一个复合模块。消息可以通过模块之间的连接发送,也可以直接发送到其他模块。
- 模块之间的 消息通常通过 门(gate) 来发送到其他模块,门是模块的 输入(in) 和 输出(out) 接口,消息通过输出门发出通过输入门接收,模块之间通过 连接(connections) 链接。复杂的复合模块通常有多层(就像网络分层),模块之间不允许跨层级传递,以免妨碍模型重用。可以给连接分配参数如传播时延、数据速率、误码率等,可以定义具有特殊属性的连接称之为 信道(channel) 。模块可以有 参数(parameters) ,可以用于将配置参数传递给简单模块,也可以交互式的进行参数输入。
- OMNeT++为描述实际系统结构提供了一些有效的工具,主要为:分层嵌套模块、模块是模块类型的实例、模块通过信道使用消息通信、灵活的模块参数、拓扑描述语言等。
如下图所示tictoc.ned例子,网络tictoc6就是由两个简单模块Txc6组成,Txc6的具体功能在Txc6.cc(c++文件)中定义。简单模块中定义了输入输出的门,在网络中通过连接将两个模块链接,设置了时延参数为100ms。
#2.2 NED编辑器
- 右键模块图标选择Properties,可以设置模块的位置、外观等设置。
ini文件编辑器
-
在 模块层次结构中,可以看见模块的子模块和配置参数,
-
Problem视图显示NED文件、ini文件中的错误、警告和消息信息;双击可以达到对应的位置
-
在Run仿真后,可以在Process视图中查看仿真运行的状态
-
在仿真开始运行后,输出结果会在控制台(Console)中显示:
-
Process视图只显示正在进行的进程,而Debug视图还会显示已经终止的进程和其退出代码。
-
通配符 * :
**.configuratorDstt.config = xmldoc("inputConfig/demo.xml")
*.globalData.config = xmldoc("inputConfig/DsttIpMacConfigScenario2.xml")
# Interface
**.fcsMode = "computed"
**.crcMode = "computed"
*.*.ethernet.typename = "EthernetLayer"
上面代码中通配符和语法含义如下:
-
*
:表示匹配当前层级的一个模块。它只匹配当前层级的一个模块,不包括子模块。例如,*.parameter
表示匹配当前层级下所有模块的parameter
参数。 -
**
:表示匹配当前层级及其所有子层级的模块。它会递归地匹配所有子模块,直到找到满足条件的模块或达到最底层的模块。例如,**.parameter
表示匹配当前层级及其所有子层级下的所有模块的parameter
参数。 -
*.*
: 匹配两个层级的模块。在这个例子中,第一个*
匹配一个模块,第二个*
匹配这个模块的子模块。 -
**.fcsMode
: 这个模式匹配了所有层级的模块中名为fcsMode
的参数。 -
*.*.ethernet.typename
: 这个模式匹配了所有两层模块层级中的ethernet
子模块,并设置它们的typename
参数为"EthernetLayer"
。
综上所述,这些配置行指示了在仿真中如何设置各个模块的参数,以及如何使用全局配置数据文件。
2.5 序列图
- Omnet++仿真内核会记录在仿真期间的调度和取消自消息、发送消息、接收消息、显示更改、模块的连接创建及删除、用户消息日志等,用于后续的处理,结果是包含仿真信息的事件日志文件,文件格式是基于行的文本。在Omnet++中,可以使用 序列图(Sequence chart) 视图和 事件日志(Event log) 来进行查看,在其中可以根据模块、消息类型和其他标准来过滤,时间线可以以如线性、紧凑、基于事件编号来显示。
但是要记得在启动仿真时的 Run configuration 中勾选
2.6 结果分析
在仿真运行完后,生成 sca文件和vec文件
.sca 文件是标量(Scalar)数据文件的扩展名。它包含了模拟运行期间收集到的标量数据,例如模块的吞吐量、延迟、丢包率等。
.vec 文件是向量(Vector)数据文件的扩展名。它包含了模拟运行期间收集到的向量数据,例如某些模块的状态变化、事件发生次数等。
点击其中一个文件就会打开数据分析界面
- 导入新的输入: 当你要分析的数据除了这个仿真这次运行的结果时,还有其他仿真运行的结果也要加入分析,可以在input界面点击右上角的绿色圆导入或删除数据
在下方三个视图分别为
input:输入 控制输入那些数据进行分析
Browse Data: 浏览数据 以表格形式浏览所有数据
Charts:图标 选择数据生成图表
在 Browse中可以看见,数据分为四种类型:
Parameters: 参数
Scalars: 标量
Histograms: 直方图
Vectors:向量
还可以在下方进行筛选,筛选 实验、模块、数据名称等等
2. 选择数据项后,点击右上角按钮可以将其在图中显示出来
12.1 结果记录
Omnet++中输出结果有主要有标量和矢量,还有直方图可选
输出矢量 是时间序列数据,从简单模块到信道记录。可以使用输出矢量来记录分组的端到端时延、往返时间、队列长度、排队时间、模块状态、链路利用率、丢包等——在仿真运行期间发生在模型中的任何有助于全面了解内容的信息。
输出标量 是汇总结果,在仿真期间计算并在仿真完成时写出。标量可以是数,或者可以是由若干字段组成的统计汇总,例如计数、平均值、标准差、总和、最大值、最小值等 。
有两种结果收集和记录方式:
- 基于信号机制,使用声明的统计
- 直接来自C++代码,使用仿真库
第一种方法结合了信号机制和NED属性,以便于从记录中去耦结果的产生,从而在记录内容和形式上提供更大的灵活性,详见5.10.
第二种方法的缺点是结果记录在模块中是硬编码的,简单的需求变化也需要更改代码或大量模块中的结果收集代码。
建议使用的结果分析路线:
- 使用集成仿真开发环境进行随意分析,即浏览数据和快速绘图
- 使用Python(或 R)程序进行复制的分析并生成定制的报告
集成仿真开发环境在结果分析时的数据选择、处理和制图步骤可以自由组合,从而实现高度自由,这些步骤将被存储为“配方“,当添加新的结果文件或替换现有文件时,该步骤会自动重新应用,可以节省重复的手动工作。