文本建模
外部模块访问( EMA, External Model Access),它采用文本方式建模,可以用循环语句来刻画多个特定规格的节点。
一般过程:
首先在图形界面下做一个简单的网络模型(可以只包含一个网络对象,例如一个固定节点或一个移动节点),选择 Topology→Export Topology→To EMA 就可以生成 EMA 文件( *.em.c),仔细观察这个文件,就可以发现文件中包含设置节点属性的函数,通常是ema_obj_attr_set()等函数,手动把这个函数放置到一个 for 循环语句里,再把函数设置的属性值(如坐标、名称)改为变量,这样就可以通过循环设置大量的节点。
改完后需要在 OPNET 控制台( console)下进行编译,具体步骤如下:
( 1)打开 OPNET 控制台窗口,进入修改过的*.em.c 所在目录
( 2)输入命令 op_mkema -m 文件名<不加后缀>。
( 3)执行刚创建的可执行文件<文件名.i0.em.x>。整个操作过程如图所示。
( 4)在 OPNET 菜单中点击 File->Model Files->Refresh Model Directories 刷新模型目录,在项目编辑器中选择Scenarios→Scenario Components→import...
EMA 与外部数据的接口
EMA设置对象的自定义属性
( 1) 读取数据文件,这里给出一个样本程序:
double double_data; string node_name; printf ("开始读入%s 文件.\n", FILE); fp = fopen(FILE, "r"); if (fp == NULL) printf ("打不开文件%s.\n", FILE); while (fscanf (fp, "%f;%s", &double_data,node_name) != EOF) { //找到 node_name 对应的节点 Objid //根据这个 Objid 给节点设置属性值 double_data } fclose(fp); printf ("成功读入文件%s.\n", FILE);
( 2)定义所需变量
EmaT_Model_Id model_id;
这时整个 EMA 模型的 ID 号,导出的 EMA 文件已经自动定义好
EmaT_Object_Id node_objid, self_attr
定义需要设置属性的节点 Objid ( node_objid)和自定义属性对象的 Objid ( self_attr)
( 3)创建自定义属性对象
Self_attr = Ema_Object_Create (model_id, OBJ_ATTR_PROPS);
( 4)
Ema_Object_Attr_Set (model_id, self_attr, "units", COMP_CONTENTS, "", "default value", COMP_CONTENTS_TYPE, EMAC_DOUBLE, "default value", COMP_CONTENTS, (double) 0, "high limit", COMP_CONTENTS, (double) 0, "low limit", COMP_CONTENTS, (double) 0, "symbol map list", COMP_INTENDED, EMAC_DISABLED, "flags", COMP_CONTENTS, 0, "data type", COMP_CONTENTS, 1, "count properties", COMP_INTENDED, EMAC_DISABLED, "list attribute definitions",COMP_INTENDED, EMAC_DISABLED, EMAC_EOL);
( 5)绑定自定义属性的名称( attr name)及其 Objid( self_attr)
Ema_Object_Prom_Attr_Set (model_id, node_objid, "attr name", self_attr);
(6 )将从步骤( 1)读到的数据 double_data 设置为自定义属性的值。
Ema_Object_Attr_Set (model_id, node_objid, "attr name",COMP_PROMOTE, EMAC_DISABLED, "attr name",COMP_CONTENTS, (double) double_data, EMAC_EOL);