zoukankan      html  css  js  c++  java
  • OMnet++ 初学者教程 第一节 入门

    第1部分-入门

    1.1模型

    首先,让我们从一个包含两个节点的“network”开始。节点将做一些简单的事情:一个是节点将创建一个数据包,而两个节点将继续来回传递相同的数据包。我们将节点称为tictoc。稍后,我们将逐步改进此模型,并在每个步骤中引入OMNeT ++功能。
    这是您从头开始实施首次仿真所采取的步骤。

    1.2设置项目

    通过输入omnetpp终端来启动OMNeT ++ IDE 。(我们假设您已经安装了有效的OMNeT ++。如果没有,请安装最新版本,并根据需要咨询_安装指南_。)进入IDE后,从菜单中选择“新建”->“ OMNeT ++项目”。

    将出现一个向导对话框。输入tictoc作为项目名称,在询问有关_项目_的初始内容时选择“_Empty _Project”,然后单击“完成”。你将在_Project Explorer中_看到一个空项目。(注意:某些OMNeT ++版本会package.ned在项目中生成文件。我们现在不需要它:通过选择文件并单击Delete删除文件。)
    该项目将保存属于我们模拟的所有文件。在我们的示例中,项目由一个目录组成。对于较大的模拟,通常将项目的内容分类到src/simulations/文件夹中,并一般将其放在这两个子文件夹下。
    Note 注意!
    使用IDE完全是可选的。命令行也上可以使用OMNeT ++的几乎所有功能(某些图形密集型和交互式功能(如序列图浏览和结果绘图)除外)。可以使用任何文本编辑器来编辑模型源文件,并且OMNeT ++提供了用于特殊任务的命令行工具,例如生成文件,将消息文件转换为C ++,结果文件查询和数据导出等。要在没有IDE的情况下继续操作,只需创建一个目录,然后使用您喜欢的文本编辑器在其中创建以下NED,C ++和ini文件。

    1.3添加NED文件

    OMNeT ++使用NED文件来定义组件并将它们组装成更大的单元,例如网络。我们开始通过添加NED文件来实现我们的模型。要将文件添加到项目中,请在左侧的_项目资源管理器_面板中右键单击项目目录 ,然后 从菜单中选择_NEW->网络描述文件Network Description File(NED 网络描述文件)_。提示您输入文件名时输入tictoc1.ned
    创建文件后,可以在OMNeT ++ IDE的“_编辑器”区域_中编辑该文件。OMNeT ++ IDE的NED编辑器有两种模式:“_Design”_和“Source”。您可以使用编辑器底部的标签在它们之间切换。在Design 模式下,可以使用鼠标和右侧的调色板以图形方式编辑拓扑。在_Source模式(源代码模式)_下,可以直接编辑NED源代码文本。在其中一种模式下所做的更改将立即反映在另一种模式下,因此您可以在编辑期间自由地在两种模式之间切换,并选择在更方便的任何一种模式下进行更改。(NED文件是纯文本文件,因此您甚至可以使用外部文本编辑器来编辑它们,尽管您会错过语法高亮显示,内容辅助,交叉引用和其他IDE功能。(那就不用外部编辑器呗!))
    切换到“_Source”_模式,然后输入以下内容

    simple Txc1
    {// 定义一个简单模块
        gates:
            input in;
            output out;
    }
    
    //
    // Txc1的两个实例(tic和toc)双向连接
    // Tic 和 toc 会互相发送信息
    //
    network Tictoc1
    {//定义一个网络模块
        submodules:
        //网络模块由两个子模块组成吗,子模块的两个组成部分tic,toc
            tic: Txc1;
            toc: Txc1;
        connections:
        // 子模块之间的连接,但相箭头表示单向链接,{}中间定义连接的传输延时是100ms
            tic.out --> {  delay = 100ms; } --> toc.in;
            tic.in <-- {  delay = 100ms; } <-- toc.out;
    }
    

    完成后,切换回_Design_模式。您应该会看到类似以下内容的内容:

    文件中的第一个块声明Txc1为简单模块类型。简单模块在NED级别上是原子的(最小模块,不可被拆分了)。它们也是活动组件(意思是组成其他大模块的组件),其行为是用C++实现的。该声明还说 Txc1有一个名为输入的门in和一个名为的输出门out
    第二个块声明Tictoc1作为network(网络)。Tictoc1是由两个子模块组装而成的,并且这两个子模块tic,``toc都是Txc1的实例, tic的输出门(gate)连接到toc的输入门(gate),反之亦然。两种方式都有100ms的传播延迟。
    笔记
    您可以在《OMNeT ++仿真手册》中找到有关NED语言的详细说明 。(也可以在doc OMNeT ++安装目录中找到该手册。)

    1.4添加C ++文件

    现在,我们需要在C ++中实现Txc1简单模块的功能。txc1.cc通过从项目的上下文菜单中选择“新建”->“源文件”(或从IDE主菜单中选择“_File”->“New”->“File ”)_来创建一个文件名(指定文件夹创建文件,注意填写后缀,不然默认创建.h文件),然后输入以下内容:

    #include <string.h>
    #include <omnetpp.h>
    
    using namespace omnetpp;
    
    /**
     * 类Txc1继承cSimpleModule,在Tictoc1 网络结构中,tic和toc斗士Txc1类的实例,
     * 他们在仿真程序开始运行的时候就会被创建
     */
    class Txc1 : public cSimpleModule
    {
      protected:
        // The following redefined virtual function holds the algorithm.
        virtual void initialize() override;
        virtual void handleMessage(cMessage *msg) override;
    };
    
    // The module class needs to be registered with OMNeT++
    // 定义的类Txc1都需要在OMNET++注册后才可以被使用
    
    Define_Module(Txc1);
    
    void Txc1::initialize()
    {
        // 仿真开始最初运行的程序.
        // 引导运行tic-toc-tic-toc进程, 
        // 其中一个模块需要发送第一条信息,我们让tic先发送。
    
        // 首先判断是tic还是toc
        if (strcmp("tic", getName()) == 0) {
            // 在out门(gate) 发送第一条信息,我们在message对象中随意发了一个 "tictocMsg"
            cMessage *msg = new cMessage("tictocMsg");
            send(msg, "out");
        }
    }
    
    void Txc1::handleMessage(cMessage *msg)
    {
        // handleMessage()函数:当信息传输到当前module时被唤醒
        // 这这个module中的这个函数,我们仅仅从out gate 中发送msg。
        // 因为tic和toc都做同样的事情,所以他们会来来回回的互发信息
        send(msg, "out"); // 发送 message
    }
    

    Txc简单module,由C ++类表示Txc1。的Txc1 类需要继承的OMNeT ++的cSimpleModule类,并需要在OMNeT ++注册Define_Module()宏。
    笔记!
    忘记Define_Module()定义宏一个常见的错误。如果缺少该内容,则会收到与以下内容类似的错误消息:。"Error: Class 'Txc1' not found -- perhapsits code was not linked in, or the class wasn't registered with Register_Class(), or inthe case of modules and channels, with Define_Module()/Define_Channel()"
    我们从重新定义两种方法cSimpleModuleinitialize()handleMessage()。它们是从仿真内核调用的:initialize()仅调用一次,handleMessage()在消息到达模块时调用。
    在其中,initialize()我们创建一个消息对象(cMessage),然后将其从outgate发送出去。由于此门连接到另一个模块的in门,因此在handleMessage()分配给NED文件中的链接的传播延迟为100ms之后,仿真内核将在以下参数中将此消息传递给另一个模块。另一个模块只是将其发送回去(另一个100毫秒的延迟),因此它将导致来来回回的互相发送一样的信息。
    Messages(数据包,帧,作业等)和events(计时器,超时)均由OMNeT ++中的cMessage对象(或其子类)表示。在发送或安排它们之后,它们将由仿真内核保存在“预定事件”或“未来事件”列表中,直到时间到了,并通过handleMessage()传递给modules.
    请注意,此模拟中没有内置停止条件:它将永远持续下去。你可以从从GUI手动停止它。(您也可以在配置文件中指定模拟时间限制或CPU时间限制,但在本教程中我们不这样做。)

    1.5添加omnetpp.ini

    为了能够运行仿真,我们需要创建一个omnetpp.ini文件。 omnetpp.ini告诉仿真程序您要仿真哪个网络(因为NED文件可能包含多个网络),您可以将参数传递给模型,为随机数生成器显式指定种子,等等。
    omnetpp.ini使用_File->New->Initialization file (INI)_ 菜单项创建文件。新文件将在_Inifile编辑器中_打开。作为NED编辑器,Inifile编辑器还具有两种模式,即_Form(表单模式)和_Source(代码模式),它们可以编辑相同的内容。前者更适合配置仿真内核,后者更适合输入模块参数。
    现在,只需切换到“_Source”_模式并输入以下内容:

    [General]
    network = Tictoc1
    

    您可以在“_Form”_模式下验证结果:

    tictoc2所有后续步骤将共享一个通用的omnetpp.ini文件。
    现在,我们已经完成了创建第一个模型的准备,并可以编译和运行它了。

    Omnet++学习资源太少,个人翻译不易。您的每一分钱都会给后来的开发者提供帮助!感谢支持。

  • 相关阅读:
    Workflow in Dynamics AX2009
    Apply Solution Upgrade in Pipeline for Power Platform
    Unmanaged
    数据库行级别权限- MS SQL SERVER 2016
    Power Fx coming to Model-driven Power Apps, Dataverse
    create a new tab and embed the Audit History in the IFrame
    Display different Business Process Flow based on user security role in D365 CE /PowerApps
    [Tip] Business Process Flow’s Enable Security Roles button issue after upgrading to Dynamics 365 / PowerApps
    Control Next and Previous stage movement in Dynamics 365/ CDS Business Process flows using Client API / PowerApps
    How to Set Value in A Regarding Field Using Easyrepro in Dynamics CRM / PowerApps
  • 原文地址:https://www.cnblogs.com/li33/p/14601948.html
Copyright © 2011-2022 走看看