Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ステートとデータのシミュレーション出力のログ

Simulink® モデルの Stateflow® チャートをシミュレートするときに、ローカル、出力およびアクティブ ステートのデータの値のログを Simulink.SimulationData.Dataset オブジェクトとして作成できます。シミュレーション後、シミュレーション データ インスペクター (Simulink)またはロジック アナライザー (DSP System Toolbox)を使用するか、MATLAB® ワークスペースで、このオブジェクトにアクセスできます。データのログ作成のワークフローは次のとおりです。

  1. チャートの信号ログを有効にして、ログ形式を選択します。信号のログの有効化 を参照してください。

  2. 信号のログのステートおよびデータを設定します。ステートおよびデータのログ設定 を参照してください。

  3. チャートのシミュレーションを実行します。

  4. ログ データにアクセスします。信号ログ データへのアクセスを参照してください。

信号のログの有効化

既定の設定では、モデルとチャートの信号のログ作成は有効にされています。信号のログを無効にするか、再度有効にするには、次を行います。

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

  2. [データのインポート/エクスポート] ペインで、[信号のログ] を選択し、チャートのログ作成を有効にします。ログ作成を無効にするには、[信号のログ] をクリアします。詳細については、Signal logging (Simulink)を参照してください。

  3. (オプション) 信号のログ オブジェクトにカスタムの名前を指定します。既定の名は logsoutです。このオブジェクトを使用して、MATLAB ワークスペース変数内のログ データにアクセスできます。詳細については、信号ログを使用した信号データの保存 (Simulink)を参照してください。

  4. (オプション) [形式] フィールドで、信号のログの形式を選択します。オプションは次のとおりです。

    • 配列

    • 構造体

    • 時間付き構造体

    • データセット

    既定の設定は [データセット] です。詳細については、時間、状態および出力データ形式 (Simulink)を参照してください。

ステートおよびデータのログ設定

ステート、ローカル データ、出力データのログのプロパティを設定するには、チャート内から [Stateflow 信号のログ] ダイアログ ボックスを使用して行う方法と、コマンド ラインからプログラムによって行う方法があります。

ステートおよびデータの個別ログ作成

1 回につき 1 つのステートまたはデータ オブジェクトのログのプロパティを設定するには、[プロパティ インスペクター]、モデル エクスプローラー、またはステートまたはデータ オブジェクトのプロパティ ダイアログ ボックスを使用します。[ログ] タブを選択し、必要に応じてプロパティを変更します。詳細については、ログのプロパティを参照してください。

以下に例を示します。

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

    openExample("stateflow/SemanticsHotelCheckinExample")

    この例の詳細については、実行時の Stateflow オブジェクトの相互作用を参照してください。

  2. Hotel チャートを開きます。

  3. [シンボル] ペインを開きます。[シミュレーション] タブの [準備] で、[[シンボル] ペイン] をクリックします。

  4. [プロパティ インスペクター] を開きます。[シミュレーション] タブの [準備] で、[プロパティ インスペクター] をクリックします。

  5. ログを作成する service ローカル データを設定します。

    1. [シンボル] ペインで、service を選択します。

    2. [プロパティ インスペクター][ログ] で、[信号データのログ] チェック ボックスをオンにします。

  6. ログを作成する Dining_area ステートを設定します。

    1. Stateflow エディターで、Dining_area ステートを選択します。

    2. [シミュレーション] タブの [準備] で、[自己アクティビティのログ] を選択します。あるいは、[プロパティ インスペクター][ログ][自己アクティビティのログ] チェック ボックスを選択します。

    3. 既定では、このステートのログ名は階層信号名 Check_in.Checked_in.Executive_suite.Dining_area です。より短い名前をステートに割り当てるには、[ログ名][カスタム] に設定し、「Dining Room」と入力します。

複数の信号のログ作成

複数のステートやデータ オブジェクトのログのプロパティを設定するには、[Stateflow 信号のログ] ダイアログ ボックスを使用します。ステート、ローカル、出力のすべてのデータのリストから、ログを作成するチャート オブジェクトを選択します。詳細については、ログのプロパティを参照してください。

