实例讲解Simulink的MATLAB Function模块

内容

MATLAB Function是一个支持使用M语言编写模块功能,并能够将所编写的M语言生成C代码,用于开发桌面应用和嵌入式应用的模块。它支持的 MATLAB内建函数比 Fcn模块要广泛,除去基本的四则运算、逻辑操作符和关系操作符,还可以调用MATLAB各种工具箱里提供的内建函数,包括支持代码生成和不支持代码生成两个类型。

1.MATLAB Function模块

模块功能:将 MATLAB 代码包含在生成可嵌入式 C 代码的模型中库:Simulink / User-Defined FunctionsHDL Coder / User-Defined Functions

此模块的特殊之处在于双击之后打开的不是参数对话框,而是一个M代码编辑窗,在这里编写M代码描述输出y与输入u之间的关系。模块拥有1个输入端口u和1个输出端口y。MATLAB Function的模块的图标上绘制一个MATLAB logo图案,如图所示。

图片

图片

模块是否有输入输出端口取决于内部M函数的定义方式。

(1)没有输出

图片

图片

(2)没有输入

图片

图片

实例1 基本操作

图片

fcn函数

​​​​​​​

function y = fcn(u1,u2)y = u1*u2;end

点击界面的Go to Diagram可以从脚本视图跳转回仿真视图。

图片

点击Edit Data,可以对输入和输出数据进行编辑,例如数据的类型、尺寸等属性。

图片

图片

模型运行结果

图片

实例2 多输入和多输出

图片

fcn1函数

​​​​​​​

function [y,y1] = fcn1(u1,u2)y = u1+u2;y1 = u1*u2;end

fcn2函数

​​​​​​​

function [y,y1] = fcn2(u)y = u(1)+u(2);y1 = u(1)*u(2);end

运行结果

图片

2.MATLAB Function里面使用if和for语句

实例3 MATLAB Function里面使用if语句

图片

fcn4函数内容

​​​​​​​

function y = fcn4(u) if u>=5     y = 1; elseif u<0     y = -1; else     y = 0; endend

运行结果

图片

实例4  MATLAB Function里面使用for语句

图片

function y = fcn5(u)num = length(u);y = 0;for i = 1:1:num    y = y +u(i);endend

运行结果

图片


3.MATLAB Function里面使用persistent保持变量

根据Simulink的运行机制,每个采样点会调用一次MATLAB Function的函数,两次调用之间,同一个变量的前次计算的终值如何传递到当前计算周期来是个问题,可以使用persistent 变量实现函数退出和进入时内部变量值的保持。

例如使用MATLAB Function编写一个能够累积输人值作为输出的模块-─累加模块。计算累加值需要一个状态变量,在每次调用fcn 时依据上一次的值进行累加,并将累加值存储在这个变量中。使用persistent声明这个变量可以实现此目的。persistent变量是定义在某个函数内的变量类型,可在函数调用的不同次数间保持上一次退出该函数的值。它同global全局变量的类似之处在于MATLAB为它们创建永久数据区域,不同之处在于它只能被声明它的函数内部识别,目的是免除此变量被其他函数或命令行修改值而造成用户无法确保其值的困扰。声明persistent变量时它刚刚被创建,还不具有初始值,其内容为空值[],调用声明persistent变量的函数时先判断persistent变量是否为空,如果是空则初始化为0 ,非空则直接使用,它们会记得上次被调用后的值。具体代码如下:

function  y = fcn(u)%% u 是模块的输入% y 是模块的输出%函数功能:实现对输入的累加persistent sum_total  % 函数内部声明 可持续类型变量 sum_total% 首先要判断persistent声明的变量是否是空if isempty(sum_total)    sum_total  = 0;endsum_total = sum_total +u; %进行累加y = sum_total;

仿真图

将Clock模块的信号输入MATLAB Function模块并使用Scope模块接收y端口的输出值,解算器设置为固定步长,值为1 ,仿真结果如图所示。

