ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

System object を使用した Simulink でのシステム設計

Simulink でのシステム設計とシミュレーション

モデルで System object を使用して Simulink® でシミュレーションを実行することができます。

  1. モデルで使用する System object™ を作成します。詳細は、Simulink で使用する新しい System object の定義を参照してください。

  2. MATLAB® で新しい System object をテストします。MATLAB での新しい System object のテストを参照してください。

  3. MATLAB System ブロックを使用して、System object をモデルに追加します。詳細は、Simulink モデルへの System object の追加を参照してください。

  4. 他の Simulink ブロックを必要に応じて追加し、ブロックを接続してシステムを構築します。

  5. システムを実行します。

Simulink で使用する新しい System object の定義

System object は、MATLAB でシステムを作成する際に使用できるコンポーネントです。MATLAB でコードを作成し、そのコードを使用して Simulink でブロックを作成します。独自の System object を定義するには、クラス定義ファイルを作成します。クラス定義ファイルは、オブジェクトを定義するコードを含むテキストベースの MATLAB ファイルです。MATLAB System ブロックを使用した System object の統合を参照してください。

ブロックのカスタマイズによる System object の定義

Simulink で使用する System object を作成します。この例では、最小平均二乗 (LMS) 適応フィルターを使用してシステム同定を実行します。

テキスト形式のクラス定義ファイルを作成して System object を定義します。この例のコードでは、最小平均二乗 (LMS) フィルターを作成し、ブロックのアイコンとダイアログ ボックスの外観をカスタマイズします。この例は、「System Identification Using MATLAB System Blocks」の Simulink の例に似ています。

メモ

クラス定義ファイルを手作業で作成する代わりに、[新規作成][System object][Simulink 拡張] メニュー オプションを使用してテンプレートを開くことができます。このテンプレートには、Simulink MATLAB System ブロックで使用する System object のカスタマイズが含まれています。テンプレート ファイルをガイドラインとして使用して編集し、独自の System object を作成できます。

クラス定義ファイルの最初の行で、System object の名前を指定し、matlab.System および matlab.system.mixin.CustomIcon の両方からのサブクラス化を行います。matlab.System 基底クラスにより、すべての基本の System object メソッドを使用して、ブロックの入出力名、タイトルおよびプロパティ グループを指定することができます。CustomIcon mixin クラスでは、ブロック アイコンを指定できるメソッドが有効になります。

セットアップ、リセット、入出力の数の設定、アルゴリズムの実行を行う適切な基本の System object メソッドを追加します。これらの各メソッドの実装については、各メソッドのリファレンス ページと以下の完全なクラス定義ファイルを参照してください。

  • 1 回限りの計算を実行し、変数を初期化するには、setupImpl メソッドを使用します。

  • ブロックのアルゴリズムを実装するには、stepImpl メソッドを使用します。

  • 状態プロパティまたは DiscreteState プロパティをリセットするには、resetImpl メソッドを使用します。

  • 入力と出力の数を指定するには、それぞれ getNumInputsImpl メソッドと getNumOutputsImpl メソッドを使用します。

Simulink で MATLAB System ブロックの外観を定義するには、適切な CustomIcon メソッドを追加します。これらの各メソッドの実装については、各メソッドのリファレンス ページと以下の完全なクラス定義ファイルを参照してください。

  • ブロック ダイアログ ボックスに表示するタイトルと説明を指定するには、getHeaderImpl メソッドを使用します。

  • ブロック ダイアログ ボックスに表示するプロパティのグループを指定するには、getPropertyGroupsImpl メソッドを使用します。

  • ブロック アイコンに表示するテキストを指定するには、getIconImpl メソッドを使用します。

  • ブロック入力端子および出力端子に表示するラベルを指定するには、getInputNamesImpl メソッドと getOutputNamesImpl メソッドを使用します。

最小平均二乗の完全なクラス定義ファイルは次のとおりです。

