OPNET核心函数学习(一)

来源:互联网 发布:javescript高级编程 编辑:程序博客网 时间:2024/06/16 01:22
1 分布类核心函数
分布类核心函数功能:按照指定的概率分布函数产生随机值。
op_dist_uniform():输入参数为非0实数,代表取值上限,产生均匀分布的随机数,注意:不包含此上限。
op_dist_exponential():产生服从指数分布的随机数,输入参数为指数分布函数的平均值
此外,还可以采用以下两个步骤:
1)调用 op_dist_load()自定义一个带参数的随机分布函数。
返回值不是一个随机数,而是指向一个分布函数的指针(Distribution *),这个指针供以后使用,所以这个步骤一般是在进程的初始化状态完成的;不管是对 OPNET 自带的一些分布函数,还是对 PDF Editor(分布函数编辑器)创建的函数,都可以调用op_dist_load()进行加载。当函数不再使用时还可以调用op_dist_unload()将所占内存释放。
2)函数一旦被加载,就可以在整个仿真过程中通过调用。op_dist_outcome()用来产生一个服从自定义分布函数的随机值。这两个核心函数以分布函数指针为输入参数, 返回一个随机值。 
2 事件类核心函数
功能:为进程模型提供有关事件的信息。
以下三个函数可以访问事件列表中的事件。
(1)op_ev_current():返回当前事件。
(2)op_ev_next(): 获得当前有效事件的下一事件。
(3)op_ev_seek_time():获得与输入的仿真事件最接近的那个事件的句柄。
以下两个常搭配使用:
op_ev_pending():判断一个事件是否还在列表中等待调度
op_ev_cancel():将事件列表中的将来事件删除

自中断:模拟进程的各种延时(将来某个时刻)的处理。自中断、遥远中断和多播中断源于调度他们的进程模块。
流中断:由于包到达输入流端口时触发的,流中断源于发送包的模块。
op_ev_strm():决定包到达的流索引号
op_ev_stat():决定事件作用的状态线索引号
op_ev_code():得到事件号
op_ev_time():返回事件调用的仿真时间
op_ev_equal():比较两个事件句柄,在进程等待一个特定事件时有用。
op_ev_src_id():获取事件源模块id
op_ev_dst_id():获取事件目的模块id
3 接口控制类核心函数
 ICI:接口控制信息,是进程块间传递信息的载体。
op_ici_create():基于指定的ICI格式文件返回一个指向ICI文件的指针。
op_ici_destroy():销毁,ICI的信息一般只用一次
4 标识类核心函数
功能:解决如何获取仿真对象Objid的问题。
op_id_self():获取自身id
除Objid外,另外三种区别网络域对象的标识方法:
1)对象名称,它是一个字符串。 
2 system id,对于同种类型的对象集合,它包含的每个对象都有一个单独的 system id,它是一个整数序列号。  
3 user id,它是用户设置的,可以不惟一,通常在对象的界面属性中设置, Objid 是系统分配的,全局惟一的,注意不要将 user id  Objid 混淆。
注意:模块不能再包含其他模块
5 内部模型访问类核心函数
功能:提供一套访问仿真实体的方法,仿真实体包括仿真属性、对象属性以及进程状态变量等。
op_ima_sim_attr_get()访问属性
op_ima_sim_attr_exists():判断属性是否存在, 如果返回 OPC_TRUE 则表明属性存在
op_ima_obj_attr_get()取得对象属性的值
op_ima_obj_attr_exists()判断某个对象属性是否存在
op_ima_obj_hname_get()可以获得某个对象的全称,表明对象从哪些对象继承得来
op_ima_obj_pos_get()得到的六个与位置相关的属性包括两个部分:
1)节点本身的位置属性。
2)自动转换的地球坐标系坐标。  
op_ima_obj_pos_get()得到的信息为经纬度和平面座标值两者之一,具体得到哪种信息要根据场景的网格度量单位是经纬度还是公里、米来定。  
op_ima_obj_state_set() op_ima_obj_state_get()函数对提供设置和读取这些状态信息的支持。
 
当需要用到无线建模时,移动站(移动节点或者移动子网)的位置随着时间改变。op_ima_obj_pos_get_time()在指定的时间获取移动站的位置。一般情况下,我们指定移动站沿着预先定义的轨迹文件移动,但是也可以通过op_ima_obj_pos_query_proc_set()指定运动程序使移动站按照自定义的运动规律移动。如果进程想知道移动站何时改变过位置,可以调用 op_ima_obj_pos_notificaiton_register(),从而使移动位置发生改变时给进程触发一个中断。  

