我是靠谱客的博主 斯文柚子,最近开发中收集的这篇文章主要介绍Matlab-Simulink_自定义函数1 Fcn模块2 MATLAB Function模块3 S-Function模块,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1 Fcn模块

Fcn 模块将指定的数学表达式应用于其输入

 

2 MATLAB Function模块

使用 MATLAB Function 模块可以编写用于 Simulink® 模型的 MATLAB® 函数。

双击MATLAB Function模块可以进行函数编辑。

 

3 S-Function模块

可以通过编写M文件供S-Function调用;点击edit可以打开函数文件

通过输入edit sfuntmpl可以打开sfuntion的编辑模板。

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的执行顺序

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

S-function输入输出参数含义

输入参数t,x,u,flag:

  • t :系统时间,代表当前的仿真时间
  • x :系统状态,行向量,格式为x(1),x(2)
  • u : 系统输入向量,即在simulink models中连接至S-function的线上的数据。注意区分x和u
  • flag : 系统状态,由系统自动生成,决定了系统应当执行哪个S-function子函数

输出参数sys,x0,str,ts,simStateCompliance:

  • sys : 系统本身,可以理解为下一时刻的系统;同时sys的前几个数值(sys[1]等)是系统的输出,即在simulink中S-function伸出线上的数据
  • x0 : 系统初始状态,格式为x0=[0;0;0].
  • str : 状态排序字符串,通常指定为[],无具体含义。
  • ts : 可认为是采样时间,表示模块采样时间和偏差的矩阵,[period,offfset],当ts=-1时表示iyu输入信号同采样周期。
  • simStateCompliance

 

 运行结果:

test_ljs.m:

