メインコンテンツ

生成された C++ コードのシミュレーションと検証

チュートリアルのこのステップでは、生成コードによって提供される結果が、Simulink® でモデル化されたアルゴリズムの結果と数値的に等価であることを検証します。テスト ハーネス モデルを作成してノーマル モードおよびソフトウェアインザループ モードで CppClassWorkflowKeyIgnition のシミュレーションを実行してから、シミュレーション データ インスペクターを使用してシミュレーションを比較します。

一般的に、生成されたコードをテストするには、ソフトウェアインザループ (SIL) シミュレーションとプロセッサインザループ (PIL) シミュレーションを実行します。SIL シミュレーションでは、生成されたコードを開発用コンピューターでコンパイルおよび実行します。PIL シミュレーションでは、ソース コードを開発用コンピューターでクロスコンパイルします。その後、PIL シミュレーションではターゲット プロセッサまたは同等の命令セット シミュレーターでオブジェクト コードをダウンロードして実行します。SIL および PIL シミュレーションで次を行うことができます。

  • コードの数値動作を検証する。

  • コード カバレッジと実行時メトリクスを収集する。

  • IEC 61508、IEC 62304、ISO 26262、EN 50128、または DO-178 認証の達成を目指して進める。

テスト ハーネスの作成

このセクションでは、テスト対象モデルである CppClassWorkflowKeyIgnition を参照するために、空の Simulink モデルからテスト ハーネス CppClassHarness を作成します。Simulink Test™ ライセンスをお持ちの場合は、簡略化されたワークフローを使用して、コンポーネント モデルからテスト ハーネスを作成できます。詳細については、Create or Import Test Harnesses and Select Properties (Simulink Test)を参照してください。