6 中断类核心函数
(1)仿真核心中断
在各个 process model  process interface 有一些 attribute:如 begsim intrptendsim intrpt、failure intrpt regular intrpt 等,在设计模块些属性的设置很关键,尤其是 begsim intrpt 的设置,其影响 init 的状态的 Enter 代码何时执行,如果是 enabled,那么仿真一开始,即仿真 0时刻,可以对 porcess 进行初始化,process 被触发后,即执行 init  Enter 代码。如果是 disabled话,就不会被 kernel 触发。如果仿真结束时需要进行一些工作(如变量的收集,内存的释放等),则需要 enable endsim intrpt regular intrpt 可用来做定时器, process interface 设定了 intrpt interval 之后,仿真核心每个该时间量触发一次 regular 中断。  
2)状态中断  
stat_intrpt :提取统计信息作为反馈控制变量,将该信息反馈回模型中进行控制。  
 StatisticWire 可以这样理解: StatisticWire  A 进程的一个变量反映给 B 进程,该变量一般由op_stat_write ()改变值, 在 B 进程中: ① 监测到 OPC_INTRPT_STAT 型中断以后,由 op_stat_local_read()读入。② 通过 op_stat_local_read()查询 stat 值,一般是在收到OPC_INTRPT_STAT 中断时去查询。而进行stat 触发,当 intrpt method 选择为 forced 方式,将直接进行触发;当 intrpt method  scheduled 方式时,有多种触发方式,比如 rising edgefalling edge trigger, repeated value trigger 等 , 按 照 触 发 方 式 在 接 收 端 引 发OPC_INTRPT_STAT  
状态中断运用最多的地方是在信道接入层( MAC)中判断无线信道是否空闲。在节点模型中,一般收信机(receiver)到 MAC 有一条状态线,假设它的源状态( src stat)为 receiver.busy,状态目的地( dest stat)为instat[0],则判断无线信道是否空闲的程序如下:
double status;
status = op_stat_local_read(0);
if (status==1.0)
{
表示信道忙,进行相应的处理}
else if(status==0.0)
{
表示信道空闲,可以发送包}  

(3)流中断
op_intrpt_strm()返回接收的流索引号(stream index)。
7 包类核心函数
包的操作有三类:创建和销毁包;设置和得到包中的内容;析取包的相关信息和属性。
op_pk_create():创建一个无格式的包,括号中的参数指示包的大小,这个函数可以看成是根据指定的规格(容器的容积)产生一个空的容器。  
op_pk_create_fmt()创建一个有格式的包,这个包的规格必须在包格式编辑器(Packet Format Editor)中定义好。  
op_pk_destroy() :销毁包
op_pk_type():判断包的类型
op_pk_copy():可以复制一个包头和内容和原始包一模一样新包, 惟一不同的是包的创建时间和包的标识号(Packet ID)。  
op_pk_stamp():仿真核心标志创建时间为当前的仿真时间,地点为创建包的进程所对应的对象标识号(Objid  。
调用函数 op_pk_creation_time _get() op_pk_creation _mod _get()来分别得到包的原始创建时间和地点。
OPNET 规定包传输的两种方式,分别是“发送(sending)”和“传递(delivering)”。 Sending 是通过连接模块与模块的包流(packet stream)来实现,而 delivering 不需要实际的物理连接。
对于 sending,有下面 4 种方式:
1常用的发送方式是调用 op_pk_send(),当包沿着输出包流到达目的模块时立即向目的模块触发流中断。整个过程没有时延,所以包到达的时刻也是包发送的时刻。
2)与第一种方式相比,如果要模拟包在包流传输过程的延时,以此来仿真模块有限的处理速度, 这时可以调用 op_pk_send_delayed()函数, 包将滞后指定的时间到达目的模块。
3)前面两种传输方式对于目的模块来说是被动的,因为包的到达会强加一个流中断通知它接收。如果目的模块希望隔一定的时间间隔主动地去从输入队列中取出一个包,此时包到达引起的时间上不规则的中断显得无意义。
4)考虑到目的模块的这种要求,源模块应该调用 op_pk_send_quiet()函数,采取一种静默的方式发送包。
包的子域相关函数
op_pk_nfd_get("pkptr","dest_address",&dest_address是从 pkptr 所指向的包中得到dest_address 域的内容,放到地址为&dest_address 的内存中。  
注意:包域大小(field size)的设定和最终在这个包域中写入的内容的大小是没有多大关系的。例如,即使包域大小设置为0,也可以在该包域中写入100字节的内容,操作也是正确的。包域大小主要用来计算数据包的大小,进而计算发送时延。包的总长度可以通过op_pk_total_size_get()获得,包的长度等于所有field长度的和加上一个校正值(bulksize)。  
op_pk_get(pkptr,strm_index) :接受包, strm_index 为接收的流中断对应的输入流索引号,它可以通过op_intrpt_strm()取得 
op_pk_send(pkptr, strm_index):发送包,strm_index 的取值应和进程模块包流连接关系一致。  
原创粉丝点击