1 Simulink代碼生成的基本概念(續(xù))
1.1 上一期補(bǔ)充內(nèi)容
上一篇文章中提到,生成嵌入式代碼,必須選擇定步長(zhǎng)求解器。實(shí)際中,生成嵌入式代碼幾乎不會(huì)使用Simulink模型庫(kù)中的連續(xù)模型,往往需要通過(guò)最簡(jiǎn)單的離散模塊來(lái)實(shí)現(xiàn)算法模型。
所以要強(qiáng)調(diào)一點(diǎn):生成嵌入式代碼,要學(xué)會(huì) 使用和適應(yīng)離散模型的搭建方式 。在建模的一開(kāi)始就要充分考慮離散模型的特點(diǎn)和需求。
一個(gè)模型是允許多個(gè)離散步長(zhǎng)的,這涉及到多任務(wù)相關(guān)的內(nèi)容,后續(xù)再作詳細(xì)介紹。建議讀者在建模的時(shí)候,將離散步長(zhǎng)(其倒數(shù)即為采樣頻率)顯示出來(lái),方便辨別不同模塊的實(shí)際步長(zhǎng)。顯示離散步長(zhǎng)的方法如下:
顯示離散步長(zhǎng) - From autoMBD
同時(shí)也建議讀者將端口數(shù)據(jù)類型顯示出來(lái),因?yàn)椴煌K之間的數(shù)據(jù)傳遞,要保證數(shù)據(jù)類型相同(后續(xù)將介紹數(shù)據(jù)類型的相關(guān)內(nèi)容)。顯示端口數(shù)據(jù)類型的方法如下所示:
顯示端口數(shù)據(jù)類型 - From autoMBD
1.2 Embedded Coder的使用
Embedded Coder工具專門(mén)為嵌入式軟件生成代碼而設(shè)計(jì),集成了MATLAB Coder和Simulink Coder,可以將m腳本和模型生成C代碼。Embedded Coder可以在下圖位置找到:
Embedded Coder位置 - From autoMBD
單擊“Embedded Coder”便可以進(jìn)入到Code Perspective窗口。在這個(gè)窗口下可以看到四個(gè)主要功能區(qū)域:
- 工具欄
- 模型區(qū)域
- 代碼面板
- 代碼映射面板
如下圖所示:
Code Perspective**四個(gè)功能區(qū)域 - From autoMBD
Tips :MATLAB/Simulink的版本不同,上述界面可能會(huì)有差異,截圖為版本為2020b。
在工具欄中,可以找到大部分關(guān)于代碼生成的選項(xiàng)工具或配置入口。模型區(qū)域用于編輯和設(shè)計(jì)模型,如果設(shè)置了定步長(zhǎng)求解器和ert系統(tǒng)目標(biāo)文件,單擊工具欄中的“Generate Code”按鈕便可以生成代碼了。
代碼面板用于查看生成的代碼。在代碼面板中,點(diǎn)擊生成的代碼,代碼對(duì)應(yīng)的模型會(huì)高亮顯示。這樣方便用戶追蹤模型生成的代碼。
代碼映射面板有很多功能,涉及到的概念和知識(shí)點(diǎn)很多,在后續(xù)的內(nèi)容中會(huì)逐步講解。
讀者可以自行探索和體驗(yàn)這四個(gè)功能區(qū)域的作用和使用方法。
2 詳解模型與代碼之間的聯(lián)系
為了便于展示此部分內(nèi)容,我制作了一個(gè)簡(jiǎn)易的PI控制模型作為示例。讀者可以在autoMBD資源庫(kù)的“臨時(shí)資源分享”文件夾中找到該模型(資源序號(hào) tA22 )。資源庫(kù)鏈接的獲取可以在《autoMBD原創(chuàng)技術(shù)文章合集》中找到(見(jiàn)文章開(kāi)頭)。
2.1 模型生成的代碼
打開(kāi)PI控制器示例模型,可以看到模型如下圖所示:
PI控制器示例模型 - From autoMBD
該示例模型已經(jīng)配置好,點(diǎn)擊“Generate Code”生成代碼。可以發(fā)現(xiàn)一共生成了六個(gè)文件:
PI控制器示例模型生成的代碼 - From autoMBD
生成的文件位于模型同級(jí)目錄下“** 模型名 _ert_rtw**”文件夾內(nèi),這六個(gè)文件的作用分別是:
- ert_main.c :該文件是一個(gè)樣例文件,向用戶展示主程序如何調(diào)用模型代碼,在代碼集成時(shí)可以參考該文件;
- 模型名.c:該文件包含模型的全部實(shí)現(xiàn)方法,包含變量的聲明和定義,Step函數(shù)、初始化函數(shù)、終止函數(shù)等的定義和實(shí)現(xiàn),即“模型的本身”;
- 模型名.h:該文件包含模型所依賴的數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)類型的定義和聲明,以及模型變量、模型算法函數(shù)的外部聲明;
- 模型名_private.h:包含模型本地的宏和數(shù)據(jù)類型定義,有定義才會(huì)生成相關(guān)內(nèi)容;
- 模型名_types.h:該文件包含模塊參數(shù)(Parameters)和模型數(shù)據(jù)(Model Data)的數(shù)據(jù)結(jié)構(gòu)的向前聲明,在一些可重用函數(shù)中可能會(huì)被使用;
- rtwtypes.h :定義了基本的數(shù)據(jù)類型和宏,大部分的生成代碼可能會(huì)依賴該文件;
- 模型名_data.c:上圖中沒(méi)有生成,但在某些情況下會(huì)生成該文件,其中包含模型中的模塊參數(shù)(Parameters)、常數(shù)模塊和I/O的數(shù)據(jù)結(jié)構(gòu)的定義和聲明。
對(duì)于代碼集成來(lái)說(shuō),用戶只需要在主函數(shù)代碼中,添加下面這個(gè)語(yǔ)句,即可使用模型生成的代碼,實(shí)現(xiàn)相關(guān)的算法和功能:
#inlcude "模型名.h"
讀者可以自行閱讀生成的代碼,初步接觸生成代碼的風(fēng)格和特點(diǎn)。接下來(lái)會(huì)詳細(xì)介紹模型和代碼之間的對(duì)應(yīng)關(guān)系。
2.2 代碼之母——模型
作為MBD的核心,怎么強(qiáng)調(diào)對(duì)****模型的理解的重要性都不為過(guò)。
在嵌入式代碼中,數(shù)據(jù)是代碼的重要組成部分。 代碼中的數(shù)據(jù)和模型中的數(shù)據(jù)是怎么聯(lián)系起來(lái)的 ,便是今天討論的重點(diǎn)。對(duì)于模型,有四個(gè)與生成代碼緊密關(guān)聯(lián)的 模型數(shù)據(jù)形式 :
- 信號(hào)(Signals)
- 參數(shù)(Parameters)
- 狀態(tài)(States)
- 模型數(shù)據(jù)(Model Data)
模型中的這四種數(shù)據(jù)形式,生成的代碼各不相同。通過(guò)控制這些模型數(shù)據(jù)的配置,即可控制生成代碼的數(shù)據(jù)類型、存儲(chǔ)位置和數(shù)據(jù)形式。
在開(kāi)始介紹前,給出模型數(shù)據(jù)形式的思維導(dǎo)圖:
模型數(shù)據(jù)形式的思維導(dǎo)圖 - From autoMBD
2.2.1 信號(hào)
信號(hào)(Signals), 即模型中不同模塊之間的數(shù)據(jù)傳遞線,有兩種:外部信號(hào)和 內(nèi)部信號(hào) 。其中外部信號(hào)又分為外部輸入信號(hào)和外部 輸出信號(hào) 。
以我構(gòu)建的PI控制器模型為例,模型包含的信號(hào)如下圖所示:
PI控制器模型的信號(hào) - From autoMBD
上圖中,Req_Ctrl和Feedback與輸入端口連接,屬于外部輸入信號(hào);PI_Ctrl與輸出端口連接,屬于外部輸出信號(hào);Err、P_value和I_value沒(méi)有與任何端口連接,屬于內(nèi)部信號(hào)。
Tips :上圖并沒(méi)有標(biāo)注全部的內(nèi)部信號(hào),一般只標(biāo)注有重要、意義的內(nèi)部信號(hào)即可。
保持默認(rèn)設(shè)置情況下生成代碼, 外部信號(hào)會(huì)生成全局變量 ,其中輸入變量為“ ** 模型名 _U** ”,而輸出變量為“ ** 模型名 _Y** ”。
以本文的示例工程為例,輸入輸出信號(hào)生成的全局變量以及相關(guān)的數(shù)據(jù)類型聲明和定義如下所示:
/* 外部輸入數(shù)據(jù)類型定義 代碼生成于"模型名.h" */
/* External inputs (root inport signals with default storage) */
typedef struct {
real_T Req_Ctrl; /* '< Root >/Req_Ctrl' */
real_T Feedback; /* '< Root >/Feedback' */
} ExtU_autoMBD_example_PI_noSub_T;
/* 外部輸出數(shù)據(jù)類型定義 代碼生成于"模型名.h" */
/* External outputs (root outports fed by signals with default storage) */
typedef struct {
real_T PI_Ctrl; /* '< Root >/PI_Ctrl' */
} ExtY_autoMBD_example_PI_noSub_T;
/* 外部輸入變量定義 代碼生成于"模型名.c" */
/* External inputs (root inport signals with default storage) */
ExtU_autoMBD_example_PI_noSub_T autoMBD_example_PI_noSubs_U;
/* 外部輸出變量定義 代碼生成于"模型名.c" */
/* External outputs (root outports fed by signals with default storage) */
ExtY_autoMBD_example_PI_noSub_T autoMBD_example_PI_noSubs_Y;
保持默認(rèn)設(shè)置生成代碼時(shí),對(duì)于內(nèi)部信號(hào), 只有具有分叉點(diǎn)的信號(hào)線會(huì)生成局部變量 ,變量名為“ rtb_信號(hào)名 ”。由于是局部變量,它會(huì)隨著Step函數(shù)的出棧而被釋放。
其他不具備分叉點(diǎn)的內(nèi)部信號(hào),不會(huì)生成任何變量,而是 隱含在算法的運(yùn)算過(guò)程當(dāng)中 。
以示例工程的內(nèi)部信號(hào)Err為例,模型中僅該信號(hào)具有分叉點(diǎn),它生成的局部變量如下所示:
/* 代碼生成于"模型名.c" */
/* Model step function */
void autoMBD_example_PI_noSubs_step(void)
{
real_T rtb_Err; /* 內(nèi)部信號(hào)Err 變量定義*/
/* Sum: '< Root >/Sum2' incorporates:
* Inport: '< Root >/Feedback'
* Inport: '< Root >/Req_Ctrl'
*/
rtb_Err = autoMBD_example_PI_noSubs_U.Req_Ctrl -
autoMBD_example_PI_noSubs_U.Feedback; /* 內(nèi)部信號(hào)Err 變量計(jì)算*/
/* Outport: '< Root >/PI_Ctrl' incorporates:
* DiscreteIntegrator: '< Root >/Discrete-Time Integrator'
* Gain: '< Root >/Kp'
* Sum: '< Root >/Sum1'
*/
autoMBD_example_PI_noSubs_Y.PI_Ctrl = 2.0 * rtb_Err +
autoMBD_example_PI_noSubs_DW.DiscreteTimeIntegrator_DSTATE; /* 內(nèi)部信號(hào)Err 變量使用*/
/* Update for DiscreteIntegrator: '< Root >/Discrete-Time Integrator' incorporates:
* Gain: '< Root >/Ki'
*/
autoMBD_example_PI_noSubs_DW.DiscreteTimeIntegrator_DSTATE += 3.0 * rtb_Err *
0.001; /* 內(nèi)部信號(hào)Err 變量使用*/
}
關(guān)于如何修改信號(hào)的代碼生成模塊信號(hào)(對(duì)應(yīng)生成變量為“ 模型名_B ”),以及其他關(guān)于信號(hào)的配置選項(xiàng),在后續(xù)的文章中進(jìn)行介紹。
2.2.2 參數(shù)
參數(shù) (Parameters)指的是模塊的參數(shù),例如:本文PI控制器模型中的PI增益模塊,它們的參數(shù)分別實(shí)現(xiàn)Kp和Ki,模型中的Discrete-Time Integrator模塊也有兩個(gè)慘數(shù),具體為采樣時(shí)間參數(shù)、初始值參數(shù)。
保持默認(rèn)設(shè)置情況下, 模塊的參數(shù)會(huì)作為數(shù)值常數(shù),直接用于算法的運(yùn)算過(guò)程 。如下所示PI控制器生成的代碼中,Kp、Ki和采樣時(shí)間直接使用其數(shù)值2、3和0.001參與算法的運(yùn)算。
/* 代碼生成于"模型名.c" */
/* Model step function */
void autoMBD_example_PI_noSubs_step(void)
{
real_T rtb_Err;
/* Sum: '< Root >/Sum2' incorporates:
* Inport: '< Root >/Feedback'
* Inport: '< Root >/Req_Ctrl'
*/
rtb_Err = autoMBD_example_PI_noSubs_U.Req_Ctrl -
autoMBD_example_PI_noSubs_U.Feedback;
/* Outport: '< Root >/PI_Ctrl' incorporates:
* DiscreteIntegrator: '< Root >/Discrete-Time Integrator'
* Gain: '< Root >/Kp'
* Sum: '< Root >/Sum1'
*/
/* 直接使用比例增益的數(shù)值常量2.0參與計(jì)算 */
autoMBD_example_PI_noSubs_Y.PI_Ctrl = 2.0 * rtb_Err +
autoMBD_example_PI_noSubs_DW.DiscreteTimeIntegrator_DSTATE;
/* Update for DiscreteIntegrator: '< Root >/Discrete-Time Integrator' incorporates:
* Gain: '< Root >/Ki'
*/
/* 直接使用積分增益的數(shù)值常量3.0和離散步長(zhǎng)數(shù)值常量0.001參與計(jì)算 */
autoMBD_example_PI_noSubs_DW.DiscreteTimeIntegrator_DSTATE += 3.0 * rtb_Err *
0.001;
}
有的時(shí)候,我們不希望模塊參數(shù)是一個(gè)數(shù)值常量,而是一個(gè)可以修改的變量。例如對(duì)Kp和Ki參數(shù)進(jìn)行在線標(biāo)定時(shí),需要有兩個(gè)變量來(lái)保存Kp和Ki參數(shù)。
關(guān)于如何修改模塊參數(shù)的代碼生成方式,使其成為一個(gè)變量而不是數(shù)值常量,可以按照下圖所示步驟進(jìn)行:
修改模塊參數(shù)的生成方式 - From autoMBD
簡(jiǎn)單來(lái)說(shuō),就是讓模型參數(shù)是可調(diào)(Tunable)的,這樣便會(huì)生成一個(gè)新的變量來(lái)保存模型中所有模塊的參數(shù)。
修改模塊參數(shù)的生成方式后,重新生成代碼??梢钥吹?,在“ 模型名 .h”中會(huì)生成一個(gè)新的數(shù)據(jù)結(jié)構(gòu)體,包含了所有模塊的全部可調(diào)參數(shù):
/* 模塊參數(shù)數(shù)據(jù)結(jié)構(gòu)體定義 代碼生成于"模型名.h" */
/* Parameters (default storage) */
struct P_autoMBD_example_PI_noSubs_T_ {
real_T Kp_Gain; /* Expression: 2
* Referenced by: '< Root >/Kp'
*/
real_T DiscreteTimeIntegrator_gainval;
/* Computed Parameter: DiscreteTimeIntegrator_gainval
* Referenced by: '< Root >/Discrete-Time Integrator'
*/
real_T DiscreteTimeIntegrator_IC; /* Expression: 0
* Referenced by: '< Root >/Discrete-Time Integrator'
*/
real_T Ki_Gain; /* Expression: 3
* Referenced by: '< Root >/Ki'
*/
};
在“ 模型名 *types.h”中會(huì)對(duì)參數(shù)結(jié)構(gòu)體聲明新的數(shù)據(jù)類型,并在“ 模型名 * data.c”(新生成的文件,默認(rèn)配置無(wú)該文件)中定義一個(gè)該數(shù)據(jù)類型的變量,同時(shí)幅初值,如下所示:
/* 模塊參數(shù)數(shù)據(jù)類型定義 代碼生成于"模型名_types.h" */
/* Parameters (default storage) */
typedef struct P_autoMBD_example_PI_noSubs_T_ P_autoMBD_example_PI_noSubs_T;
/* 模塊參數(shù)變量定義和賦初值 代碼生成于"模型名_data.c "*/
/* Block parameters (default storage) */
P_autoMBD_example_PI_noSubs_T autoMBD_example_PI_noSubs_P = {
/* Expression: 2
* Referenced by: ' Root >/Kp'
*/
2.0,
/* Computed Parameter: DiscreteTimeIntegrator_gainval
* Referenced by: ' Root >/Discrete-Time Integrator'
*/
0.001,
/* Expression: 0
* Referenced by: ' Root >/Discrete-Time Integrator'
*/
0.0,
/* Expression: 3
* Referenced by: ' Root >/Ki'
*/
3.0
};
可以看到,用于存儲(chǔ)模塊參數(shù)的變量名為“ 模型名_P ”。重新查看生成的Step函數(shù),可以發(fā)現(xiàn)PI控制器算法的計(jì)算,不再直接使用數(shù)值常量,而是使用變量“ 模型名 _P”進(jìn)行的運(yùn)算。
/* 代碼生成于"模型名.c" */
/* Model step function */
void autoMBD_example_PI_noSubs_step(void)
{
real_T rtb_Err;
/* Sum: '< Root >/Sum2' incorporates:
* Inport: '< Root >/Feedback'
* Inport: '< Root >/Req_Ctrl'
*/
rtb_Err = autoMBD_example_PI_noSubs_U.Req_Ctrl -
autoMBD_example_PI_noSubs_U.Feedback;
/* Outport: '< Root >/PI_Ctrl' incorporates:
* DiscreteIntegrator: '< Root >/Discrete-Time Integrator'
* Gain: '< Root >/Kp'
* Sum: '< Root >/Sum1'
*/
/* 使用"模型名_P.Kp_Gain"參與計(jì)算 */
autoMBD_example_PI_noSubs_Y.PI_Ctrl = autoMBD_example_PI_noSubs_P.Kp_Gain *
rtb_Err + autoMBD_example_PI_noSubs_DW.DiscreteTimeIntegrator_DSTATE;
/* Update for DiscreteIntegrator: '< Root >/Discrete-Time Integrator' incorporates:
* Gain: '< Root >/Ki'
*/
/* 使用"模型名_P.Ki_Gain"和"模型名_P.DiscreteTimeIntegrator_gainval"參與計(jì)算 */
autoMBD_example_PI_noSubs_DW.DiscreteTimeIntegrator_DSTATE +=
autoMBD_example_PI_noSubs_P.Ki_Gain * rtb_Err *
autoMBD_example_PI_noSubs_P.DiscreteTimeIntegrator_gainval;
}
更多關(guān)于模塊參數(shù)的代碼生成配置方法,將在后續(xù)的文章中介紹。
2.2.3 狀態(tài)
狀態(tài) (States)是離散系統(tǒng)運(yùn)算過(guò)程中必不可少的元素。
我們知道,離散系統(tǒng)是在每一個(gè)離散的時(shí)間點(diǎn)上, 運(yùn)行一次Step函數(shù)。某一時(shí)刻運(yùn)行一次Step函數(shù),除了需要輸入數(shù)據(jù)(通過(guò)外部輸入信號(hào)輸入)以外, 往往還需要上一個(gè)時(shí)刻的運(yùn)算結(jié)果 ,甚至之前連續(xù)幾個(gè)時(shí)刻的運(yùn)算結(jié)果。
在嵌入式系統(tǒng)中,這些結(jié)果需要一個(gè)變量來(lái)存儲(chǔ),這個(gè)變量即為 狀態(tài)變量 。
在Simulink模型庫(kù)中,凡是包含離散因子“ z ”的模塊,全部具有狀態(tài)變量。這些模塊在生成代碼時(shí),都會(huì)生成一個(gè)名為“ 模型名_DW ”的變量來(lái)保存狀態(tài)變量。
具體而已,在本文PI控制器示例工程中,包含一個(gè)離散積分模塊,該模塊具有狀態(tài)變量,生成的代碼如下:
/* 數(shù)據(jù)類型定義 位于"模型名.h"中*/
/* Block states (default storage) for system '< Root >' */
typedef struct {
real_T DiscreteTimeIntegrator_DSTATE;/* '< Root >/Discrete-Time Integrator' */
} DW_autoMBD_example_PI_noSubs_T;
/* 狀態(tài)變量定義 位于"模型名.c"中 */
/* Block states (default storage) */
DW_autoMBD_example_PI_noSubs_T autoMBD_example_PI_noSubs_DW;
用戶還可以定義自己的“狀態(tài)變量”,通過(guò)Data Store Memory模塊即可實(shí)現(xiàn)。 Data Store Memory模塊位于Simulink庫(kù)中的下圖這個(gè)位置:
Data Store Memory - From autoMBD
Data Store Memory模塊與離散模塊一樣,被當(dāng)作狀態(tài)變量,生成在變量“ 模型名 _DW”當(dāng)中。
雖然我們稱它為狀態(tài)變量,但對(duì)于Data Store Memory模塊,把它當(dāng)作普通的變量來(lái)使用也是可以的。
更多關(guān)于狀態(tài)變量的代碼生成,將在后續(xù)的文章中介紹。
2.2.4 模型數(shù)據(jù)
模型數(shù)據(jù)是Simulink為模型定義的一個(gè)數(shù)據(jù)類型,它保存了模型的部分信息。在代碼生成中,它的數(shù)據(jù)類型和定義如下圖所示:
/* 模型數(shù)據(jù)結(jié)構(gòu)體定義 位于"模型名.h"中 */
/* Real-time Model Data Structure */
struct tag_RTM_autoMBD_example_PI_no_T {
const char_T * volatile errorStatus;
};
/* 模型數(shù)據(jù)類型聲明 位于"模型名.h"中 */
/* Forward declaration for rtModel */
typedef struct tag_RTM_autoMBD_example_PI_no_T RT_MODEL_autoMBD_example_PI_n_T;
/* 模型數(shù)據(jù)變量外部聲明 位于"模型名.h"中 */
/* Real-time Model object */
extern RT_MODEL_autoMBD_example_PI_n_T *const autoMBD_example_PI_noSubs_M;
/* 模型數(shù)據(jù)變量定義 位于"模型名.c"中 */
/* Real-time model */
static RT_MODEL_autoMBD_example_PI_n_T autoMBD_example_PI_noSubs_M_;
RT_MODEL_autoMBD_example_PI_n_T *const autoMBD_example_PI_noSubs_M = &autoMBD_example_PI_noSubs_M_;
可以看到,默認(rèn)情況下,模型數(shù)據(jù)只包含了一個(gè)表示錯(cuò)誤狀態(tài)的字符串,他的變量名為“ 模型名_M ”。在實(shí)際中,很少會(huì)使用Simulink默認(rèn)的模型數(shù)據(jù)定義。
更多關(guān)于模型數(shù)據(jù)的代碼生成,將在后續(xù)的文章中介紹。
3 規(guī)范建模過(guò)程
從上文可以看到,模型的數(shù)據(jù)形式直接關(guān)系到代碼的生成,所以模型的好壞直接影響代碼的可讀性。
為了生成好的代碼,規(guī)范建模過(guò)程是非常重要的。MathWorks官方發(fā)布了建模指南《MathWorks? Advisory Board Control Algorithm Modeling Guidelines》(可以在autoMBD資源庫(kù)“臨時(shí)資源分享”文件夾中找到該指南的PDF文檔,資源序號(hào) tA23 ,資源庫(kù)鏈接可以在文章合集中找到,文章合集的獲取見(jiàn)文章開(kāi)頭)。
該建模指南在模型的命名、模塊基本配置、模型的框架層級(jí)涉及、模型的復(fù)用等等多個(gè)方面,指導(dǎo)用戶建模。但該文檔內(nèi)容太多,五百多頁(yè),不是職業(yè)工作要求,一般人也很難看完并堅(jiān)持執(zhí)行。
但我依然建議讀者保持一個(gè)良好的建模習(xí)慣,我認(rèn)為可以從以下幾個(gè)方面來(lái)做:
- 為端口、信號(hào)線、子系統(tǒng)、模塊等命有意義的名字,而不是空著,或命名無(wú)意義;
- 建模時(shí),遵循信號(hào)從上到下、從左到右的傳遞順序,而不是雜亂無(wú)章的到處飛線,盡量避免信號(hào)逆向傳遞,無(wú)法避免時(shí)盡量少而清晰。
- 合理使用子系統(tǒng)模塊、參考子系統(tǒng)模塊、參考模型,構(gòu)建合理的模型框架和層級(jí);
- 一個(gè)功能的模型不要太復(fù)雜,復(fù)雜的模型可以考慮分層簡(jiǎn)化,子系統(tǒng)模型不要嵌套太多層;
- 建模的過(guò)程,要考慮模型的可重用性、模型的獨(dú)立性;
- 可以使用腳本來(lái)定義模型數(shù)據(jù),這樣可以擴(kuò)展模型的功能。
以上是我的一些建模經(jīng)驗(yàn),規(guī)范建模不是一朝一夕的事情,是平時(shí)的積累和習(xí)慣養(yǎng)成。雖然這會(huì)花一些精力,但好處是明顯的。為了更好的生成可讀性高的代碼,特別是模型復(fù)雜到一定程度時(shí),我提倡保持一個(gè)好的建模習(xí)慣。
-
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3667瀏覽量
130905 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
493瀏覽量
28070 -
MBD
+關(guān)注
關(guān)注
0文章
26瀏覽量
9148 -
PI控制器
+關(guān)注
關(guān)注
1文章
25瀏覽量
11617 -
simulink仿真
+關(guān)注
關(guān)注
0文章
75瀏覽量
8728
發(fā)布評(píng)論請(qǐng)先 登錄
基于模型的設(shè)計(jì)(MBD)的深入討論
基于模型設(shè)計(jì)的HDL代碼自動(dòng)生成技術(shù)綜述
利用Matlab的simulink搭建模型生成C代碼
利用Matlab的simulink搭建模型生成C代碼
Simulink模型生成代碼
通過(guò)一個(gè)簡(jiǎn)單的Simulink模型生成代碼
怎樣利用Matlab的simulink搭建模型生成C代碼呢
Simulink 自動(dòng)代碼生成原理分享
快速原型中SIMULINK模型的代碼自動(dòng)生成
MathWorks推出新款代碼生成工具Simulink
配置Simulink模型,調(diào)皮屬于你自己的代碼

關(guān)于模型設(shè)計(jì)的永磁同步電機(jī)控制編譯和代碼生成

基于模型設(shè)計(jì)的永磁同步電機(jī)控制編譯和代碼生成

simulink自動(dòng)生成ROS代碼

評(píng)論