matlab 中 s 函数编写心得 函数是 system Function 的简称,用它来写自己的 simulink 模块。(够简单吧,^_^, 详 细的概念介绍大伙看帮助吧)可以用 matlab、C、C++、Fortran、Ada 等语言来写, 这儿我 只介绍怎样用 matlab 语言来写吧(主要是它比较简单) 先讲讲为什么要用 s 函数, 我觉得用 s 函数可以利用 matlab 的丰富资源, 而不仅仅局 限 于 simulink 提供的模块, 而用 c 或 c++等语言写的 s 函数还可以实现对硬件端口的操作,还 可以操作 windows API 等的 先介绍一下 simulink 的仿真过程(以便理解 s 函数),simulink 的仿真有两个阶段: 一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、 采样 时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、 计算连 续状态等等,这个阶段需要反复运行,直至结束。 在 matlab 的 workspace 里打 edit sfuntmpl(这是 matlab 自己提供的 s 函数模板), 我们 看它来具体分析 s 函数的结构。 它的第一行是这样的: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)是偏移量。 下面结合 sfuntmpl.m 中的代码来讲具体的结构: switch flag, case 0, [sys,x0,str,ts]=mdlInitializeSizes; flag=0 表示处于初始化状态,此时用函数 mdlInitializeSizes 进行初始化,此函数在 sfuntmpl.m 的 149 行 我们找到他,在初始化状态下,sys 是一个结构体,用它来设置模块的一些参数,各个参 数 详细说明如下 size = simsizes;%用于设置模块参数的结构体用 simsizes 来生成 sizes.NumContStates sizes.NumDiscStates sizes.NumOutputs = 0;%模块连续状态变量的个数 = 0;%模块离散状态变量的个数 = 0;%模块输出变量的个数 %判断 flag,看当前处于哪个状态 sizes.NumInputs = 0;%模块输入变量的个数 % sizes.DirFeedthrough = 1;%模块是否存在直接贯通(直接贯通我的理解是输入能 直接控制输出) sizes.NumSampleTimes = 1;%模块的采样时间个数,至少是一个 sys = simsizes(sizes); 举个例子,考虑如下模型: dx/dt=fc(t,x,u) 也可以用连续状态方程描述:dx/dt=A*x+B*u %设置完后赋给 sys 输出 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.NumOutputs=1;sizes.NumInpu ts=1; 其他的可以不变。