%函数的总入口,收到信号后,首先进入这个函数.这个函数包含一个switch语句,根据情况进入不同的子函数
function [sys,x0,str,ts] = spacemodel(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
case 1,
sys=mdlDerivatives(t,x,u);
case 2,
sys=mdlUpdate(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9,
sys=mdlTerminate(t,x,u);
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
%S-function进行基本的设置,相当于构造函数,定义S函数的基本特性,包括采样时间、连续或者离散状态的初始条件和Sizes数组
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
%调用构造函数,生成一个默认类
sizes.NumContStates
= 2;
%设置系统连续状态的数量,如果是2个输出,则设为2
sizes.NumDiscStates
= 0;
%设置系统离散状态的数量
sizes.NumOutputs
= 2;
%设置系统输出的数量,如果是2个输出,则设为2
sizes.NumInputs
= 1;
%设置系统输入的数量
sizes.DirFeedthrough = 1;
%设置系统直接通过量的数量,一般为1
sizes.NumSampleTimes = 1;
% At least one sample time is needed
% 采样时间个数,1表示只有一个采样周期.
% 猜测为如果为n,则下一时刻的状态需要知道前n个状态的系统状态
sys = simsizes(sizes);
%将sizes结构体中的信息传递给sys
x0
= [0 1];
% 系统初始状态
str = [];
% 保留变量,保持为空
ts
= [0 0];
% 采样时间
%该函数仅在连续系统中被调用,计算连续状态变量的微分方程,求所给表达式的等号左边状态变量的积分值的过程
function sys=mdlDerivatives(t,x,u)
%Time-varying model
sys(1)=u*1;
sys(2)=u*2;
%产生(传递)系统输出
function sys=mdlOutputs(t,x,u)
% sys(1)=x(1);
% sys(2)=x(2);
if u<-0.5
sys(1)=-1;
sys(2)=-2;
elseif u>=-0.5 && u <=0.5
sys(1)=0;
sys(2)=0;
elseif u>0.5
sys(1)=1;
sys(2)=2;
end
%此外,还有三类函数如下
%sys=mdlUpdate(t,x,u); 该函数仅在离散系统中被调用,用于产生控制系统的下一个状态;更新离散状态、采样时间和主时间步的要求
function sys=mdlUpdate(t,x,u)
sys =[];
% sys=mdlGetTimeOfNextVarHit(t,x,u) 获得下一次系统执行(next hit)的时间,该时间为绝对时间 此函数仅在采样时间数组中指定变量离散时间采样时间[-2 0]时会被调用。
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1;
%设置下一个采样时间在1s之后
sys = t + sampleTime;
% sys=mdlTerminate(t,x,u) 相当于构析函数,结束该仿真模块时被调用
function sys=mdlTerminate(t,x,u)
sys = [];

例1:用S函数实现Gain模块 ,通过建立 Mask传递参数Gain_fac

建立模型

 Mask封装s-function:

 封装效果:

 S-function设置:

将Mask中的参数产地到function中

 代码实现:

注意主函数和mdlOutputs函数多了一个Gain_fac参数传递作为Gan的系数

%函数的总入口,收到信号后,首先进入这个函数.这个函数包含一个switch语句,根据情况进入不同的子函数
function [sys,x0,str,ts] = Gain_sfun_test(t,x,u,flag,Gain_fac)
switch flag,
case 0, %第一步:设置初始条件
[sys,x0,str,ts]=mdlInitializeSizes;
case 1,%更新输出前,计算导数
sys=mdlDerivatives(t,x,u);
case 2,,%第四步:更新离散状态
sys=mdlUpdate(t,x,u);
case 3,%第三步:计算输出;第五步:计算输出
sys=mdlOutputs(t,x,u,Gain_fac);
case 4,%第二步:计算下一个采样时间,适应与变采样时间
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9,%结束仿真
sys=mdlTerminate(t,x,u);
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
%S-function进行基本的设置,相当于构造函数,定义S函数的基本特性,包括采样时间、连续或者离散状态的初始条件和Sizes数组
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
%调用构造函数,生成一个默认类
sizes.NumContStates
= 0;
%设置系统连续状态的数量,如果是2个输出,则设为2
sizes.NumDiscStates
= 0;
%设置系统离散状态的数量
sizes.NumOutputs
= 1;
%设置系统输出的数量,如果是2个输出,则设为2
sizes.NumInputs
= 1;
%设置系统输入的数量
sizes.DirFeedthrough = 1;
%设置系统直接通过量的数量,一般为1
sizes.NumSampleTimes = 0;
% At least one sample time is needed
% 采样时间个数,1表示只有一个采样周期.
% 猜测为如果为n,则下一时刻的状态需要知道前n个状态的系统状态
sys = simsizes(sizes);
%将sizes结构体中的信息传递给sys
x0
= [];
% 系统初始状态
str = [];
% 保留变量,保持为空
ts
= [];
% 采样时间
%该函数仅在连续系统中被调用,计算连续状态变量的微分方程,求所给表达式的等号左边状态变量的积分值的过程
function sys=mdlDerivatives(t,x,u)
%Time-varying model
% sys(1)=u*1;
% sys(2)=u*2;
sys=[];
%产生(传递)系统输出
function sys=mdlOutputs(t,x,u,Gain_fac)
sys(1)=Gain_fac*u;
% sys(2)=x(2);
%此外,还有三类函数如下
%sys=mdlUpdate(t,x,u); 该函数仅在离散系统中被调用,用于产生控制系统的下一个状态;更新离散状态、采样时间和主时间步的要求
function sys=mdlUpdate(t,x,u)
sys =[];
% sys=mdlGetTimeOfNextVarHit(t,x,u) 获得下一次系统执行(next hit)的时间,该时间为绝对时间 此函数仅在采样时间数组中指定变量离散时间采样时间[-2 0]时会被调用。
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1;
%设置下一个采样时间在1s之后
sys = t + sampleTime;
% sys=mdlTerminate(t,x,u) 相当于构析函数,结束该仿真模块时被调用
function sys=mdlTerminate(t,x,u)
sys = [];

 运行结果:

例2:用S函数实现积分模块 

建立模型

S-Function代码:

%函数的总入口,收到信号后,首先进入这个函数.这个函数包含一个switch语句,根据情况进入不同的子函数
function [sys,x0,str,ts] = Gain_sfun_test(t,x,u,flag)
switch flag,
case 0, %第一步:设置初始条件
[sys,x0,str,ts]=mdlInitializeSizes;
case 1,%更新输出前,计算导数
sys=mdlDerivatives(t,x,u);
case 2,,%第四步:更新离散状态
sys=mdlUpdate(t,x,u);
case 3,%第三步:计算输出;第五步:计算输出
sys=mdlOutputs(t,x,u);
case 4,%第二步:计算下一个采样时间,适应与变采样时间
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9,%结束仿真
sys=mdlTerminate(t,x,u);
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
%S-function进行基本的设置,相当于构造函数,定义S函数的基本特性,包括采样时间、连续或者离散状态的初始条件和Sizes数组
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
%调用构造函数,生成一个默认类
sizes.NumContStates
= 1;
%设置系统连续状态的数量,如果是2个输出,则设为2
sizes.NumDiscStates
= 0;
%设置系统离散状态的数量
sizes.NumOutputs
= 1;
%设置系统输出的数量,如果是2个输出,则设为2
sizes.NumInputs
= 1;
%设置系统输入的数量
sizes.DirFeedthrough = 1;
%设置系统直接通过量的数量,一般为1
sizes.NumSampleTimes = 0;
% At least one sample time is needed
% 采样时间个数,1表示只有一个采样周期.
% 猜测为如果为n,则下一时刻的状态需要知道前n个状态的系统状态
sys = simsizes(sizes);
%将sizes结构体中的信息传递给sys
x0
= [0];
% 系统初始状态
str = [];
% 保留变量,保持为空
ts
= [];
% 采样时间
%该函数仅在连续系统中被调用,计算连续状态变量的微分方程,求所给表达式的等号左边状态变量的积分值的过程
function sys=mdlDerivatives(t,x,u)
%Time-varying model
% sys(1)=u*1;
% sys(2)=u*2;
sys=3*u;%求积分
%产生(传递)系统输出
function sys=mdlOutputs(t,x,u)
sys(1)=2*x;%产生输出
% sys(2)=x(2);
%此外,还有三类函数如下
%sys=mdlUpdate(t,x,u); 该函数仅在离散系统中被调用,用于产生控制系统的下一个状态;更新离散状态、采样时间和主时间步的要求
function sys=mdlUpdate(t,x,u)
sys =[];
% sys=mdlGetTimeOfNextVarHit(t,x,u) 获得下一次系统执行(next hit)的时间,该时间为绝对时间 此函数仅在采样时间数组中指定变量离散时间采样时间[-2 0]时会被调用。
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1;
%设置下一个采样时间在1s之后
sys = t + sampleTime;
% sys=mdlTerminate(t,x,u) 相当于构析函数,结束该仿真模块时被调用
function sys=mdlTerminate(t,x,u)
sys = [];

 运行结果:

参考材料《MATLAB_SIMULINK系统仿真》

最后

以上就是斯文柚子为你收集整理的Matlab-Simulink_自定义函数1 Fcn模块2 MATLAB Function模块3 S-Function模块的全部内容,希望文章能够帮你解决Matlab-Simulink_自定义函数1 Fcn模块2 MATLAB Function模块3 S-Function模块所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部