OPNET中设计网络 MATLAB

这样就可以在opnet进程域中编写的matlab引擎语言可以在opnet的运行过程中启动matlab引擎框,进行计算。

matlab引擎的一下调用函数请参看任意的matlab高级编程书籍就可以找到。

附件1:在OPNET的进程域中编写的一下代码(仅供参考)

启动matlab引擎的代码:

if(op_intrpt_type() == OPC_INTRPT_BEGSIM)

         {

               if(!(ep = engOpen("\0")))             //the "0" == "\0" == "NULL"

                              {

                                op_sim_end("system can not start MATLAB engine","","","");

                              }

         }

else if(op_intrpt_type() == OPC_INTRPT_ENDSIM)

         {

            engClose(ep);

         }

 

计算和画图的一下小代码:

#include "engine.h"

 

#include "opnet.h"

 

#include "stdio.h"

 

#include <math.h>

 

#define round(x) (floor(x + 0.5))

void mdltn_cmd(char*, char*, int, int, double);

extern Engine *ep;

 

void

        

matlab_err(Packet* pkptr)

        

{

  mxArray *result;

 

  double *num_errs, pklen, snr, ecc_thresh, symbol_rate, elap_time;

 

  OpT_Packet_Size          seg_size;

 

  int prev_num_errs;

 

  Objid rx_id, rx_ch_id;

 

  char modulation[100];

 

  char cmd[2000];

mxArray  *T=NULL;

  double    time[10]={0,1,2,3,4,5,6,7,8,9};

  

  mxArray   *sun=NULL;

  double     *num_err;

  char  suncmd[200]="a=1;b=30;c=a+b;";

 

 

  FIN (matlab_err(pkptr));

  op_prg_odb_bkpt("sun");

 

  prev_num_errs = op_td_get_int(pkptr, OPC_TDA_RA_NUM_ERRORS);

 

  

  if(prev_num_errs > 0)

          

           {

           ecc_thresh = op_td_get_dbl(pkptr, OPC_TDA_RA_ECC_THRESH);

          

           pklen = (double)op_pk_total_size_get(pkptr);

 if((double)prev_num_errs / pklen > ecc_thresh)

                    

                     {

                     FOUT;

                     }

           }

 

  else

          

           {

           pklen = -1.0;

           }

 

 

 

  rx_id = op_td_get_int(pkptr, OPC_TDA_RA_RX_OBJID);

op_ima_obj_attr_get(rx_id, "modulation", modulation);

 

  snr = op_td_get_dbl(pkptr, OPC_TDA_RA_SNR);

 

  elap_time = op_sim_time() - op_td_get_dbl(pkptr, OPC_TDA_RA_SNR_CALC_TIME);

 

  rx_ch_id = op_td_get_int(pkptr, OPC_TDA_RA_TX_CH_OBJID);

 

  op_ima_obj_attr_get(rx_ch_id, "data rate", &symbol_rate);

 

  seg_size = (OpT_uInt64)round(elap_time * symbol_rate);

 if(seg_size != 0)

          

           {

                mdltn_cmd(modulation, cmd, 2000, (int)seg_size, snr);

                  

                   engEvalString(ep, cmd);

                  

                   if((result = engGetVariable(ep, "nErrors")) == NULL)

                           

                            {

                            op_sim_end("'t Get nErrors Result", "", "", "");

                            }

                  

                   else

                           

                            {

                            num_errs = mxGetPr(result);

                            }

                  

                  

                   mxDestroyArray(result);

                  

                   op_td_set_int(pkptr, OPC_TDA_RA_NUM_ERRORS,(int)((*num_errs) + prev_num_errs));

 op_td_set_dbl(pkptr,OPC_TDA_RA_ACTUAL_BER, (*num_errs) / seg_size);

                  

           }

T=mxCreateDoubleMatrix(1,10,mxREAL);

  memcpy((char*)mxGetPr(T),(char*)time,10*sizeof(double));

  engPutVariable(ep,"T",T);

  engEvalString(ep,"D=.5*(-9.8).*T.^2;");

  engEvalString(ep,"plot(T,D);");

  engEvalString(ep,"title('position vs. time for a falling object');");

  engEvalString(ep,"xlabel('tiem(seconds)');");

  engEvalString(ep,"ylabel('position(meters)');");

engEvalString(ep,suncmd);

  if((sun=engGetVariable(ep,"c"))==NULL)

           {

           op_sim_end("'t get the variable","","","");

           }

  else

           {

           num_err = mxGetPr(sun);

           }

  printf("the number is: %d",(int) *num_err);


 engEvalString(ep,"abc");

  if((sun=engGetVariable(ep,"c"))==NULL)

           {

           op_sim_end("'t get the variable","","","");

           }

  else

           {

           num_err = mxGetPr(sun);

           }

  printf("the number is: %d",(int) *num_err);

 

 

  mxDestroyArray(T);

  mxDestroyArray(sun);

  FOUT

}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Opnet(现在已更名为Riverbed Modeler)与Matlab的联调,下面是一个简单的教程: 步骤1:安装并配置OpnetMatlab软件。 确保已正确安装和配置OpnetMatlab软件,以便它们可以在同一台计算机上运行。确保两个软件版本兼容,并且都已成功激活。 步骤2:创建一个Opnet模型。 在Opnet创建一个网络模型,并确保其包含需要与Matlab联调的组件或模块。 步骤3:导出Matlab接口。 在Opnet,找到与Matlab接口相关的组件或模块。这些组件通常用于将数据传输到Matlab进行处理。选择合适的接口,并将其导出为Matlab接口文件。 步骤4:在Matlab编写处理代码。 打开Matlab,并编写处理来自Opnet的数据的代码。根据需要,您可以使用不同的Matlab工具箱和函数来处理和分析数据。 步骤5:导入Opnet数据。 在Matlab,导入来自Opnet的数据文件或通过接口传输的实时数据。确保正确解析和处理数据,以便进行后续分析或仿真。 步骤6:执行Matlab代码并与Opnet进行交互。 在Matlab执行代码,并与Opnet进行交互。这可能包括向Opnet发送控制命令、更新Opnet模型参数或接收来自Opnet的实时数据。 步骤7:分析和可视化结果。 根据需要,使用Matlab的分析工具箱和可视化函数对处理后的数据进行分析和可视化。这将帮助您理解和解释与Opnet模型相关的结果。 需要注意的是,OpnetMatlab联调的具体步骤可能会根据您的应用场景和使用的版本有所不同。因此,在实际操作时,请参考OpnetMatlab的官方文档或在线资源,以获得更详细和准确的指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值