內容
MATLAB Function是一個支持使用M語言編寫模塊功能,并能夠將所編寫的M語言生成C代碼,用于開發桌面應用和嵌入式應用的模塊。它支持的 MATLAB內建函數比 Fcn模塊要廣泛,除去基本的四則運算、邏輯操作符和關系操作符,還可以調用MATLAB各種工具箱里提供的內建函數,包括支持代碼生成和不支持代碼生成兩個類型。
1.MATLAB Function模塊
模塊功能:將 MATLAB 代碼包含在生成可嵌入式 C 代碼的模型中
庫:
Simulink / User-Defined Functions
HDL 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;
end
end
運行結果
實例4??MATLAB Function里面使用for語句
function y = fcn5(u)
num = length(u);
y = 0;
for i = 1:1:num
y = y +u(i);
end
end
運行結果
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;
end
sum_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);
end
end
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);%初始化
end
persistent n %聲明采樣數據次數的持續性變量 n
if isempty(n)
n = 1;
else
n = n +1;
end
data(:,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圖形,如圖所示。
仿真圖
產生的三維圖形結果