classdef lmsSysObj < matlab.System &...
      matlab.system.mixin.CustomIcon
   % lmsSysObj Least mean squares (LMS) adaptive filtering. 
   % #codegen

   properties
      % Mu Step size
      Mu = 0.005;
   end

   properties (Nontunable)
      % Weights  Filter weights
      Weights = 0;
      % N  Number of filter weights
      N = 32;
   end
  
   properties (DiscreteState) 
      X;
      H;
   end
  
   methods (Access = protected)
      function setupImpl(obj)
         obj.X = zeros(obj.N,1);
         obj.H = zeros(obj.N,1);
      end
      
      function [y, e_norm] = stepImpl(obj,d,u)
         tmp = obj.X(1:obj.N-1);
         obj.X(2:obj.N,1) = tmp;
         obj.X(1,1) = u;
         y = obj.X'*obj.H;
         e = d-y;
         obj.H = obj.H + obj.Mu*e*obj.X;
         e_norm = norm(obj.Weights'-obj.H);
      end
    
      function resetImpl(obj)
         obj.X = zeros(obj.N,1);
         obj.H = zeros(obj.N,1);
      end
      
   end   

   % Block icon and dialog customizations
   methods (Static, Access = protected)
      function header = getHeaderImpl
         header = matlab.system.display.Header(...
              'lmsSysObj', ...
              'Title', 'LMS Adaptive Filter');
      end
      
      function groups = getPropertyGroupsImpl
         upperGroup = matlab.system.display.SectionGroup(...
              'Title','General',...
              'PropertyList',{'Mu'});
            
         lowerGroup = matlab.system.display.SectionGroup(...
              'Title','Coefficients', ...
              'PropertyList',{'Weights','N'});
            
         groups = [upperGroup,lowerGroup];
      end
   end
   
   methods (Access = protected)
      function icon = getIconImpl(~)
         icon = sprintf('LMS Adaptive\nFilter');
      end
      function [in1name, in2name] = getInputNamesImpl(~)
         in1name = 'Desired';
         in2name = 'Actual';
      end
      function [out1name, out2name] = getOutputNamesImpl(~)
         out1name = 'Output';
         out2name = 'EstError';
      end
   end
end

非直達による System object の定義

Simulink で使用する System object を作成します。この例では、最小平均二乗 (LMS) 適応フィルターを使用してシステム同定を実行し、フィードバック ループを使用します。

テキスト形式のクラス定義ファイルを作成して System object を定義します。この例のコードでは、整数の遅延を作成してフィードバック ループを含め、ブロック アイコンのカスタマイズを行います。フィードバック ループについては、フィードバック ループでの System object の使用を参照してください。この例では非直達に使用できる System object を実装します。この例は、「System Identification Using MATLAB System Blocks」の Simulink の例に似ています。

クラス定義ファイルの最初の行で、matlab.System および matlab.system.mixin.CustomIcon からのサブクラス化を行います。matlab.System 基底クラスにより、すべての基本の System object メソッドを使用して、ブロックの入出力名、タイトルおよびプロパティ グループを指定することができます。CustomIcon mixin クラスでは、ブロック アイコンを指定できるメソッドが有効になります。Nondirect mixin で、ブロックの更新方法と、ブロックで出力される内容を指定するメソッドが有効になります。

オブジェクトの設定とリセットおよびプロパティの検証を実行する適切な基本の System object メソッドを追加します。このオブジェクトは非直達をサポートするため、stepImpl メソッドを実装しません。代わりに、updateImpl メソッドと outputImpl メソッドを実装します。これらの各メソッドの実装については、各メソッドのリファレンス ページと以下の完全なクラス定義ファイルを参照してください。

  • オブジェクトのプロパティのいくつかを初期化するには、setupImpl メソッドを使用します。

  • プロパティの状態をリセットするには、resetImpl メソッドを使用します。

  • プロパティ値が有効であるかどうかを確認するには、validatePropertiesImpl メソッドを使用します。

ブロックでその状態とその出力を更新する方法を指定するには、Nondirect メソッドではなく、次の stepImpl mixin クラス メソッドを追加します。これらの各メソッドの実装については、リファレンス ページと以下の完全なクラス定義ファイルを参照してください。

  • ブロック出力を計算するコードを実装するには、outputImpl メソッドを使用します。

  • ブロックの内部状態を更新するコードを実装するには、updateImpl メソッドを使用します。

  • ブロックが直達ではないことを指定するには、isInputDirectFeedthroughImpl メソッドを使用します。その入力は、その出力に直接影響しません。

MATLAB System ブロックを介して Simulink で使用されるブロック アイコンを定義する getIconImpl メソッドを追加します。このメソッドの実装については、リファレンス ページと以下の完全なクラス定義ファイルを参照してください。

遅延の完全なクラス定義ファイルは以下のとおりです。

classdef intDelaySysObj < matlab.System &...
     matlab.system.mixin.Nondirect &...
     matlab.system.mixin.CustomIcon
   % intDelaySysObj Delay input by specified number of samples.
   % #codegen

   properties
      % InitialOutput Initial output
      InitialOutput = 0;
   end

   properties (Nontunable)
      % NumDelays Number of delays
      NumDelays = 1;
   end

   properties (DiscreteState)
      PreviousInput;
   end

   methods (Access = protected)
      function setupImpl(obj, ~)
         obj.PreviousInput = ones(1,obj.NumDelays)*obj.InitialOutput;
      end
      
      function [y] = outputImpl(obj, ~)
         % Output does not directly depend on input
         y = obj.PreviousInput(end);
      end

      function updateImpl(obj, u) 
         obj.PreviousInput = [u obj.PreviousInput(1:end-1)]; 
      end

      function flag = isInputDirectFeedthroughImpl(~,~)
         flag = false;
      end

      function validatePropertiesImpl(obj)
         if ((numel(obj.NumDelays)>1) || (obj.NumDelays <= 0))
            error('Number of delays must be positive non-zero ...
              scalar value.');
         end
         if (numel(obj.InitialOutput)>1)
            error('Initial output must be scalar value.');
         end
      end

      function resetImpl(obj)
         obj.PreviousInput = ones(1,obj.NumDelays)*obj.InitialOutput;
      end
      
      function icon = getIconImpl(~)
         icon = sprintf('Integer\nDelay');
      end
   end
end

MATLAB での新しい System object のテスト

  1. 新しい System object のインスタンスを作成します。たとえば、lmsSysObj のインスタンスを作成します。

    s = lmsSysObj;

  2. 異なる入力を使用してオブジェクトを複数回実行します。このステップを行うことで、Simulink に追加する前に構文エラーおよびその他の発生する可能性のある問題がないかテストされます。たとえば、以下のようにします。

    desired = 0;
    actual = 0.2;
    s(desired,actual);

Simulink モデルへの System object の追加

  1. System object のブロック ダイアログ ボックスへのマッピングの説明に従って、MATLAB System ブロックを使用して System object を Simulink モデルに追加します。

  2. Simulink のドキュメンテーションの説明に従って、他の Simulink ブロックを追加し、それらを接続して、モデルを完成させるために必要なパラメーターを構成します。「MATLAB System ブロックを使用した FIR システムのシステム同定」の Simulink の例を参照してください。

  3. Simulink モデルを実行するのと同じようにモデルを実行します。