ImageVerifierCode 换一换
格式:DOCX , 页数:7 ,大小:19.47KB ,
资源ID:8280088      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8280088.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(matlab中sfunction用法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

matlab中sfunction用法.docx

1、matlab中sfunction用法matlab 中 s-function 用法创建一个有1输入(2维),2输岀(1维),3个参数,还有全局变量的s- functiono1.新建sfunction的C语言文件打开 simulink,点击 User-Defined Functions 里面的 S-FunctionExampleso这个里面有多个语言版本的模板,有C, C+, Ada, Fortran和M语言 的版本,其实都大同小异,只要了解儿个函数就很容易使用了。选择C语言的版 本:从 S-function 模块中选择 C-file S-functions 里面的 Basic C-MEX tem

2、plateo打开后,另存为自己的模块名字,如test, c。下面我们来分析代码:#define S_FUNCTION_NAME test/这里把文件名 sfuntmpl_basic 修改为 testdefine S_FUNCTION_LEVEL 2#include simstruc. h程序里面要用到的头文件在这里引用,如“math.h”等。float global/定义全局变量static void mdllnitializeSizes(SimStruct *S)这个函数用来设置输入、输出和参数的。ssSetNumSFcnParams (S, 3) ; /*设置参数个数,这里为 3 */if

3、 (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S) return;ssSetNumContStates (S, 0) ;/设置连续状态的个数,缺省为0ssSetNumDiscStates(S, 0) ;/设置离散状态的个数,缺省为0;辻(!ssSetNumInputPorts(S, 1) return;/设置输入变量的个数,这里为1 ssSetlnputPortWidth (S, 0, 2) : /设置输入变量 0 的维数为 2ssSetInputPortRequiredContiguous (S, 0, true) ; /设置 input。的

4、访问方 式,true就是临近访问,这样指针的增量后就可以直接访问下个input端口了。 ssSetInputPortDirectFeedThrough(S, 0, 1) ;/ 设置输入端口的信号是否 mdlOutputs函数中使用,这儿设置为true。辻(!ssSetNumOutputPorts(S, 2) return;/设置输出变量的个数ssSetOutputPortWidth (S, 0, 1) ;/设置输出变量0的维数为1维 ssSetOutputPortWidth(S, 1, 1) ;/设置输出变量1的维数为1维 ssSetNumSampleTimes(S, 1) : /设置采样时间

5、,此处为 Is。ssSetNumRWork (S, 0) ;/不管ssSetNumlWork(S, 0);ssSetNumPWork(S, 0);ssSetNumModes(S, 0);ssSetNumNonsampledZCs(S, 0): ssSetOptions(S, 0):/下面可以写全局变量的初始化程序global_var=l;static void mdllnitializeSampleTimes(SimStruct *S)/暂时不管ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);ssSetOffsetTime (S, 0, 0. 0);

6、#define fl)L_INITIALIZE_CONDITIONS /* Change to itundef to remove function */#if defined(MDL_INITIALIZE_CONDITIONS)static void mdllnitializeConditions (SimStruct *S)/暂时不管#endif /* Nfl)L_INITIALIZE_CONDITIONS */ define MDL_START /* Change to #undef to remove function */#if defined ftL_START)static vo

7、id mdlStart(SimStruct *S)/暂时不管tiendif /* MDL_START */static void mdlOutputs(SimStruct *S, int_T tid)/这里填入相关的运 算、算法等real_T *paral = mxGetPr(ssGetSFcnParam(S, 0); real_T *para2 =mxGetPr(ssGetSFcnParam(S, 1); real_T *para3 =mxGetPr(ssGetSFcnParam(S, 2): const real_T *u = (const real_T*) ssGetlnputPortS

8、ignal(S, 0);real_T *yl = ssGetOutputPortSignal(S, 0); real_T *y2 =ssGetOutputPortSignal(S, 1); ylL0Z=u0j*paral10j+ul*para20; y20=ul*para30+u0*paral0;#define MDL_UPDATE / Change to Sundef to remove function */#辻 defined ftL_UPDATE)static void mdlUpdate(SimStruct *S, int_T tid)#endif /* MDL_UPDATE */#

9、define Nfl)L_DERIVATIVES /* Change to ftundef to remove function */ttif defined (Nfl)L_DERI VAT IVES)static void mdlDerivatives(SimStruct *S)ttendif /* Nfl)L_DERI VAT IVES */static void mdlTerminate (SimStruct *S) /这里需要把 global 变量全部初 始化,否则下次运行程序时,全局变量还是之前的值。tfdef MATLAB_MEX_FILE /* Is this file bein

10、g compiled as a MEX-file?*/include simulink. c /* MEX-file interface mechanism */ttelsettinclude cg_sfun. h /* Code generation registration function */ ttendif2.编译在 mat lab 的 command window 里面输入mex test, c M ,即可将 test, c 编译 为mex文件。3.调用 sfunction在 simulink 空间里面拉入 sfunction,在 s-function name 里面填入 test

11、, 参数里面填入要设定的参数,然后仿真即可。Mat lab中如何编写S函数(zz)2009-03-26 19:11函数是system Function的简称,用它来写自己的simulink模块。可以用mat lab C、C+、Fortran、Ada等语言来写,这儿我只介绍怎样用 mat lab语言来写吧(主要是它比较简单)。先讲讲为什么要用s函数,我觉得用s函数可以利用mat lab的丰富资源,而 不仅仅局限于simulink提供的模块,而用c或C+等语言写的s函数还可以实现 对硬件端口的操作,还可以操作windows API等的。先介绍一下simulink的仿真过程(以便理解s函数),sim

12、ulink的仿真有两个 阶段:一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状 态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更 新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。在mat lab的workspace里打edit sfuntmpl (这是mat lab自己提供的s函数模 板),我们看它来具体分析s函数的结构。它的笫行是这样的:function sys, x0, str, ts=sfuntmpl (t, x, u, flag).先讲输入与输出变量的含义:t是釆样时间,x是状态变量,u是输入(是做成simulink模块的输入),

13、flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义),xO是状 态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻, 一般在初始化中将它置空就可以了,str二),ts是一个1X2的向量,ts(l)是采 样周期,ts(2)是偏移量。下面结合sfuntmpl. m中的代码来讲具体的结构:switch flag, %判断flag,看当前处于哪个状态case 0,sys, xO, str, ts=mdlInitializeSizes;flag二0表示处于初始化状态,此时用函数mdlln

14、itializeSizes进行初始化, 此函数在sfuntmpl. m的149 if,我们找到他,在初始化状态下,sys是一个结构 体,用它来设置模块的一些参数,各个参数详细说明如下size = simsizes;%用于设置模块参数的结构体用simsizes来生成sizes. NumContStates = 0模块连续状态变量的个数sizes. NumDiscStates = 0模块离散状态变量的个数sizes. NumOutputs = 0;%模块输出变量的个数sizes. Numlnputs = 0;%模块输入变量的个数sizes. DirFeedthrough = 1模块是否存在直接贯通

15、(直接贯通我的理解是输 入能直接控制输出)sizes. NumSampleTimes = 1模块的采样时间个数,至少是一个sys = simsizes (sizes) ; %设置完后赋给sys输出举个例子,考虑如下模型:dx/dt二fc (t, x, u)也可以用连续状态方程描述:dx/dt二A*x+B*ux(k+l)=fd(t, x, u)也可以用离散状态方程描述:x (k+1) =H*x (k) +G*u(k)y二fo(t, x, u)也可以用输出状态方程描述:y二C*x+D*u设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我 们就只需改上面那一段代码为:(一般连续状态

16、与离散状态不会一块用,我这儿是为了方便说明)sizes. NumContStates=l;sizes. NumDiscStates=l;sizes. NumOutputs=l;sizes. Numlnputs=l;其他的可以不变。继续在mdllnitializeSizes函数中往下看:xO = ; %状态变量设置为空,表示没有状态变量,以我们上面的假设,可改 为xO二0, 0(离散和连续的状态变量我们都设它初值为0)str = ; %这个就不用说了,保留参数嘛,置就可以了,反正没什么用, 可能7. 0会给它一些意义ts =0 0; %采样周期设为0表示是连续系统,如果是离散系统在下面的 mdl

17、Get %TimeOfNextVarHit 函数中具体介绍。嘻嘻,总算讲完了初始化,后面的应该快了在sfuntmpl的106行继续往下看:case 1,sys=mdlDerivatives(t, x, u);flag二1表示此时要计算连续状态的微分,即上面提到的dx/dt二fc(t, X, u)中 的dx/dt,找到mdlDerivatives函数(在193行)如果设置连续状态变量个数为0, 此处只需sys二;就可以了(如sfuntmp 1中一样),按我们上述讨论的那个模型, 此处改成sys=fc(t, x(l),u)或sys二A*x+B*u %我们这儿x(l)是连续状态变量, 而x(2)是离

18、散的,这儿只用到连续的,此时的输出sys就是微分继续,在sfuntmpl的112行:case 2,sys=mdlUpdate(t, x, u);flag二2表示此时要计算下一个离散状态,即上面提到的x(k+l)=fd(t,x, u), 找到mdlUpd ate函数(在206行)它这儿sys二;表示没有离散状态,我们这而可 以改成 sys二fd(t, x (2), u)或 sys=H*x(2)+G*u;%sys 即为 x(k+l)看来后面儿个一两句话就可了,呵呵,在sfuntmp 1的118行case 3,sys二mdlOutputs(t, x, u);flag二3表示此时要计算输出,即y=fo

19、(t, x, u),找到mdlOutputs函数(在218 行),如上,如果sys二表示没有输出,我们改成sys二fo(t, x, u)或sys二C*x+D*u %sys此时为输出y好像快完了,嘻嘻,在sfuntmpl的124行case 4,sys=mdlGetTimeOfNextVarHit(t, x, u);flagM表示此时要计算下一次采样的时间,只在离散采样系统中有用(即上文 的mdllnit ializeSizes中提到的ts设置ts (1)不为0)连续系统中只需在mdlGetTimeOfNextVarHit函数中写上sys二;这个函数主要 用于变步长的设置,具体实现大家可以用edi

20、t vsfunc看vsfunc. m这个例子最后一个,在sfuntmpl的130行case 9,sys=mdlTerminate(t, x, u);flag二9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上 sys二就可,如果你在结束时还要设置什么,就在此函数中写关于sfuntmpl这个s函数的模板讲完了。s函数还可以带用户参数,下面给个例子,和simulink下的gain模块功能一 样,大伙自己看吧,我睡觉去了,累了。function sys, xO, str, ts = sfungain(t, x, u, flag, gain) switch flag, case 0

21、,sizes = simsizes;sizesNumContStates = 0;sizesNumDiscStates = 0;sizesNumOutputs = 1:sizesNumlnputs = 1:sizesDirFeedthrough = 1:sizesNumSampleTimes = 1:sys = simsizes(sizes):x0二;str=;ts=0, 0;case 3,sys=gain*u;case 1, 2, 4, 9,sys =;end做好 s 函数后,simulink-user-defined function 下拖一个 S-Function 到你的模型,就可以用了,在simulink user-defined function还有个s-Function Builder,他可以生成用c语言写的s函数在mat lab的workspace下打sfundemos,可以看到很多演示s函数的程序。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1