Matlab-Simulink_自定义函数

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系统仿真》

  • 19
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值