- 6
- 0
- 约7.07千字
- 约 12页
- 2019-05-17 发布于浙江
- 举报
matlab 中 s 函数编写心得(转)
2011-12-20 12:07:54| 分类:Matlab|举报|字号订阅
Part I:
所谓s函数是systemFunction的简称,用它来写自己的simulink
模块.s函数可以用matlab、C、C++、Fortran、Ada等语言来写,这
儿我只介绍怎样用matlab语言来写吧 (主要是它比较简单)
xmlnamespace prefix o ns
urn:schemas-microsoft-com:office:office/
先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰
富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言
写的s函数还可以实现对硬件端口的操作,还可以操作windowsAPI
等
先介绍一下simulink的仿真过程 (以便理解s函数),simulink
的仿真有两个阶段:一个为初始化,这个阶段主要是设置一些参数,
像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运
行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态
等等,这个阶段需要反复运行,直至结束.
在matlab的workspace里输入edit sfuntmpl(这是matlab 自
己提供的s函数模板),我们看它来具体分析s函数的结构.
1. 函数的函数头
函数的第一行:function[sys,x0,str,ts] sfuntmpl(t,x,u,flag), 先
讲输入与输出变量的含义:
t是采样时间,x是状态变量, u是输入(是做成simulink模块的输
入),flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行
等)
sys输出根据flag的不同而不同(下面将结合flag来讲sys的含
义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想
好该怎么用它, 一般在初始化中将它置空就可以了,str []),ts是一个
1×2的向量,ts(1)是采样周期,ts(2)是偏移量
2. 函数分析
下面结合sfuntmpl.m中的代码来讲具体的结构:
switchflag, %判断flag,看当前处于哪个状态
case 0,
[sys,x0,str,ts] mdlInitializeSizes;
// 解释说明
flag 0表示当前处于初始化状态,此时调用函数
mdlInitializeSizes进行初始化,此函数在该文件的第 149行定义. 其
中的参数sys是一个结构体,它用来设置模块的一些参数,各个参数详
细说明如下
size simsizes;%用于设置模块参数的结构体用simsizes来生
成
sizes.NumContStates 0; %模块连续状态变量的个数
sizes.NumDiscStates 0; %模块离散状态变量的个数
sizes.NumOutputs 0; %模块输出变量的个数
sizes.NumInputs 0; %模块输入变量的个数
sizes.DirFeedthrough 1; %模块是否存在直接贯通
sizes.NumSampleTimes 1; %模块的采样时间个数, 至少是
一个
sys simsizes(sizes); %设置完后赋给sys输出
举个例子,考虑如下模型:
dx/dt fc(t,x,u) 也可以用连续状态方程描述:dx/dt A*x+B*u
x(k+1) fd(t,x,u) 也可以用离散状态方程描述:
x(k+1) H*x(k)+G*u(k)
y fo(t,x,u) 也可以用输出状态方程描述:y C*x+D*u
设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为 1
个,我们就只需改上面那一段代码为(一般连续状态与离散状态不会一
块用, 我这儿是为了方便说明):
sizes.NumContStates 1;sizes.NumDiscStates 1;sizes.Nu
mOutputs 1;sizes.NumInputs 1;
其他的可以不变, 继续在mdlInitializeSizes函数中往下看:
x0 []; %状态变量设置为空,表示没有
原创力文档

文档评论(0)