Simulink S-Function使用指南(matlab提供说明+中文解析)

Matlab提供的学习资料

在Matlab命令行中输入>> edit sfuntmpl 
可获取详细的资料

你觉得S-Function很难学,但是一旦学会,你发现Simulink更加好用了!!

如果有以下需求可以用S-Fuction
(1)被模块化的Simulink搞得晕头转向,想要通过一个函数写出复杂的被控系统
(2)想要保存在时域的变量
(3)控制系统输出较为复杂,难以用function m-function描述
(4)控制系统具有复杂的时变特性

S-Function界面介绍
在这里插入图片描述

S-function name:自己定义的名字,一般和.m文件名相同;
S-function parameters:参数,不填
S-function modules :模块,不填
**点击“Edit”,即可进入代码编辑界面**

S-Function 函数结构

[sys,x0,str,ts] = functionName(t,x,u,flag)
%主函数,接收信号后,首先进入这个函数。函数包含一个switch语句,依据case的不同,调用不同的函数。

[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)的时间,该时间为绝对时间。请注意,仅当在采样时间数组中以mdlInitializeSizes指定变量离散时间采样时间[-2 0]时,才使用此函数。

sys=mdlTerminate(t,x,u)
%相当于构析函数(~Class),结束该仿真模块时被调用

S-Function执行顺序

(1)在仿真开始时,执行mdlInitializeSizes;
(2)若系统包含连续部分,则调用mdlDerivatives;若系统包含离散部分,则调用mdlUpdate
(3)调用mdlOutputs,产生输出
(4)若满足条件,则执行mdlGetTimeOfNextVarHit
(5)循环执行1--3,直至仿真停止
(6)执行mdlTerminate,仿真停止

S-Function输入输出参数的含义
1. 输入参数t,x,u,flag介绍

t: 系统时间
x:系统状态
u:系统输入,即为Simulink中输入给S-Function的数据
flag:系统状态,自动生成,返回的flag决定系统当前执行到哪个S-Function子函数

2. 输出参数sys,x0,str,ts,simStateCompliance介绍

sys : 系统本身,可以理解为下一时刻的系统;同时sys的前几个数值(sys[1]等)是系统的输出,即在simulink中S-function伸出线上的数据
x0 : 系统初始状态
str : 状态排序字符串,通常指定为[]。
ts : 可认为是采样时间
simStateCompliance: 指定在保存和恢复模型的完整模拟状态时如何处理此块。允许的值为:“DefaultSimState”、“HasNoSimState”或“DisallowSimState”。
如果未指定该值,则模拟特征的块符合性设置为“UknownSimState”。

mdlInitializeSizes例程与介绍

sizes = simsizes;           %调用构造函数,生成一个默认类

sizes.NumContStates  = 0;   	%设置系统连续状态的数量
sizes.NumDiscStates  = 0;   	% 设置系统离散状态的数量
sizes.NumOutputs     = 0;   	% 设置系统输出的数量
sizes.NumInputs      = 0;   		% 设置系统输入的数量
sizes.DirFeedthrough = 1;   	% 设置系统直接通过量的数量,一般为1
sizes.NumSampleTimes = 1;  % 需要的样本时间,一般为1.
% NumSampleTimes : 0 表示没有,即用户在编写 mdlOutputs 子函数时确保子函数的 sys 不出现输入变量u;1 表示有直接联系,即在输出的 sys 中与 u 有直接的联系。

sys = simsizes(sizes);             % 创建类对象sys
x0  = [];                  					% 系统初始状态
str = [];                   					% 保留变量,保持为空
ts  = [0 0];                				% 采样时间
simStateCompliance = 'UnknownSimState';

给个小例子,让你更清楚

该例子是用S-Function构建PID控制器Gc和被控对象Gg.
采用初始化、微分函数和输出函数,即mdlInitializeSizes函数、mdlDerivatives函数、mdlOutputs函数。
==========================================================================
在初始化中采用sizes的结构,选择2个输出,3个输入,3个输入实现了P、I、D三项的输入。
其中初始条件x(0)=0,dx(0)=0
Kp,Ki,Kd = 60,1,3;
另一个S-Function用于生成一个状态空间,转成传递函数和Simulink中133/(s^2+25s)等价,这里不过是状态空间的写法
dx = Ax + Bu
y = Cx + Du
==>
A = [0 1; 0 -25]; B = [0; 133]; C = [1 0]; D = 0;

在这里插入图片描述

%%chap3s.m
% u系统输入,即为Simulink中输入给S-Function的数据,这里指控制器提供给函数的三个信号,所以很明显,sizes.NumInputs = 3
function [sys, x0, str, ts] = s_function(t, x, u, flag)

switch flag
    case 0
         [sys, x0, str, ts] = mdlInitializeSizes;
    case 3
        sys = mdlOutputs(t,x,u);
    case {2, 4, 9}
        sys = [];
    % Unexpected flags
    otherwise
        error(['UNhandled flag = ', num2str(flag)]);
         
