本节主要是关于信道(channel)的相关知识。
信道封装了与连接关联的参数和行为,信道与简单模块类似,在它们背后就是C++类,在默认情况下,类名与NED的类型名相同,除非有一个@class属性(@namespace也需要注意),例如,下面的信道类型需要一个名为CustomChannel 的C++ 类。
channel CustomChannel // needs a CustomChannel C++ class
{
}
跟简单模块不同的是,一般情况下不需要自己来定义信道类型,只需要从系统中已经预定义好的信道类型进行特殊化即可,内建的类型有: ned.IdealChannel, ned.DelayChannel and ned.Datarate-Channel。 (“ned” 是包名,和Java类似的是可以用import ned.* 来导入所有这三种类型,这样就不用写前缀ned)。
IdealChannel
DelayChannel
- 有两个参数。
- delay是一个double类型的参数,代表传播时延,可以用s,ms,us来指定。
- Disabled是一个布尔值,默认为false,当设为true时,信道对象会丢弃所有的信息。
DatarateChannel
- 与DelayChannel相比,它有更多的参数。
- datarate是一个double型的参数,代表信道的数据率,可以用bps,Kbps,Mbps,Gbps来指定,默认值是0,代表无限带宽。
- ber和per分别代表比特错误率和包错误率,并且允许基本的错误建模。它们是随机生成的范围在0到1之间的数值。通过在包对象中设置一个错误的标记(error flag),接收的模块进行检查并丢弃标记为冲突的数据包。它们的默认值都是0。
注意: There is no channel parameter that would decide whether the channel deliversthe message object to the destination module at the end or at the start of the reception; that is decided by the C++ code of the target simple module. See the setDeliverOn-ReceptionStart() method of cGate.
Read more…
本节内容是复合模块,即 Compound modules。
一个复合模块可以拥有gates和参数,但是并没有C++代码与之关联。如果想要为一个复合模块添加代码,可以将代码封装为一个简单模块,然后以子模块的方式来添加到复合模块中。
一个复合模块的声明可以包含若干部分,它们都是可选的:
module Host
{
types: // 在这里定义内部类型,如模块和信道类型等,仅在本地使用
...
parameters:
...
gates:
...
submodules: // 子模块,可以创建子模块向量,子模块的类型可以来自参数
...
connections:// 可以通过循环,条件等创建连接,连接的行为可以通过将信道与连接联系来定义,信道的类型也可以来自参数
...
}
复合模块可以通过继承来扩展,继承时不仅可以加入参数和gates,还可以加入新的子模块和新的连接,但是不能对子模块或连接进行“de-inherit”,或者修改所继承的模块或类型。
Read more…
本节介绍简单模块。
简单模块是在模型中活动的组件,它用关键字 simple 来定义。
simple Queue
{
parameters:
int capacity;
@display("i=block/queue");
gates:
input in;
output out;
}
Parameters和gates部分都是可选的,即是说如果没有parameter或gate的话就可以不写。而且parameters关键字本身也是可选的,就算参数和属性存在也可以忽略它。
NED定义不包含模块的任何操作,操作是用C++来定义的,默认情况下OMNet将查找与NED类型同名的C++类(在这里是Queue)。
可以用@class 属性直接指定C++类,类也可以包括命名空间,如下例使用了mylib::Queue
simple Queue
{
parameters:
int capacity;
@class(mylib::Queue);
@display("i=block/queue");
gates:
input in;
output out;
}
如果几个模块都在相同的命名空间里,那最好用@namespace代替@class属性,例如下面的例子会自动添加命名空间mylib作为前缀:
@namespace(mylib);
simple App {
...
}
simple Router {
...
}
simple Queue {
...
}
Read more…
本文是对 OMNet++4.0 中的 NED 语言的学习笔记,其内容来自OMNet++ 4.0 用户手册的第三章第1,2节。
用户需要用NED语言来描述一个仿真模型。NED代表Network Description(网络描述),它让用户声明简单模块(simple modules),从而连接或重组为复合模块(compound modules),或将一些复合模块标记为networks(网络)或自包含(self-contained))的仿真模型。信道是另一个组件类型,它的实例也能使用在复合模块中。
NED的几个特性让它能在大型项目中也具有可伸缩性:
- 分层 复杂的模块作为一个实体,可以分解为更小的模块,从而组成复合模块。
- 基于组件 简单模块和复合模块都是可重用的。
- 接口 接口可以在应该使用模块和信道的地方作为一个占位符(placeholder)存在,而真正的模块或信道类型则可以在网络建立的时候通过参数来决定。例如对于一个复合模型MobileHost,它包含一个拥有IMobility模块接口的mobility子模型,那么类型可以从实现了IMobility接口的RandomWalkMobility,TurtleMobility中来选择。
- 包 采用了类似于Java 的package机制来减少冲突,而ned引入的NEDPATH则类似于Java的CLASSPATH,用于指定依赖关系。
- 内部类型 在复合模块中本地使用的信道类型和模块类型可以在复合模块内部定义,这是为了减少命名空间带来的问题。
- 元数据注解 可以通过添加属性来为模块,信道类型,参数,gates加以注解。仿真核心并不直接使用元数据,但它们能携带为多种工具添加额外的信息,运行时环境,甚至模型中的其它模块。例如,一个模块的图形化表示(图标等)或者提示符及一个参数的测量的元(milliwatt等)都通过元数据注解来指定。
注意 继承,接口,包,内部类型,元数据注解都是在4.0之后才加入的新特性。而且NED语言可以和XML进行相互转化而不会损失数据。
下面通过一个例子来学习NED语言。
本例中的网络由结点组成,每一个结点都有一个以随机间隔时间来生成数据包的应用程序,结点本身也拥有路由功能。这里假设这个应用基于数据报进行通讯,这样就不用考虑传输层。
首先用NED来描述下图所表示的网络:

网络拓扑
// 定义了一个名为 Network 的网络,在 NED 语言中,注释的另一个作用是能生成文档。
network Network
{
submodules:
node1: Node; // Node 类型在后面再定义
node2: Node;
node3: Node;
...
connections: // 定义了结点的连接方式:双向,速度为 100Mbps
node1.port++ <--> {datarate=100Mbps;} <--> node2.port++;
node2.port++ <--> {datarate=100Mbps;} <--> node4.port++;
node4.port++ <--> {datarate=100Mbps;} <--> node6.port++;
...
}
Read more…
评论