Main Content

データ クラスの定義

この例では、Simulink® データ クラスをサブクラス化する方法を示します。

MATLAB® クラス構文を使用して、パッケージにデータ クラスを作成します。必要に応じて、データ クラスにプロパティを割り当て、ストレージ クラスを定義します。

例を使用したデータ クラスの定義

  1. 作業フォルダーで、フォルダー dataclasses にある +SimulinkDemos データ クラス パッケージを表示します。

  2. データ クラスを定義する場所にフォルダーをコピーします。

  3. フォルダー +mypkg の名前を変更して、その親フォルダーを MATLAB パスに追加します。

  4. データ クラス定義を変更します。

手動によるデータ クラスの定義

  1. パッケージ フォルダー +mypkg を作成して、その親フォルダーを MATLAB パスに追加します。

  2. +mypkg の内部にクラス フォルダー @Parameter および @Signal を作成します。

    メモ

    Simulink では、データ クラスは +Package/@Class フォルダー内に定義する必要があります。

  3. @Parameter フォルダー内に MATLAB ファイル Parameter.m を作成して編集のために開きます。

  4. MATLAB クラス構文を使用して Simulink.Parameter のサブクラスであるデータ クラスを定義します。

    classdef Parameter < Simulink.Parameter
       
    end % classdef
    

Parameter または Signal 以外のカスタム クラス名を使用するには、カスタム名を使用してクラス フォルダーに名前をつけます。たとえば、クラス mypkg.myParameter を定義するには次を行います。

  • Simulink.Parameter または Simulink.Signal のサブクラスとしてデータ クラスを定義します。

    classdef myParameter < Simulink.Parameter
       
    end % classdef
    

  • クラス定義で、コンストラクター メソッドに myParameter または mySignal という名前をつけます。

  • クラス定義を含むクラス フォルダーに @myParameter または @mySignal という名前をつけます。

オプション: プロパティをデータ クラスに追加する

propertiesend のキーワードは、プロパティ定義ブロックを囲んでいます。

classdef Parameter < Simulink.Parameter
	properties % Unconstrained property type
		Prop1 = [];
	end

	properties(PropertyType = 'logical scalar')
		Prop2 = false;
	end

	properties(PropertyType = 'char')
		Prop3 = '';
	end

	properties(PropertyType = 'char',...
      AllowedValues = {'red'; 'green'; 'blue'})
		Prop4 = 'red';
	end
end % classdef

Simulink.ParameterSimulink.Signal または Simulink.CustomStorageClassAttributes のサブクラスにプロパティを追加する場合、以下のプロパティ タイプを指定できます。

プロパティ タイプ構文
double 型properties(PropertyType = 'double scalar')
int32 型properties(PropertyType = 'int32 scalar')
論理型properties(PropertyType = 'logical scalar')
文字ベクトル (char)properties(PropertyType = 'char')
取りうる値を一部に制限された文字ベクトルproperties(PropertyType = 'char', AllowedValues = {'a', 'b', 'c'})

特別なコピー動作が必要なプロパティを追加する場合は、copyElement メソッドをオーバーライドしてその動作を定義します。たとえば、+SimulinkDemos データ クラス パッケージ内のクラス定義ファイル Parameter.m では、プロパティ タイプが制約されないプロパティ GenericProperty が定義されています。copyElement メソッドは、GenericProperty のコピー動作を指定します。特別なコピー動作が必要なプロパティを追加、削除、または変更する場合は、copyElement メソッドの更新も確実に行う必要があります。

PropertyType ではなく MATLAB プロパティの検証 (プロパティ値の検証を参照) を使用する場合、プロパティはクラスのダイアログ ボックスの編集フィールドとして表示されます。PropertyType および AllowedValues を使用する場合は、プロパティ ダイアログ ボックスには次が表示されます。

  • logical スカラー プロパティ向けのチェック ボックス。

  • 文字ベクトルおよび AllowedValues 向けのドロップダウン メニュー。

オプション: データ クラスに初期化コードを追加する

データ クラス内にコンストラクターを追加すると、クラスがインスタンス化されるときに初期化処理を実行できます。追加されたコンストラクターは、入力引数を必須とすることはできません。

この例では、コンストラクターはオプションの入力引数に基づいてオブジェクトの値 obj を初期化します。

classdef Parameter < Simulink.Parameter
	methods
		function obj = Parameter(optionalValue)
			if (nargin == 1)
				obj.Value = optionalValue;
			end
		end
	end % methods
end % classdef

オプション: ストレージ クラスの定義

