Simulink® モデルの Stateflow® チャートをシミュレートするときに、ローカル、出力およびアクティブ ステートのデータの値のログを Simulink.SimulationData.Dataset
オブジェクトとして作成できます。シミュレーション後、シミュレーション データ インスペクターまたはロジック アナライザーを使用するか、MATLAB® ワークスペースで、このオブジェクトにアクセスできます。データのログ作成のワークフローは次のとおりです。
チャートの信号ログを有効にして、ログ形式を選択します。信号のログの有効化 を参照してください。
信号のログのステートおよびデータを設定します。ステートおよびデータのログ設定 を参照してください。
チャートのシミュレーションを実行します。
ログ データにアクセスします。信号ログ データへのアクセスを参照してください。
既定の設定では、モデルとチャートの信号のログ作成は有効にされています。信号のログを無効にするか、再度有効にするには、次を行います。
[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。
[データのインポート/エクスポート] を選択します。
[信号] ペインで、[信号のログ] チェック ボックスをオンにし、チャートのログ作成を有効にします。ログ作成を無効にするには、チェック ボックスをオフにします。
(オプション) 信号のログ オブジェクトにカスタムの名前を指定します。既定の名は logsout
です。このオブジェクトを使用して、MATLAB ワークスペース変数内のログ データにアクセスできます。詳細については、信号ログを使用して、信号データをエクスポートを参照してください。
(オプション) [形式] フィールドで、信号のログの形式を選択します。オプションは次のとおりです。
配列
構造体
時間付き構造体
データセット
既定の設定は [データセット]
です。詳細については、時間、状態および出力データ形式を参照してください。
[OK] をクリックします。
ステート、ローカル データ、出力データのログのプロパティを設定するには、チャート内から [Stateflow 信号のログ] ダイアログ ボックスを使用して行う方法と、コマンド ラインからプログラムによって行う方法があります。
1 回につき 1 つのステートまたはデータ オブジェクトのログのプロパティを設定するには、プロパティ インスペクター、モデル エクスプローラー、またはステートまたはデータ オブジェクトのプロパティ ダイアログ ボックスを使用します。[ログ] タブを選択し、必要に応じてプロパティを変更します。詳細については、ログのプロパティを参照してください。
たとえば、sf_semantics_hotel_checkin
モデルで、次を行います。
Hotel
チャートを開きます。
[シンボル] ペインを開きます。[シミュレーション] タブの [準備] で、[[シンボル] ペイン] をクリックします。
プロパティ インスペクターを開きます。[シミュレーション] タブの [準備] で、[プロパティ インスペクター] をクリックします。
ログを作成する service
ローカル データを設定します。
[シンボル] ペインで、service
を選択します。
プロパティ インスペクターの [ログ] で、[信号データのログ] チェック ボックスをオンにします。
ログを作成する Dining_area
ステートを設定します。
Stateflow エディターで、Dining_area
ステートを選択します。
[シミュレーション] タブの [準備] で、[自己アクティビティのログ] を選択します。あるいは、プロパティ インスペクターの [ログ] で、[自己アクティビティ ログの作成] チェック ボックスをオンにします。
既定では、このステートのログ名は階層信号名 Check_in.Checked_in.Executive_suite.Dining_area
です。より短い名前をステートに割り当てるには、[ログ名] フィールドで [カスタム]
を選択して Dining
Room
と入力します。
複数のステートやデータ オブジェクトのログのプロパティを設定するには、[Stateflow 信号のログ] ダイアログ ボックスを使用します。ステート、ローカル、出力のすべてのデータのリストから、ログを作成するチャート オブジェクトを選択します。詳細については、ログのプロパティを参照してください。
たとえば、sf_semantics_hotel_checkin
モデルで、次を行います。
Hotel
チャートを開きます。
複数の信号をログに記録するには、Shift キーを押しながらログ対象のステートを選択します。[シミュレーション] タブの [準備] で、[自己アクティビティのログ] を選択します。
ログ バッジ は、モデル内でログ記録される信号を示します。
出力端子を追加してチャートのアクティビティを監視できます。Stateflow エディターから、[シミュレーション] タブの [出力端子の追加] をクリックします。Stateflow チャートに新しい端子が表示されます。この端子をビューアーに接続して、チャートの子アクティビティを監視します。
ステートおよびデータ オブジェクトのログのプロパティをコマンド ラインからプログラムによって設定します。ステートまたはデータ オブジェクトのログ作成を有効にするには、オブジェクトのハンドルを取得して、その LoggingInfo.DataLogging
プロパティを 1
に設定します。Stateflow プログラム インターフェイスの詳細については、Loggingを参照してください。
たとえば、sf_semantics_hotel_checkin
モデルで、次を行います。
Hotel
チャートを開きます。
Dining_area
ステートのハンドルを取得します。
rt = sfroot; diningState = rt.find('-isa','Stateflow.State','Name','Dining_area');
ローカル データ service
のハンドルを取得します。
serviceData = rt.find('-isa','Stateflow.Data','Name','service');
Dining_area
ステートと service
データのログ作成を有効にします。
diningState.LoggingInfo.DataLogging = 1; serviceData.LoggingInfo.DataLogging = 1;
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 ワークスペースで、ログ データを表示できます。
モデルをシミュレートすると、[シミュレーション データ インスペクター] アイコンが強調表示されて、新しいシミュレーション データがあることが示されます。
シミュレーション データ インスペクターを開くには、[シミュレーション] タブで、アイコン をクリックします。
シミュレーション中にログに記録された信号を検証して比較します。シミュレーション データ インスペクターを参照してください。
モデルをシミュレートすると、[ロジック アナライザー] アイコンが強調表示されて、新しいシミュレーション データがあることが示されます。ロジック アナライザーを使用するには、DSP System Toolbox™ または SoC Blockset™ がなければなりません。
ロジック アナライザーを開くには、[シミュレーション] タブで、アイコン をクリックします。
シミュレーション中にログに記録されたステートの表示、測定、比較を行います。ロジック アナライザー (DSP System Toolbox)を参照してください。
信号のログ オブジェクトにアクセスするには、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
ログが作成された要素にアクセスするには、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]
ログ データおよびログが作成された各要素の時間にアクセスするには、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;
A
を単一のコマンドで更新すると、
A = 1;
i
と j
のすべての値に関して、コマンドが A[i][j] = 1
を暗示している場合であっても同じです。エクスターナル モードでモデルをシミュレートする場合、Stateflow データのログ作成はサポートされません。
[高速リスタート] が有効なチャートからステート アクティビティやデータのログを作成すると、最初の実行以降のすべての実行で、最初にログが作成されたデータ点が重複します。このようなデータ点を使用するアルゴリズムでは、この重複を考慮しなければなりません。
get
| plot
| Simulink.SimulationData.Dataset
| Stateflow.SimulationData.Data
| Stateflow.SimulationData.State
| table
| xlswrite