我是靠谱客的博主 神勇眼睛,最近开发中收集的这篇文章主要介绍MATLAB的S-Function的用法(C语言)及全局变量与局部变量效果一、s-function实现仿真输入常量10,每次自加1二、s-function简介总结   (局部变量i全局变量i仿真结果区别见下篇,写不下了),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

MATLAB的S-Function的用法(C语言)及全局变量与局部变量

 

 

  • 一、s-function实现仿真输入常量10,每次自加1
  • 二、s-function简介
    • 1.s-funcyion
    • 2.结果局部变量与全局变量区别与效果。
  • 总结

 


 


提示:以下是本篇文章正文内容,下面案例可供参考

一、s-function实现仿真输入常量10,每次自加1

。仿真

 

二、s-function简介

1.s-function 

一般要改文件名#define S_FUNCTION_NAME  yanzheng;采样时间ssSetSampleTime(S, 0, 52e-6);//采样时间52us;算法实现在static void mdlOutputs(SimStruct *S, int_T tid)这个函数里。

代码如下(示例):

#define S_FUNCTION_NAME  yanzheng    //yanzheng 要matalb中.c文件名一样 这里要改
#define S_FUNCTION_LEVEL 2                  //提供一个简单的接口,可与少部分的S函数API交互。Matlab对于这种方式的支持更多的是为了保持与以前版本的兼容,现在推荐采用的是Level 2 S函数
#include "simstruc.h"                     //程序里面要用到的头文件在这里引用,如“math.h”等
#include <math.h>
static void mdlInitializeSizes(SimStruct *S)   //这个函数用来设置输入、输出和参数的。

{
   ssSetNumSFcnParams(S, 0);              //* Number of expected parameters
    if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S))

{
        /* Return if number of expected != number of actual parameters */
        return;
    }

    ssSetNumContStates(S, 0);
    ssSetNumDiscStates(S, 0);

    if (!ssSetNumInputPorts(S, 1)) return;//输入变量的个数
    ssSetInputPortWidth(S, 0, 1);    //这里要改,设置输入变量0的维数为1
    ssSetInputPortRequiredContiguous(S, 0, true); /*direct input signal access*/
    /*
     * Set direct feedthrough flag (1=yes, 0=no).
     * A port has direct feedthrou gh if the input is used in either
     * the mdlOutputs or mdlGetTimeOfNextVarHit functions.
     * See matlabroot/simulink/src/sfuntmpl_directfeed.txt.
     */
    ssSetInputPortDirectFeedThrough(S, 0, 1);

    if (!ssSetNumOutputPorts(S, 1)) return;//输出变量的个数
    ssSetOutputPortWidth(S, 0, 1);设置输出变量0的维数为1维

    ssSetNumSampleTimes(S, 1);//模块的采样时间个数,至少是一个,采样个数一般是1
    ssSetNumRWork(S, 0);//不管
    ssSetNumIWork(S, 0);
    ssSetNumPWork(S, 0);
    ssSetNumModes(S, 0);
    ssSetNumNonsampledZCs(S, 0);

    ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
}



static void mdlInitializeSampleTimes(SimStruct *S)//采样时间52us进s-function一次
{
    ssSetSampleTime(S, 0, 52e-6);//采样时间52us
    ssSetOffsetTime(S, 0, 0.0);

}

#define MDL_INITIALIZE_CONDITIONS   /* Change to #undef to remove function */
#if defined(MDL_INITIALIZE_CONDITIONS)
  static void mdlInitializeConditions(SimStruct *S)
  {
  }
#endif /* MDL_INITIALIZE_CONDITIONS */


#define MDL_START  /* Change to #undef to remove function */
#if defined(MDL_START)
 
  static void mdlStart(SimStruct *S)
  {
  }

int  in;//定义全局变量
int   i;
#endif /*  MDL_START */
double SecondControlValue = 0;
static void mdlOutputs(SimStruct *S, int_T tid)//这里填入相关的运算、算法等相当于main()函数

