我們來聊聊結構體。
E-Coder 在做自動代碼生成的時候,在默認情況下,它會把所有的輸入信號定義為一個結構體_U,把所有的輸出信號定義為另一個結構體_Y,把所有的參數定義為一個結構體_P。雖然這樣的結構體不一定是我們想要的,但至少,說明自動代碼生成是支持結構體的。
本文并不解決“哪些情況下應該使用結構體”這個問題,這里來說說:
怎么實現我想要的結構體?
從之前的文章中我們說到,自動生成代碼時,想讓各種信號、參數定義和聲明采用什么樣的方式,都是通過數據對象 (Data Object) 來實現的。那,如果我希望把信號 a ,b,c 或者參數 k1,k2,k3 定義為一個結構體,該怎么實現呢?
構造結構體
要得到:
typdef struct {
double k1;
double k2;
double k3;
} kk_type;
kk_type kk={2.0,3.0,4.0};
怎么做:
設置數據對象的Storage Class屬性為 Struct
或者使用Simulink Bus來定義新的結構體類型 outyy
舉個例子
1.新建如下的簡單模型并生成代碼
先看一下 “正常的” 不使用結構體的情況:
看下面這張圖,定義好了對應的信號數據對象 (Simulink.Signal) u1、u2、u3、yy1、yy2、yy3,與參數數據對象(Simulink.Parameter) k1、k2、k3。
通過名字對應以及關聯操作,實現關聯,也就是上圖中的藍色小叉子。具體如何操作以前介紹過。
Ctrl + B,生成代碼:
2.把參數 k1、k2、k3 放在指定的結構體 kk 里
選中數據對象 k1,k2,k3,把 StorageClass 都設置為 Struct(Custom),并指定結構體名字為 kk。這樣在自動生成代碼時,這幾個參數會自動放入結構體 kk 中。
看到,在生成的代碼里,得到一個新的結構體類型 kk_type:
并且,根據這幾個參數的值,得到了結構體變量 kk:
3.把信號 yy1、yy2、yy3 也放在一個輸出結構體里
剛才的參數結構體是通過設置數據對象的 StorageClass 為 Struct 來實現的。而現在,以信號為例,使用另一種方式來實現這個目的: Simulink Bus。
a.首先,通過 Simulink Bus 來定義一個新的結構體數據類型 outyy:
定義這個 Bus 的結構,里面的成員名就是最后出現在代碼里的名字:
那么此時,一個新的數據類型就構造好了。將來在生成代碼時,這個新的結構體類型就是這樣:
數據類型定義好了,接著,我們就要來用它了。
b. 把 Simulink 的三個輸出信號使用 Bus Creator 模塊變成總線信號,取名叫 outStruct:
設置這個 Bus Creator 模塊的數據類型為剛定義好的結構體 outyy。另外,還得勾選它為非虛擬總線。那么這樣,它在生成代碼時,就會被當做結構體來看:
c. 如同之前每一個 double\single 類型的信號一樣,接著,也為 outStruct信號定義一個同名的數據對象 outStruct。
在 Simulink 模型上的 outStruct 信號線的屬性界面上勾選關聯到這個數據對象,得到藍色小叉子。
4. 最后生成代碼
-
數據
+關注
關注
8文章
6888瀏覽量
88826 -
數據類型
+關注
關注
0文章
236瀏覽量
13608 -
結構體
+關注
關注
1文章
129瀏覽量
10833
發布評論請先 登錄
相關推薦
評論