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

シミュレーション中のブロック データへのアクセス

ブロックの実行時オブジェクトについて

Simulink® は、ブロック実行時インターフェイスと呼ばれるアプリケーション プログラミング インターフェイス (API) を提供します。これによりシミュレーションの実行中に、ブロック入力、ブロック出力、パラメーター、状態、作業ベクトルのような、ブロック データにプログラムでアクセスすることができます。このインターフェイスを使用して、MATLAB® コマンド ライン、Simulink デバッガー、Level-2 MATLAB S-Function (のWrite Level-2 MATLAB S-Functionsを参照) から、ブロックの実行時データにアクセスできます。

メモ:

このインターフェイスは、モデルが停止していたり、デバッガー内で実行または停止しているときにも使用できます。

ブロック実行時インターフェイスは、実行中のモデル内のブロックに関するデータを提供する一連の Simulink データ オブジェクト クラスから構成されます (データ オブジェクトを参照)。特に、このインターフェイスは、ブロックの実行時オブジェクトと呼ばれる Simulink.RunTimeBlock のインスタンスと実行中のモデル内の各非バーチャル ブロックを関連付けます。実行時オブジェクトのメソッドとプロパティにより、ブロックの I/O 端子、パラメーター、サンプル時間、状態に関する実行時データにアクセスできます。

実行時オブジェクトへのアクセス

実行中のモデル内の各非バーチャル ブロックは、シミュレーションの実行中、値がブロックの実行時オブジェクトのハンドルとなる RuntimeObject パラメーターをもちます。これにより、get_param を使ってブロックの実行時オブジェクトを取得することができます。たとえば、次のステートメント

rto = get_param(gcb,'RuntimeObject');

は、現在選択されているブロックの実行時オブジェクトを返します。実行時オブジェクト データは読み取り専用です。実行時オブジェクトを使用して、ブロックのパラメーター、入力、出力および状態データを変更することはできません。

メモ:

バーチャル ブロック (非バーチャル ブロックとバーチャル ブロックを参照) は、実行時オブジェクトをもちません。モデルのコンパイル中の最適化で削除されたブロックも、実行時オブジェクトをもちません (ブロック削減を参照)。実行時オブジェクトは、ブロックを含むモデルが実行中あるいは一時停止中にのみ存在します。モデルが停止した場合、get_param は、空のハンドルを返します。モデルを停止すると、既存の実行時オブジェクトのすべてのハンドルが空になります。

メソッド実行イベントのリスニング

ブロックのランタイム API に対する応用の 1 つは、シミュレーション中の主要点で、ブロックが出力や微係数を計算する前後のブロックの状態値のような診断データを収集することです。ブロックのランタイム API は、そのような応用を可能にするイベント リスナー メカニズムを提供します。詳細は、add_exec_event_listener コマンドのドキュメンテーションを参照してください。メソッド実行イベントを使用した例を表示するには、MATLAB のコマンド ラインに

を入力します。この Simulink モデルには S-Function の adapt_lms.m が含まれます。これはシステム同定を実行して FIR フィルターの係数を判定します。S-Function の PostPropagationSetup メソッドは、2 番目のベクトルに各タイム ステップで計算されるフィルター係数を保存するように、ブロックの実行時オブジェクトの DWork ベクトルを初期化します。

Simulink モデルでは、S-Function ブロックの下の注釈をダブルクリックすると、OpenFcn が実行されます。この関数は、最初に FIR フィルター係数をプロットする図を開きます。次に関数 add_adapt_coef_plot.m を実行して、次のコード行により PostOutputs メソッド実行イベントを S-Function のブロック実行時オブジェクトに追加します。

% Add a callback for PostOutputs event
blk = 'sldemo_msfcn_lms/LMS Adaptive';

h   = add_exec_event_listener(blk, ...
         'PostOutputs', @plot_adapt_coefs);

関数 plot_adapt_coefs.m は、毎回、S-Function の Outputs メソッドを呼び出した後に実行されるイベント リスナーとして登録されています。関数は、ブロックの実行時オブジェクトの DWork ベクトルにアクセスして、Outputs メソッドで計算されたフィルター係数をプロットします。plot_adapt_coefs.m に使用される呼び出し構文は、あらゆるリスナーの基準に従います。次に示されたように、最初の入力引数は S-Function のブロック実行時オブジェクトで、2 番目の引数はイベント データの構造体です。

function plot_adapt_coefs(block, ei) %#ok<INUSD>
% 
% Callback function for plotting the current adaptive filtering
% coefficients.

stemPlot  = get_param(block.BlockHandle,'UserData');

est = block.Dwork(2).Data;
set(stemPlot(2),'YData',est);
drawnow('expose');

実行時オブジェクトと Simulink の実行の同期

実行時オブジェクトを使用して、ブロックの出力値を取得し、MATLAB コマンド ウィンドウに表示するには、次のコマンドを入力します。

rto = get_param(gcb,'RuntimeObject')
rto.OutputPort(1).Data

しかし、実行時オブジェクトが Simulink の実行と同期されていない場合は、ブロックの真の出力が表示されない可能性があります。Simulink は、実行時オブジェクトが Level-2 MATLAB S-Function またはイベント リスナー コールバックに使用されているときにのみ、実行時オブジェクトと Simulink の実行を確実に同期します。実行時オブジェクトを MATLAB コマンド ウィンドウから呼び出したときに、モデルの他のブロックにメモリの共有が許可されている場合は、不正確な出力データが返されることがあります。

Data フィールドに正しいブロック出力が確実に含まれるようにするには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[信号ストレージの再利用] チェック ボックスをオフにします (信号ストレージの再利用 (Simulink Coder)を参照)。

関連するトピック