simulink怎么生成vxworks的执行程序_从EPB模型谈谈Simulink代码生成
前段時間有讀者朋友問代碼生成的例子,說他正在做EPB的仿真模型,但總是和應用串不到一塊去,我這里就從一個簡單EPB控制模型來談談simulink代碼生成,總結代碼生成方法的同時也順便回答他的問題。
1.EPB模型準備
用來舉例說明的模型很簡單,就是EPB(電子駐車,Electrical Parking Brake)中的手動夾緊功能,即駕駛員操作EPB按鈕實現電子卡鉗夾緊從而駐車的功能。
如果你開過車,應該會知道EPB就是下面這玩意。
EPB的功能很多,我們只拿其中最簡單的EPB Switch Apply功能來說明,要使電子卡鉗夾緊,同時滿足下面四個條件即可:
(1)EPB未處于工廠轉轂模式;
(2)EPB開關被拉起;
(3)EPB卡鉗鎖止功能正常;
(4)車輛靜止;
分別用四個flag信號表示這四個狀態量:
雖然只有簡單四個信號,在實際開發中每個信號又要再根據很多條件做判斷,比如工廠轉轂模式是一種整車廠用來檢測駐車制動力是否合格的測試模式,要根據車速輪速做綜合判斷;又例如車輛靜止的判斷條件,并不是簡單的車速為0,而是要判斷四個輪速傳感器的脈沖信號;這里就不做詳細展開。
根據以上的觸發條件可以建立該功能的Simulink模型:
2.代碼生成前的準備
打開Model Settings會話框,在Solver選項中,選擇Fixed-Step(固定步長)和discrete(非連續解算器),這主要是因為我們面向的主要是嵌入式開發,而嵌入式開發的板子都是靠晶振或者外部時鐘電路來計時的,采樣時間一般是固定的。
在Code Generation選項中,System target file(生成目標文件)選ert.tlc,即embedded coder嵌入式代碼生成。
在Report選項中,勾選Create code generation report和Open report automatically,生成代碼后可以方便查看相關報告及詳細代碼。
3.代碼生成及優化
上面準備工作完畢后,點擊下圖藍色Generate Code按鈕或者快捷鍵Ctrl+B,即可自動生成代碼。
生成的代碼如下,結構類似S-function:
初始化(EPB_model_20201123_initialize)→ 程序執行(EPB_model_20201123_step)→ 程序終止 (EPB_model_20201123_terminate)
備注:terminate在實際開發中用不到,因為程序在板子上都是循環跑的,不會終止,這里主要是仿真時間選擇了有限值。
截取主要的代碼看一下,是不是看起來很不舒服?這是因為設置沒有進行優化,生成的代碼都是按照simulink內部默認方式進行變量命名和算法轉寫,不是我們熟悉的C語言表示方法。
35 /* Model step function */ 36 void EPB_model_20201123_step(void) 37 { 38 /* Outport: '<Root>/EPB_Caliper_apply_request_f' incorporates: 39 * Constant: '<S1>/Constant' 40 * Constant: '<S2>/Constant' 41 * Inport: '<Root>/EPB_RollerTest_Status_f' 42 * Inport: '<Root>/EPB_Switch_Status_f' 43 * Inport: '<Root>/EPB_lockfuntion_Status_f' 44 * Inport: '<Root>/Vehicle_Standstill_Status_f' 45 * Logic: '<Root>/Logical Operator' 46 * RelationalOperator: '<S1>/Compare' 47 * RelationalOperator: '<S2>/Compare' 48 */ 49 EPB_model_20201123_Y.EPB_Caliper_apply_request_f = 50 ((EPB_model_20201123_U.EPB_RollerTest_Status_f == 0.0) && 51 EPB_model_20201123_U.EPB_Switch_Status_f && 52 (EPB_model_20201123_U.EPB_lockfuntion_Status_f == 0.0) && 53 EPB_model_20201123_U.Vehicle_Standstill_Status_f); 54 55 /* Matfile logging */ 56 rt_UpdateTXYLogVars(EPB_model_20201123_M->rtwLogInfo, 57 (&EPB_model_20201123_M->Timing.taskTime0)); 58 59 /* signal main to stop simulation */ 60 { /* Sample time: [0.2s, 0.0s] */ 61 if ((rtmGetTFinal(EPB_model_20201123_M)!=-1) && 62 !((rtmGetTFinal(EPB_model_20201123_M)- 63 EPB_model_20201123_M->Timing.taskTime0) > 64 EPB_model_20201123_M->Timing.taskTime0 * (DBL_EPSILON))) { 65 rtmSetErrorStatus(EPB_model_20201123_M, "Simulation finished"); 66 } 67 }那該怎么優化設置?
首先可以優化信號線,在信號線的properties菜單中,將要定義的變量填入Signal name,然后在Code Generation選項中選擇ExportedGlobal(定義為全局變量)
修改完的模型就變成如下的樣子:
生成的代碼可以看到已經出現我們熟悉的變量定義,主要的代碼也變得清爽易讀
52 EPB_Caliper_apply_request_f = ((EPB_RollerTest_Status_f == 0.0) && 53 EPB_Switch_Status_f && (EPB_lockfuntion_Status_f == 0.0) && 54 Vehicle_Standstill_Status_f); 55 56 /* Outport: '<Root>/EPB_Caliper_apply_request_f' */ 57 EPB_model_20201123_Y.EPB_Caliper_apply_request_f_j = 58 EPB_Caliper_apply_request_f;其次可以單獨管理變量,在M文件中批量定義程序用到的變量并初始化,這里變量不多就直接在命令窗口演示,Initial value設置為0,Storage class設置為ExportedGlobal:
然后在模型中綁定已經在workspace中定義的變量,信號線的properties中勾選Signal name must resolve to Simulink signal object:
修改后的信號線旁邊會出現叉子標志,表示信號綁定成功:
4.代碼生成后能干什么?
本來到上面本文就結束了,但之前和剛接觸MBD開發流程的童鞋交流過程中,發現大家對整個開發過程不是很熟悉,或者說不知道生成代碼后能做什么,這里簡單介紹下MBD開發。
MBD是Model Based Design基于模型開發的縮寫,本質上是將原本文字描述的技術需求文檔以及測試說明文檔轉化成便于理解的可視化模型,將重復且易出錯的代碼編寫過程交付給計算機軟件完成,按照事先定義好的編程規則自動生成代碼,目的是提高開發效率,減少錯誤。
自動生成的代碼一般需要導入到芯片廠家開發的專用IDE(集成開發環境)中,進行檢查編譯后,下載到指定硬件中即可完成嵌入式開發。
總結
以上是生活随笔為你收集整理的simulink怎么生成vxworks的执行程序_从EPB模型谈谈Simulink代码生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小赢怎样解绑银行卡?
- 下一篇: pb90代码如何连接sql2008r2_