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 ファイルです。MATLAB System ブロックを使用した System object の統合を参照してください。

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

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

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

メモ

クラス定義ファイルを手作業で作成する代わりに、[新規][System object][Simulink 拡張]メニュー オプションを使用してテンプレートを開くことができます。このテンプレートには、SimulinkMATLAB 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メソッドを使用します。

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

classdeflmsSysObj < matlab.System% lmsSysObj Least mean squares (LMS) adaptive filtering.% #codegenproperties% Mu Step sizeMu = 0.005;endproperties(Nontunable)% Weights Filter weightsWeights = 0;% N Number of filter weightsN = 32;endproperties(DiscreteState) X; H;endmethods(Access = protected)functionsetupImpl(obj) obj.X = zeros(obj.N,1); obj.H = zeros(obj.N,1);endfunction[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);endfunctionresetImpl(obj) obj.X = zeros(obj.N,1); obj.H = zeros(obj.N,1);endend% Block icon and dialog customizationsmethods(Static, Access = protected)functionheader = getHeaderImpl header = matlab.system.display.Header(...'lmsSysObj',...'Title',“LMSdaptive Filter');endfunctiongroups = getPropertyGroupsImpl upperGroup = matlab.system.display.SectionGroup(...'Title','General',...'PropertyList',{'Mu'}); lowerGroup = matlab.system.display.SectionGroup(...'Title','Coefficients',...'PropertyList',{“重量”,“N”}); groups = [upperGroup,lowerGroup];endendmethods(Access = protected)functionicon = getIconImpl(~) icon = sprintf(“LMSdaptive\nFilter');endfunction[in1name, in2name] = getInputNamesImpl(~) in1name ='Desired'; in2name ='Actual';endfunction[out1name, out2name] = getOutputNamesImpl(~) out1name ='Output'; out2name ='EstError';endendend

非直達による System object の定義

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

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

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

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

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

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

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

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

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

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

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

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

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

classdefintDelaySysObj < matlab.System% intDelaySysObj Delay input by specified number of samples.% #codegenproperties% InitialOutput Initial outputInitialOutput = 0;endproperties(Nontunable)% NumDelays Number of delaysNumDelays = 1;endproperties(DiscreteState) PreviousInput;endmethods(Access = protected)functionsetupImpl(obj, ~) obj.PreviousInput = ones(1,obj.NumDelays)*obj.InitialOutput;endfunction[y] = outputImpl(obj, ~)% Output does not directly depend on inputy = obj.PreviousInput(结束);endfunctionupdateImpl(obj, u) obj.PreviousInput = [u obj.PreviousInput(1:end-1)];endfunctionflag = isInputDirectFeedthroughImpl(~,~) flag = false;endfunctionvalidatePropertiesImpl(obj)if((numel(obj.NumDelays)>1) || (obj.NumDelays <= 0)) error('Number of delays must be positive non-zero ...scalarvalue.');endif(numel(obj.InitialOutput)>1) error('Initial output must be scalar value.');endendfunctionresetImpl(obj) obj.PreviousInput = ones(1,obj.NumDelays)*obj.InitialOutput;endfunctionicon = getIconImpl(~) icon = sprintf('Integer\nDelay');endendend

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

  1. 新しい系统对象のインスタンスを作成します。たとえば、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 モデルに追加します。

詳細については、MATLAB System ブロックを使用した System object の統合を参照してください。