我是靠谱客的博主 神勇眼睛,最近开发中收集的这篇文章主要介绍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仿真结果区别见下篇,写不下了)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复