设置步长为1

图片

图片

图片

示波器输出

图片

经过10 s共11个采样点后,结果累加到55,等同于sum([0 : 10])。使用persistent变量时需要注意:

(1)persistent变量不能作为函数的输入输出参数﹐否则会报错。(2)persistent变量不能同当前工作空间中已经存在的变量同名,否则会     报错。(3)persistent变量不能声明在Command Window (命令窗口)里,必须在    函数内声明。

4.添加trigger信号

在Edit data中添加触发信号。

图片

实例5 添加触发信号

图片

fcn6

function y = fcn6(u)num = length(u);y = 0;for i = 1:1:num    y = y +u(i);endend

图片


5.Extrinsic函数

MATLAB Function模块支持在M编辑器内部定义子函数并调用,但是不支持递归调用。MATLAB Function可以将MATLAB内建函数编写的M函数生成C代码,如 sum,length , sqrt等(支持代码生成的M函数详细列表请搜索MATLAB自带 Help文档的Func-tions Supported for C/C++Code Generation — Alphabetical List.),使用不支持代码生成功能的MATLAB内建函数时,如绘图函数系列 plot , patch , bar和 figure等,需使用eml. extrinsic( 'plot ' , 'bar')来声明为Extrinsic函数,启动仿真后这些函数只用来仿真,不进行编译,从而不生成可独立运行的C/C++代码及可执行文件。

Extrinsic函数

Extrinsic函数的处理方式 

图片

模型进行仿真时,MATLAB生成调用Extrinsic函数的代码,但是不生成可执行代码,仅保证这些函数能够在MATLAB环境下执行。模块生成代码时,MATLAB会判断Extrinsic函数是否对调用它们的函数输出值有影响,如果有则产生编译器错误,如果没有影响,则对声明为Extrinsic函数以外的函数进行代码生成,而忽略此Extrinsic函数。

Simulink 的 Scope只能显示线条图像,目前的版本还不支持3-D绘图,不能像MATLAB那样提供各种功能强大的绘图功能。可使用MATLAB Function模块自定义一个模块绘制3-D图像。结合Extrinsic函数声明和Persistent变量的使用,可以在MATLAB Function模块中调用绘图函数绘图,并将每次从 Simulink模型获取的输入保存起来,如下所示例程:

​​​​​​​​​​​​​​

function  fcn(u)%% 绘制三维图形eml.extrinsic('plot3','scatter3','delete','close');%声明不能生成c代码的函数len = length(u);%计算输入的长度persistent data  %声明持续性变量if isempty(data) %判断持续性变量是否是空值    data = zeros(3,100000);%初始化endpersistent n  %声明采样数据次数的持续性变量 nif isempty(n)    n = 1;else    n = n +1;enddata(:,n) = u;%存储输入的数据 3*n  每列数据是一个三维坐标(x,y,z)persistent  h  if isempty(h)    h = plot3(data(1,:),data(2,:),data(3,:),'bo');else    delete(h);%每个采样时刻重新绘制图像以达到动态刷新的效果     h = plot3(data(1,:),data(2,:),data(3,:),'bo');end

模型建立时使用Clock模块, Fcn模块和Mux模块构成正弦、余弦和时间量3维输入。运行模型之后,会动态地绘制出每个采样时刻计算的值到坐标轴中,构成逐步上升的螺旋3-D图形,如图所示。

仿真图

图片

产生的三维图形结果

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/176187.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

许战海战略文库|从丰田到等离子屏:技术领先为何失去市场?

引言&#xff1a;在探讨技术创新与市场需求之间的微妙关系时&#xff0c;个关键的问题浮现:为什么强大的技术优势并不总是等同于市场成功?从丰田汽车在电动车领域的挑战到日本等离子显示屏技术的衰落,市场趋势对企业成功存在决定性影响。企业需要在技术创新和市场需求之间找到…

