Simulink中提供了各种各样的模块,使得研究人员通过搭积木的方式,可以实现大部分功能需求。但总会有一些场景,是必须要研究人员自行编写代码,来满足自己的个性化需求。

Simulink正是通过Matlab function、s-function等模块,有效地拓宽了自身的能力边界(几乎是只有想不到,没有做不到),也奠定了它在工科领域的地位。


1、Fcn、Interpreted Matlab Function、Matlab Function

Fcn为用户自定义的一个函数:

。支持代数运算、关系运算、逻辑运算、三角函数等。可以看做是轻量级的Matlab Function。

Interpreted Matlab Function 的功能与Fcn类似,但是基本属于被淘汰的模块了。

Matlab function是我最喜欢的模块。因为它可以替代库中的大部分模块,而且方便注释、修改以及功能拓展,极大地简化了模型的复杂度,提高了可读性。而且它很方便地可以编译成代码。一般来说只要在Matlab function编写、经过验证的代码,可以放心的在DSP等控制器中应用。以下是我使用的两个简单案例。

小猫钓鱼:手撕系列(3):锁相环(SRF-PLL)​zhuanlan.zhihu.com

小猫钓鱼:手撕系列(4):空间矢量调制(SVPWM)​zhuanlan.zhihu.com

2、S-function、Level-2 Matlab S-function

S-function的内容很丰富。可以参考:

只是学电的:Simulink之——S函数​zhuanlan.zhihu.com

古德曼汽车工业:S-Funciton应用实例​zhuanlan.zhihu.com

之前写过一个简单的案例,作为参考。

小猫钓鱼:simulink仿真时,在线修改模型参数(S函数法)​zhuanlan.zhihu.com

对S-function 自带的案例进行注释,方便大伙理解。

function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)%[sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag,p1,...pn)%   flag   result             描述
%   -----  ------             --------------------------------------------
%   0      [sizes,x0,str,Ts]  初始化,返回SYS的大小,初始状态x0,str,采样时间Ts
%   1      DX                 返回连续状态微分SYS.
%   2      DS                 更新离散状态 SYS = X(n+1)
%   3      Y                  返回输出SYS.
%   4      TNEXT              Return next time hit for variable step sample time in SYS.
%   5                         Reserved for future (root finding).
%   9      []                 结束 perform any cleanup SYS=[].%   当flag=0时,以下信息必须赋值回传
%      SYS(1) = 连续状态个数
%      SYS(2) = 离散状态个数
%      SYS(3) = 输出量个数
%      SYS(4) = 输入量个数   注:上述4个变量可以赋值为-1,表示其值可变
%      SYS(5) = 保留值。为0.
%      SYS(6) = 直接馈通标志(1=yes, 0=no).如果u在flag=3时被使用,说明S函数是直接馈通,赋值为1. 否则为0.
%      SYS(7) = 采样时间个数,Ts的行数
%
%      X0     = 初始状态。没有则赋值为[].除flag=0外,被忽略。
%      STR    = 系统保留,设为[].
%      TS     = m*2 矩阵。(采样周期,偏移量)
%               TS = [0      0,      : 连续采样
%                     0      1,      : 在1个Ts后连续采样
%                     PERIOD OFFSET, : Discrete sample time where
%                                      PERIOD > 0 & OFFSET < PERIOD.
%                     -2     0];     : 变步长离散采样,
%                                      flag=4用于决定下一个采样时刻
%          注:
%              若希望每个时间步都运行,则设Ts=[0,0]
%              若希望继承采样时间运行,则设Ts=[-1,0]
%              若希望继承采样时间运行,且希望在微步内不变化,应该设Ts=[-1,1]
%              若希望仿真开始0.1s后每隔0.25秒运行,则设Ts=[0.25,0.1]
%              若希望按照不同速率执行不同任务,则Ts应按照升序排列。
%              即:每隔0.25秒执行一个任务,同时在开始0.1秒后,每隔1秒执行另一个任务
%              Ts=[0.25,0; 1.0,0.1],则simulink将在下列时刻执行s函数[0,0.1,0.25,0.5,0.75,1,1.1,...]% 以下是S函数的主函数
switch flag,case 0,    % 初始化[sys,x0,str,ts,simStateCompliance]=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       % 未知flag值 DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end     % S函数主程序结束%=============================================================================
% mdlInitializeSizes
% 返回s函数的sizes、初始条件、采样时刻
%=============================================================================
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
% 调用simsizes函数为sizes结构赋值
% simsizes函数是S函数模块特有的。它的结构和代码是固定的。sizes = simsizes;
sizes.NumContStates  = 0;   %连续状态个数
sizes.NumDiscStates  = 0;   %离散状态个数
sizes.NumOutputs     = 0;   %输出量个数
sizes.NumInputs      = 0;   %输入量个数
sizes.DirFeedthrough = 1;   %直接馈通标志
sizes.NumSampleTimes = 1;   % 至少有一个采样时刻
sys = simsizes(sizes);x0  = 0;   % 状态初始化
str = [];   % str 始终为空
ts  = [0 0];% 初始化采样时间% 指定simStateCompliance的值.
%    'UnknownSimState', < 默认值; warn and assume DefaultSimState
%    'DefaultSimState', < Same sim state as a built-in block
%    'HasNoSimState',   < No sim state
%    'DisallowSimState' < Error out when saving or restoring the model sim state
simStateCompliance = 'UnknownSimState';
% 子函数mdlInitializeSizes 结束%=============================================================================
% mdlDerivatives
% 返回连续状态量的导数
%=============================================================================
function sys=mdlDerivatives(t,x,u)sys = [];% 子函数mdlDerivatives结束%=============================================================================
% mdlUpdate
%更新离散时间状态,采样时刻和主时间步的要求。
%=============================================================================
function sys=mdlUpdate(t,x,u)sys = [];
% 子函数 mdlUpdate 结束%=============================================================================
% mdlOutputs
% 计算并返回模块输出量
%=============================================================================
function sys=mdlOutputs(t,x,u)sys = [];% 子函数 mdlOutputs 结束%=============================================================================
% mdlGetTimeOfNextVarHit
% 返回下一个采样时刻。注意返回结果是一个绝对时间,只在Ts=[-2,0]时使用。
%=============================================================================
function sys=mdlGetTimeOfNextVarHit(t,x,u)%
sys =[];% 子函数 mdlGetTimeOfNextVarHit 结束%=============================================================================
% mdlTerminate
% 仿真结束
%=============================================================================
%
function sys=mdlTerminate(t,x,u)sys = [];% 子函数 mdlTerminate结束

