启动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);