Sirius' blog Sirius' blog
首页
  • 学习笔记

    • 《C++》
    • 《MATLAB》
    • 《Python》
  • 学习笔记

    • 《Git》
    • 《CMake》
  • 技术文档
  • 博客搭建
  • 学习
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Sirius0v0

怕什么真理无穷,进一寸有一寸的欢喜
首页
  • 学习笔记

    • 《C++》
    • 《MATLAB》
    • 《Python》
  • 学习笔记

    • 《Git》
    • 《CMake》
  • 技术文档
  • 博客搭建
  • 学习
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 学习笔记

    • Matlab在数模上的应用——基础打杂篇
    • Matlab在制导控制的应用(科学计算)
    • Matlab在制导控制的应用(线性控制)
    • S-Function入门——基础介绍
    • Level-1 Matlab S-Function编写入门
      • Level-1 Matlab S-Function函数的代码编写
        • 函数原型及输入输出含义
        • 如何使用可选参数?
        • Flag 0: mdlInitializeSizes函数
        • Flag 1: mdlDerivatives函数
        • Flag 2: mdlUpdate函数
        • Flag 3: mdlOutputs函数
        • Flag 4: mdlGetTimeOfNextVarHit函数
        • Flag 9: mdlTerminate函数
        • 一些值得注意的点
      • 对S-Function模块进行封装
    • C-Mex S-Function编写入门
  • 踩坑记录

  • 《MATLAB》与控制
  • 学习笔记
Sirius0v0
2023-08-13
目录

Level-1 Matlab S-Function编写入门

# Level-1 Matlab S-Function编写入门

S-function包括主函数和6个功能子函数,包括mdlInitializeSizes(初始化)、mdlDerivatives(连续状态微分)、mdlUpdate(离散状态更新)、mdlOutputs(模块输出)、mdlGetTimeOfNextVarHit(计算下次采样时刻)和mdlTerminate(仿真结束)。

在S-function仿真过程中,利用switch-case语句,根据不同阶段对应的flag值来调用不同子函数,以完成对S-function模块仿真流程的控制。

Level-1 Matlab S-function仿真流程如下:

# Level-1 Matlab S-Function函数的代码编写

可以利用命令打开一个示例代码:

edit sfuntmpl

# 函数原型及输入输出含义

函数原型如下:

[sys,x0,str,ts,simStateCompliance] = SFUNC(t,x,u,flag,p1,...pn)

SFUNC在给定时间点t返回的内容取决于flag的值、当前状态x、当前输入量u和可选输入参数p1,...pn,可选参数可以提供给S-Function,并且在任何FLAG操作期间使用。下面对flag的定义进行解释:

FLAG 结果 描述
0 [sizes, x0, str, Ts] 初始化,在sys返回系统大小,在x0初始化状态,在str中返回状态排序信息,在Ts中返回采样时间
1 dx 返回在sys中的连续状态的微分
2 ds 更新离散状态 sys = x(n+1)
3 y 返回sys输出
4 t_next 返回sys中下一采样时间点
5 保留字
9 [] 仿真结束,进行清理sys操作

输出量:

  • sys : 一个通用的返回参数,返回值取决于flag的值;
  • x0 :状态初始值;
  • str :默认为空,无需设置;
  • ts :采样时间,包含采样时间和偏移量;
  • simStateComplicance :附加变量。

# 如何使用可选参数?

需要在使用可选参数的函数参数列表后加上定义即可。

function [sys,x0,str,ts,simStateCompliance] = delay_and_gain_level1(t,x,u,flag,Ts,gain)
switch flag,
  case 0,
    % 在需要使用可选参数的函数处加上参数即可
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(Ts);
  case 1,
    sys=mdlDerivatives(t,x,u);
  case 2,
    sys=mdlUpdate(t,x,u);
  case 3,
    sys=mdlOutputs(t,x,u,gain);
  case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u,Ts);
  case 9,
    sys=mdlTerminate(t,x,u);
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end

# Flag 0: mdlInitializeSizes函数

function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
% 示例中参数使用硬编码设置,推荐利用可选参数进行设置
sizes = simsizes;

% 以下四个参数可以被指定为-1,表示大小动态调整
sizes.NumContStates  = 0;   % 连续状态的数量
sizes.NumDiscStates  = 0;   % 离散状态的数量
sizes.NumOutputs     = 0;   % 输出的数量
sizes.NumInputs      = 0;   % 输入的数量

% 如果在FLAG=3调用期间使用u,则具有直接馈入
% 将其设置为0类似于承诺在FLAG=3期间不会使用u;
% 如果违反承诺,则会出现不可预测的结果。
sizes.DirFeedthrough = 1;   % 输入端口是否具有直接馈入

% 采样次数,应与下述ts的行数一致,一般为1
sizes.NumSampleTimes = 1;

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

ts  = [0 0];    % [采样时间,时间偏移]

simStateCompliance = 'UnknownSimState';

% end mdlInitializeSizes

# Flag 1: mdlDerivatives函数

function sys=mdlDerivatives(t,x,u)
% 设置对状态x的微分
sys = [];

% end mdlDerivatives

# Flag 2: mdlUpdate函数

function sys=mdlUpdate(t,x,u)
% 设置对离散状态x(n)的更新x(n+1)
sys = [];

% end mdlUpdate

# Flag 3: mdlOutputs函数

function sys=mdlOutputs(t,x,u)
% 设置系统输出y,该函数的x实则为x(n)
sys = [];

% end mdlOutputs

# Flag 4: mdlGetTimeOfNextVarHit函数

function sys=mdlGetTimeOfNextVarHit(t,x,u)
% 例如,如下设置则下一次执行该模块为1秒后
sampleTime = 1;
sys = t + sampleTime;

% end mdlGetTimeOfNextVarHit

# Flag 9: mdlTerminate函数

function sys=mdlTerminate(t,x,u)
% 执行任何结束仿真后需要处理的任务
sys = [];

% end mdlTerminate

# 一些值得注意的点

  • 初始化函数中的参数尽可能使用可选参数设置的方式进行,尽量避免使用硬编码的手段;
  • 参数列表中的x表示当前时刻的x(k);
  • 注意根据Flag=3: mdlOutputs函数中是否使用u,正确设置DirFeedthrough的值。

# 对S-Function模块进行封装

在S-Function中如需设置可选参数,利用模块的封装可以更加清楚地展示所需参数并设置,本节将介绍封装的基本操作。

  1. 右击待封装的模块:Mask(封装) -> Create Mask(创建封装);
  2. 在Parameters & Dialog(参数和对话框)中选择Edit(编辑);
  3. 设置Prompt(提示)和Name(名称)并保存,其中Prompt为面板中的提示词,Name为可选参数变量名;
  4. 右击被封装系统:选择Block Parameters(模块参数),在S-Function参数字段中设置相应的可选参数。
编辑 (opens new window)
#MATLAB#Simulink
上次更新: 2023/08/14, 19:51:00
S-Function入门——基础介绍
C-Mex S-Function编写入门

← S-Function入门——基础介绍 C-Mex S-Function编写入门→

最近更新
01
ipopt优化库配置及使用
07-21
02
ubuntu离线安装包的方法
07-21
03
其它控件的使用
03-05
更多文章>
Theme by Vdoing | Copyright © 2020-2024 Sirius0v0 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式