{//这个
    const real_T *u = (const real_T*) ssGetInputPortSignal(S,0);//u是输入变量 u是一维变量及u[0],及s-function只有一个输入,
    real_T       *y = ssGetOutputPortSignal(S,0);//y是输出变量,同上s-function只有一个输出,见下图。
    for (;i<1;i++)//定义局部变量i ,每次进来mdlOutputs一次,i都被赋予0,这个循环都要被执行一次,下面会细说。
    in=u[0];//
    in=in+1;
    y[0]=in;
}


#define MDL_UPDATE  /* Change to #undef to remove function */
#if defined(MDL_UPDATE)
  /* Function: mdlUpdate ======================================================
   * Abstract:
   *    This function is called once for every major integration time step.
   *    Discrete states are typically updated here, but this function is useful
   *    for performing any tasks that should only take place once per
   *    integration step.
   */
  static void mdlUpdate(SimStruct *S, int_T tid)
  {
  }
#endif /* MDL_UPDATE */


#define MDL_DERIVATIVES  /* Change to #undef to remove function */
#if defined(MDL_DERIVATIVES)
  /* Function: mdlDerivatives =================================================
   * Abstract:
   *    In this function, you compute the S-function block's derivatives.
   *    The derivatives are placed in the derivative vector, ssGetdX(S).
   */
  static void mdlDerivatives(SimStruct *S)
  {
  }
#endif /* MDL_DERIVATIVES */


/* Function: mdlTerminate =====================================================
 * Abstract:
 *    In this function, you should perform any actions that are necessary
 *    at the termination of a simulation.  For example, if memory was
 *    allocated in mdlStart, this is the place to free it.
 */
static void mdlTerminate(SimStruct *S)
{
}


/*======================================================*
 * See sfuntmpl_doc.c for the optional S-function methods *
 *======================================================*/

/*=============================*
 * Required S-function trailer *
 *=============================*/

#ifdef  MATLAB_MEX_FILE    /* Is this file being compiled as a MEX-file? */
#include "simulink.c"      /* MEX-file interface mechanism */
#else
#include "cg_sfun.h"       /* Code generation registration function */
#endif

2.

int in;
int i=0;//定义全局变量i
double SecondControlValue = 0;
static void mdlOutputs(SimStruct *S, int_T tid)
{
    const real_T *u = (const real_T*) ssGetInputPortSignal(S,0);
    real_T       *y = ssGetOutputPortSignal(S,0);//y = [PWM1 PWM2 PWM3 PWM9 PWM10] 
  //  if(i==1)
   // { i++;
   // in=u[0];}
   // in=in+1;
   // y[0]=in;    
    for (;i<1;i++)//* i,in 全局变量,第一次进mdlOutputs()for会循环一次,i=1,in=11,y[0]=11第二次进、、、、、mdlOutputs()i=1,不满足for,执行in=in+1;in=12;y[0]=12...
    in=u[0];
    in=in+1;//加一
    y[0]=in;//输出
}


总结   (局部变量i全局变量i仿真结果区别见下篇,写不下了)

.s-function 

一般要改文件名#define S_FUNCTION_NAME  yanzheng;采样时间ssSetSampleTime(S, 0, 52e-6);//采样时间52us;算法实现在static void mdlOutputs(SimStruct *S, int_T tid)这个函数里。

局部变量,形参,函数内部定义的变量,包括主函数内定义的变量,离开函数变量就无效,释放内存。
全局变量 作用于本文件中其他函数所共用 有效 范围从定义变量的位置开始到本源文件结束,在一个函数中全局变量的值改变了,在其他函数中也可以使用这个已改变的值

这样一来,按道理说,一个文件中定义的全局变量,可以在整个程序的任何地方被使用,举例说,如果A文件中定义了某全局变量,那么B文件中应可以使用该变量。
 

最后

以上就是神勇眼睛为你收集整理的MATLAB的S-Function的用法(C语言)及全局变量与局部变量效果一、s-function实现仿真输入常量10,每次自加1二、s-function简介总结   (局部变量i全局变量i仿真结果区别见下篇,写不下了)的全部内容,希望文章能够帮你解决MATLAB的S-Function的用法(C语言)及全局变量与局部变量效果一、s-function实现仿真输入常量10,每次自加1二、s-function简介总结   (局部变量i全局变量i仿真结果区别见下篇,写不下了)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部