このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
System object を使用した Simulink でのシステム設計
Simulink でのシステム設計とシミュレーション
モデルで System object を使用して Simulink® でシミュレーションを実行することができます。
モデルで使用する System object™ を作成します。詳細は、Simulink で使用する新しい System object の定義を参照してください。
MATLAB® で新しい System object をテストします。MATLAB での新しい System object のテストを参照してください。
.
MATLAB System ブロックを使用して、System object をモデルに追加します。詳細は、Simulink モデルへの System object の追加を参照してください。
他の Simulink ブロックを必要に応じて追加し、ブロックを接続してシステムを構築します。
システムを実行します。
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 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 のテスト
新しい System object のインスタンスを作成します。たとえば、
lmsSysObj
のインスタンスを作成します。s = lmsSysObj;
異なる入力を使用してオブジェクトを複数回実行します。このステップを行うことで、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 モデルに追加します。
詳細については、MATLAB System ブロックを使用した System object の統合を参照してください。