matlab 中的sfunction 的用法(C 语言)
创建一个有1 输入(2 维),2 输出(1 维),3 个参数,还有全局变量的s-function。
1.新建sfunction 的C 语言文件
打开simulink,点击User-Defined Functions 里面的S-Function Examples。这
个里面有多个语言版本的模板,有C ,C++ ,Ada ,Fortran 和M 语言的版本,其
实都大同小异,只要了解几个函数就很容易使用了。
选择C 语言的版本:
从S-function 模块中选择C-file S-functions 里面的Basic C-MEX template 。打开后,
另存为自己的模块名字,如test.c 。
下面我们来分析代码:
#define S_FUNCTION_NAME test//这里把文件名sfuntmpl_basic 修改为test
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
//程序里面要用到的头文件在这里引用,如“math.h”等。
float global_var; //定义全局变量
static void mdlInitializeSizes(SimStruct *S)
{
//这个函数用来设置输入、输出和参数的。
ssSetNumSFcnParams(S, 3); /*设置参数个数,这里为3 */
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return;
}
ssSetNumContStates(S, 0);//设置连续状态的个数,缺省为0 ;
ssSetNumDiscStates(S, 0);//设置离散状态的个数,缺省为0 ;
if (!ssSetNumInputPorts(S, 1)) return;//设置输入变量的个数,这里为1
ssSetInputPortWidth(S, 0, 2); //设置输入变量0 的维数为2
ssSetInputPortRequiredContiguous(S, 0, true); //设置 input0 的访问方式,true 就是
临近访问,这样指针的增量后就可以直接访问下个input 端口了。
ssSetInputPortDirectFeedThrough(S, 0, 1);// 设置输入端口的信号是否 mdlOutputs
函数中使用,这儿设置为true 。
if (!ssSetNumOutputPorts(S, 2)) return;//设置输出变量的个数
ssSetOutputPortWidth(S, 0, 1);//设置输出变量0 的维数为1 维
ssSetOutputPortWidth(S, 1, 1);//设置输出变量1 的维数为1 维
ssSetNumSampleTimes(S, 1); //设置采样时间,此处为1s。
ssSetNumRWork(S, 0);//不管
ssSetNumIWork(S, 0);
ssSetNumPWork(S, 0);
ssSetNumModes(S, 0);
ssSetNumNonsampledZCs(S, 0);
ssSetOptions(S, 0);
//下面可以写全局变量的初始化程序
global_var=1;
}
static void mdlInitializeSampleTimes(SimStruct *S)//暂时不管
{
ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);
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)
sta