OMNeT/OMNEST 4.0 集成开发环境概述
最近想学习一下 OMNetpp 仿真环境的使用,在windows下配置安装环境的过程可以参考这里。
在网上搜索找到一篇由sunfast 翻译的关于 OMnet 4.0 IDE 环境的介绍,感觉翻译得很不错。PDF 版本的翻译文档可以从这里下载,对翻译有疑问的地方,可以参照官方网站的原文,我在这里主要是添加了图片的序号,同时添加了原文的图片。
OMNeT/OMNEST 4.0 集成开发环境概述
A QUICK OVERVIEW OF THE OMNeT++/OMNEST 4.0 IDE
介绍
OMNeT 4.0 集成开发环境基于Eclipse平台,并对编辑器、视图、向导和其他功能进行了扩展。OMNeT增加了模型创建和配置 (NED和ini文件)、执行批处理操作及分析仿真结果等功能,而Eclipse则通过各种开源或者商用的插件来支持C++编辑、集成CVS/SVN和其他的一些可选特性(UML建模、bug跟踪、数据库访问等)。
下面这个屏幕截图显示了OMNeT++ IDE的主要几个组成部分:
图1.OMNet++ 4.0 IDE,编辑一个NED文件

NED 编辑器
NED编辑器支持图形模式和文本模式分别对NED文件进行编辑,用户可以在任意时刻点击编辑器窗口底部的标签,在编辑模式间进行切换。
图2:在图形编辑模式下的NED编辑器

在图形模式下,可以创建复合模块、信道和其他组件类型。可以通过可用模块类型面板(palette)来创建子模块;可以在属性视图里修改Visual和non-visual属性,也可以从文本菜单里选择会话来修改。编辑器提供无限次的撤销/重做、目标克隆、移动及重定义大小约束、目标对齐、放大缩小和其他许多可能的功能。
子模块可以绑定(在指定位置),也可以不绑定(自动布局)。可以编辑修改包括图像背景、网格背景、默认图标(通过显示字符串的继承)、调整图标大小和着色、通信距离和许多其他的图形特性。
图3. 属性视图

属性视图使得用户可以编辑目标对象的图形及非图形属性。具体单元编辑器(special cell editors)使得选择颜色、图标等工作更为便利。属性的更改支持撤销(undo)和重做(redo)。属性视图也可以与其他的编辑器共用,如用于结果分析的Result Analysis,用户可用该编辑器来定制图表和其他对象。
图4. 源代码编辑模式下的NED编辑器

文本模式使得用户能直接和NED 源代码打交道,当按下Ctrl+空格键时,编辑器提供包括关键字、模块类型名、参数、门和子模块名称等的自动识别(上下文感知完成:context-aware completion)。把鼠标移到NED 类型名上面,可以看到所引用的模块类型的文档。在用户在输入的时候,NED 源代码在不断地进行检查和确认( parsed and validated ),左侧的空白处将会实时地显示错误。语法高亮(Syntax highlighting),自动缩进( automatic indentation),同时还提供对OMNeT++ 3.x NED 语法的自动转换。
图5. 大纲视图
大纲视图显示了NED 文件的框架结构,无论是图形模式还是文本模式,还有导航(模式)。
其他视图:NED 编辑器还可以使用模块层次视图和NED 参数视图,它们显示了子模块的层次、选定模块或子模块的参数,这些视图将在下一节的ini 文件编辑器里描述;还有问题视图(Problems View ),显示了在NED 文件以及其他文件里的错误和警告;任务视图(Tasks View )显示了NED 文件和其他源文件中的FIXME 和TODO 注释内容。
Ini文件编辑器
Ini 文件编辑器用于用户配置仿真模型的运行。可以基于样式(form-based),也可以直接编辑源码。
图6. 基于样式(Form-based)的 ini 文件编辑
Ini 文件编辑器具有所有支持的配置选项、提供有关配置的多种样式,并通过标题来组织。有关描述和默认值显示在工具提示栏,便于阅读。Ini 文件的结构(段和他们的继承树)同样是可见的、可编辑的[通过鼠标拖曳和对话框]。
支持语法检查和内容自动识别,编辑器支持“撤销/重做”操作,支持3.x 版本的自动转换。
图7. ini 文件的源代码编辑器

