matlab s函数运行过程,matlab的s函数简介及其仿真过程.doc

41528d3028836879cd698677c3999917.gifmatlab的s函数简介及其仿真过程.doc

一、S函数简介S函数是SYSTEMFUNCTION的简称,用它来写自己的SIMULINK模块。可以用MATLAB、C、C、FORTRAN、ADA等语言来写。用S函数可以利用MATLAB的丰富资源,而不仅仅局限于SIMULINK提供的模块,而用C或C等语言写的S函数还可以实现对硬件端口的操作,还可以操作WINDOWSAPI等的二、SIMULINK的仿真过程SIMULINK的仿真有两个阶段第一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。在MATLAB的WORKSPACE里输入EDITSFUNTMPL,便打开一个MATLAB自己提供的S函数模板。S函数的结构如下第一行FUNCTIONSYS,X0,STR,TSSFUNTMPLT,X,U,FLAG输入与输出变量的含义T是采样时间,X是状态变量,U是输入(是做成SIMULINK模块的输入),FLAG是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);SYS输出根据FLAG的不同而不同(下面将结合FLAG来讲SYS的含义),X0是状态变量的初始值,STR是保留参数,一般在初始化中将它置空就可以了,STR,TS是一个12的向量,TS1是采样周期,TS2是偏移量。SWITCHFLAG,判断FLAG,看当前处于哪个状态CASE0,SYS,X0,STR,TSMDLINITIALIZESIZESFLAG0表示处于初始化状态,此时用函数MDLINITIALIZESIZES进行初始化。在初始化状态下,SYS是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下SIZESIMSIZES用于设置模块参数的结构体用SIMSIZES来生成SIZESNUMCONTSTATES0模块连续状态变量的个数SIZESNUMDISCSTATES0模块离散状态变量的个数SIZESNUMOUTPUTS0模块输出变量的个数SIZESNUMS0模块输入变量的个数SIZESDIRFEEDTHROUGH1模块是否存在直接贯通(即输入能直接控制输出)SIZESNUMSAMPLETIMES1模块的采样时间个数,至少是一个SYSSIMSIZESSIZES设置完后赋给SYS输出举个例子,考虑如下模型DX/DTFCT,X,U也可以用连续状态方程描述DX/DTAXBUXK1FDT,X,U也可以用离散状态方程描述XK1HXKGUKYFOT,X,U也可以用输出状态方程描述YCXDU设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为(一般连续状态与离散状态不会一块用,这儿是为了方便说明)SIZESNUMCONTSTATES1SIZESNUMDISCSTATES1SIZESNUMOUTPUTS1SIZESNUMS1其他的可以不变。继续在MDLINITIALIZESIZES函数中往下看X0状态变量设置为空,表示没有状态变量,以我们上面的假设,可改为X00,0离散和连续的状态变量我们都设它初值为0STR保留参数TS00采样周期设为0表示是连续系统,如果是离散系统在下面的MDLGETTIMEOFNEXTVARHIT函数中具体介绍在SFUNTMPL的106行继续往下看CASE1,SYSMDLDERIVATIVEST,X,UFLAG1表示此时要计算连续状态的微分,即上面提到的DX/DTFCT,X,U中的DX/DT,找到MDLDERIVATIVES函数(在193行)如果设置连续状态变量个数为0,此处只需SYS就可以了,按我们上述讨论的那个模型,此处改成SYSFCT,X1,U或SYSAX1BU我们这儿X1是连续状态变量,而X2是离散的,这儿只用到连续的,此时的输出SYS就是微分在SFUNTMPL的112行CASE2,SYSMDLUPDATET,X,UFLAG2表示此时要计算下一个离散状态,即上面提到的XK1FDT,X,U,找到MDLUPDATE函数(在206行)它这儿SYS表示没有离散状态,我们这而可以改成SYSFDT,X2,U或SYSHX2GUSYS即为XK1在SFUNTMPL的118行CASE3,SYSMDLOUTPUTST,X,UFLAG3表示此时要计算输出,即YFOT,X,U,找到MDLOUTPUTS函数(在218行),如上,如果SYS表示没有输出,我们改成SYSFOT,X,U或SYSCXDUSYS此时为输出Y在SFUNTMPL的124行CASE4,SYSMDLGETTIMEOFNEXTVARHITT,X,UFLAG4表示此时要计算下一次采样的时间,只在离散采样系统中有用即上文的MDLINITIALIZESIZES中提到的TS设置TS1不为0连续系统中只需在MDLGETTIMEOFNEXTVARHIT函数中写上SYS这个函数主要用于变步长的设置,具体实现大家可以用EDITVSFUNC看VSFUNCM这个例子最后一个,在SFUNTMPL的130行CASE9,SYSMDLTERMINATET,X,UFLAG9表示此时系统要结束,一般来说写上在MDLTERMINATE函数中写上SYS就可,如果你在结束时还要设置什么,就在此函数中写S函数还可以带用户参数,下面给个例子,和SIMULINK下的GAIN模块功能一样,FUNCTIONSYS,X0,STR,TSSFUNGAINT,X,U,FLAG,GAINSWITCHFLAG,CASE0,SIZESSIMSIZESSIZESNUMCONTSTATES0SIZESNUMDISCSTATES0SIZESNUMOUTPUTS1SIZESNUMS1SIZESDIRFEEDTHROUGH1SIZESNUMSAMPLETIMES1SYSSIMSIZESSIZESX0STRTS0,0CASE3,SYSGAINUCASE{1,2,4,9},SYSEND做好了S函数后,SIMULINKUSERDEFINEDFUNCTION下拖一个SFUNCTION到你的模型,就可以用了在SIMULINKUSERDEFINEDFUNCTION还有个SFUNCTIONBUILDER,他可以生成用C语言写的S函数在MATLAB的WORKSPACE下打SFUNDEMOS,可以看到很多演示S函数的程序。三、具体用法创建一个有1输入(2维),2输出(1维),3个参数,还有全局变量的SFUNCTION。1新建SFUNCTION的C语言文件打开SIMULINK,点击USERDEFINEDFUNCTIONS里面的SFUNCTIONEXAMPLES。这个里面有多个语言版本的模板,有C,C,ADA,FORTRAN和M语言的版本,其实都大同小异,只要了解几个函数就很容易使用了。选择C语言的版本从SFUNCTION模块中选择CFILESFUNCTIONS里面的BASICCMEXTEMPLATE。打开后,另存为自己的模块名字,如TESTC。下面我们来分析代码DEFINES_FUNCTION_NAMETEST//这里把文件名SFUNTMPL_BASIC修改为TESTDEFINES_FUNCTION_LEVEL2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值