setupCoderInfo メソッドを使用して、クラスの CoderInfo オブジェクトを設定します。次に、useLocalCustomStorageClasses メソッドへの呼び出しを作成して、カスタム ストレージ クラス デザイナーを開きます。

  1. データ クラス内のコンストラクターで useLocalCustomStorageClasses メソッドを呼び出します。

    classdef Parameter < Simulink.Parameter
    	methods
    		function setupCoderInfo(obj)
    			useLocalCustomStorageClasses(obj, 'mypkg');
    			
    			obj.CoderInfo.StorageClass = 'Custom';
    		end
    	end % methods
    end % classdef
    
  2. パッケージに対するカスタム ストレージ クラス デザイナーを開きます。

    cscdesigner('mypkg')
  3. ストレージ クラスを定義します。

オプション: ストレージ クラスのカスタム属性の定義

  1. MATLAB ファイル myCustomAttribs.m を作成して編集用に開きます。このファイルを +mypkg/@myCustomAttribs フォルダーに保存します。ここで、+mypkg@Parameter フォルダーと @Signal フォルダーを含むフォルダーです。

  2. MATLAB クラス構文を使用して Simulink.CustomStorageClassAttributes のサブクラスを定義します。たとえば、元の識別子を使用してデータを定義しながら、生成コード内でデータの代わりの名前を与えるストレージ クラスを考えてみます。

    classdef myCustomAttribs < Simulink.CustomStorageClassAttributes
    	properties(PropertyType = 'char')
    		AlternateName = '';
    	end
    end % classdef
    

  3. isAddressable メソッドの既定の実装をオーバーライドして、ストレージ クラスを書き込み可能にするかどうかを決定します。

    classdef myCustomAttribs < Simulink.CustomStorageClassAttributes
    		properties(PropertyType = 'logical scalar')
    			IsAlternateNameInstanceSpecific = true;
    		end
    		
    		methods
    			function retVal = isAddressable(hObj, hCSCDefn, hData)
    				retVal = false;
    			end
    		end % methods
    end % classdef
    
  4. getInstanceSpecificProps メソッドの既定の実装をオーバーライドします。

    例については、以下のオーバーライド関数を参照してください。

    function props = getInstanceSpecificProps(hObj)
        % GETINSTANCESPECIFICPROPERTIES  Return instance-specific properties
        %   (custom attributes that can be modified on each data object).
            
          if hObj.IsStructNameInstanceSpecific
            props = findprop(hObj, 'StructName');
          else
            props = [];
          end
        end
    function props = getInstanceSpecificProps(hObj)
        % GETINSTANCESPECIFICPROPERTIES  Return instance-specific properties
        %   (custom attributes that can be modified on each data object).
          props = [];
          
          if hObj.IsOwnerInstanceSpecific
              ptmp = findprop(hObj, 'Owner');
              props = [props; ptmp];
          end
          
          if hObj.IsDefinitionFileInstanceSpecific
              ptmp = findprop(hObj, 'DefinitionFile');
              props = [props; ptmp];
          end
          
          if hObj.IsPersistenceLevelInstanceSpecific
              ptmp = findprop(hObj, 'PersistenceLevel');
              props = [props; ptmp];
          end
        end

    メモ

    これはオプションの手順です。既定の設定では、すべてのカスタム属性がインスタンス固有で、データ オブジェクトごとに変更できます。ただし、どのプロパティをインスタンス固有になるように許可するかは制限できます。

  5. getIdentifiersForInstance メソッドの既定の実装をオーバーライドして、データ クラスのオブジェクトの識別子を定義します。

    メモ

    既定の実装では、このメソッドはデータ オブジェクトの名前または識別子をクエリし、生成コードでその識別子を使用します。このメソッドをオーバーライドすることで、生成コード内のデータ オブジェクトの識別子を制御できます。

    classdef myCustomAttribs < Simulink.CustomStorageClassAttributes
    	properties(PropertyType = 'char')
    		GetFunction = '';
    		SetFunction = '';
    	end
     
    	methods
    		function retVal = getIdentifiersForInstance(hCSCAttrib,...
     hCSCDefn, hData, identifier)
    			retVal = struct('GetFunction',...
     hData.CoderInfo.CustomAttributes.GetFunction, ...
    			'SetFunction', hData.CoderInfo.CustomAttributes.SetFunction);
    		end%
    	end % methods
    end % classdef
  6. グループ化されたストレージ クラスを使用する場合は、getIdentifiersForGroup メソッドの既定の実装をオーバーライドして、生成コード内のグループの識別子を指定します。

    例については、作業フォルダー内のフォルダー @CSCTypeAttributes_FlatStructure にある CSCTypeAttributes_FlatStructure.m を参照してください。

関連するトピック