ini 文件源码编辑器文本模式编辑器可让用户直接和ini 文件打交道,对于高级用户来说,这比样式模式下更为有效。提供无限制的撤销/重做,语法着色等,当用户在输入时,自动进行文件分析,实时显示错误和警告。
编辑器知道所有的NED 声明(简单模块、复合模块、信道等),并充分挖掘这些信息以助于给用户提供诊断和帮助。看一下network= 这个配置项(configuration key),它知道顶层复合模块的的NED 类型,并通过递归列举(recursively enumerating)顶层模块的子模块、子-子模块、子-子-子模块…等来内建一个网络的静态图,并一直把这个信息与ini 文件内容联系起来。编辑器知道ini 文件里的哪些配置项对应哪些模块参数,哪个配置项是未用的、哪个模块参数是开放(open)的,如未赋值,并在工具提示栏显示这个信息作为警告。
图8. The Add Missing Keys dialog

为了尽快从零开始创建ini 文件,编辑器提供了一个Add Missing Keys 对话框,点击OK 后,编辑器就会给所有未赋值的NED 参数插入ini 文件配置项,用户只需提供值就可以了。
图9. 模块层次视图

模块层次视图显示了当前配置下的网络的子模块层次及其模块参数。它告诉我们模块参数是如何获得值的(在NED文件里使用默认值或者从ini文件获得)。通过(右键的)文本菜单,用户可以直接跳到模块的NED声明、子模块、参数、门以及参数获得值的位置(NED或者ini文件)。
视图可以绑定(pinned to )到一个具体的编辑器,来阻止当用户在NED 和ini 文件编辑器之间进行切换的时候,它的内容被改变。
图10. NED 参数视图

默认情况下,NED 参数视图显示了当前配置下的网络中的所有未赋值NED 参数列表,可以切换该视图来显示所
有的参数,包括赋值和未赋值的。对于已赋值的参数,视图显示他们是如何获得值的,是从NED 里初始化、还是从ini 文件中获取。同样,该视图可以被绑定。
图11. The Problems View

问题视图(Problems View)以一种统一的方式来显示来自NED 文件、ini 文件和其他源文件中的错误、警告和信息消息。双击某项将打开相应的文件并来到错误所在的位置。视图内容可以通过不同的方法进行过滤(当前文件、当前工程、所有工程、或者根据严重程度)。
Other Views. The Outline View displays the list of sections in the current ini file, and can be used for navigation as well.
运行仿真
OMNeT++ IDE 可以直接在集成环境里运行仿真。它可以把仿真直接作为一个普通的C/C++应用程序来运行,并在其之上执行C++源码级的调试。可以作为一个独立的程序运行(在Tkenv 或Cmdenv 下); 也可以作为不同参数或者随机数种子的批处理运行。(备注: 一个基于Eclipse 的运行时环境IDEEnv 目前还没推出,计划在未来的发行版本推出)。
图12. 运行对话框——显示一个仿真运行配置

在 Eclipse IDE 里,运行配置里描述了运行一个程序的不同方法。有多种不同的运行配置类型(C/C++应用程序、JAVA 应用程序等等)。在首次运行一个程序时,用户首先创建一个运行配置的例程、填上空白内容(程序名、命令行参数等等)、然后点击Run 按钮。OMNeT++给仿真提供了多种的配置类型:一种是对普通“C/C++本地程序”运行类型进行仿真标签扩展(便于编辑仿真相关的命令行选项);还有一种是仿真运行或者仿真批处理的独立运行类型。前者也可用于C++调试。
对话框显示了QueueNet 样例仿真模型的一个独立运行类型。通过在对话框中指定多于一个的运行数目来运行批处理仿真。Ini 文件允许用户定义不同的场景,这些场景会对给定的NED 参数的一个值清单进行遍历(iterate over)、并根据不同的种子执行多个运行(在4.0 发行版中改进);运行对话框显示哪些运行对应那些参数和种子设置,以此来帮助用户选择所期待的运行数目。
如果是多处理器或多核计算机,可以通过指定一次运行多个仿真过程(process)来进行。
图13. 过程视图

