Matlab S-funciton
作者:互联网
Matlab S-funciton 使用记录
一、使用基础
1. 功能说明
所谓s函数是system Function的简称, 用它来写自己的simulink模块. s函数可以用matlab、C、C++、Fortran、Ada等语言来写。先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作, 还可以操作windows API等。
先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段: 一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、 采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束.
2. 打开与编辑 S-Function
在matlab的workspace里输入edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构.
重要且全面的学习资料
在matlab命令行中输入 edit sfuntmpl ,可以打开S-function的模板,里面对S-function的函数和变量作用均作了介绍。 S-function的基础是现代控制理论的状态定义,使用S-function需具备现代控制理论的基本知识
二、理解s-function
为什么要有S-function
因为matlab中的模块太过标准化,无法满足多变的应用和调试需求,在以下情况下,S-function可以很方便的对系统进行建模。
控制或受控系统具有复杂时变特性
控制系统在控制过程中自我迭代,存在需要保留和记录的变量
控制系统的输出较为复杂,难以用function和m-function表示
系统在生成、运行或结束时需要执行特殊操作
S-function属性窗口介绍
S-function name :S-function的名字,随便写,自己认识即可
S-function parameters:S-function的模块参数,默认为空
S-function modules :S-function的模块,无需修改,采用系统默认模块即可 也就是说,这三个参数,只需要修改第一个参数为模块命名即可
点击Edit,可以进入S-function的代码编辑界面
S-function内部函数介绍
- sys,x0,str,ts] = functionName(t,x,u,flag)
这是函数的总入口,收到信号后,首先进入这个函数.这个函数包含一个switch语句,根据情况进入不同的子函数 - [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
S-function进行基本的设置,具体参数会在后面进行介绍。相当于构造函数 sys=mdlDerivatives(t,x,u);
该函数仅在连续系统中被调用,用于产生控制系统状态的导数 - sys=mdlUpdate(t,x,u);
该函数仅在离散系统中被调用,用于产生控制系统的下一个状 - sys=mdlOutputs(t,x,u); 产生(传递)系统输出
- sys=mdlGetTimeOfNextVarHit(t,x,u) 获得下一次系统执行(next hit)的时间,该时间为绝对时间
此函数仅在采样时间数组中指定变量离散时间采样时间[-2 0]时会被调用。 - sys=mdlTerminate(t,x,u)
相当于构析函数,结束该仿真模块时被调用
S-function的执行顺序
- 在仿真开始时,执行mdlInitializeSizes
- 若系统包含连续部分,则调用mdlDerivatives;若系统包含离散部分,则调用mdlUpdate
- 调用mdlOutputs,产生输出
- 若满足条件,则执行mdlGetTimeOfNextVarHit
- 循环执行1–3,直至仿真停止
- 执行mdlTerminate,仿真停止
S-function输入输出参数含义
输入参数t,x,u,flag
t :系统时间
x :系统状态
u : 系统输入,即在simulink models中连接至S-function的线上的数据。注意区分x和u
flag : 系统状态,由系统自动生成,决定了系统应当执行哪个S-function子函数
输出参数sys,x0,str,ts,simStateCompliance
sys : 系统本身,可以理解为下一时刻的系统;同时sys的前几个数值(sys[1]等)是系统的输出,即在simulink中S-function伸出线上的数据
x0 : 系统初始状态
str : 状态排序字符串,通常指定为[]。
ts : 可认为是采样时间
simStateCompliance
mdlInitializeSizes例程与介绍
sizes = simsizes; %调用构造函数,生成一个默认类
sizes.NumContStates = 0; %设置系统连续状态的数量
sizes.NumDiscStates = 0; %设置系统离散状态的数量
sizes.NumOutputs = 0; %设置系统输出的数量
sizes.NumInputs = 0; %设置系统输入的数量
sizes.DirFeedthrough = 1; %设置系统直接通过量的数量,一般为1
sizes.NumSampleTimes = 1; % at least one sample time is needed
% 需要的样本时间,一般为1.
% 猜测为如果为n,则下一时刻的状态需要知道前n个状态的系统状态
sys = simsizes(sizes);
x0 = []; % 系统初始状态
str = []; % 保留变量,保持为空
ts = [0 0]; % 采样时间
simStateCompliance = 'UnknownSimState';
注意
S-function的基础是现代控制理论的状态定义,S-function本身是一个系统,可以被设置为控制系统,也可以被设置为受控系统。因此本文所指的系统,均指S-function本身
标签:function,状态,函数,sizes,系统,sys,Matlab,funciton 来源: https://blog.csdn.net/xq1998/article/details/121445749