本文研究Simulink模型中調用Matlab函數的方法。
文章目錄
- 1 Matlab Function子產品
- 2 模組化與代碼生成
- 3 Matlab Function中的資料管理
-
- 3.1 關聯Signal對象
- 3.2 建立函數内的參數
- 4 Matlab Function生成代碼的限制
- 5 總結
1 Matlab Function子產品
在Simulink中模組化的時候,有時會發現自己想要的功能無法通過Simulink中正常的子產品和子系統實作,但是通過Matlab函數卻可以很容易地實作。又或者說,通過Matlab可以調用一些工具包,但是Simulink裡卻沒有這種功能,但又想在模型中實作這個功能。
針對以上問題,可以在Simulink中使用Matlab Function子產品,然後再子產品内寫Matlab代碼。進而實作了通過Simulink模型調用Matlab函數。

2 模組化與代碼生成
本章節通過勾股定理的例子,示範Matlab Function子產品的模組化。
1)打開Simulink,拖出一個Matlab Function子產品。輕按兩下子產品進入,可以看到裡面已經有一個名為fcn的函數定義。
2)将函數修改為下圖的勾股定理計算。
在c = gougu(a,b)這個Matlab函數中,a,b相當于子系統的輸入,c相當于子系統的輸出。
3)點選右上角的Edit Data,可以編輯輸入輸出的屬性。這裡把輸入輸出的資料類型都改為single。相當于Simulink子系統中的Inport和Outport的類型一樣。
4)儲存關閉函數編輯視窗,在模型中添加輸入的常數和disp子產品,然後運作模型,觀察輸出結果。注意,由于在函數裡定義了輸入輸出的資料類型,外面的信号接口要輸入single型常數。
5)為驗證代碼生成,将輸入端替換成Inport,輸出端替換成Outport并配置好代碼生成(可參照https://blog.csdn.net/u013288925/article/details/104851546)。
6)Ctrl + B生成代碼。在生成的step函數中就實作了勾股定理的C代碼。
3 Matlab Function中的資料管理
3.1 關聯Signal對象
在Edit Data中,可以配置輸入輸出關聯資料字典中的Signal對象。
1)在Ports and Data Manager中勾選Data must resolve to signal object。
2)在Matlab工作空間中建立一個Signal對象,并将類型和StorageClass配置如下。
3)Ctrl + B生成代碼。可以看到c變量定義到了data.c中。
3.2 建立函數内的參數
1)在Ports and Data Manager中中點選Add–>Data建立一個參數。
2)将參數的Name改為d,Scope改為Parameter,Type改為single。
3)在Matlab工作空間中建立一個常量d=single(0.1)。
4)把Matlab Function中的代碼中改為開根号後乘以d。
5)Ctrl + B生成代碼。從代碼中可以看出,step函數把參數d内聯進去了。
4 Matlab Function生成代碼的限制
Matlab Function生成代碼的限制很多,譬如不支援動态記憶體配置設定、不支援元胞數組等。
另外,也有很多matlab函數和工具包也不能生成代碼,具體可以參照Matlab Function中右上角的幫助檔案。
5 總結
Matlab Function子產品的使用可以讓Simulink內建Matlab函數,不過還是盡量使用Simulink的其他子產品搭建控制政策,少用Matlab Function子產品。因為Matlab Function的可讀性不友好,而且生成代碼的限制也很多。
>>傳回個人部落格總目錄