simulink怎么生成vxworks的执行程序_从EPB模型谈谈Simulink代码生成
前段時(shí)間有讀者朋友問(wèn)代碼生成的例子,說(shuō)他正在做EPB的仿真模型,但總是和應(yīng)用串不到一塊去,我這里就從一個(gè)簡(jiǎn)單EPB控制模型來(lái)談?wù)剆imulink代碼生成,總結(jié)代碼生成方法的同時(shí)也順便回答他的問(wèn)題。
1.EPB模型準(zhǔn)備
用來(lái)舉例說(shuō)明的模型很簡(jiǎn)單,就是EPB(電子駐車,Electrical Parking Brake)中的手動(dòng)夾緊功能,即駕駛員操作EPB按鈕實(shí)現(xiàn)電子卡鉗夾緊從而駐車的功能。
如果你開(kāi)過(guò)車,應(yīng)該會(huì)知道EPB就是下面這玩意。
EPB的功能很多,我們只拿其中最簡(jiǎn)單的EPB Switch Apply功能來(lái)說(shuō)明,要使電子卡鉗夾緊,同時(shí)滿足下面四個(gè)條件即可:
(1)EPB未處于工廠轉(zhuǎn)轂?zāi)J?#xff1b;
(2)EPB開(kāi)關(guān)被拉起;
(3)EPB卡鉗鎖止功能正常;
(4)車輛靜止;
分別用四個(gè)flag信號(hào)表示這四個(gè)狀態(tài)量:
雖然只有簡(jiǎn)單四個(gè)信號(hào),在實(shí)際開(kāi)發(fā)中每個(gè)信號(hào)又要再根據(jù)很多條件做判斷,比如工廠轉(zhuǎn)轂?zāi)J绞且环N整車廠用來(lái)檢測(cè)駐車制動(dòng)力是否合格的測(cè)試模式,要根據(jù)車速輪速做綜合判斷;又例如車輛靜止的判斷條件,并不是簡(jiǎn)單的車速為0,而是要判斷四個(gè)輪速傳感器的脈沖信號(hào);這里就不做詳細(xì)展開(kāi)。
根據(jù)以上的觸發(fā)條件可以建立該功能的Simulink模型:
2.代碼生成前的準(zhǔn)備
打開(kāi)Model Settings會(huì)話框,在Solver選項(xiàng)中,選擇Fixed-Step(固定步長(zhǎng))和discrete(非連續(xù)解算器),這主要是因?yàn)槲覀兠嫦虻闹饕乔度胧介_(kāi)發(fā),而嵌入式開(kāi)發(fā)的板子都是靠晶振或者外部時(shí)鐘電路來(lái)計(jì)時(shí)的,采樣時(shí)間一般是固定的。
在Code Generation選項(xiàng)中,System target file(生成目標(biāo)文件)選ert.tlc,即embedded coder嵌入式代碼生成。
在Report選項(xiàng)中,勾選Create code generation report和Open report automatically,生成代碼后可以方便查看相關(guān)報(bào)告及詳細(xì)代碼。
3.代碼生成及優(yōu)化
上面準(zhǔn)備工作完畢后,點(diǎn)擊下圖藍(lán)色Generate Code按鈕或者快捷鍵Ctrl+B,即可自動(dòng)生成代碼。
生成的代碼如下,結(jié)構(gòu)類似S-function:
初始化(EPB_model_20201123_initialize)→ 程序執(zhí)行(EPB_model_20201123_step)→ 程序終止 (EPB_model_20201123_terminate)
備注:terminate在實(shí)際開(kāi)發(fā)中用不到,因?yàn)槌绦蛟诎遄由隙际茄h(huán)跑的,不會(huì)終止,這里主要是仿真時(shí)間選擇了有限值。
截取主要的代碼看一下,是不是看起來(lái)很不舒服?這是因?yàn)樵O(shè)置沒(méi)有進(jìn)行優(yōu)化,生成的代碼都是按照simulink內(nèi)部默認(rèn)方式進(jìn)行變量命名和算法轉(zhuǎn)寫(xiě),不是我們熟悉的C語(yǔ)言表示方法。
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 }那該怎么優(yōu)化設(shè)置?
首先可以優(yōu)化信號(hào)線,在信號(hào)線的properties菜單中,將要定義的變量填入Signal name,然后在Code Generation選項(xiàng)中選擇ExportedGlobal(定義為全局變量)
修改完的模型就變成如下的樣子:
生成的代碼可以看到已經(jīng)出現(xiàn)我們熟悉的變量定義,主要的代碼也變得清爽易讀
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;其次可以單獨(dú)管理變量,在M文件中批量定義程序用到的變量并初始化,這里變量不多就直接在命令窗口演示,Initial value設(shè)置為0,Storage class設(shè)置為ExportedGlobal:
然后在模型中綁定已經(jīng)在workspace中定義的變量,信號(hào)線的properties中勾選Signal name must resolve to Simulink signal object:
修改后的信號(hào)線旁邊會(huì)出現(xiàn)叉子標(biāo)志,表示信號(hào)綁定成功:
4.代碼生成后能干什么?
本來(lái)到上面本文就結(jié)束了,但之前和剛接觸MBD開(kāi)發(fā)流程的童鞋交流過(guò)程中,發(fā)現(xiàn)大家對(duì)整個(gè)開(kāi)發(fā)過(guò)程不是很熟悉,或者說(shuō)不知道生成代碼后能做什么,這里簡(jiǎn)單介紹下MBD開(kāi)發(fā)。
MBD是Model Based Design基于模型開(kāi)發(fā)的縮寫(xiě),本質(zhì)上是將原本文字描述的技術(shù)需求文檔以及測(cè)試說(shuō)明文檔轉(zhuǎn)化成便于理解的可視化模型,將重復(fù)且易出錯(cuò)的代碼編寫(xiě)過(guò)程交付給計(jì)算機(jī)軟件完成,按照事先定義好的編程規(guī)則自動(dòng)生成代碼,目的是提高開(kāi)發(fā)效率,減少錯(cuò)誤。
自動(dòng)生成的代碼一般需要導(dǎo)入到芯片廠家開(kāi)發(fā)的專用IDE(集成開(kāi)發(fā)環(huán)境)中,進(jìn)行檢查編譯后,下載到指定硬件中即可完成嵌入式開(kāi)發(fā)。
總結(jié)
以上是生活随笔為你收集整理的simulink怎么生成vxworks的执行程序_从EPB模型谈谈Simulink代码生成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小赢怎样解绑银行卡?
- 下一篇: python win10 桌面_Pyth