在有springSecurity或者若依项目中获取当前系统登录的用户信息

方法一&#xff08;springSecurity自带的&#xff09; AuthenticationPrincipal 是 Spring Security 框架中的一个注解&#xff0c;用于获取当前已认证用户的 principal&#xff08;即用户身份信息&#xff09;。 方法二&#xff08;若依项目自带的&#xff09; &#xff08;1…

基于C#实现Bitmap算法

在所有具有性能优化的数据结构中&#xff0c;我想大家使用最多的就是 hash 表&#xff0c;是的&#xff0c;在具有定位查找上具有 O(1)的常量时间&#xff0c;多么的简洁优美&#xff0c;但是在特定的场合下&#xff1a; ①&#xff1a;对 10 亿个不重复的整数进行排序。 ②&am…

做Python自动化测试,我教你个方法还能快一倍!

如果你学过 python 进行自动化测试&#xff0c;你一定使用过 unittest。 今天我们要讲的 nose2 是一个高级版本的 unittest。他比 unittest 更容易理解&#xff0c;用起来也更加方便一些。 快速开始 nose2 在 unittest 的基础上开发的&#xff0c;所以如果你之前是用 unitte…

python 水质日历热力图

利用日历热力图可以方便的查看站点水质全年的变化情况。 接口获取站点数据 这一步根据自己实际情况&#xff0c;也可以读取excel、MySQL读取数据。这里把API地址已隐去。 import numpy as np import calendar import requests import json import pandas as pd import time f…

python基于GCN(图卷积神经网络模型)和LSTM(长短期记忆神经网络模型)开发构建污染物时间序列预测模型

在以往的时间序列预测建模中广泛使用的是回归类算法模型和RNN类的算法模型&#xff0c;相对来说技术栈会更稳定一些&#xff0c;最近有一个实际业务场景的需求&#xff0c;在建模的过程中要综合考虑其余点位的影响依赖&#xff0c;这时候我想到了之前做过的交通流量和速度预测相…

全国第一届学生(青年)运动会女子拳击比赛60公斤冠军载誉归来

11月16日&#xff0c;参加全国第一届学生&#xff08;青年&#xff09;运动会女子拳击比赛60公斤冠军阿依古再丽麦合苏提抵达和田。 中华人民共和国第一届学生&#xff08;青年&#xff09;运动会拳击比赛11月12日在广西贺州市钟山县体育馆落下帷幕&#xff0c;本届比赛新疆拳击…

60V降压恒流芯片 高调光比LED驱动器 SL6015B替代PT4115 电路简单

在LED照明领域&#xff0c;降压恒流芯片是一种非常重要的芯片&#xff0c;它可以将输入的电压降低并输出稳定的电流&#xff0c;从而为LED灯提供合适的驱动电源。其中&#xff0c;SL6015B是一款非常优秀的降压恒流芯片&#xff0c;它具有高调光比、简单的电路设计、低成本的优点…

服务案例|故障频发的一周,居然睡得更香!

医院运维有多忙&#xff1f; 医院运维&#xff0c;听起来平平无奇毫不惊艳&#xff0c;但其中的含金量&#xff0c;可不是“维持系统正常运行”就能总结的。毕竟医院对业务连续性的超高要求&#xff0c;让运维面对的问题都是暂时的&#xff0c;下一秒可能就有新问题需要发现解…

一般人用 Linux 算是找虐吗?

一般人用 Linux 算是找虐吗&#xff1f; 主要得看用什么Linux&#xff0c;毕竟Android也算是Linux&#xff0c;满大街一般人整天在用&#xff0c;也没什么人觉得自己在找虐。 最近很多小伙伴找我&#xff0c;说想要一些Linux的资料&#xff0c;然后我根据自己从业十年经验&…

【Linux】:进程间通信和日志模拟

