實例講解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.pswp.cn/news/162028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162028.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄算法訓練營第四十三天【動態規劃part05】 | 1049. 最后一塊石頭的重量 II、494. 目標和、474.一和零

1049. 最后一塊石頭的重量 II 題目鏈接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官網 - 全球極客摯愛的技術成長平臺 求解思路&#xff1a; 等于把石頭盡量分成重量相同的兩堆 動規五部曲 確定dp數組及其下標含義&#xff1a;容量為j的背包&#xff0c;最多能裝…

logstash安裝和使用

官網&#xff1a;https://www.elastic.co/cn/logstash/ 1.上傳Linux安裝包 2.解壓安裝包且重命名 [rootVM-4-10-centos logstash]# tar -zxvf logstash-8.11.1-linux-x86_64.tar.gz -C ../software/[rootVM-4-10-centos logstash]# mv logstash-8.11.1/ logstash3.啟動測試 …

國產遙感影像處理軟件 GSRS,真是很方便

兼容國內外絕大多數衛星遙感影像格式&#xff1b;高效的影像查看&#xff0c;比如漫游、放大、縮小、查看影像像素灰度值、影像地理坐標、影像投影坐標系等等&#xff1b;人機交互影像裁剪&#xff0c;任何繪制裁剪區域&#xff0c;輸出裁剪影像&#xff1b;具備影像基本處理功…

基于Haclon的Blob分析

任務要求&#xff1a; 請用BLOB分析的方法計算圖中所有灰度值在120和255之間的像素構成的8連通區域的面積與中心點坐標。 Blob基礎&#xff1a; 分析過程&#xff1a;首先獲取圖像&#xff0c;然后根據特征對原始圖像進行閾值分割&#xff08;區分背景像素和前景像素&#xf…

洛谷 P4552 [Poetize6] IncDec Sequence

挺好的一道思維題。 分析 因為是對區間修改&#xff0c;多次修改肯定會超時&#xff0c;很容易想到差分。 那么原題的對區間修改就可以轉換為下面三個操作&#xff08;均在差分數組中&#xff09;&#xff1a; 1. 任選一個數1 2. 任選一個數-1 3. 任選兩個數1和-1 進一步考…

貪心算法及相關例題

目錄 什么是貪心算法&#xff1f; leetcode455題.分發餅干 leetcode376題.擺動序列 leetcode55題.跳躍游戲I leetcode45題.跳躍游戲II leetcode621題.任務調度器 leetcode435題.無重疊空間 leetcode135題.分發糖果 什么是貪心算法&#xff1f; 貪心算法更多的是一種思…

《QT從基礎到進階·三十七》QWidget實現左側導航欄效果

NavigationBarPlugin插件類實現了對左側導航欄的管理&#xff0c;我們可以在導航欄插件中添加界面&#xff0c;并用鼠標點擊導航欄能夠切換對應的界面。 源碼在文章末尾 實現效果如下&#xff1a; NavigationBarPlugin實現的接口如下&#xff1a; class NAVIGATIONBAR_EXP…

【brpc學習實踐六】backup request場景案例

應用場景 有時為了保證可用性,需要同時訪問兩路服務,哪個先返回就取哪個。在brpc中,這有多種做法,根據server是否掛在同一個命名服務內有所區別。 當后端server可以掛在一個命名服務內時 Channel開啟backup request。這個Channel會先向其中一個server發送請求,如果在Ch…

C#,數值計算——插值和外推,多項式插值與外推插值(Poly_interp)的計算方法與源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 多項式插值與外推插值 /// Polynomial Interpolation and /// Extrapolation interpolation routines for one dimension /// </summary> public class Poly…

【ES6.0】- Promise對象

【ES6.0】- Promise對象 文章目錄 【ES6.0】- Promise對象一、概述二、Promise狀態三、Promise方法3.1 Promise.prototype.then方法&#xff1a;鏈式操作3.2 Promise.prototype.catch方法&#xff1a;捕捉錯誤3.3 Promise.race方法&#xff1a;捕捉錯誤3.4 Promise.any()3.5 Pr…

