天天看點

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

本文研究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函數。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

2 模組化與代碼生成

本章節通過勾股定理的例子,示範Matlab Function子產品的模組化。

1)打開Simulink,拖出一個Matlab Function子產品。輕按兩下子產品進入,可以看到裡面已經有一個名為fcn的函數定義。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

2)将函數修改為下圖的勾股定理計算。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

在c = gougu(a,b)這個Matlab函數中,a,b相當于子系統的輸入,c相當于子系統的輸出。

3)點選右上角的Edit Data,可以編輯輸入輸出的屬性。這裡把輸入輸出的資料類型都改為single。相當于Simulink子系統中的Inport和Outport的類型一樣。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

4)儲存關閉函數編輯視窗,在模型中添加輸入的常數和disp子產品,然後運作模型,觀察輸出結果。注意,由于在函數裡定義了輸入輸出的資料類型,外面的信号接口要輸入single型常數。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

5)為驗證代碼生成,将輸入端替換成Inport,輸出端替換成Outport并配置好代碼生成(可參照https://blog.csdn.net/u013288925/article/details/104851546)。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

6)Ctrl + B生成代碼。在生成的step函數中就實作了勾股定理的C代碼。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

3 Matlab Function中的資料管理

3.1 關聯Signal對象

在Edit Data中,可以配置輸入輸出關聯資料字典中的Signal對象。

1)在Ports and Data Manager中勾選Data must resolve to signal object。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

2)在Matlab工作空間中建立一個Signal對象,并将類型和StorageClass配置如下。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

3)Ctrl + B生成代碼。可以看到c變量定義到了data.c中。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

3.2 建立函數内的參數

1)在Ports and Data Manager中中點選Add–>Data建立一個參數。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

2)将參數的Name改為d,Scope改為Parameter,Type改為single。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

3)在Matlab工作空間中建立一個常量d=single(0.1)。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

4)把Matlab Function中的代碼中改為開根号後乘以d。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

5)Ctrl + B生成代碼。從代碼中可以看出,step函數把參數d内聯進去了。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

4 Matlab Function生成代碼的限制

Matlab Function生成代碼的限制很多,譬如不支援動态記憶體配置設定、不支援元胞數組等。

另外,也有很多matlab函數和工具包也不能生成代碼,具體可以參照Matlab Function中右上角的幫助檔案。

Simulink代碼生成: 調用Matlab函數1 Matlab Function子產品2 模組化與代碼生成3 Matlab Function中的資料管理4 Matlab Function生成代碼的限制5 總結

5 總結

Matlab Function子產品的使用可以讓Simulink內建Matlab函數,不過還是盡量使用Simulink的其他子產品搭建控制政策,少用Matlab Function子產品。因為Matlab Function的可讀性不友好,而且生成代碼的限制也很多。

>>傳回個人部落格總目錄

繼續閱讀