在汽車嵌入式軟體開發中,需要正确地配置Simulink的信号和參數,才能生成相應的标定量、輸入輸出變量和觀測量。本文通過一個例子總結筆者工作中所用的配置方法。
文章目錄
- 1 問題引入
- 2 輸出信号配置
- 3 輸入信号配置
- 4 觀測量配置
- 5 标定量配置
- 6 總結
1 問題引入
在Simulink代碼生成(一) Embedded Coder配置這一篇部落格中,沒有對輸入輸出信号做任何配置就生成了代碼。此時生成的代碼表現為結構體的形式,并且是在子產品内定義的。
一個模型的輸入信号可能來源于其他模型的輸出或者底層軟體,是以這樣直接在自身代碼内部的定義方式顯然是不符合實際開發需求的。筆者在工作中是通過配置輸入輸出信号線對象,即Simulink.Signal對象,生成了特定存儲方式的代碼。
2 輸出信号配置
首先建立一個Simulink模型demo1.slx,并将輸出信号線命名為Output1,如圖所示。
在Matlab指令行輸入:
>> Output1 = Simulink.Signal;
此時,在右側的工作區建立了一個名為Output1的Signal對象。輕按兩下該對象,将其配置如下圖:
其中,Data Type表示其數值類型為single型,Initial Value表示初始值設為10,Storage Class設為ExportToFile表示該變量輸出到外部檔案,下面的HeaderFile和DefinitionFile表示外部的C檔案和頭檔案。1
然後回到模型demo1.slx,右擊Output1信号線,選擇Properties打開該信号線的屬性視窗。在視窗中勾選Signal name must resolve to Simulink signal object,将該信号線和剛剛定義的Signal對象關聯起來2。關聯後模型中會出現一個小叉子的圖示。
然後生成代碼,打開報告。在demo1.c的step函數中可以看到,輸出變量命名為了Output1,而不是之前的Demo_Y.Out的結構體。initialize函數中可以看到,将Output1初始化為了10,與之前配置相吻合。
那麼,這個Output1是在哪兒定義的呢?打開Demo1_Output.c就可以看到Output1的定義了,這與之前的StorageClass配置相吻合。
然後,在Demo1_Output.h中用extern關鍵字外部定義了Output1,也就是說其他的模型如果要輸入Output1這個變量,代碼中隻需要包含Demo1_Output.h這個頭檔案即可。可以注意到,demo.c檔案中包含了demo.h頭檔案,demo1.h頭檔案中包含了Demo1_Output.h頭檔案。
3 輸入信号配置
配置輸入信号的步驟與輸出信号相似,要給信号線命名并關聯。但是在Signal對象中要把StorageClass設定為ImportFromFile,并且隻需要填入HeaderFile頭檔案。這裡假設Input1是Demo2輸出的。
生成的代碼中,demo1_private.h包含Demo2_Output.h頭檔案。但是不會生成這個頭檔案,因為這個變量是Import的,屬于别的檔案中定義的。并且Input1這個變量也不會在initialize函數中初始化。
4 觀測量配置
觀測量和輸出信号配置類似,都是輸出到外部檔案。不過最好在C檔案命名上展現其中的是觀測量。
5 标定量配置
标定量在汽車軟體中是可以被标定工具所修改的,是以需要有volatile關鍵字修飾。标定量在模型中不是以信号線存在的,而是作為某個子產品的參數,常見的是作為Const子產品的參數。
如圖所示,将Simulink中Const的參數定為一個标定量。
然後,在Matlab指令行定義一個Parameter對象
>> Calibration1 = Simulink.Parameter;
打開該對象,配置參數資訊。
其中,Value表示代碼中的指派,StorageClass、HeaderFile和DefinitionFile表示存儲類型為Volatile和所在檔案。
然後,不需要像信号線一樣關聯對象,直接生成代碼。就會多生成标定量的C檔案和頭檔案,其中定義了标定量。
在step函數中用了這個标定量。如果用标定工具修改了這個量,就會在MCU中生效。
6 總結
本文隻是筆者所用到的對信号線和參數的配置方法。在實際工作中根據不同的項目特點可以進行其他配置。
>>傳回個人部落格總目錄
- Signal對象也可以在資料字典裡定義。 ↩︎
- 也可以通過Matlab腳本批量勾選,詳見Matlab技巧(三) 通過腳本擷取/修改Simulink信号線參數 ↩︎