以下に例を示します。

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

    openExample("stateflow/SemanticsHotelCheckinExample")
  2. Hotel チャートを開きます。

  3. 複数の信号をログに記録するには、Shift キーを押しながらログ対象のステートを選択します。[シミュレーション] タブの [準備] で、[自己アクティビティのログ] を選択します。

  4. ログ バッジ は、モデル内でログ記録される信号を示します。

出力端子の追加

出力端子を追加してチャートのアクティビティを監視できます。Stateflow エディターから、[シミュレーション] タブの [出力端子の追加] をクリックします。Stateflow チャートに新しい端子が表示されます。この端子をビューアーに接続して、チャートの子アクティビティを監視します。

コマンド ライン API によるチャート信号のログ作成

ステートおよびデータ オブジェクトのログのプロパティをコマンド ラインからプログラムによって設定します。ステートまたはデータ オブジェクトのログ作成を有効にするには、オブジェクトのハンドルを取得して、その LoggingInfo.DataLogging プロパティを 1 に設定します。Stateflow プログラム インターフェイスの詳細については、Stateflow API の概要を参照してください。

以下に例を示します。

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

    openExample("stateflow/SemanticsHotelCheckinExample")
  2. ステート Dining_area に対応するStateflow.State オブジェクトにアクセスします。

    diningState = find(sfroot,"-isa","Stateflow.State",Name="Dining_area");

  3. ローカル データ service に対応するStateflow.Data オブジェクトにアクセスします。

    serviceData = find(sfroot,"-isa","Stateflow.Data",Name="service");

  4. Dining_area ステートと service データのログ作成を有効にします。

    diningState.LoggingInfo.DataLogging = true;
    serviceData.LoggingInfo.DataLogging = true;

  5. Dining_area ステートのログ名を、カスタム名 Dining Room に変更します。

    % Enable custom naming
    diningState.LoggingInfo.NameMode = "Custom";
    
    % Enter the custom name
    diningState.LoggingInfo.LoggingName = "Dining Room";

信号ログ データへのアクセス

シミュレーション時に、Stateflow により、ログ データは Simulink.SimulationData.Dataset (Simulink) 信号のログ オブジェクトに保存されます。

たとえば、service ローカル データと Dining_area ステートのアクティビティのログを作成するように sf_semantics_hotel_checkin モデルを設定するとします。シミュレーション開始後に、1 つ目のスイッチを 2 回切り替えてホテルにチェックインし、2 つ目のスイッチを複数回切り替えてルーム サービスを注文します。シミュレーションを停止後に、シミュレーション データ インスペクター、ロジック アナライザー、または MATLAB ワークスペースで、ログ データを表示できます。

シミュレーション データ インスペクターでのログ データの表示

シミュレーション データ インスペクターを開くには、[シミュレーション] タブで、[データ インスペクター] を選択します。モデルをシミュレートすると、アイコンが強調表示されて、シミュレーション データ インスペクターに新しいシミュレーション データがあることが示されます。詳細については、シミュレーション データ インスペクターを使用したステート アクティビティの表示を参照してください。

ロジック アナライザーでのログ データの表示

ロジック アナライザーを開くには、[シミュレーション] タブで、[ロジック アナライザー] を選択します。モデルをシミュレートすると、アイコンが強調表示されて、ロジック アナライザーに新しいシミュレーション データがあることが示されます。詳細については、ロジック アナライザーでの Stateflow ステートの表示を参照してください。

メモ

ロジック アナライザーを使用するには、DSP System Toolbox™、SoC Blockset™、または HDL Verifier™ がなければなりません。

