创建进程模型属性的作用
可以方便的在外部实现对进程的控制,而不需要进入代码中修改
创建进程模型的属性
进入进程模型——Interfaces——Model Attributes
创建属性项
依据需要创建各种类型的属性,填写属性名,类型,默认值,如果是string类型,默认值可以为空,如果是复合属性,现在还不能指定默认值。如下图所示:
【复合属性】:类似树形结构的属性,有多个子属性
这时,其实属性的创建对于一般使用已经结束,可以返回进程模块,右键-编辑属性,可以看到属性列表已经有刚刚创建的三个属性(此时复合属性还不能使用),接下来的步骤是对属性的特性进行具体的设置。
编辑属性特性
integer类型的属性
选中属性——底部Edit Properties
在特性编辑对话框主要有以下5项可以配置,逐一介绍
-
Attribute Properties 可以选择Private或Public。如果是Private,表明该项属性只能是在该进程中使用;如果是Public,表明该项属性可以在其他进程中也可以使用,此时点击右侧的Save Public可以将已经编辑好的属性保存到本地(opnet模型库),这样在另一个进程的某个属性可以通过Load Public直接加载出来你刚刚保存的属性特性,前提是这两个属性类型一致(指的是string、int等这个类型一致)。当然,加载进来公共属性特性后,你就不能继续对该属性特性进行编辑,因为它不是你私有的,公共的东西怎么可以动呢,哈哈。此时,如果想要增加一些自己特有的属性特性,需要将public改为private,此时就可以继续编辑了。
-
Range:有三种类型:open inclusive exclusive 表示该项属性的范围。open表示上下无限制,inclusive表示包含,exclusive表示除外
-
Symbol map:符号映射,一种符号对应一个值,设置该项是为了方便该属性值的选择,在这儿设置后,之后选择属性值时会有下拉列表,直接从下拉列表中选择需要的值即可。如下图:
-
Default value:默认值,顾名思义
-
还有一个Units忘了框住了,表示该属性的单位,只是一个让人易于理解字面值,没有实际意义,之后会自动在属性一栏中用括号括住,用于备注,帮助理解(此处的单位的显示只会在复合属性的子属性中生效,对于其他类型的属性不会显示)
-
Comments:备注,说明该属性的含义和作用,在进程块将鼠标放到属性左侧的"?"上会提示信息
-
这样,对于integer类型的属性就完整的创建完了,其他除复合属性的类型创建方法与此一致
string类型的属性
- string类型的属性一般用于生成分布函数,我是在研究分布函数,所以单独拿出来介绍
- 如上图Symbol map中,符号和值都设成了一样的名字,便于理解,而每个值代表一中分布函数的string类型(手动输入的),之后会通过函数来调用该类型的分布函数
- 此处分布函数的值可以设置具体的某个参数,也可以不设置具体参数,比如exponential(mean),你也可以直接设置为exponential(10),只是如果不设置具体的参数值,需要在设置参数时,先选中该属性函数,在点击Edit,手动修改mean为某个值。
- 关于如何依据属性获取分布函数,下面再介绍
复合属性
- 将属性类型设置为Compound——选择该属性——Edit Properties
- 在该对话框编辑复合属性的子属性
(1)同样,复合属性的子属性也可以设置对应的特性,同上面int和string类型属性的设置方法
(2)复合属性中也可以嵌套复合属性
如下图第一行:Default number of rows,表示默认生成几个这样的复合属性(不是子属性)
- 点击Edit Row Count Properties,如下图,主要更改的一般就是Range,表示生成该复合属性数目的范围限制,如果将from和to都设为inclusive,值都为1,表示只生成一个该复合属性,这时在进程模块右键编辑属性中可以看到该复合属性下的Row标志也直接没有了,如果将To设为open,表示用户可以生成多个该复合属性,这个有点类似于无线发射机的channel属性,可以生成多个信道channel。
如下图所示,复合属性1只有一个,且并没有Row选项,而复合属性2有Row选项,右键Row,可以复制、删除、插入多个该复合属性
- 编辑复合属性的特性Edit Compound Attribute Properties
在该对话框可以设置复合属性的子属性组合,如下是设置了两个组合,一个Default ,另一个是None
设置好Symbol后,点击对应的Value,可以直接设置对应子属性的值
- 此时复合属性的子属性如果设置了Unit,则会显示
获取进程的复合属性
属性结构
如图所示是属性结构
- 说明:属性Traffic Generation Parameters限制了只有一个Row,只能创建一个该复合属性,所以没有显示Row,但还是有Row0的
Row0的子属性有5个,如下图
进程模块-右键-编辑属性
debug模式下左下角的Attrbute栏描述
在状态机中编写代码获取属性
- 获取进程模块的id
Objid my_id;
my_id = op_id_self();
- 获取进程模型属性的复合属性名为Traffic Generation Parameters的Objid
Objid traf_gen_comp_attr_objid;
op_ima_obj_attr_get(my_id,"Traffic Generation Parameters",&traf_gen_comp_attr_objid);
- 获取第一个该复合属性(即第一个Row:Row0)的Objid,如果有多个该项复合属性,则有多个Row,Row1、Row2
Objid traf_conf_objid;
traf_conf_objid = op_topo_child (traf_gen_comp_attr_objid, OPC_OBJTYPE_GENERIC, 0);//0表示是第一个Row:Row0,如果是Row1,则将0该为1
- 获得Row0的各项子属性
char start_time_string[128];
double stop_time;
op_ima_obj_attr_get (traf_conf_objid, "Start Time", start_time_string);
op_ima_obj_attr_get (traf_conf_objid, "Stop Time", &stop_time);
- 获得Row0的复合属性Objid,同样是使用Row0的属性获取方式
Objid pk_gen_arg_objid;
op_ima_obj_attr_get(traf_conf_objid,"Packet Generation Arguments",&pk_gen_arg_objid);
由自定义的string类型属性使用分布函数
声明外部文件
进入进程模型——File——Declare External Files
选择两个外部文件:oms_dist_support 、oms_string_support
添加头文件
在进程模型HB中添加头文件
#include "oms_dist_support.h"
使用分布函数
- 获取分布函数句柄
OmsT_Dist_Handle start_time_dist_handle;
start_time_dist_handle = oms_dist_load_from_string (start_time_string);
- 由分布函数句柄得到一个输出值
double start_time;
start_time = oms_dist_outcome (start_time_dist_handle);
printf("start time is ",start_time);