Main Content

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 ファイルです。Author Blocks Using MATLAB System Objectsを参照してください。

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

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

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

メモ

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

クラス定義ファイルの最初の行で、System object の名前を指定し、matlab.System からのサブクラス化を行います。matlab.System 基底クラスにより、すべての基本の System object メソッドを使用して、ブロックの入出力名、タイトルおよびプロパティ グループを指定できます。

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

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

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

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

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

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

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

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

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

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

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

classdef lmsSysObj < matlab.System
   % 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 を実装します。

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

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

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

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

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

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

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

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

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

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

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

classdef intDelaySysObj < matlab.System
   % 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 の追加

MATLAB Function ブロックでの System object

Simulink モデルに System object コードを含めるには、MATLAB Function ブロックを使用します。関数には、1 つ以上の System object を含めることができます。Simulink にシステムを直接実装するよりも、MATLAB 環境にシステムを部分的に実装する方が簡単です。多くの System object には Simulink ブロックと同等の機能をもつものがあります。Simulink モデルに含める MATLAB コードを作成する前に、目的の処理を実行するブロックが存在しないかを確認してください。

MATLAB System ブロックでの System object

MATLAB System ブロックを使用して、Simulink に、クラス定義ファイルで作成した個々の System object を含めることができます。このオプションは、独自のアルゴリズム ブロックを Simulink モデルに追加するための 1 つの方法です。

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

詳細については、Author Blocks Using MATLAB System Objectsを参照してください。