Matlab simulink建模与仿真 第十六章(用户定义函数库)

参考视频: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。

Matlab 复制代码
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 = [];
相关推荐
励志成为嵌入式工程师29 分钟前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉1 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer1 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq1 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
记录成长java3 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山3 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
睡觉谁叫~~~3 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
音徽编程3 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
观音山保我别报错3 小时前
C语言扫雷小游戏
c语言·开发语言·算法
小屁孩大帅-杨一凡3 小时前
java后端请求想接收多个对象入参的数据
java·开发语言