参考视频:simulink1.1simulink简介_哔哩哔哩_bilibili
一、用户定义函数库中的模块概览
注:MATLAB版本不同,可能有些模块也会有差异,但大体上区别是不大的。
二、Fcn/Matlab Fcn模块
1、Fcn模块
双击Fcn模块,在对话框中可配置一个表达式,其中用u表示输入(u可以是向量甚至是矩阵),表达式可使用MATLAB中的函数,表达式的计算结果即为Fcn模块的输出。
2、Matlab Fcn模块
(1)该模块的作用和Fcn模块差不多,不过它的可操作性更强,Fcn模块根据表达式求结果,而Matlab Fcn模块根据函数求结果,另外该模块的边框是粗黑线条,意味着编译模型时该模块是独立编译的。
(2)双击该模块可打开一个代码编辑窗口,在这里可以编辑该模块中的函数。
三、S函数(仅了解)
1、S函数简介
(1)S函数的全称为system-functions(系统函数),它主要用于扩展simulink环境(扩展simulink模块的用法)。
(2)S函数可使用多种语言进行编写,如C语言、C++、Python、MATLAB、Fortran等,使用C语言、C++和Fortran这些编译型语言需要借助mex文件。
(3)S函数通过特定语法调用simulink中提供给该S函数的应用程序接口,通过该接口,S函数可以和simulink的计算引擎进行交互。
(4)通过S函数可实现连续系统、离散系统和混合控制系统。
2、S函数相关模块概述
(1)(Level-1 M-file)S-Function模块:
①该模块本身能调用系统函数所实现的功能比Level-2 M-file S-Function模块少得多,其存在的意义是为了兼容旧版本的MATLAB。
②该模块主要是用标志位flag来实现相应的功能的,内部使用switch语句对标志位进行判断,针对各种情况进行代码的编写。
③S函数模板有几个默认参数t、x、u(系统输入信号)和flag,S-Function模块会自动将它们传递给S函数,程序员可以在“S-function parameters”字段中指定其它自定义的输入参数值(如自定义参数不止1个,用逗号进行分隔)。
(2)Level-2 M-file S-Function模块:
①该模块使用回调函数的方式,在运行过程中通过调用相应的变量来实现函数调用的功能。
②该模块允许程序员使用MATLAB创建自定义模块,这些模块可以有多个输入和多个输出,并能够处理由simulink模型产生的任何类型的信号。
③Level-1 M-file S-Function模块的S函数引导行(即第一行)中有非常多的参数和返回值,而Level-2 M-file S-Function模块的S函数引导行只有一个函数参数block,且没有返回值,同时在引导行下方调用setup函数(参数为block)建立一个局部的block对象作为运行时对象,接下来,S函数的执行都围绕这个block对象。
④Level-2 M-file S-Function模块的S函数较Level-1 M-file S-Function模块的S函数更为复杂,这里不再进行过多介绍,具体可看官方的帮助文档。
(3)S-Function Builder模块:
①该模块可以使用C语言和C++编写S函数,适用于初次使用C语言或者C++编写S函数的编程人员。
②使用C语言和C++编写S函数的过程比较复杂,本章不会对此进行深入介绍。
3、S函数使用示例
(1)模型如下图所示,常量5为系统的输入信号u。
(2)以下是根据Level-1 M-file S-Function模块S函数模板改制的函数,函数名为mysfun,其中gain和bias为自定义输入参数,在本例中分别定为3和4。
function [sys,x0,str,ts,simStateCompliance] = mysfun(t,x,u,flag,gain,bias) %gain和bias为非模板参数,其它均为S函数模板需要的参数
%t-仿真时间,x-状态变量(针对存在状态方程的情况,也就是系统可进行微分和积分),u-系统输入,flag-标志位
%sys-系统输出,x0-状态初始值,str-保留(暂无作用),ts-[采样周期 采用时间偏移值](连续系统中采样周期为0)
%%%%%%simStateCompliance-允许取值有“DefaultSimState”(默认仿真状态)、“HasNoSimState”(无仿真状态)%和“DisallowSimState”(禁止仿真状态),如不进行设置,则默认为“UknownSimState”(未知仿真状态)
%%%%%
switch flag %判断标志位,区分各种情况case 0 %标志位为0,进行初始化[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;case 3 %根据系统输入求系统输出sys=mdlOutputs(t,x,u,gain,bias);case{1,2,4,9} %未使用的几种情况sys=[];otherwise %系统出错DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end%初始化函数mdlInitializeSizes
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes; %生成S函数使用的结构体
sizes.NumContStates = 0; sizes.NumDiscStates = 0; %连续状态数目和离散状态数目
sizes.NumOutputs = 1; sizes.NumInputs = 1; %输出端口数目和输入端口数目
sizes.DirFeedthrough = 1; %是否有前馈(0代表有,1反之)
sizes.NumSampleTimes = 1; %采样时间的数目(至少需要一个采样时间)sys = simsizes(sizes); %结构体返回
x0 = []; %初始状态
str = []; %保留参数(暂时不用)
ts = [0 0]; %[采样周期 采用时间偏移值]
simStateCompliance = 'UnknownSimState'; %默认仿真状态%对系统输入求微分(无状态变量可不必理会)
function sys=mdlDerivatives(t,x,u)
sys = [];%对系统状态进行更新(没有微分操作可不必理会)
function sys=mdlUpdate(t,x,u)
sys = [];%根据系统输入求系统输出
function sys=mdlOutputs(t,x,u,gain,bias)
sys = gain * u + bias;%设置下一个采样时间点相对上一个采样时间点的间隔(仅针对离散系统)
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1; %间隔秒数
sys = t + sampleTime;%运行结束后执行清空操作(释放内存,使用MATLAB编写S函数可不必理会)
function sys=mdlTerminate(t,x,u)
sys = [];