当你的仿真运行时间较长、或者你正在执行批处理中的多个运行,过程视图(Progress View)报告了仿真执行的状态。如果需要的话,可以点击来取消整个批处理操作。多个仿真运行在不同的过程,这些过程不会妨碍IDE,这样一来,当用户的仿真正在后台运行时,用户仍然可以继续手头的工作。上面这个屏幕截图中,并行运行的过程数目有两个;#1 已经结束(不再显示),而#3 在#2 仍在运行的时候已经在运行了。
图14. 控制台视图

每个运行中的过程(process)都会把自身的输出发送到控制台视图里的一个单独的控制台缓冲(console buffer),这样用户在仿真完成之后可以重新查看那些输出。可以通过控制台视图的菜单或者工具栏在控制台缓冲之间进行切换,或者在调试视图里对过程进行双击。
图15. 在Debug 视图中显示一个仿真批处理中的三个运行

调试视图(Debug View)是Eclipse 的另一个标准视图,但它不仅仅只用于调试。过程视图仅仅只显示当前执行的过程,而调试视图将已经终止的过程也一并显示,以及他们的退出代码。通过运行数目和运行时间来标记过程,更容易识别,双击项目(items)在控制台视图里显示过程的输出。
顺序图(Sequence Chart )
OMNeT++ 4.0 仿真内核可以在仿真运行过程中记录各种事件日志:自消息的调度和取消、消息的发送、更改显示、模块和链接的创建和删除、用户日志消息等等。内核将产生一个事件日志文件,包含仿真的详细信息,之后可以用于各种不同的用途,比如在一个顺序图上对模块之间的消息交换进行可视化。文件格式是基于行的(line-based)的文本格式,便于第三方工具的处理。
图16. 显示一个无线网络中的ARP的顺序图

在IDE中,一个事件日志可以被顺序图可视化。在顺序图中,事件用点表示,而消息的发送/调度/重用操作则用箭头表示。可以通过模块、消息类型和其他的标准对该图进行过滤;也可以通过一个具体事件的产生原因和结果来进行过滤, (通过仿真时间中的前后箭头)。图表时间线(chart timeline)可以用不同的模式显示,比如线性的(仿真时间), 紧凑的(非线性的), 还有基于事件数的。模块轴排序、在轴上显示状态向量数据(通过向量输出文件)、缩放以及特殊的导航选项、还有将图表以SVG格式输出。
事件日志表(Event Log Table )和顺序图(Sequence Chart)都可以有效地显示几个GB的事件日志文件,而无需要求太多的内存空间。
图17. 事件日志视图

事件日志表显示了在仿真期间所记录的事件日志文件的内容;与顺序图一样,事件日志表同样支持过滤。
Scave(结果分析)
Scave 是OMNeT++的结果分析工具,它的任务是帮助用户对保存到向量和标量文件中的仿真结果进行处理和可视化。有了Scave,不管是单仿真运行的输出(一个或两个文件)、或者是仿真批处理的结果(可能有几百个文件,且在不同目录下),用户的工作照样从容不迫。
支持系统化、可重复的处理,这意味着所有的处理和图表都存储为“食谱(recipe)”;举个例子,如果仿真因为一个模型漏洞或者配置错误而需要重新运行,已有的图表不需要从头开始重画,只需用新的结果文件来取代旧的,就会使得图标自动显示新数据。
Scave 是一个多标签页编辑器(multi-page editor)。编辑器编辑的是“食谱”:结果文件作为它的输入、从结果文件获得数据以供处理、并创建相应的图表;编辑器的几个标签页对应这几个步骤。【What the editor edits is the“recipe”: what result files to take as inputs, what data to select from them, what (optional) processing to apply, and what
kind of charts to create from them. The pages (tabs) of the editor roughly correspond to these steps】你将会看到,Scave 不仅仅是OMNeT++ 3.x 中的Scalars 和Plove 工具的联合。
图18. 指定输入文件用于数据分析