end
% 这里说明,因为在前面已经给定控制器的模型,该S-Function的作用只是将Kp,Ki,Kd的值给系统加上
function [sys, x0, str, ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0;	% 设置连续信号个数
sizes.NumDiscStates = 0;	% 设置离散信号个数
sizes.NumOutputs = 1;     	% 输出信号个数,这里指正弦跟踪误差信号
sizes.NumInputs = 3;		% 输入信号个数,这里指PID三个环节的输入
sizes.DirFeedthrough = 1;	% 设置系统直接通过量的数量,一般为1
sizes.NumSampleTimes = 0;	% 需要的样本时间,一般为1.

sys = simsizes(sizes);    
x0 = [];
str = [];
ts = [];

% 产生输出
function sys = mdlOutputs(t,x,u) 
error = u(1);
derror = u(2);
errori = u(3);

kp = 60;
ki = 1;
kd = 3;
ut = kp*error + kd*derror + ki*errori;

sys(1) = ut;  % 同时sys的前几个数值(sys[1])是系统的输出,即在simulink中S-function伸出线上的数据
%%chap1_3plant.m
% S-Function for continuous state equation
function [sys, x0, str, ts] = s_function(t, x, u, flag)
switch flag
    %Initialization
    case 0
        [sys, x0, str, ts] = mdlInitializeSizes;  % 初始化构造函数
    case 1
        sys = mdlDerivatives(t,x,u);
    %Outputs
    case 3
        sys = mdlOutputs(t, x, u);
    %Unhandled flags
    case {2, 4, 9}
        sys =[];
    %Unexpected flags
    otherwise
        error(['UNhandled flag = ', num2str(flag)]);

end

function [sys, x0, str, ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2;    % 连续状态的个数为两个,分别为dx(t)y(t)
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;       % 输出为一个
sizes.NumInputs = 1;		% 输入为一个,即经过控制器校正的信号
sizes.DirFeedthrough = 0;   % 无关系则为0
sizes.NumSampleTimes = 0;

sys = simsizes(sizes);
x0 = [0, 0];
str = [];
ts = [];

function sys = mdlDerivatives(t,x,u)

sys(1) = x(2);
% sys(2) = -(25+10*rands(1))*x(2)+(133+30*rands(1))*u;
sys(2) = -(25+10*sin(t))*x(2)+(133+30*sin(t))*u;

function sys = mdlOutputs(t,x,u)
sys(1) = x(1);

  • 36
    点赞
  • 269
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Simulink 中的 S-Function 是一种用于模拟系统中不能用内置模块描述的部分的功能。它可以使用 C 或 MATLAB 编写,并在模拟过程中被当作一个模块运行。S-Function 可以用来描述硬件设备、自定义算法或其他系统部分。 ### 回答2: Simulink中的S-Function是一种可以允许用户使用C或C++编写的自定义函数,可用于模型中的特定子系统。S-Function可用于执行多种任务,如执行用户自定义的数学操作、IO访问、系统调用和任意样板代码等。 S-Function可以实现以下功能: 1.利用C/C++的高扩展性和灵活性。利用S-Function,用户可以使用自己的函数来实现Matlab Simulink中的特定应用程序。高扩展性和灵活性允许用户修正和更新已有的模型。 2.可通过自定义代码来执行特定的模型操作。用户可以使用S-Function来定义模型中复合组件的处理过程。这特别适合需要进行高度定制的操作的用户。例如,用户可能需要使用自己的数据格式或算法计算缺省模型中未命名的操作。 3.直接访问硬件并读写外部数据。S-Function提供了对硬件的直接访问,因此,您可以使用S-Function编写代码,直接从设备获取或向设备发送数据。例如,用户可能需要在与某种设备交互时,读取数据或执行控制操作,如放置数据在模型之外的组件上。 4.调用外部库和函数。用户可以使用S-Function来定义在模型中所使用的库。这提供用户更大自由度,允许用户使用未在配置文件中列出的库。 总的来说,S-FunctionMatlab Simulink中非常强大的一个工具,可以帮助用户实现各种不同的功能和操作,并且还支持用户自定义的代码。虽然需要一些编程技能,但是对于需要使用自定义函数来实现复杂模型的用户,S-Function是一个不可或缺的工具。 ### 回答3: Simulink中的S-Function,全称为Simulation Function Blocks,是Simulink用来扩展其本身的功能的工具箱之一。S-Function可以被认为是一种自定义的Simulink Block,允许用户使用C、C++、Assembly或Matlab语言等来编写其激活函数(S-Function可以与其他语言之间结合使用)。 与其他Simulink Block一样,S-Function也是由输入端口和输出端口组成的,但S-Function之所以与众不同,是因为其具有以下特征: 1. 自定义输入、输出信号的数据结构和处理方法; 2. 可以直接调用外部的代码(例如:C++函数,Matlab脚本等); 3. 可实现相对较为复杂的算法(例如:嵌入式系统的控制算法等); 4. 消耗的计算资源相比其他Block要更加经济。 S-Function使用方法如下: 1. 首先在Simulink中打开一个新模型; 2. 然后,在Simulink库中找到S-Function Block,将其拖动至模型中; 3. 在S-Function Block的参数设置中,用户需要指定本身实现的算法,以及输入输出信号等; 4. 可以打开S-Function编辑器,根据需要,定制自己需要的代码逻辑; 5. 保存工具箱以便在其他模型中重复使用。 总之,通过S-Function的使用,用户可以在Simulink中实现各种自定义算法和控制逻辑的设计,提高模型的可用性和模拟表现力。因此,熟练掌握S-Function的开发流程是Simulink基本技能之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值