最近看了一下无刷直流电机的相关概念及仿真,看到大多数的文献仿真中都使用到了S函数,因此下了点资料看了一番,在本博文中简单地说一下S函数的概念及使用。
    S函数即系统函数System Function的意思,为什么要使用S函数呢?是因为在研究中,有时需要用到复杂的算法设计等,而这些算法因为其复杂性不适合用普通的Simulink模块来搭建,即matlab所提供的Simulink模块不能满足用户的需求,需要用编程的形式设计出S函数模块,将其嵌入到系统中。如果恰当地使用S函数,理论上,可以在Simulink下对任意复杂的系统进行仿真。
    S函数具有固定的程序格式,用matlab语言可以编写S函数,此外还允许用户使用CC++FortranAda等语言进行编写,用非matlab语言进行编写时,需要采用编译器生成动态链接库DLL文件。
在主窗口中输入sfundemos,或者点击Simulink->User-Defined Functions->S-Function Examples,即可出现如图1所示的界面,可以选择对应的编程语言查看演示文件。
1 S函数范例库
Matlab为了用户使用方便,有一个S函数的模板sfuntmpl.m,一般来说,我们仅需要在sfuntmpl.m的基础上进行修改即可。在主窗口输入edit sfuntmpl即可出现模板函数的内容,可以详细地观察其帮助说明以便更好地了解S函数的工作原理。模板函数的定义形式为function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag),一般来说,S函数的定义形式为[sys,x0,str,ts]=sfunc(t,x,u,flag,p1,Pn),其中的sfunc为自己定义的函数名称,以上参数中,
txu分别对应时间、状态、输入信号,flag为标志位,其取值不同,S函数执行的任务和返回的数据也是不同的,pn为额外的参数,sys为一个通用的返回参数值,其数值根据flag的不同而不同,x0为状态初始数值,str在目前为止的matlab版本中并没有什么作用,一般str=[]即可,ts为一个两列的矩阵,包含采样时间和偏移量两个参数,如果设置为[0 0],那么每个连续的采样时间步都运行,[-1 0]则表示按照所连接的模块的采样速率进行,[0.25 0.1]表示仿真开始的0.1s后每0.25s运行一次,采样时间点为TimeHit=n*period+offset
S函数的使用过程中有2个概念值得注意:1direct feedthrough,系统的输出是否直接和输入相关联,即输入是否出现在输出端的标志,若是为1,否则为0,一般可以根据在flag=3的时候,mdlOutputs函数是否调用输入u来判断是否直接馈通。2dynamically sized inputs,主要给出连续状态的个数、离散状态的个数、输入数目、输出数目和直接馈通否。
S函数中目前支持的flag选择有012349等几个数值,下面说一下在不同的flag情况下S函数的执行情况。1flag=0。进行系统的初始化过程,调用mdlInitializeSizes函数,对参数进行初始化设置,比如离散状态个数、连续状态个数、模块输入和输出的路数、模
块的采样周期个数、状态变量初始数值等。2flag=1。进行连续状态变量的更新,调用mdlDerivatives函数。3flag=2。进行离散状态变量的更新,调用mdlUpdate函数。4flag=3。求取系统的输出信号,调用mdlOutputs函数。5flag=4。调用mdlGetTimeOfNextVarHit函数,计算下一仿真时刻,由sys返回。6flag=9。终止仿真过程,调用mdlTerminate函数。
2 不同flag情况下S函数执行情况
在实际仿真过程中,Simulink会自动将switch函数用法举例flag设置为0,进行初始化过程,然后将flag的数值设置为3,计算模块的输出,一个仿真周期后,Simulinkflag的数值先后设置为12,更新系统的连续和离散状态,再将其设置为3,计算模块的输出,如此循环直至仿真结束条件满足。 
S函数的编写过程中,首先需要搞清楚模块中有多少个连续和离散状态,离散模块的采样周期是如何的,同时需要了解模块的连续和离散的状态方程分别是什么,输出如何表示。下面以实例说明S函数的具体应用。
实例一:在进行BLDC的速度电流双闭环控制时候,如果电流采用滞缓控制,那么速度环的输出作为参考电流的输入IsABC三相的参考电流分别为I_arI_brI_cr,转子的位置记为Pos,那么转子位置和三相参考电流之间的关系表如图3所示。
3 转子位置和三相参考电流的关系表
分析系统情况:输入为两路,一是角度Angle,通过mod(angle,2*pi)转化为Pos,二是参考电流输入Is,输出为三路,分别为ABC的三相参考电流,离散和连续的状态均为0,输入端出现在输出端,将S函数命名为given_current,其程序代码如下所示:
%参考电流模块
%Author:dingqian12345@126
%很明显:2个输入分别为角度和速度控制器的输出、3个输出为三相电流的参考电流、为直通模型
function [sys,x0,str,ts]=cemf(t,x,u,flag)
clc;
switch flag
    case 0
        [sys,x0,str,ts]=mdlInitializeSizes;    %初始化
    case 1
        sys=[];                                %连续状态的更新
    case 2
        sys=[];              %离散状态的更新
    case 3
        sys=mdlOutputs(u);                      %求取系统的输出信号
    case 4
        sys=[];                                %计算下一时刻的仿真时间
    case 9
        sys=[];                                %终止仿真
    otherwise
        error(['Unhandled flag=',num2str(flag)]);
end
%%%%%flag=0的时候进行整个系统的初始化
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;            %读入初始化参数模板

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。