1. 程式人生 > >Matlab/Simulink 中列舉類資料的定義

Matlab/Simulink 中列舉類資料的定義




在汽車控制軟體開發過程中,使用 Simulink建模時,經常會用到列舉型資料。因為列舉型資料在表示資料時有著更清晰的物理含義,模型及生成的程式碼的可讀性更強。
  1. Simulink中列舉型資料的定義

    simulink中,列舉型資料的定義有兩種方法:

  • M檔案中用 classdef模組進行定義;

  • 使用函式Simulink.defineIntEnumType定義。

    1. 1在M檔案中用classdef模組進行定義

      1.1.1 首先定義一個Simulnk.IntEnumType的之類,然後定義每個列舉值對應的數值。

      例子如下:

      例一:定義一個發動機狀態的列舉類。

classdefEng_State<Simulink.IntEnumType

enumeration

Stop(0)

Crank(1)

Run(2)

end

end

simulink環境下使用列舉型資料時,要注意一下:

  • 列舉型別資料的名稱必須是唯一的,區分大小寫,不能再workspace訊號名稱和資料型別名稱有重複。

  • 列舉值對應的數值必須是連續單調遞增的,但是在定義的時候,對排序不做要求。

1.1.2 Simulink列舉型別的定製化

針對在模擬和程式碼生成時的特殊需求,可以在類的定義中用靜態的方法對Simulink列舉型別資料的屬性進行定製化。

靜態的方法如下:

靜態方法

目的

預設操作

定製返回值

使用場景

getDefaultValue

給列舉類指定預設值

列舉型別中的第一個定義

列舉類中列舉元素的名稱(字串的形式)

模擬和程式碼生成

getDescription

新增對列舉類的描述

‘’

描述的內容(字串的形式)

程式碼生成

getHeaderFile

指定具體的標頭檔案。一般和getDataScope一起使用

‘’

定義了列舉型別資料的標頭檔案

程式碼生成

getDataScope

定義列舉型別資料是輸出到外部還是引用外部的定義。

getHeaderFile方法指定了程式碼生成輸出到的標頭檔案或從外部引用的標頭檔案

Auto

以下三個字串之一:

Auto’,‘Exported’,

Imported

程式碼生成

addClassNameToEnumNames

在程式碼生成時,以類的名稱作為字首

false

trueorfalse

程式碼生成

針對於例一的定義,Eng_State的預設值為Eng_State.Stop(預設為定義的第一個元素)。可以利用getDefaultValue方法指定預設值。Simulink.defineIntEnumType

例二:

classdef Eng_State<Simulink.IntEnumType

enumeration

Stop(0)

Crank(1)

Run(2)

end

methods (Static = true)

functionretVal = getDefaultValue()

retVal= Eng_State.Run;

end

functionretVal = getDescription ()

retVal= This is the state of the engine;

end

functionretVal = getHeadFile ()

retVal= Eng_state.h;

end

functionretVal = getDataScope ()

retVal= Exported; % if itis Exported, it will generate the code and to be used by other component.

if it is Imported, it will generate the code and use the data defined byother component.

end

functionretVal = addClassNametoEnumNames ()

retVal= true;

end

end

end

1.1.3將檔案儲存為M型別的檔案

將定義好的類儲存為matlab檔案:

  • 檔案的名稱必須和類的名字一樣。例如:上邊的例子儲存為Eng_State.m檔案

  • 儲存的檔案必須在matlab的新增的路徑下, 這樣使用時Matlab能自動找到這個定義。而且,使用時不用執行,直接放在matlab儲存的路徑下就可以了。

  • 每個enum資料型別的定義必須要是單獨的檔案,不能再一個檔案裡面定義多個enum資料型別

    1. 2使用函式Simulink.defineIntEnumType定義

      Simulink.defineIntEnumType函式也可以實現列舉類的定義

      函式的用法如下:

Simulink.defineIntEnumType(ClassName,CellOfEnums,IntValues,Property1,Value1,…,PropertyN,ValueN)

ClassName

列舉資料型別的名稱

CellOfEnum

列舉資料內包含的字串元素

IntValues

與字串元素對應的數值

Description,’ClassDesc’

描述屬性,具體描述的內容

DefaultValue,DefValue

預設值屬性,具體的預設值

HeaderFile,FileName

標頭檔案屬性,標頭檔案名稱

‘DataScope’, ‘Auto’|’Exported’|’Imported’

資料範圍屬性,指定在生成程式碼時,資料是被匯入或匯出到指定的標頭檔案中。

Value

Action

Auto(預設)

如果沒有指定標頭檔案的名稱,那麼列舉類定義會被匯出到名稱為模型名_types.h的檔案中

Exported

將列舉類的定義匯出到標頭檔案中,當沒有指定具體的標頭檔案名稱時,預設定義到 類名_h的檔案中。

Imported

將資料從具體的標頭檔案中匯入。如果沒有指定標頭檔案,將從 類名.h的檔案中匯入

例三如下:實現的功能和例2相同。

Simulink.defineIntEnumType('Eng_State', ...

{'Stop', 'Crank', 'Run'}, [0;1;2],...

'Description', ' This is the state of theengine ', ...

'DefaultValue', 'Run', ...

'HeaderFile', ' Eng_state.h ', ...

'DataScope',' Exported ', ...

'AddClassNameToEnumNames', true);