一方面是很久没使用S-function;另一方面是在我的应用场景下,可以用Matlab function 代替S-function。所以此处就不具体展开。

3、S-function Builder

当有些代码是由C/C++语言编写的,又不想自己动手转化成Matlab Function中的m语言时,可以通过S-function Builder将C/C++包容到simulink模型中。

以下提供一个最简单的例子:

在Outputs标签页中,填入C代码想要实现的功能:如将输入直接输出。

完成后,点击右上角的“Build”即可。编译完成后,会在当前目录下,生成.c 和.mexw64 文件。

可能会弹出如下报错:

点击 “安装 MinGW-w64” , 按照顺序安装即可。

更多的案例,可在Simulink库->User-Defined Functions -> S-Function Examples -> C-file S-Functions ->S-function Builder 中进行学习。

4、Matlab System

Matlab System 可以让用户,采用面向对象编程的思想,来创造一个模块。

通过New,新建一个 matlab.system 对象,在"y=u"处,填入想要的输入与输出的关系。

一般而言,可以由Matlab Function代替。 关于matlab的面向对象编程,可以参考:

徐潇,李远。MATLAB面向对象编程——从入门到设计模式(第2版)[M].北京航空航天大学出版社。

5、Function Caller、C Caller、Simulink Function

Function Caller、C Caller 调用模型内或Stateflow中已经定义好的函数。

没有深入了解过,用到的话,可以参考帮助文档中的这个模型。

6、Initialize Function、Reset Function、Terminate Function

对模型中某些状态变量进行设置初始值重置状态值以及 在模型结束时,读取状态变量值。