MATLAB ワークスペースでのログ データの表示

  1. 信号のログ オブジェクトにアクセスするには、MATLAB コマンド プロンプトで、以下のように入力します。

    logsout = out.logsout
    logsout = 
    
    Simulink.SimulationData.Dataset 'logsout' with 2 elements
    
                            Name         BlockPath                        
                            ___________  ________________________________ 
        1  [1x1 State]      Dining Room  sf_semantics_hotel_checkin/Hotel
        2  [1x1 Data ]      service      sf_semantics_hotel_checkin/Hotel
    

  2. ログに記録された要素にアクセスするには、関数 get を使用します。ログが作成された要素には、名前、インデックス、またはブロック パスでアクセスできます。

    diningLog = get(logsout,"Dining Room")
    diningLog = 
    
      Stateflow.SimulationData.State
      Package: Stateflow.SimulationData
    
      Properties:
             Name: 'Dining Room'
        BlockPath: [1×1 Simulink.SimulationData.BlockPath]
           Values: [1×1 timeseries]
    
    serviceLog = get(logsout,"service")
    serviceLog = 
    
      Stateflow.SimulationData.Data
      Package: Stateflow.SimulationData
    
      Properties:
             Name: 'service'
        BlockPath: [1×1 Simulink.SimulationData.BlockPath]
           Values: [1×1 timeseries]
    

  3. ログ データおよびログが作成された各要素の時間にアクセスするには、Values.Data プロパティと Values.Time プロパティを使用します。以下に例を示します。

    • 関数 table を使用して、ログ データを表形式でまとめます。

      T1 = table(diningLog.Values.Time,diningLog.Values.Data);
      T1.Properties.VariableNames = ["Time","Data"]
      T1 =
      
        6×2 table
      
             Time       Data
          __________    ____
      
                   0     0  
          1.8607e+06     1  
          1.9653e+06     0  
          1.9653e+06     1  
          1.9653e+06     0  
          2.2912e+06     1  
      
      T2 = table(serviceLog.Values.Time,serviceLog.Values.Data);
      T2.Properties.VariableNames = ["Time","Data"]
      T2 =
      
        6×2 table
      
             Time       Data
          __________    ____
      
                   0     0
          1.7076e+06     0  
          1.8607e+06     1  
          1.9653e+06     2  
          1.9653e+06     3  
          1.9653e+06     4  
          2.2912e+06     5  
      

    • 関数 plot を使用して、ログ データを Figure ウィンドウに表示します。

      X = serviceLog.Values.Time;
      Y = serviceLog.Values.Data;
      plot(X,Y,"-o")
      xlabel("Time")
      ylabel("Data")

      Figure that shows the data logged during simulation.

    • ログ作成された値の配列を関数 xlswrite に渡すことにより、ログ データを Excel® スプレッドシートにエクスポートします。

      A = [double(diningLog.Values.Time) double(diningLog.Values.Data)];
      xlswrite("dining_log.xls",A);

メモ

信号のログ オブジェクトは、ログ記録中のデータに対して Stateflow チャートが書き込むたびに、データの値が変更されない場合でも、データ点を記録します。たとえば、この例では、値が 0 のデータ点は、チャートが時間 0 においてローカル データ service0 に初期化するときと、デフォルト遷移が時間 1.7076e+06 において service0 に設定するときが該当します。

多次元データのログ作成

Stateflow では、多次元信号への各更新を単一の変更としてログに記録します。たとえば、行列 A の 2 つの要素を別々に更新すると、

A[1][1] = 1;
A[1][2] = 1;
ログ データでは 2 つの異なる変更が得られます。これに対して、行列 A を単一のコマンドで更新すると、
A = 1;
ログ データでは単一の変更が得られます。これは、ij のすべての値に関して、コマンドが A[i][j] = 1 を暗示している場合であっても同じです。

データのログに関する制限

エクスターナル モードでモデルをシミュレートする場合、Stateflow データのログ作成はサポートされません。

[高速リスタート] が有効なチャートからステート アクティビティやデータのログを作成すると、最初の実行以降のすべての実行で、最初にログが作成されたデータ点が重複します。このようなデータ点を使用するアルゴリズムでは、この重複を考慮しなければなりません。

参考

アプリ

オブジェクト

関数

ツール

関連するトピック