Main Content

シミュレーションとコードの比較

この例では、slexAircraftExample モデルから生成されたコードで計算された答えを確認する方法を説明します。2 組の出力データを取得し、比較する方法を説明します。モデルのシミュレーションにより 1 組の出力データが作成されます。生成されたコードの実行により 2 組目の出力データが作成されます。

メモ

モデル出力と生成コードとの間で有効な比較を行うには、シミュレーション実行とビルド プロセスにおいて、同じ [ソルバーの選択][ステップ サイズ] を使用します。

ログ作成ための信号データの構成

信号データのログを作成し、記録するためにモデルを構成します。

  1. slexAircraftExample が閉じていることを確認します。ベース ワークスペースをクリアして、前のシミュレーションの結果を削除します。コマンド ウィンドウで以下のように入力します。

    clear

    clear を実行すると、前のシミュレーション中に作成された変数とすべてのワークスペース変数がクリアされます。この中には、slexAircraftExample モデルで必要な標準変数もあります。

  2. モデルを開くには、コマンド ウィンドウで、次を入力します。

    openExample('slexAircraftExample')
    .

  3. モデル ウィンドウで [ファイル]、[名前を付けて保存] を選択して作業フォルダーに移動し、slexAircraftExample モデルのコピーを myAircraftExample という名前で保存します。

  4. 次の信号のデータのログを作成するようにモデルを設定します。Stickalpha,radq, rad/sec の 3 つがあります。各信号について、次のように実行します。

    1. 信号を右クリックします。コンテキスト メニューから [プロパティ] を選択します。

    2. [信号プロパティ] ダイアログ ボックスで、[信号データのログ] を選択します。

    3. [ログ名] セクションのドロップダウン リストから、[カスタム] を選択します。

    4. テキスト フィールドに、対応する信号のログ名を入力します。

      信号名ログ名
      StickStick_input
      alpha,radAlpha
      q, rad/secPitch_rate

    5. [適用] をクリックし、[OK] をクリックします。

    詳細については、信号ログを使用した信号データの保存を参照してください。

  5. [コンフィギュレーション パラメーター] ダイアログ ボックスで、以下の操作を実行します。

    1. [タイプ][固定ステップ] に設定します。

    2. [形式][時間付き構造体] に設定します。

    3. [状態] チェック ボックスをオフにします。

    4. [信号のログ] チェック ボックスをオンにします。

    5. [ワークスペース データのログをシミュレーション データ インスペクターに記録] チェック ボックスをオンにします。

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

シミュレーション データのログに進みます。

シミュレーション データのログ

シミュレーションを実行し、信号データのログを作成して、 シミュレーション データ インスペクターにデータを表示します。

  1. モデルを実行します。シミュレーションが完了すると、Simulink® エディター ツール バーで [シミュレーション データ インスペクター] ボタンが強調表示され、シミュレーション データ インスペクターで新しいシミュレーション出力が利用できることを示します。

  2. [シミュレーション データ インスペクター] ボタンをクリックして、シミュレーション データ インスペクターを開きます。

  3. 信号をグループ化します。

    1. [可視化] タブで、[信号のグループ化] をクリックします。

    2. [信号のグループ化] ダイアログ ボックスで、[次の基準] リストから [データ階層] を選択します。

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

  4. logsout 展開アイコンをクリックして記録された信号を表示します。

  5. [形式] タブをクリックします。

  6. [サブプロット] ボタンをクリックして [3x1] を選択し、3 つのサブプロットを表示します。

  7. 各信号について、次のように実行します。

    1. 上のサブプロットをクリックします。青色の輪郭線はプロットが選択されていることを示します。

    2. Alpha 信号名の隣にあるチェック ボックスをオンにします。信号データがサブプロットに表示されます。

    3. 中央のサブプロットで Pitch_rate 信号をプロットします。

    4. 下のサブプロットで Stick_input 信号をプロットします。

実行可能ファイルの実行とデータの読み込みに進みます。

実行可能ファイルの実行とデータの読み込み

