一、介绍
S函数(S-Function)是系统函数(System Function)的简称,是一个动态的计算机语言描述。在MATLAB中,用户可以选择用M文件编写,也可以选择C语言或者HEX文件编写。
二、原理
由于在研究中经常需要复杂的算法设计,而这些算法因为其复杂性不适合用普通的Simlink模块来搭建,MATLAB所提供的Simulink模块不能满足用户的需求,需要用编程的形式设计出S函数模块,然后嵌入到系统当中。若恰当使用S函数,理论上可以在Simulink下对任意复杂的系统进行仿真。
S函数有固定的程序格式,用MATLAB语言可以编写S函数,此外还允许用户使用C、C++、Fortran和Ada等语言进行编写。用非MATLAB语言进行编写时,需要采用编译器生成动态链接库DLL文件。在命令行窗口中输入sfundemos,或者单机Simulink->User-Defined Functions->S-Function Examples,即可出现所示界面,可以选择对应的变成语言查看演示文件。
为了方便,有一个S函数的模板sfuntmpl.m。仅需要在sfuntmpl.m的基础上进行修改即可。在命令行窗口输入edit sfuntmpl即可出现模板函数的内容。 如下:
function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)
%SFUNTMPL General MATLAB S-Function Template
% 输入参数:
% t、x、u分别对应时间、状态、输入信号
% flag为标志位,其,取值不同,S函数执行的任务和返回的数据也是不同的
% 【若想添加其他的输入可以用逗号隔开】
% 输出参数:
% sys为一个通用返回参数值,其取值根据flag的不同而不同
% x0为状态初始数值
% str在目前为止的matlab版本中并没有什么作用,一般str=[]即可
% ts为一个两列的矩阵,包含采样时间和偏移量俩个参数
%
% The following outlines the general structure of an S-function.
%主函数,switch选择语句
switch flag,
%%%%%%%%%%%%%%%%%%
% Initialization %初始化
%%%%%%%%%%%%%%%%%%
case 0, %系统初始化,调用mdlInitializeSizes函数
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
%%%%%%%%%%%%%%%
% Derivatives %
%%%%%%%%%%%%%%%
case 1, %计算连续状态变量的导数,调用mdlDerivatives函数
sys=mdlDerivatives(t,x,u);
%%%%%%%%%%
% Update %
%%%%%%%%%%
case 2, %更新离散状态变量,调用mdlUpdate函数
sys=mdlUpdate(t,x,u);
%%%%%%%%%%%
% Outputs %
%%%%%%%%%%%
case 3, %计算s函数的输出,调用mdlOutputs函数
sys=mdlOutputs(t,x,u);
%%%%%%%%%%%%%%%%%%%%%%%
% GetTimeOfNextVarHit %
%%%%%%%%%%%%%%%%%%%%%%%
case 4, %计算下一仿真时刻
sys=mdlGetTimeOfNextVarHit(t,x,u);
%%%%%%%%%%%%%
% Terminate %
%%%%%%%%%%%%%
case 9, %仿真结束,调用mdlTerminate函数
sys=mdlTerminate(t,x,u);
%%%%%%%%%%%%%%%%%%%%
% Unexpected flags %
%%%%%%%%%%%%%%%%%%%%
otherwise %其他未知情况处理,用户可自行定义
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
% end sfuntmpl
%
%===========================&#