請記得:
1. 拿正確的模型去生成代碼;
2. 只對你關心的數據進行數據管理。
M數據對象的基本概念
在你的模型驗證完成之后,就可以進行代碼生成工作了,代碼生成階段最主要的工作就是數據管理。
前面我們說過,我們只管理我們關心的數據,對于那些無關的數據,就任由代碼生成工具怎么處理吧。
數據管理的方式有好幾種,我這里只介紹在工程化項目中被廣泛應用的使用數據對象管理數據。這里的“數據對象”里面的“對象”二字和就是我們經常聽到的“面向對象”里面的“對象”一樣。沒錯,說白了,就是使用面向對象的方式去管理數據。
我們知道,在面向對象的編程模式下,有一個非常重要的概念——類。類是一種抽象,抽象出某一類事物共同具有的某些屬性以及相關的操作(面向對象里稱之為“方法”)。面向對象模式下,還有一個概念——包,包會把相關的幾個類打包到一起,以便于管理。另外,就是對象,對象是類的實例,對象不再是抽象的,而是具體的,創建對象就是一個實例化過程。對象擁有類的所有屬性,同時要求我們給出屬性值。
Simulink在進行數據管理的時候,提供了兩個包,一個是Simulink Package,另一個是mpt Package。下面以Simulink Package為例,介紹包、類以及屬性的結構。
如圖示,Simulink包里有兩個類,一個是Signal,一個是Parameter。對于其中的每個類,都有各自的屬性和方法。
數據管理基本上就是管理事先定義好的各種屬性,其中,最為重要就是數據類型(Data Type)和存儲類(Storage Class)。數據類型相信大家都很熟悉,這里面稍微有些麻煩的是定點數,以后我會專門介紹數據的定點化,這里就不做過多的討論;而存儲類,是影響數據存儲的重要因素。模型中的信號,我們可能定義為全局變量,也可能定義為靜態變量;模型中的參數,我們可以定義為常數型變量,也可以定義為宏定義;還有的數據,在一個模塊中定義后,在其他模塊中就不能再次定義。所有這些,都是通過定義數據對象的存儲類來實現的。
M代碼生成示例
下面我通過一個簡單例子來介紹一下數據管理過程,模型非常簡單,輸出Out1等于兩個輸入信號In1和In2相加再乘以k。這個模型,我們的目標代碼如下:
z = ( x + y ) * k ;
其中, x、y在其他模塊中定義,z和k在本模塊定義。
怎么做?
首先,設置代碼生成工具為Embedded Coder,也就是設置系統目標文件(System Target File)為ert.tlc;
然后,數據管理:
使用信號對象管理信號
在信號線上定義信號名:鼠標雙擊信號線,出現編輯框之后,寫上信號的名字x、y、z;
在數據字典或者Base Workspace里定義同名的信號對象:在Model Explorer里面,選中數據字典的Design Data,或者Base Workspace,然后添加三個Simulink Signal,并命名為x、y、z,設置x、y的Storage Class為Imported Extern,z的Storage Class為Exported Global;
將信號對象和信號關聯起來:在信號線上,使用鼠標右鍵,選擇Properties,然后在Properties對話框里選中Signal name must resolve to Simulink signal object,關聯了信號對象的信號名前面會出現一個藍色的叉子。
說明
鼠標右鍵點擊信號線的方式只能對單個信號進行關聯,如果想批量關聯,可以在MATLAB窗口中使用如下命令:disableimplicitsignalresolution(‘mymodel’),假如模型文件的文件名是mymodel.slx或者mymodel.mdl。
使用參數對象管理參數
定義參數:雙擊Gain模塊,賦值為k;
定義參數對象:在Model Explorer界面下,選中數據字典或者Base Workspace,定義Simulink Parameter對象k,給出k的初始值為2,設置Storage Class為constVolatile;
Inline參數:在配置參數(Configuration Parameters)的優化選項(Optimization)里設置的信號和參數(Signals and Parameters)設置參數的inline選項。
然后,就可以按下Ctrl+B生成代碼了。經過上述設置之后,我們如愿得到了我們期望的代碼:
z = ( x + y ) * k ;
其中x、y為外部模塊定義好的全局變量,本模塊內只做了Extern聲明,沒有定義,z為全局變量,定義在本模塊,k為加了限定詞const和volatile的參數。
說明
MATLAB從R2014b開始提供了數據字典功能,將數據對象通過獨立的文件進行管理。如果使用數據字典管理數據的話,數據對象需要定義在數據字典里面,并且還要有一個將數據字典和模型關聯的過程,如果使用Base Workspace管理數據,和以前版本的MATLAB沒有區別。
上面是一個簡單的例子,更多的代碼生成相關的設置,可以留意MATLAB公眾號中柚籽的系列文章《怎樣生成我想要的C代碼》(也可以在公眾號中回復【柚籽】查看),也可以在今天的第二條圖文中觀看我錄制的代碼生成視頻。
最后,讓我再次重復:拿正確的模型去生成代碼只對你關心的數據進行數據管理
-
數據管理
+關注
關注
1文章
294瀏覽量
19620 -
靜態變量
+關注
關注
0文章
13瀏覽量
6649
發布評論請先 登錄
相關推薦
評論