モデルを変更したので、myAircraftExample 実行可能ファイルをリビルドして実行し、有効なデータ ファイルを取得しなければなりません。

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスで [MAT ファイルの変数名の修飾子] パラメーターを rt_ に設定します。rt_ は、この例の最初の部分でログ用に選択した各変数の前に付きます。

  2. [適用] をクリックし、[OK] をクリックします。

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

  4. コードを生成するには [C コード] タブで [ビルド] ボタンをクリックします。

  5. ビルドが完了したら、コマンド ウィンドウからスタンドアロン プログラムを実行します。

    !myAircraftExample

    プログラムを実行すると、次のメッセージがコマンド ウィンドウに表示されます。

    ** starting the model ** 
    ** created myAircraftExample.mat ** 
  6. データ ファイル myAircraftExample.mat を読み込みます。

    load myAircraftExample
    

ヒント

UNIX® プラットフォームの場合、コマンド ウィンドウで構文 !./executable_name を使用して実行可能プログラムを実行します。必要に応じて、構文 ./executable_name を使用して OS シェルから実行可能プログラムを実行します。詳細については、外部コマンド、スクリプト、プログラムの実行を参照してください。

結果の可視化と比較に進みます。

結果の可視化と比較

ログ作成ための信号データの構成で始まった一連の例に従うと、モデルの Simulink による実行と、モデルから生成されたプログラムの実行によってデータが取得されます。

  1. alpha,rad の実行の出力を表示するには、データをシミュレーション データ インスペクターにインポートします。

    1. シミュレーション データ インスペクターの [可視化] タブで、[インポート] ボタンをクリックして [インポート] ダイアログを開きます。

    2. [インポート元][ベース ワークスペース] に指定します。

    3. [インポート先][新規実行] に指定します。

    4. [信号名] の左側にあるチェック マークをクリックし、チェック ボックスをオフにします。

    5. [時系列のルート]rt_yout になっている alpha,rad データのチェック ボックスをオンにします。

    6. [インポート] をクリックします。

    これで、選択したデータが [Run 2: Imported_Data] の下に表示されます。

  2. 実行されたデータのプロットを表示します。

    1. rt_yout の展開記号クリックします。

    2. 上のサブプロットをクリックして、alpha, rad 信号名の隣にあるチェック ボックスをオンにします。信号データが上のサブプロットに表示されます。

      信号が同じであるため、実行 1 と実行 2 の alpha, rad 信号がサブプロット内で重複しています。

シミュレーションとコード生成結果の間にごくわずかな差異が見られる可能性があります。この微妙な差異の原因としては、以下を含む多くの要素が考えられます。

  • コンパイラの最適化の違い

  • ステートメントの順序

  • ランタイム ライブラリ

たとえば、sin(2.0) などの関数呼び出しでは、使用する C ライブラリによって若干異なる値が出力される場合があります。このような差異のため、実際に画面に表示される結果とここに示す結果との間でも相違が生じる可能性があります。

シミュレーションとコード生成の状態の比較

シミュレーション時に Simulink が記録する状態の順序は、Simulink Coder™ がコード生成時に状態を記録する順序とは異なります。シミュレーションとコード生成での状態を比較するには、状態をブロック名で並べ替えます。

たとえば、既定の設定で、Simulink は状態データを MATLAB 変数 xout にエクスポートします。Simulink Coder は状態データを変数 rt_xout にエクスポートします。これらの変数に対する状態データを並べ替えるには、MATLAB コマンド ウィンドウに次のコマンドを入力します。

[~,idx1]=sort({xout.signals.blockName});
xout_sorted=[xout.signals(idx1).values];
[~,idx2]=sort({rt_xout.signals.blockName}); 
rt_xout_sorted=[rt_xout.signals(idx2).values];

コード生成とシミュレーションの間でログ記録の順序が同じことを確認するには、MATLAB コマンド ウィンドウに次のコマンドを入力します。

isequal(xout_sorted, rt_xout_sorted)

関連するトピック