第三節-Android10.0 Binder通信原理(三)-ServiceManager篇

1、概述 在Android中&#xff0c;系統提供的服務被包裝成一個個系統級service&#xff0c;這些service往往會在設備啟動之時添加進Android系統&#xff0c;當某個應用想要調用系統某個服務的功能時&#xff0c;往往是向系統發出請求&#xff0c;調用該服務的外部接口。在上一節…

廣告機/商業顯示屏_基于MT878安卓主板方案

安卓主板在廣告機領域扮演著重要的角色。無論是在商場、車站、酒店、電梯、機場還是高鐵站&#xff0c;LED廣告機廣泛應用&#xff0c;并通過不同方式進行播放和管理。 廣告機/商業顯示屏_基于MT878安卓主板方案 基于MT8788安卓主板方案的廣告機采用了聯發科MT8788八核芯片方案…

對比兩個數組中對應位置的兩個元素將每次對比的最大值用于構成新的數組np.maximum()

【小白從小學Python、C、Java】 【計算機等考500強證書考研】 【Python-數據分析】 對比兩個數組中對應位置的兩個元素 將每次對比的最大值用于構成新的數組 np.maximum() 選擇題 以下代碼的輸出結果為&#xff1f; import numpy as np a1 [1,2,33] a2 [11,2,3] print("…

Axios 默認配置 簡化URL 簡化代碼 多臺服務器接口配置

main.js配置 import Axios from axios Axios.defaults.method GET//設置默認的請求類型 Axios.defaults.baseURL https://apis.jxcxin.cn/api//設置接口地址 Axios.defaults.params { token: abc } //每次請求都帶上這個參數 Axios.defaults.timeout 5000 //請求的超時時間…

MATLAB - text的兩種使用方法

text小技巧 1. 常規使用&#xff08;Method 1&#xff09;2. 在顯示畫面的相對位置&#xff08;Method 2&#xff09;3. 舉個例子 1. 常規使用&#xff08;Method 1&#xff09; text(x,y,txt)2. 在顯示畫面的相對位置&#xff08;Method 2&#xff09; text(string,‘ABC’,…

使用websocket獲取thingsboard設備的實時數據

背景 有一個讀者前來咨詢,如何實時獲取設備的遙測數據。 其實tb是有提供websocket接口來獲取設備數據的。而且還支持js跨域調用。下面給大家演示一下。 websocket地址 完整代碼 <!DOCTYPE HTML> <html><h

HTTP協議和WebSocket協議之間的區別

HTTP協議和WebSocket協議之間的主要區別在于它們的設計目的和通信方式。 HTTP協議是一種無狀態的協議&#xff0c;它的主要設計目的是用于從Web服務器傳輸超文本到本地瀏覽器的傳輸協議。HTTP協議使用請求和響應模型&#xff0c;客戶端向服務器發送請求&#xff0c;服務器返回…

【Java并發編程十二】線程池

線程池 用來統一地管理線程&#xff0c;避免線程的重復創建與銷毀。使用線程池可以讓執行完的線程回到線程池&#xff0c;等待下一次調用。 import jdk.jshell.EvalException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import j…

Matplotlib顏色條的配置_Python數據分析與可視化

Matplotlib顏色條配置 基本顏色顏色條選擇配色方案顏色條刻度的限制與擴展功能的設置離散型顏色條 基本顏色 Matplotlib提供了8種指定顏色的方法&#xff1a; 在[0&#xff0c;1]中的浮點值的RGB或RGBA元組&#xff08;例如 (0.1, 0.2, 0.5) 或&#xff08;0.1&#xff0c; 0.…

C語言中文網 - Shell腳本 - 9

第1章 Shell基礎(開胃菜) 9. Shell修改命令提示符 Shell 通過PS1和PS2這兩個環境變量來控制提示符的格式,修改PS1和PS2的值就能修改命令提示符的格式。 PS1 控制最外層的命令提示符格式。 PS2 控制第二層的命令提示符格式。 在修改 PS1 和 PS2 之前,我們先用 echo 命令輸出…