Main Content

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

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

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

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

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

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

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

信号のログの有効化

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

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

  2. [データのインポート/エクスポート] を選択します。

  3. [信号] ペインで、[信号のログ] チェック ボックスをオンにし、チャートのログ作成を有効にします。ログ作成を無効にするには、チェック ボックスをオフにします。

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

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

    • 配列

    • 構造体

    • 時間付き構造体

    • データセット

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

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

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

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

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

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

たとえば、sf_semantics_hotel_checkin モデルで、次を行います。

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

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

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

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

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

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

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

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

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

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

複数の信号のログ作成

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

たとえば、sf_semantics_hotel_checkin モデルで、次を行います。

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

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

  3. ログ バッジ によりモデル内のログ信号にマークが付きます。

出力端子の追加

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

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

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

たとえば、sf_semantics_hotel_checkin モデルで、次を行います。

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

  2. Dining_area ステートのハンドルを取得します。

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

  3. ローカル データ service のハンドルを取得します。

    serviceData = rt.find('-isa','Stateflow.Data','Name','service');

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

    diningState.LoggingInfo.DataLogging = 1;
    serviceData.LoggingInfo.DataLogging = 1;

  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 信号のログ オブジェクトに保存されます。

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

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

モデルをシミュレートすると、[シミュレーション データ インスペクター] アイコンが強調表示されて、新しいシミュレーション データがあることが示されます。

  1. シミュレーション データ インスペクターを開くには、[シミュレーション] タブで、アイコン をクリックします。

  2. シミュレーション中にログに記録された信号を検証して比較します。シミュレーション データ インスペクターを参照してください。

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 = logsout.get('Dining Room')
    diningLog = 
    
      Stateflow.SimulationData.State
      Package: Stateflow.SimulationData
    
      Properties:
             Name: 'Dining Room'
        BlockPath: [1×1 Simulink.SimulationData.BlockPath]
           Values: [1×1 timeseries]
    
    serviceLog = logsout.get('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
          __________    ____
          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')

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

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

多次元データのログ作成

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

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

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

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

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

参考

| | | | | |

関連するトピック