资源描述:
《matlab中的sfunction的用法(C语言)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、matlab中的sfunction的用法(C语言)已有1148次阅读2010-7-911:38
2、个人分类:学习笔记
3、系统分类:科研笔记
4、关键词:matlab,sfunction,C创建一个有1输入(2维),2输出(1维),3个参数,还有全局变量的s-function。1.新建sfunction的C语言文件打开simulink,点击User-DefinedFunctions里面的S-FunctionExamples。这个里面有多个语言版本的模板,有C,C++,Ada,Fortran和M语言的版本,其实都大同小异,只要了解几个函数就很容易使用了。选择C语
5、言的版本:从S-function模块中选择C-fileS-functions里面的BasicC-MEXtemplate。打开后,另存为自己的模块名字,如test.c。下面我们来分析代码:#defineS_FUNCTION_NAMEtest//这里把文件名sfuntmpl_basic修改为test#defineS_FUNCTION_LEVEL2#include"simstruc.h"//程序里面要用到的头文件在这里引用,如“math.h”等。floatglobal_var;//定义全局变量staticvoidmdlInitializeSizes(Sim
6、Struct*S){//这个函数用来设置输入、输出和参数的。ssSetNumSFcnParams(S,3);/*设置参数个数,这里为3*/if(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S)){return;}ssSetNumContStates(S,0);//设置连续状态的个数,缺省为0;ssSetNumDiscStates(S,0);//设置离散状态的个数,缺省为0;if(!ssSetNumInputPorts(S,1))return;//设置输入变量的个数,这里为1ssSetInputPortWid
7、th(S,0,2);//设置输入变量0的维数为2ssSetInputPortRequiredContiguous(S,0,true);//设置input0的访问方式,true就是临近访问,这样指针的增量后就可以直接访问下个input端口了。ssSetInputPortDirectFeedThrough(S,0,1);//设置输入端口的信号是否mdlOutputs函数中使用,这儿设置为true。if(!ssSetNumOutputPorts(S,2))return;//设置输出变量的个数ssSetOutputPortWidth(S,0,1);//设置输
8、出变量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;}staticvoidmdlInitializeSample
9、Times(SimStruct*S)//暂时不管{ssSetSampleTime(S,0,CONTINUOUS_SAMPLE_TIME);ssSetOffsetTime(S,0,0.0);}#defineMDL_INITIALIZE_CONDITIONS/*Changeto#undeftoremovefunction*/#ifdefined(MDL_INITIALIZE_CONDITIONS)staticvoidmdlInitializeConditions(SimStruct*S)//暂时不管{}#endif/*MDL_INITIALIZE_CON
10、DITIONS*/#defineMDL_START/*Changeto#undeftoremovefunction*/#ifdefined(MDL_START)staticvoidmdlStart(SimStruct*S)//暂时不管{}#endif/*MDL_START*/staticvoidmdlOutputs(SimStruct*S,int_Ttid)//这里填入相关的运算、算法等{real_T*para1=mxGetPr(ssGetSFcnParam(S,0));real_T*para2=mxGetPr(ssGetSFcnParam(S,1)
11、);real_T*para3=mxGetPr(ssGetSFcnParam(S,2));constreal_