Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

データ ディクショナリの列挙値

Simulink® データ ディクショナリは、列挙型を含む MATLAB® 変数、データ オブジェクト、データ型などのモデル データを永続的に保存します。MATLAB でデータ ディクショナリによって定義された列挙型クラスはそのディクショナリによって所有され、Simulink.clearIntEnumType を使用してクリアすることはできません。データ ディクショナリを閉じると、そのディクショナリが所有する列挙型クラスがクリアされます。ディクショナリを閉じるときに列挙型クラスのインスタンスが存在する場合、その列挙型クラスはクリアされず、ユーザーがそのクラスのオーナーになります。クラスのオーナーとして、Simulink.findIntEnumTypeSimulink.clearIntEnumType を使用してクラスを検索またはクリアできます。データ ディクショナリの基本的な情報は、データ ディクショナリとはを参照してください。

データ ディクショナリへの列挙型の移行

この例では、モデルで使用されている列挙型をデータ ディクショナリに移行する方法を示します。

設計データのインポート

  1. 設計データまたはブロックに列挙型を使用しているモデルを開きます。

  2. Simulink エディターの [モデル化] タブにある [設計] の下で、[データ ディクショナリへのリンク] をクリックします。

  3. [モデル プロパティ] ダイアログ ボックスで、[新規作成] をクリックしてデータ ディクショナリを作成します。

  4. データ ディクショナリに名前を付けて保存し、[適用] をクリックします。

  5. [データの移行] をクリックします。

  6. 参照された変数のコピーについてのメッセージに対して、[移行] をクリックします。

  7. Simulink でデータ ディクショナリにインポートされなかった列挙型が報告されます。

  8. [OK] をクリックします。

    モデルがデータ ディクショナリにリンクされたことを報告する通知が Simulink エディターに表示されます。

列挙型のインポート

列挙型の定義をインポートするのは、その型を使用して作成しているすべての設計データをインポートした後のみです。列挙型をデータ ディクショナリにインポートすると、Simulink が MATLAB ファイルまたは型定義を含む P ファイルを無効にするため、MATLAB ベース ワークスペースに残っている変数の定義が失われます。

  1. 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'
  2. データ ディクショナリを開いて、それを Simulink.data.Dictionary オブジェクトで表します。

    ddConnection = Simulink.data.dictionary.open('myEnumsDD.sldd')
    ddConnection = 
    
      Dictionary with properties:
    
              DataSources: {0x1 cell}
        HasUnsavedChanges: 0
               NumberOfEntries: 3
    

  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 つの列挙型のインスタンスがモデル ワークスペースで定義され、モデルを閉じた後にインポートできます。モデルを閉じてそれらの列挙型をインポートします。

  4. ディクショナリを開いて移行された列挙型を表示します。

データ ディクショナリの列挙値の操作

以下の例では、データ ディクショナリの既存の列挙値を操作する方法を示します。

列挙型定義の名前の変更

  1. データ ディクショナリで、列挙型のコピーを作成し、そのコピーの名前を変更します。

  2. 古い名前の型から派生したモデルが使用する列挙オブジェクトを見つけます。

  3. これらのオブジェクトを、名前を変更した型から派生したオブジェクトに置き換えます。

  4. 古い名前の型を削除します。

列挙メンバーの名前の変更

以下のいずれかの方法を使用します。

  • ディクショナリ内の列挙値を選択し、1 つ以上の列挙メンバーの名前を変更します。

  • モデルが列挙メンバーを参照する場合、名前を変更したメンバーと一致するようにこれらの参照を変更します。

列挙メンバーの名前の削除

  1. 削除する列挙メンバーに対する、モデルの参照を見つけます。

  2. これらの参照を別のメンバーに置き換えます。

  3. 列挙値から元のメンバーを削除します。

列挙メンバーの元となる値の変更

列挙メンバーの値を MATLAB 変数として表す場合、または Simulink.Parameter オブジェクトの Value フィールドを使用して、列挙メンバーの値を変更できます。

  1. 値を変更する列挙メンバーに対する、モデルの参照を見つけます。

  2. これらの参照をメモしておきます。

  3. 列挙メンバーの値を変更します。

  4. モデルの列挙メンバーへの参照を手動で更新します。

データ ディクショナリからの列挙型の削除

ディクショナリでの列挙型の定義が不要になった場合、次の手順に従います。

  1. MATLAB で列挙データ型を手動で定義します。Simulink モデルでの列挙型データの使用を参照してください。

  2. 列挙クラスのインスタンスを削除します。列挙データ型をディクショナリから削除するときに列挙クラスのインスタンスが存在している場合、ディクショナリは列挙クラスの制御を解放しますが、クラスは動的列挙クラスとしてメモリに残ったままになります。Simulink.findIntEnumTypeSimulink.clearIntEnumType を使用してクラスを検索またはクリアできます。

  3. 列挙型をディクショナリから削除します。

参考

関連するトピック