simulink仿真实例_又见Simulink库模型之(9):自定义函数相关推荐

  1. 光伏混合储能直流微电网simulink仿真,超级电容仿真模型,蓄电池模型仿真,有双向dcdc电路

    光伏混合储能直流微电网simulink仿真,超级电容仿真模型,蓄电池模型仿真,有双向dcdc电路,有能量管理系统和防止soc越线系统,不同光照下能量的传输. 过程详细,有各种参考资料,详细说明 ID: ...

  2. simulink仿真实例_MATLAB机器人运动学仿真入门

    之前有小伙伴想了解MATLAB运动学仿真的知识,这两天特地作了整理.最近在找工作,所以文章更新频率会慢一些,时间仓促,如果错误还请指正. 1. 准备知识 在学习用MATLAB仿真之前,应该先去了解一下 ...

  3. 智能控制技术_基于Matlab的二阶系统模糊控制仿真实例_课程学习

    一:题目描述 二:控制器和规律描述 假设系统输入为 r = 1. 0 ,可取系统输出误差e和误差变化ec作为模糊控制器的输入 ,模糊控制器的输出u作为被控对象的控制输入.则可根据系统输出的误差和误差变 ...

  4. simulink传递函数_又见Simulink库模型之(6):查找表

    在搭建Simulink模型时,有一部分实际对象输入与输出的关系并不是显而易见的,无法用传递函数等精确方式建模.但是我们可以通过实验的方式,通过施加不同的输入,测量相应的输出,从而建立输入与输出的关系. ...

  5. simulink仿真实例详解_三菱FX 5U PLC模块硬件精品实例,附接线图

    今天说说三菱FX5U 模块硬件的接线实例,主要有以下几个方面:电源AC.DC接线.输入输出接线.模拟量接线.不同原理有不同的接线方式,现在给大家仔细讲解分享! AC电源接线例 漏型输入[-公共端]时的 ...

  6. 电气simulink常用模块_从整车控制器VCU模型入门simulink(1)

    学习一门语言或者一门技术,最烦的就是长篇大论的理论和脱离实际的练习,我想正在阅读这篇文章的你一定深有体会,既然认识到了这样的痛点,我们接下来就换一种方式来学,通过实际工程中能运用到模型来逐步入门sim ...

  7. 永磁同步电机力矩控制simulink仿真,永磁同步发电机simulink控制

    永磁同步电机力矩控制仿真,异步电机仿真,单轴的电流调节器适用于力矩控制,发电控制,独特的MTPA控制+弱磁控制,以及电流路径规划,实现全速范围内的力矩调节,适用于轨道交通领域以及电动汽车领域. 列车运 ...

  8. python format函数实例_【Python】-String的Format格式规约函数及实例

    #字符串格式规约 #format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type] #参数详解 #fill ::= ,填充字 ...

  9. mysql存储过程自定义结构体_(转)MySQL存储过程/存储过程与自定义函数的区别...

    转自:http://www.cnblogs.com/caoruiy/p/4486249.html 语法: 创建存储过程: CREATE[definer = {user|current_user}] P ...

最新文章

  1. Matlab-bp神经网络
  2. 华中农业大学苏汉东课题组诚聘博士后-
  3. oracle质数怎么算,借花献佛之使用Oracle sql求质数(笔记)
  4. python:文件读写操作
  5. C#中使用二进制和ProtoBuf分别进行序列化、反序列化、压缩、解压缩对比测试汇总
  6. 感情沟通出了问题要怎么解决_冬养的月季花枝条干枯,开花萎蔫,哪里出了问题,该怎么解决?...
  7. 工作167:eachrt解决问题方法思路
  8. 惊呆了!被公司辞退拿了22万补偿金,原东家称每月涨薪7000,只要退还22万
  9. mysql多张表join_Mysql 多表连接查询 inner join 和 outer join 的使用
  10. ubuntu前置耳机孔没声音的解决办法
  11. python dll注入监听_DLL注入和API拦截
  12. 2013.06.25《流行音乐的分类》
  13. 优化屏蔽广告.提高浏览体验
  14. 房屋托管网络管理系统_学习管理系统和共享托管
  15. 蛙蛙推荐:蛙蛙教你解析网络包
  16. atan、atanf、atanl、atan2、atan2f、atan2l
  17. 什么是Nginx服务器
  18. 【科普资料】从科学精神到科学知识的材料
  19. 作业:计数器仿真实验
  20. Android之近场通信技术

热门文章

  1. 中考计算机考试试题山西注意事项,2021年山西省中考考试注意事项(3)
  2. java中一级缓存二级缓存_[Java] hibernate 一级缓存和二级缓存
  3. mysql字段简索引_3万字总结,Mysql优化之精髓
  4. xhtml与html的区别开头,XHTML与HTML的差别
  5. vs在linux下的环境搭建,linux下vscode环境配置
  6. jsp给前端注入值失败_基于 qiankun 的微前端最佳实践(图文并茂) 应用间通信篇...
  7. php将汉字转换为gb2312编码,php实现utf-8和GB2312编码相互转换
  8. lcl手术和飞秒区别_想知道自己适合哪种近视手术?Mark!
  9. 深入了解hibernate之PO,VO,load,get
  10. java复制和上传_java文件上传复制等功能