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的代码编辑界面
Matlab S-funciton

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本身

上一篇:S-function入门及案例详解(2)——S-function基本案例介绍


下一篇:Linux /proc/meminfo文件详解