进程间通信 一.基本概念二.简单的通信-管道(匿名管道)1.建立通信信道2.通信接口 三.命名管道三.模拟命名管道通信&#xff08;加上日志&#xff09;1.完整代码2.基本使用 一.基本概念 是什么 两个或多个进程实现数据层面的交互。 因为进程独立性的存在&#xff0c;导致进程间…

spark shuffle 剖析

ShuffleExchangeExec private lazy val writeMetrics SQLShuffleWriteMetricsReporter.createShuffleWriteMetrics(sparkContext)private[sql] lazy val readMetrics SQLShuffleReadMetricsReporter.createShuffleReadMetrics(sparkContext)用在了两个地方&#xff0c;承接的是…

禁止安装新软件怎么设置(超详细图文介绍)

很多公司的网管向我们反应&#xff0c;总是有员工随意下载软件&#xff0c;并且不去正规网站、正规官网下载&#xff0c;导致公司的电脑总是又卡又慢&#xff0c;网管的工作很难开展。 此时就需要对公司安装软件的情况&#xff0c;进行统一管控了。 方法一&#xff1a;适合个人…

Git - 版本控制系统

目录 一、概述 配置用户信息 二、Git仓库 创建 本地仓库 git的三个区域 示例 Git文件状态 举例 三、区域使用 暂存区使用 版本库使用 文件忽略 四、分支 步骤 合并与删除 步骤 合并与提交 合并冲突 五、常用指令 六、Git远程仓库 使用步骤 克隆 同步 …

一键合并多个TXT文本,将保存在TXT的快递单号进行一键合并

如果你需要处理大量的TXT文本文件&#xff0c;那么你可能会遇到需要将这些文件合并为一个文件的情况。这不仅涉及到文件的组织和管理&#xff0c;还可能涉及到文件内容的连贯性和完整性。现在&#xff0c;我们有一个强大的工具&#xff0c;可以帮助你轻松实现一键文件整理&…

身份证号码校验

根据《新版外国人永久居留身份证适配性改造要点》&#xff0c;公司需要把代码中对身份证的校验进行优化 就文档内容可以看到需要优化的要点是&#xff1a; 新版永居证号码以 9 开头 受理地区代码出生日期顺序码校验码&#xff1b;&#xff08;共18位&#xff09; eg&#xff…

2023年约特干故城夜间演艺《万方乐奏有于阗》完美谢幕

11月19日&#xff0c;记者走进约特干故城看到演员在欢乐地跳着刀郎舞和古典舞&#xff0c;庆祝今年以来夜间演艺《万方乐奏有于阗》演出200场完美谢幕。 11月19日在约特干故城&#xff0c;演员正在表演迎宾乐舞。阿卜力克木依卜拉依木摄 当天晚上&#xff0c;城楼上旌旗猎猎&am…

Transmit v5.10.3(FTP客户端)

Transmit 5是一款由Panic开发的功能强大的FTP(文件传输协议)客户端软件&#xff0c;专为 macOS 平台设计。它提供了简单、直观的界面和丰富的功能&#xff0c;使用户能够轻松地管理和传输文件。 在文件传输和同步方面&#xff0c;Transmit 5提供了强大的文件同步功能&#xff…

18张值得收藏的高清卫星影像

这里分享的18张高清卫星影像&#xff0c;由吉林一号卫星拍摄。 原图来自长光卫星嘉宾在直播中分享的PPT演示文档。 18张高清卫星影像 吉林一号高分04A星&#xff0c;于2022年05月21日拍摄的北京紫禁城高清卫星影像。 北京紫禁城 云南昆明滇池国际会展中心高清卫星影像&…

【STM32外设系列】JW01三合一空气质量检测模块

&#x1f380; 文章作者&#xff1a;二土电子 &#x1f338; 关注公众号获取更多资料&#xff01; &#x1f438; 期待大家一起学习交流&#xff01; 文章目录 一、JW01模块简介二、数据格式介绍三、程序设计3.1 串口初始化3.2 串口接收中断服务函数3.3 数据解析函数 四、其他…