simulink看起來很簡單,embeded coder看起來也很簡單,但一個模型很簡單,涉及到批量的時候光靠手點應該還是挺煩的。而且應該沒有企業是直接這樣做的吧。一方面是可讀性很差,另一方面直接作為嵌入式集成的時候可能會遇到問題。
明確一點,幾乎所有simulink的鼠標點的GUI操作都可以用.m代碼來實現。如果可以用代碼來實現,就可以實現批量自動化。
這一點有點像excel的宏,所有excel的鼠標點的操作也可以用VB代碼來實現,這樣就可以把一些通用的操作做成模板,也更方便自動化。不過excel有錄宏的功能,這樣對于不知道怎么寫代碼的GUI操作可以有個參考,甚至大大簡化了手寫代碼量。
還沒找到matlab有類似的功能,有的時候想找個簡單的GUI操作對應的.m語句要在網上搜半天加試半天,令人頭禿。
因為最終還是C/C++嵌入式語言,所以還是需要有一些嵌入式C/C++的知識來更好地理解整個抽象和映射的過程。
| Simulink Model | C code | Autosar concept |
|---|---|---|
| .mdl 文件 | .c 源文件 | software component |
| 原子子系統 Atomic Subsystem | 函數 Function | 可運行實體 Runable Entity |
| Function call subsystem & inport with "function-call" | function call timing | RTE event |
下面總結了一些不算熟練的探索,就作為現階段的學習筆記吧:
一般情況下,各企業會對模型有自己的規范要求,一般是結合了MAAB和功能安全,以及自己企業生成代碼工具相配合的規范。
比如模型要有三層架構:外層只有一個模塊,次內層是trigger層,會有幾個runable或者說函數或者說function call sub-system,內層是具體的邏輯。不同層級也會有不同的要求。
數據字典是為生成代碼準備的。除了基本的邏輯運算關系可以直接轉成代碼外,代碼還涉及到數據的定義以及其他屬性,最好一起管理。如果不專門處理,simulink會按照自己的方式,即你不好看懂的方式處理。
simulink里可以通過model explorer可以添加數據對象:
Model Explorer
添加好后就會在工作區以下面的圖標顯現:
工作區的數據對象
以下截圖的所有屬性都可以通過數據字典管理:
對象屬性
不是所有屬性都是生成代碼必填的,比如Data type可以在模型里體現,這里就可以寫auto。比如最大最小值是可以不寫的,但是寫了話會體現在a2l里,對數據檢查還有之后的標定更友好。為了安全要求應該是強制的。
之后一般有兩種管理數據字典的方法:
保存成sldd關聯到模型:這樣的好處是每次重新打開模型都不用重新把數據字典加載到工作空間。但需要一個習慣的過程。
excel管理:這樣比較方便,門檻比較低,對一般人來說更加直觀。但每次打開模型都需要把excel的數據重新寫入工作空間,可以寫簡單的.m腳本來實現。
需要注意數據的重復定義和函數的重復定義問題。
比如,如果你把每個模塊的輸入輸出都定義了,那這個模塊的輸出是另一個模塊的輸入,同樣的信號就會在兩個模塊里重復定義,這樣集成的時候編譯器就會報錯。
還有就是針對企業自定義庫library里面的一些函數,函數名也要注意有沒有犯重復定義的毛病。
最后還需要在模型里把想要的信號的信號線resolve,并冠以數據字典里的信號對象一樣的名字,一般是輸入輸出還有想要觀測的觀測量。我理解這樣才可以把模型跟數據字典里的信號對象相關聯。
resolve的方法網上也有很多,信號少的話手動加也沒什么問題。需要批量的話可以寫個小腳本來實現。
嵌入式語言可能需要指定變量在內存中的位置,對信號和標定都不一樣。可以通過在某些代碼的前后加特定的字段實現,手加理論上應該也可以,但應該沒人這么做。
matlab/simulink已經提供了比較好的解決方案,叫做自定義存儲類。相當于你可以自己建一個package,在里面你可以自定義一些組別,比如標定是一個組別,輸入信號是一個組別,輸出信號是一個組別,然后每個組別可以在定義前后加特定的你設計的pragma字段包括注釋,自動添加自動管理。
package會在新建數據對象時要求選擇:
新建對象
每個package會有信號和標定兩種大的類型,simulink有內嵌的mpt.Signal和mpt.Parameter以及Simulink.Signal和Simulink.Parameter,但不能更改。
如果這些不夠用的話,你可以通過cscdesigner設計自己的package。
simulink package不能修改
存儲類會體現在數據對象的Code Generation頁,也可以手動在這里添加或修改:
對象屬性里的存儲類
通過自定義存儲類你可以選擇把信號或者標定定義在不同的文件里。
新建自定義存儲類的方法網上有很多,就不在這里贅述了。
大多接觸模型配置的時候都是直接點圖標來選擇,但是批量操作模型代碼生成的話,一個一個點就不切實際了。
可以把當前配置保存為一個.mat文件,然后通過.m語句加載進需要的模型。
這個配置里面的學問感覺還是挺深的,從最基礎的選擇步長,選擇tlc(目標語言編譯器),到是否生成a2l等等。尤其是Code Generation里面,比如可以通過Code Generation - Template 修改代碼模板,使生成的代碼頂部底部或其他地方帶有你想要的炫酷字樣。
比如這個勾選后,代碼里初始化為0的部分就不體現了
最后感謝學習過程中找到的chhttty大神的博客,對初學者來說是很好的資源。
版權聲明:本文為知乎「林木」的原創文章,已獲作者發表許可。
閱讀原文,關注作者知乎!推薦閱讀
帶不帶功能安全(IS26262)的區別,功能安全要做啥?
談談Bootloader自更新
談談對兩家AUTOSAR工具看法
奧迪首款800V車型技術總覽
CAN設計與應用指南
汽車軟件需求是如何變成用戶功能?
電子電氣架構設計需要考慮哪些方面?
汽車E/E架構的網絡安全分析
電子電氣架構設計需要考慮哪些方面?
一文搞懂AUTOSAR的DEM模塊深度解讀汽車域控制器談談在V模型流程中引入敏捷開發自動駕駛域控制器信息梳理自動駕駛中的路徑規劃汽車軟件開發的下一個階段是什么樣的?深度分析整車控制域現狀與發展分享不易,懇請點個【??】和【在看】