第一页(标签)显示,结果文件是分析的输入文件。上半部分通过显式的文件名或者通配符来指定所要选择的文件。下半部列出了具体的匹配到输入规范的文件,以及他们所包含的运行(runs)。注意:除了实际记录的代码外,OMNeT++4.0结果文件包含一个唯一的运行ID和几个元数据注释(metadata annotations)。最右侧第三颗树根据他们的‘实验—测量—重复’标签来组织这些仿真运行。通常的基本假设是用户会组织他们基于仿真的研究来进行各种“实验”,一个实验会包含多次“测量”,很多情况下相同的仿真模型会在不同的参数设置下进行,也就是说,用户会在参数空间里进行多次仿真运行。为了使得最终的统计更可信,每个测量都将可能在不同的随机数种子情况下重复多次。有了OMNeT++ 4.0中的增强型 ini 文件,建立这样的场景变得容易,并且那些‘实验—测量—重复’标签或多或少可以自动赋值—更多详细内容请参见ini文档 (“OMNeT++ 4.0 仿真配置 Configuring Simulations in OMNeT++ 4.0”)
图19. 浏览仿真产生的向量和标量数据

第二页用表格的形式显示结果(向量、标量和柱状图),用户可以浏览它们。可以对结果进行排序和过滤,可以用组合框(combo boxes)进行简单的过滤,如果还不够理想的话,用户可以使用一个通用的模式匹配扩展语言来编写任意复杂的过滤器。所选择或所过滤的数据可以马上记录到数据集(datasets)中,以便进一步处理。
图20. 定义用来分析的数据集

图21. 线条图 (A Line Chart)

图22. 柱状图

图23. 输出向量视图 (Output Vector View)

图24. 数据集视图 (Dataset View)

Related posts:


您好,请问omnet和omnest是同一个软件吗?谢谢!
是相同的,但是它们的 liscense 不一样,Omnest 是商用的。
大家好,我想把一些数或者字符串存入到一个类似MFC里面的CArray里面,可是在omnet下的cArray的Add方法不能加数和字符串怎么办啊!多谢指教啊!
leeing,多谢你的回复和关注,我看到一些帖子说omnet可以在vc下调试运行,可是里面说的选项我都找不到,请问是怎么回事啊?我用的是omnet4.1,安装的时候运行里面的mingwenv.cmd就可以用了,别人说的用法都不好使,我的QQ:381484656,可以的话希望能向你多学习,万分感谢!
经过苦思冥想,我终于找到了解决cArray类的Add方法不能加入cObject以外变量的方法,既然它要求要用cObject类对象,那咱就构造一个类,继承自cObject,也就OK了!方法虽然有些牵强,但是还是解决问题了,好兴奋,在这里班门弄斧一下,希望高手们不要取笑哦!不过还有就是omnet动态添加的模块不能自动调用initialize()函数还是没有解决,希望好心的朋友知道答案的话给点提示,谢谢!
不好意思,上面的方法也解决不了问题,而且程序老是报错!今天终于找到原因了,原来cArray是cMessage的一个内部类,不能像MFC里面一样用,不过新建一个.msg文件,把要存储的变量放在这个message类中,omnet会在编译时生成c++源文件,并提供每个变量的set和get方法,非常好用!
@孟辉:你可以看看这个链接, http://www.omnetpp.org/pmwiki/index.php?n=Main.RecompilingWithMSVC ,上面说,建议4.x版本的都使用内嵌的MingGW 进行编译。