首页 matlab中的sfunction的用法(C语言)

matlab中的sfunction的用法(C语言)

举报
开通vip

matlab中的sfunction的用法(C语言)matlab中的sfunction的用法(C语言)已有1148次阅读2010-7-911:38|个人分类:学习笔记|系统分类:科研笔记|关键词:matlab,sfunction,C创建一个有1输入(2维),2输出(1维),3个参数,还有全局变量的s-function。1.新建sfunction的C语言文件打开simulink,点击User-DefinedFunctions里面的S-FunctionExamples。这个里面有多个语言版本的模板,有C,C++,Ada,Fortran和M语言的版本,其实都大同小异,只要...

matlab中的sfunction的用法(C语言)
matlab中的sfunction的用法(C语言)已有1148次阅读2010-7-911:38|个人分类:学习 笔记 哲学笔记pdf明清笔记pdf政法笔记下载课堂笔记下载生物化学笔记PDF |系统分类:科研笔记|关键词:matlab,sfunction,C创建一个有1输入(2维),2输出(1维),3个 参数 转速和进给参数表a氧化沟运行参数高温蒸汽处理医疗废物pid参数自整定算法口腔医院集中消毒供应 ,还有全局变量的s-function。1.新建sfunction的C语言文件打开simulink,点击User-DefinedFunctions里面的S-FunctionExamples。这个里面有多个语言版本的模板,有C,C++,Ada,Fortran和M语言的版本,其实都大同小异,只要了解几个函数就很容易使用了。选择C语言的版本:从S-function模块中选择C-fileS-functions里面的BasicC-MEXtemplate。打开后,另存为自己的模块名字,如test.c。下面我们来 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 代码:#defineS_FUNCTION_NAMEtest//这里把文件名sfuntmpl_basic修改为test#defineS_FUNCTION_LEVEL2#include"simstruc.h"//程序里面要用到的头文件在这里引用,如“math.h”等。floatglobal_var;//定义全局变量staticvoidmdlInitializeSizes(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;//设置输入变量的个数,这里为1ssSetInputPortWidth(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);//设置输出变量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;}staticvoidmdlInitializeSampleTimes(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_CONDITIONS*/#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));real_T*para3=mxGetPr(ssGetSFcnParam(S,2));constreal_T*u=(constreal_T*)ssGetInputPortSignal(S,0);real_T*y1=ssGetOutputPortSignal(S,0);real_T*y2=ssGetOutputPortSignal(S,1);y1[0]=u[0]*para1[0]+u[1]*para2[0];y2[0]=u[1]*para3[0]+u[0]*para1[0];}#defineMDL_UPDATE/*Changeto#undeftoremovefunction*/#ifdefined(MDL_UPDATE)staticvoidmdlUpdate(SimStruct*S,int_Ttid){}#endif/*MDL_UPDATE*/#defineMDL_DERIVATIVES/*Changeto#undeftoremovefunction*/#ifdefined(MDL_DERIVATIVES)staticvoidmdlDerivatives(SimStruct*S){}#endif/*MDL_DERIVATIVES*/staticvoidmdlTerminate(SimStruct*S)//这里需要把global变量全部初始化,否则下次运行程序时,全局变量还是之前的值。{}#ifdefMATLAB_MEX_FILE/*IsthisfilebeingcompiledasaMEX-file?*/#include"simulink.c"/*MEX-fileinterfacemechanism*/#else#include"cg_sfun.h"/*Codegenerationregistrationfunction*/#endif2.编译在matlab的commandwindow里面输入“mextest.c”,即可将test.c编译为mex文件。3.调用sfunction在simulink空间里面拉入sfunction,在s-functionname里面填入test,参数里面填入要设定的参数,然后仿真即可。[原创]matlab每日一贴(仿真函数篇二)S-Function在User-DefinedFunction里面还有matlabfunction模块,这个模块支持matlab函数和自定义的函数,缺点就是input,output都是一个端口,模块上不能显示输入输出的label。还有fcn模块,它支持简易的函数 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 达式。S-FunctionS-Function,在library里面有很多模板,有C,C++,M,Ada,Fortran的版本,其实都大同小异,只要了解几个函数就很容易使用了,当然初学者也可以用S-FunctionBuilder来构建。当然了解了代码后,那个Builder生成的代码就更容易懂了。下面咱们以一个例子开始把任务:构建一个C的S-Function。2个input,2个output,2个parameterinput都为3*1向量,output也是3*1向量。从S-function模块中选择C-fileexamples里面的BasicC-MEXtemplate。打开它,另存为我们的模块名字就ok了。我们存为test.c把下面我们来分析代码:1.#defineS_FUNCTION_NAMEsfuntmpl_basic#defineS_FUNCTION_LEVEL2#defineINPUT_NUM2#defineOUTPUT_NUM2这儿我们需要修改下文件名了。把sfuntmpl_basic改为test2.#include"simstruc.h"此处引用头文件,当我们需要其他头文件,例如math.h,stdio.h等,看你需要啥函数了。3.staticvoidmdlInitializeSizes(SimStruct*S)这个函数我们用来设置输入,输入,和参数的。参数就是,我们点击模块时候,那个对话框里面需要设置的。参数之间空格隔开4.ssSetNumSFcnParams(S,PARA_NUM);/*Numberofexpectedparameters*/if(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S)){/*Returnifnumberofexpected!=numberofactualparameters*/return;}PARA_NUM就是你自己需要设置的参数个数5.ssSetNumContStates(S,0);ssSetNumDiscStates(S,0);设置连续状态和离散状态个数。缺省都为06.if(!ssSetNumInputPorts(S,INPUT_NUM))return;ssSetInputPortWidth(S,0,3);//设置端口的维数,现在为3*1ssSetInputPortRequiredContiguous(S,0,true);/*directinputsignalaccess*/ssSetInputPortWidth(S,1,3);//设置端口的维数,现在为3*1ssSetInputPortRequiredContiguous(S,1,true);/*directinputsignalaccess*/ssSetInputPortDirectFeedThrough(S,0,1);ssSetInputPortDirectFeedThrough(S,1,1);INPUT_NUM就是输入端口的个数,分别设置每个端口的维数,注意端口号从0开始的。ssSetInputPortRequiredContiguous是设置input的访问方式,true就是临近访问,这样指针的增量后就可以直接访问下个input端口了。ssSetInputPortDirectFeedThrough设置输入端口的信号是否mdlOutputs函数中使用,这儿设置为true。7.if(!ssSetNumOutputPorts(S,OUTPUT_NUM))return;ssSetOutputPortWidth(S,0,3);ssSetOutputPortWidth(S,1,3);同样设置2个输出端口,以及维数8.ssSetNumSampleTimes(S,1);ssSetNumRWork(S,0);ssSetNumIWork(S,0);ssSetNumPWork(S,0);ssSetNumModes(S,0);ssSetNumNonsampledZCs(S,0);设置采样时间,此处为1s。ssSetNumRWork,设置浮点向量的大小,0表示继承信号大小,DYNAMICALLY_SIZED表示可用mdlSetWorkWidths来自己设置。下面的函数依次是设置整型,指针,模式向量的大小。模式向量是专用模块的编写的。ssSetNumNonsampledZCs设置采样点之间的zerocrossing的模块的状态个数9.mdlInitializeSizes函数搞定。其他mdlInitializeSampleTimesmdlInitializeConditionsmdlStart我们暂时不管了,一些初始化的东西,大家可以放在这里。我们直接奔mdlOutputs函数把。10.在这个函数里面,我们执行我们的复杂逻辑关系,和我们的代码了。首先,我们得到我们参数,输入,输出的指针把。这样我们才能操作。real_T*para1=mxGetPr(ssGetSFcnParam(S,0));real_T*para2=mxGetPr(ssGetSFcnParam(S,1));constreal_T*u1=(constreal_T*)ssGetInputPortSignal(S,0);constreal_T*u2=(constreal_T*)ssGetInputPortSignal(S,1);real_T*y1=ssGetOutputPortSignal(S,0);real_T*y2=ssGetOutputPortSignal(S,1);下面我们简单把输入乘上参数1或参数2,然后赋值给输出。y1[0]=para1[0]*u1[0];y1[1]=para1[0]*u1[1];y1[2]=para1[0]*u1[2];y2[0]=para2[0]*u2[0];y2[1]=para2[0]*u2[1];y2[2]=para2[0]*u2[2];注意,参数是指针,所以要那么引用它。ok那么在matlab得commandwindow里面用语句“mextest.c”编译把11.mdlUpdatemdlDerivatives这几个函数以后再探讨了mdlTerminate这个函数必须提下,当你在s-funtion里面定义全局变量后,一定要在这里赋值为0,或者其他值,不然在下次仿真时候,全局变量还是上次仿真的值哦。先写那么点哦。呵呵,休息下,。。。一点点心得,大家见笑了。
本文档为【matlab中的sfunction的用法(C语言)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
肥猫叫noah
暂无简介~
格式:pdf
大小:105KB
软件:PDF阅读器
页数:0
分类:高中语文
上传时间:2020-02-17
浏览量:68