データ ディクショナリの列挙値
Simulink® データ ディクショナリは、列挙型を含む MATLAB® 変数、データ オブジェクト、データ型などのモデル データを永続的に保存します。MATLAB でデータ ディクショナリによって定義された列挙型クラスはそのディクショナリによって所有され、Simulink.clearIntEnumType
を使用してクリアすることはできません。データ ディクショナリで定義されている列挙クラスを使用するには、そのデータ ディクショナリが開いている必要があります。データ ディクショナリを閉じると、そのディクショナリが所有する列挙型クラスがクリアされます。ディクショナリを閉じるときに列挙クラスのインスタンスが存在する場合、その列挙クラスはクリアされず、MATLAB がそのクラスのオーナーになります。クラスの定義は、Simulink.clearIntEnumType
を使用してクリアするまでメモリに残ったままになります。メモリ内に残っている列挙クラスを見つけるには、Simulink.findIntEnumType
を呼び出します。データ ディクショナリの基本的な情報は、データ ディクショナリとはを参照してください。
データ ディクショナリへの列挙型の移行
この例では、モデルで使用されている列挙型をデータ ディクショナリに移行する方法を示します。
設計データのインポート
設計データまたはブロックに列挙型を使用しているモデルを開きます。
Simulink エディターの [モデル化] タブにある [設計] セクションの [リポジトリ] の下で、[データ ディクショナリへのリンク] をクリックします。
[モデル プロパティ] ダイアログ ボックスで、[新規作成] をクリックしてデータ ディクショナリを作成します。
データ ディクショナリに名前を付けて保存し、[適用] をクリックします。
[データの移行] をクリックします。
参照された変数のコピーについてのメッセージに対して、[移行] をクリックします。
Simulink でデータ ディクショナリにインポートされなかった列挙型が報告されます。
[OK] をクリックします。
モデルがデータ ディクショナリにリンクされたことを報告する通知が Simulink エディターに表示されます。
列挙型のインポート
列挙型の定義をインポートするのは、その型を使用して作成しているすべての設計データをインポートした後のみです。列挙型をデータ ディクショナリにインポートすると、Simulink が MATLAB ファイルまたは型定義を含む P ファイルを無効にするため、MATLAB ベース ワークスペースに残っている変数の定義が失われます。
MATLAB コマンド プロンプトで、モデル ブロック内で使用される列挙型の名前を取得します。
% Find all variables and enumerated types used in model blocks usedTypesVars = Simulink.findVars('EnumsReporting','IncludeEnumTypes',true); % Here, EnumsReporting is the name of the model and % usedTypesVars is an array of Simulink.VariableUsage objects % Find indices of enumerated types that are defined by MATLAB files or P-files enumTypesFile = strcmp({usedTypesVars.SourceType},'MATLAB file'); % Find indices of enumerated types that are defined using the function % Simulink.defineIntEnumType enumTypesDynamic = strcmp({usedTypesVars.SourceType},'dynamic class'); % In one array, represent indices of both kinds of enumerated types enumTypesIndex = enumTypesFile | enumTypesDynamic; % Use logical indexing to return the names of used enumerated types enumTypeNames = {usedTypesVars(enumTypesIndex).Name}'
enumTypeNames = 'dEnum1' 'dEnum10' 'dEnum2' 'dEnum3' 'dEnum4' 'dEnum5' 'dEnum6' 'dEnum9'
データ ディクショナリを開いて、それを
Simulink.data.Dictionary
オブジェクトで表します。ddConnection = Simulink.data.dictionary.open('myEnumsDD.sldd')
ddConnection = Dictionary with properties: DataSources: {0x1 cell} HasUnsavedChanges: 0 NumberOfEntries: 3
importEnumTypes
メソッドを使用して、モデルのブロックで使用されている列挙型をインポートします。このメソッドによってターゲット ディクショナリに対する変更が保存されるため、メソッドを使用する前に、保存されていない変更が許容可能なものであるか確認してください。[successfulMigrations, unsuccessfulMigrations] = ... importEnumTypes(ddConnection,enumTypeNames)
successfulMigrations = 1x6 struct array with fields: className renamedFiles unsuccessfulMigrations = 1x2 struct array with fields: className reasons
importEnumTypes
で列挙型をインポートすると、列挙型クラス定義ファイルの名前が変更されて.save
が追加されます。たとえば元の列挙型クラス定義ファイルの名前がEnum1.m
であれば、Simulink ではEnum1.m.save
という名前になります。移行されなかった列挙型は構造体
unsuccessfulMigrations
で報告されます。この例では 2 つの列挙型のインスタンスがモデル ワークスペースで定義され、モデルを閉じた後にインポートできます。モデルを閉じてそれらの列挙型をインポートします。ディクショナリを開いて移行された列挙型を表示します。
データ ディクショナリの列挙値の操作
以下の例では、データ ディクショナリの既存の列挙値を操作する方法を示します。
列挙型定義の名前の変更
データ ディクショナリで、列挙型のコピーを作成し、そのコピーの名前を変更します。
古い名前の型から派生したモデルが使用する列挙オブジェクトを見つけます。
これらのオブジェクトを、名前を変更した型から派生したオブジェクトに置き換えます。
古い名前の型を削除します。
プログラムによる列挙メンバーの表示
列挙型の有効な値をリストするには、次のようなコードを使用します。この例では、データ ディクショナリ enumDD.sldd
に格納されている列挙型の myColors
の値がリストされます。
dd = Simulink.data.dictionary.open('enumDD.sldd'); sec = getSection(dd, 'Design Data'); ent = getEntry(sec,'myColors'); e = getValue(ent); e.Enumerals.Name Simulink.data.dictionary.closeAll();
列挙メンバーの名前の変更
以下のいずれかの方法を使用します。
ディクショナリ内の列挙値を選択し、1 つ以上の列挙メンバーの名前を変更します。
モデルが列挙メンバーを参照する場合、名前を変更したメンバーと一致するようにこれらの参照を変更します。
列挙メンバーの名前の削除
削除する列挙メンバーに対する、モデルの参照を見つけます。
これらの参照を別のメンバーに置き換えます。
列挙値から元のメンバーを削除します。
列挙メンバーの元となる値の変更
列挙メンバーの値を MATLAB 変数として表す場合、または Simulink.Parameter
オブジェクトの Value
フィールドを使用して、列挙メンバーの値を変更できます。
値を変更する列挙メンバーに対する、モデルの参照を見つけます。
これらの参照をメモしておきます。
列挙メンバーの値を変更します。
モデルの列挙メンバーへの参照を手動で更新します。
データ ディクショナリからの列挙型の削除
ディクショナリでの列挙型の定義が不要になった場合、次の手順に従います。
MATLAB で列挙データ型を手動で定義します。Simulink モデルでの列挙型データの使用を参照してください。
列挙クラスのインスタンスを削除します。列挙データ型をディクショナリから削除するときに列挙クラスのインスタンスが存在している場合、ディクショナリは列挙クラスの制御を解放しますが、クラスは動的列挙クラスとしてメモリに残ったままになります。
Simulink.findIntEnumType
とSimulink.clearIntEnumType
を使用してクラスを検索またはクリアできます。列挙型をディクショナリから削除します。
参考
Simulink.data.dictionary.EnumTypeDefinition