Tictoc示例

  • 格式:pdf
  • 大小:685.27 KB
  • 文档页数:29

tic: Txc1;
//节点 tic
toc: Txc1;
//节点 toc
connections:
//两个节点间的连接定义
tic.out --> delay 100ms --> toc.in;
tic.in <-- delay 100ms <-- toc.out;
endmodule
network tictoc1 : Tictoc1 //网络定义,可见网络就是复合模块类型 Tictoc1 的一个变量(实例) endnetwork
在 C++文档中使用 OMNeT++的 ev 对象输出调试信息: ev << "Sending initial message\n"; //加入到 initialize()函数中 ev << "Received message `" << msg->name() << "', sending it out again\n"; //加入到 handleMessage()函数中
应该注意先定义后使用原则。其含义最好从下向上倒着看:
• (network..endnetwork) 定义了一个网络 tictoc1(仿真的对象); • (module..endmodule) 定义了一个复合模块(类型)Tictoc1,其中包含子模块 tic 和 toc,它们都是简单模块类型 Txc1 的
[General] seed-0-mt=532569 # 或者其它任意 32 位数据
ev << "Message arrived, starting to wait " << delay << " secs...\n"; tictocMsg = msg; scheduleAt(simTime()+delay, event);
另外,可以如下设置丢包率:
if (uniform(0,1) < 0.1) {
#include <string.h> #include <omnetpp.h>
class Txc1 : public cSimpleModule //简单模块在 C++源文件中表现为一个 cSimpleModule 派生类。 {
protected: virtual void initialize(); virtual void handleMessage(cMessage *msg);
9. 你可以调整仿真动画的速度。其它控制如 F8 (停)、F4(单步)、F5(开动画)、F6(关 动画)、F7(加快)等。
参考源文件:tictoc1.ned, , omnetpp.ini
【返回】 【目录】
2. 两节点 TicToc 增强模型
Step 2: 美化图示,增加调试输出
在 NED 文件中使用 display 描述子句美化节点图示。注意 i 标签的含义。 submodules: tic: Txc2; display: "i=block/process,cyan"; // Note "i=<icon>,<color>" toc: Txc2; display: "i=block/process,gold"; connections:
ev << "\"Losing\" message\n"; delete msg; }
虽然引入了随机变量,但相同代码的模型多次运行,得到的结果完全相同,这一特性(可再现)对于仿真是非常重要的。OMNeT++ 使用确定随机数生成算法(缺省为 Mersenne Twister RNG)和相同的种子。在 omnetpp.ini 中可以设置种子:
实例。Tic 的输出门(out)连接到 toc 的输入门(in),Toc 的输出门(out)连接到 tic 的输入门(in),传输延迟均为 100ms; • (simple..endsimple) 定义了一个简单模块(类型)Txc1 。
3. 简单模块(类型)是 NED 描述的基本单位,其算法需要 C++语言实现。简单模块(类型)Txc1 的算法实现源文件 如 下:
本例中去掉 counter 变量,以保持较少的代码。仿真 图示如下:
参考源文件: tictoc5.ned, , omnetpp.ini
Step 6: 随机变量及参数
用变量 delay 表示消息保留时间,并用参数 delayTime 来传值。参数 delayTime 可以引用随机变量(在 omnetpp.ini 中):
OMNeT++ 教程——TicToc
3.2
通过一个建模&仿真实例,介绍 OMNeT++的一些通用特色。 本教程使用的 Tictoc 实例,位于在 OMNeT++安装目录中 samples/tictoc 子目录中。但是一步步按此教程学习,你将收获颇多。 注意:
假定你的系统已经正确安装了 OMNeT++。并且你熟悉 C++语言及其开发过程(编辑源程序,编译,调试等)。 例子中的源程序相关调用请参考 OMNeT++ API 文档。 本文及 TicToc 模型改自 Ahmet Sekercioglu (Monash 大学)的 TicToc 教程.
counter = par("limit");
当 NED 文件中模块含义参数时,可以在 NED 复合模块或网络定义中传值,或者通过配置文件 omnetpp.ini 传递参数。前者优先级 高,但后者相当灵活。
module Tictoc4
submodules: tic: Txc4; parameters: limit = 8; // 复合模块定义,子模块列表中传值 display: "i=block/process,cyan"; toc: Txc4; display: "i=block/process,gold";
private: int counter; // 增加为类成员变量
protected: 在 initialize()函数中将 counter 初始化为 10,并在 handleMessage()函数中每发一次消息将 counter 减少 1,当其减到 0 时不再转发 消息。系统中事件处理完后仿真终止。 WATCH(counter); // 以便在图形界面 Tkenv 中查看 counter 变量 双击节点 tic 图标,然后可看到下图示(模块窗口)。在仿真过程中,可以看到 counter 变量的变化。
因此在类中增加两个 cMessage 指针变量:event 和 tictocMsg。
class Txc5 : public cSimpleModule
{
private:
cMessage *event;
// 定时消息
cMessage *tictocMsg; // 记录需转发的消息
public:
scheduleAt()函数负责给自己发消息,这类消息称为自消息。
参考源文件: tictoc3.ned, , omnetpp.ini
Step 4: 增加仿真参数
simple Txc4 parameters: limit: numeric const; gates:
// 声明了一个新参数 limit
简单模块中的参数最终一般要进入 C++代码中,如在 initialize()函数中读取 limit 来初始化 counter 变量:
1. 建立 tictoc 工作目录,进入此目录。 2. 建立网络拓扑文件 tictoc1.ned(文本文件)
simple Txc1 gates: in: in; out: out;
endsimple
//简单模块类型说明
module Tictoc1
//复合模块类型说明
submodules:
//字模块列表
tictoc6.tic.delayTime = exponential(3) tictoc6.toc.delayTime = truncnormal(3,1)
在 handleMessage()函数中引用参数:
double delay = par("delayTime"); // 每次得到的值都不同
在多模块模型中,特定模块的调试信息可以如下图操作来查 看,以避免快速刷屏。
参考源文件:tictoc2.ned, , omnetpp.ini
Step 3: 增加状态变量
这里增加一个计数器变量,实现消息交换计数。消息交换 10 次后被删除。 class Txc3 : public cSimpleModule {
在 OMNeT++中,仿真概念中的消息和事件都表示为 cMessage 对象。
4. 使用 opp_makemake 命令创建 Makefile 文件。Windows+MSVC 环境用户使用 opp_nmakemake 命令创建 Makefile.vc 文件。
5. 使用 make 命令编译。Windows+MSVC 环境用户使用使用 nmake –f Makefile.vc 命令编译。
};
Define_Module(Txc1);
//简单模块在 OMNeT++中的注册宏
void Txc1::initialize() {
// 仿真初始化,由节点 tic 发出第一条消息 if (strcmp("tic", name()) == 0) {
// 创建并从输出门"out"发出第一条消息"tictocMsg",其消息内容这里并不关心. cMessage *msg = new cMessage("tictocMsg"); send(msg, "out"); } }