ドキュメンテーション センター

  • 評価版
  • 製品アップデート

目次

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

同時実行のモデル例

同時実行環境で稼働するよう構成されたモデルの対話型の例では、以下を行います。

  1. MATLAB® コマンド ウィンドウで疑問符をクリックします。

    ドキュメンテーション センター ウィンドウが開きます。

  2. [Simulink][例][モデリング機能][同時実行のモデル化][マルチコア ターゲットでの同時実行のモデル化] の順に移動します。

マルチコア ターゲットでの同時実行のモデル化

このモデルでは、Simulink と Simulink Coder™ を使用してマルチコア ターゲットでモデルの同時実行を実現する方法を示します。さらに、タスク間のデータ転送など、ターゲット上での同時実行の効果をシミュレーションでキャプチャする方法も示します。この例では、ルート入力端子からシステムへの非同期の外部入力の効果を指定してシミュレーションする方法も示しています。

例の要件

このモデルのコードを生成する場合は、Simulink Coder™ をインストールしてください。ただし、この例をシミュレーションすると、Simulink と Simulink Coder™ によって、現在の作業フォルダー内にコードが生成されることがあります。このフォルダーにファイルを生成しない (または生成できない) 場合は、現在の作業フォルダーを変更変更してください。

topmdl = 'sldemo_concurrent_execution';
open_system(topmdl);
curDir = pwd;
cd(tempdir);

モデルの概要

同時実行機能を利用するには、Model ブロックを使用してモデルを同時に実行可能な部分に分割します。モデルを開いて開いて、Plant、Compensato、ControllerA、ControllerB の 4 つの Model ブロックに分割されていることを確認します。

同時実行の探索

この機能を使用すると、マッピング インターフェイスから Model ブロックのパーティションをタスクにマッピングすることが可能になります。Model ブロックを別のタスクに割り当てることで、その Model ブロックをリアルタイム ターゲットで同時に実行することが可能になります。

マッピング インターフェイスを試す際には、タスク コンフィギュレーションの変更を検討してください。具体的には、タスクを追加または削除し、必要に応じて [タスクにブロックをマッピング] パネル (以下に図示) を使用して、Model ブロックのパーティションを再割り当てします。詳細は、ドキュメンテーションドキュメンテーションを参照してください。マッピングは対話的に実行することも、プログラムから API を使用して実行することも可能です。たとえば、以下のコマンド ライン命令は、以下の図に示すようにモデルの設定方法を表示します。

これで、モデルをシミュレートシミュレートし、マッピングの効果を調べることができます。特に、Simulink エディターは、通信による単位遅延を示す新しい $z^{-1}$ アイコンを使用して、タスク間の通信を表示します。

% Enable the external inputs to the system.
set_param(topmdl, 'LoadExternalInput', 'on');

% Get active configuration set
csTop = getActiveConfigSet(topmdl);

% Get the task configuration.
tc = csTop.concurrentExecutionComponents;

% Get the block handles for mapping.
plantBlkH        = get_param([topmdl '/Plant'], 'Handle');
compensatorBlkH  = get_param([topmdl '/Compensator'], 'Handle');
controlABlkH     = get_param([topmdl '/Controller A'], 'Handle');
controlBBlkH     = get_param([topmdl '/Controller B'], 'Handle');
interruptBlkH    = get_param([topmdl '/Interrupt'], 'Handle');

% Delete any previously created tasks
periodicTrigger = tc.Triggers(1);
periodicTasks   = periodicTrigger.Tasks;
tnames          = {periodicTasks.Name};
for i = 1:length(periodicTasks)
    periodicTrigger.deleteTask(tnames{i});
end

% Delete aperiodic trigger
aperiodicTrigger = tc.Triggers(2);
tc.deleteTrigger(aperiodicTrigger);

% Create and configure new tasks.
plant           = periodicTrigger.addTask('Plant');
controlA        = periodicTrigger.addTask('ControllerA');
controlB        = periodicTrigger.addTask('ControllerB');
interruptSource = tc.addAperiodicTrigger('Interrupt');

plant.Period    = '0.1';
controlA.Period = '0.1';
controlB.Period = '0.1';

% Perform mapping of blocks to tasks.
tc.map(plantBlkH, plant);
tc.map(compensatorBlkH, plant);
tc.map(controlABlkH, controlA);
tc.map(controlBBlkH, controlB);
tc.map(interruptBlkH, interruptSource);

% Launch Concurrent Execution dialog
Simulink.SoftwareTarget.concurrentExecution(topmdl, ...
                                            'OpenDialog', ...
                                            'Configuration');

sim(topmdl);

シミュレーション結果の表示

シミュレーション データ インスペクターを使用して、シミュレーション結果を表示します表示します。この結果は、通信の影響 (前述) と非周期的なイベントの両方を観察する目的で使用できます。以下の図は、[コンフィギュレーション パラメーター] ダイアログの [データのインポート/エクスポート] パネルで時間 4 および 7 で指定されたイベントに対してシステムがどのように反応するかを示しています。

タスク間通信の設定

設計基準により適合するように、Model ブロック間のタスク間通信のモードを変更できます。このためには、リンクリンクをクリックするか、下記の手順に従います。

[同時実行] ダイアログの [データ転送] ノードをクリックします。[データ転送オプション] ペインで、[既定]、[周期信号]Ensure data integrity only を選択して変更します。[適用] をクリックして変更を保存します。

これで、モデルをシミュレートシミュレート します。Model ブロック間の信号に表示されるロック アイコンは、同時実行タスク間のデータ転送がデータ整合性のみのモードで実行されていることを示しています。個々の信号レベルでのタスク間データ転送モードのきめ細かな制御については、ドキュメンテーションドキュメンテーションを参照してください。

コードおよびプロファイル レポートの生成

モデルからコードおよびプロファイル レポートコードおよびプロファイル レポートを生成します。

プロファイル レポートは、生成されたコードがホスト コンピューターでどのように実行されたかという情報を示します。以下に示すプロファイル レポートの例では、生成されたコードは 4 コア プロセッサのホスト コンピューターで実行されました。[Task Execution Time] セクションには、時間がマイクロ秒単位で表示されます。[Task Affinitization to Processor Cores] セクションには、各コアでタスクがどのように同時実行されたかという情報が表示されます。同時実行の仕組みについての詳細は、コード生成レポートに示されたコードを調べるか、「ドキュメンテーションドキュメンテーション」を参照してください。

モデルを閉じる

close_system(topmdl, 0);
close_system([topmdl,'_plant'], 0);
close_system([topmdl,'_compensator'], 0);
close_system([topmdl,'_controller_A'], 0);
close_system([topmdl,'_controller_B'], 0);
cd(curDir);

まとめ

この例では、Simulink と Simulink Coder™ を使用してマルチコア ターゲットでの同時実行の効果を調べる簡単なワークフローを示しています。xPC Target™ のオンターゲット プロファイリング機能とともに、このワークフローを反復して適用すると、実際のアプリケーションのパフォーマンスをマルチコア xPC Target™ 環境で最適化できます。

この情報は役に立ちましたか?