matlab中的sfunction的用法(C语言).pdf
文本预览下载声明
matlab 中的sfunction 的用法(C 语言)
已有 1148 次阅读 2010-7-9 11:38 |个人分类:学习笔记 |系统分类:科研笔记 |
关键词: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 t
显示全部