ハーネス モデルにより、参照モデルに対するテスト入力が生成されます。

  1. モデル CppClassWorkflowKeyIgnition を開きます。

    openExample("CppClassWorkflowKeyIgnition.slx");
  2. モデル エクスプローラーを開きます。[モデル化] タブの [設計][モデル エクスプローラー] をクリックします。

  3. モデル エクスプローラーで、モデル CppClassWorkflowKeyIgnition のコンフィギュレーションをエクスポートします。

    1. [モデルの階層構造] の下で [Simulink Root] を展開し、[CppClassWorkflowKeyIgnition] を右クリックして、[コンフィギュレーション][アクティブなコンフィギュレーション セットのエクスポート] を選択します。

    2. [エクスポート] ダイアログ ボックスで、コンフィギュレーションを cpp_sil_configuration として保存します。

  4. モデル エクスプローラーのツール バーで、New Model button をクリックして新しいモデルを作成します。

  5. 新しい無題のモデルを CppClassHarness として保存します。

  6. 保存したコンフィギュレーションをハーネス モデル CppClassHarness にインポートします。

    1. [モデルの階層構造] の下で [CppClassHarness] を右クリックし、[コンフィギュレーション][インポート] を選択します。

    2. [インポート] ダイアログ ボックスで cpp_sil_configuration を選択し、[開く] をクリックします。

    3. 確認のダイアログ ボックスが開いた場合は、[OK] をクリックしてコンフィギュレーションを保存します。次に、モデル エクスプローラーで [CppClassHarness] を右クリックし、モデルを保存します。

    4. モデル エクスプローラーを閉じます。

    この時点で、ハーネス モデルはテスト対象モデル (CppClassWorkflowKeyIgnition) と同じコンフィギュレーション パラメーターを使用するように構成されています。各モデルの [コンフィギュレーション パラメーター] ダイアログ ボックスを開いて設定を比較することで、コンフィギュレーション パラメーターがインポートされていることを確認できます。

  7. ハーネス モデル CppClassHarness の Simulink キャンバスで、出力端子とパルス発生器の間にPulse Generatorブロックを 1 つ、Outportブロックを 2 つ、Modelブロックを 1 つ追加します。

  8. Model ブロックをダブルクリックします。[ブロック パラメーター] ダイアログ ボックスで、以下を行います。

    1. [モデル名] の下で [参照] をクリックし、CppClassWorkflowKeyIgnition を選択します。

    2. [開く] をクリックし、[OK] をクリックします。

  9. Pulse Generator ブロックを Model ブロック CppClassWorkflowKeyIgnitionkeyState 入力端子に接続し、2 つの Outport ブロックを Model ブロック CppClassWorkflowKeyIgnitionengineState 出力端子および cycleTime 出力端子に接続します。

    Harness model CppClassHarness shows the connected function generator, Model block CppClassWorkflowKeyIgnition, outputs engineState and cycleTime.

  10. Pulse Generator ブロックをダブルクリックして [ブロック パラメーター] ダイアログ ボックスを開きます。[ブロック パラメーター] ダイアログ ボックスで、以下を行います。

    • [パルス タイプ][サンプル ベース] に設定する。

    • [振幅]2 に設定する。

    • [周期 (サンプル数)]200 に設定する。

    • [パルス幅 (サンプル数)]2 に設定する。

    • [位相遅延 (サンプル数)]200 に設定する。

    • [サンプル時間]0.01 に設定する。

    • その他のオプションは既定の設定のままにする。

    [OK] をクリックします。

  11. 最上位の入力および出力の信号線にラベルを追加します。

    • パルス発生器を Model ブロックに接続する信号線をダブルクリックし、「input」と入力する。

    • Model ブロックを engineState 出力端子に接続する信号線をダブルクリックし、「outputState」と入力する。

    The harness model for CppClassWorkflowKeyIgnition contains the input stimulus pulse generator and labeled input signal and output signal.

  12. CppClassHarness の [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

  13. [データのインポート/エクスポート] ペインで、[信号のログ] を選択します。[OK] をクリックします。

  14. モデルを保存します。

ノーマル モードでのモデルのシミュレーション

ハーネス モデルをノーマル モードで実行し、シミュレーション データ インスペクターで結果を取得します。

  1. ハーネス モデルで、[モデル化] タブを選択して [モデル データ エディター] をクリックし、モデル データ エディターを開きます。

  2. モデル データ エディターで、[信号] タブを選択します。

  3. ドロップダウン リストの設定を [設計] から [インストルメンテーション] に変更します。

  4. データ テーブルの [名前] 列で input 信号および outputState 信号を見つけ、[ログ データ] 列の対応するチェック ボックスをオンにします。

    The Model Data Editor panel displays at the bottom of the Simulink window and shows the Log Data check boxes selected for the input and outputState signals.

    [ログ データ] 列のチェック ボックスをオンにすることで、シミュレーション データがシミュレーション データ インスペクターに記録される信号が指定されます。

  5. Model ブロック CppClassWorkflowKeyIgnition を右クリックし、続いて [ブロック パラメーター] ボタン をクリックします。

  6. [ブロック パラメーター] ダイアログ ボックスで、[シミュレーション モード][ノーマル] に設定されていることを確認します。[OK] をクリックします。

  7. [実行] をクリックして CppClassHarness のシミュレーションを実行します。

  8. シミュレーションが完了したら、シミュレーション データ インスペクターでシミュレーション結果を確認します。シミュレーション データ インスペクターがまだ開いていない場合、[シミュレーション] タブの [結果の確認][データ インスペクター] をクリックします。

  9. 最新 (現在) の実行について、実行名フィールドをダブルクリックし、実行の名前を CppClassHarness: Normal mode に変更します。

  10. input および outputState を選択して信号をプロットします。

    Simulation results for input and outputState signals.

SIL モードでのモデルのシミュレーション

次に、ハーネス モデルを SIL モードで実行します。SIL シミュレーションでは、開発用コンピューターでコードを生成、コンパイル、実行します。シミュレーション データ インスペクターは結果をログに記録します。

  1. CppClassHarness モデル ウィンドウで、CppClassWorkflowKeyIgnition モデル ブロックを右クリックし、[ブロック パラメーター] ボタン をクリックします。

  2. [ブロック パラメーター] ダイアログ ボックスで、[シミュレーション モード]Software-in-the-loop (SIL) に、[コード インターフェイス]Top model に設定します。[OK] をクリックします。Model ブロックで、最上位モデルでシミュレーションが SIL モードで実行されることが示されます。

    The CppClassWorkflowKeyIgnition Model block indicates "SIL: Top".

  3. CppClassHarness モデルのシミュレーションを実行します。[診断ビューアー] パネルが開き、ビルドとコード生成のステータスが表示されます。

    コード生成レポートのウィンドウが開いた場合は、このチュートリアルの後半で調査するためにそのウィンドウを最小化します。

  4. シミュレーションが完了したら、シミュレーション データ インスペクターで実行名フィールドをダブルクリックし、新しい実行の名前を CppClassHarness: SIL mode に変更します。

  5. input および outputState を選択して信号をプロットします。

シミュレーション結果の比較

シミュレーション データ インスペクターを使用して、シミュレーション結果を比較します。

  1. シミュレーション データ インスペクターで、[比較] タブをクリックします。

  2. [ベースライン] フィールドで、CppClassHarness: Normal mode を選択します。

  3. [比較対象] フィールドで、CppClassHarness: SIL mode を選択します。

  4. [比較] をクリックします。

シミュレーション データ インスペクターに、ノーマル モードと SIL モードの結果が一致することが示されます。同様の方法で、ノーマル モードと PIL モードの結果を比較できます。ノーマル モード シミュレーションと SIL シミュレーションおよび PIL シミュレーションの結果を比較すると、生成されたアプリケーションが想定どおりに実行されることを確認するのに役立ちます。

The Simulation Data Inspector shows the outputState waveform and indicates that the simulation results match.

あるいは、SIL/PIL マネージャーアプリを使用して、生成されたモデル コードを検証する簡略化されたワークフローを実行することもできます。

次は、生成されたコードの展開方法を確認します。