Main Content

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

Simulink および Stateflow の要素用の Report Generator の作成

ファインダーとレポーターを使うと、ブロック線図やブロックなどの Simulink® モデル要素、および Stateflow® のチャートや遷移などを検索しレポートするためのコードの作成に必要な時間と複雑度が軽減されます。Simulink Report Generator™ レポート API は DOM API の上にある層です。そのファインダーとレポーターは Simulink および Stateflow の find 基底クラスを基にしています。サブシステム内のブロックやチャート内のステートなど、特定の要素を検索する対象となるコンテナーを指定します。ファインダー オブジェクトはその結果を、対応するファインダー結果オブジェクトの配列に返します。

Simulink レポート API には、コンテナーのイメージを返すレポーター クラスも含まれます。このイメージはモデルの最上位レベルです。

ファインダーから返される各結果オブジェクトには関連付けられたレポーター オブジェクトがあり、これらの結果をレポートします。レポーター オブジェクトはプロパティのテーブルやデータ プロットなどのコンテンツを保持し、コンテンツを書式設定します。レポーター オブジェクトをレポートに追加します。共通のレポート要素を定義するには、MATLAB® レポート API レポーターを使用します。詳細については、レポーターとはを参照してください。

すべてのファインダーとレポーターには次の機能があります。

  • 既定の動作と値

  • 出力のオーバーライドとカスタマイズの許可

すべてのファインダーには findhasNext、および next の各メソッドがあります。find メソッドは検索を実行し、指定されたタイプの検出要素それぞれについて、すべての要素を結果オブジェクトの配列で返します。hasNext メソッドと next メソッドは一度に 1 つの要素を見つけて返し、結果リストの反復処理に使用されます。hasNext メソッドは、指定されたタイプの要素が少なくとも 1 つコンテナーにあるかどうかをチェックします。コンテナーに 1 つ以上の要素がある場合は、next メソッドで検索して結果オブジェクトとして返されるよう、hasNext メソッドはこれをキューに入れます。

すべてのレポーターには事前定義されたテンプレートがあります。各レポーターのテンプレートで、書式設定、レイアウト、およびコンテンツのホールが定義されます。レポートをカスタマイズする場合を除き、テンプレートを変更する必要や、書式、レイアウト、ホールを指定する必要はありません。既定のテンプレートをコピーして編集するか、新しいテンプレートを使用することにより、レポートをカスタマイズできます。既定のテンプレートのコピーを編集すると、テンプレートをカスタマイズするための開始点と模範とする構造を得ることができます。新しいテンプレートを使用すると、空のファイルから始めて、独自のテンプレートを完全に定義することができます。レポートのコンテンツの順序を変更するには、テンプレートのホールを並べ替えます。ファインダーではテンプレートは使用しません。レポーター クラスをカスタマイズする別の方法は、これをサブクラス化することです。

各出力タイプの既定のレポーター テンプレートは、次の場所のテンプレート ライブラリにあります。

matlab\toolbox\shared\slreportgen\rpt\rpt\+slreportgen\
    +report\@<reporter>\resources\templates\<output>
たとえば、DiagramReporter の PDF 出力で用いる既定のテンプレートのパスは、次のとおりです。
matlab\toolbox\shared\slreportgen\rpt\rpt\+slreportgen\
    +report\@DiagramReporter\resources\templates\pdf\default.pdftx
テンプレートの編集の詳しい例は、レポーターとはの「レポーター要素」のセクションを参照してください。

Simulink レポート API クラス

Simulink レポート API は、以下のファインダー クラス、結果クラス、およびレポート クラスを提供します。これらのクラスを Report Generator プログラムで使用するには、レポートを保持するための、タイプ slreportgen.report.Report のコンテナーを作成する必要があります。

ファインダー クラスと結果クラス

レポート API クラス説明
slreportgen.finder.AnnotationFinderSimulink ブロック線図の注釈を検索します。
slreportgen.finder.BlockFinderSimulink ブロック線図内のブロックを検索します。
slreportgen.finder.BlockResultBlockFinder オブジェクトによって検出されたブロックが含まれます。
slreportgen.finder.ChartDiagramFinderモデル内の Stateflow チャートを検索します。
slreportgen.finder.DataDictionaryFinderSimulink データ ディクショナリを検索します。
slreportgen.finder.DataDictionaryResultDataDictionary オブジェクトによって検出されたデータ ディクショナリが含まれます。
slreportgen.finder.DiagramElementFinderSimulink ブロック線図または Stateflow チャートの要素を検索します。
slreportgen.finder.DiagramElementResultDiagramElementFinder オブジェクトによって検出されたブロック線図の要素が含まれます。
slreportgen.finder.DiagramFinderSimulink モデル内のブロック線図とチャートを検索します。
slreportgen.finder.DiagramResultDiagramFinder オブジェクトによって検出されたブロック線図が含まれます。
slreportgen.finder.ModelVariableFinderSimulink モデルで使用される変数を検索します。
slreportgen.finder.ModelVariableResultModelVariableFinder オブジェクトによって検出されたモデル変数が含まれます。
slreportgen.finder.SignalFinderモデルまたはブロックで使用される信号を検索します。
slreportgen.finder.SignalResultSignalFinder オブジェクトによって検出された信号が含まれます。
slreportgen.finder.StateFinderStateflow チャート内のステートを検索します。
slreportgen.finder.StateflowDiagramElementFinderStateflow チャートの要素を検索します。
slreportgen.finder.SystemDiagramFinderSimulink モデル内のシステム ブロック線図を検索します。

レポーター クラス

レポート API クラス説明
slreportgen.report.BusSimulink ブロックによって選択または作成されたバスについてレポートします。
slreportgen.report.BusObjectモデルで使用される Simulink.Bus オブジェクトについてレポートします。
slgreportgen.report.CCallerC Caller ブロックについてレポートします。
slreportgen.report.CFunctionC Function ブロックについてレポートします。
slreportgen.report.DataDictionarySimulink データ ディクショナリについてレポートします。
slreportgen.report.DiagramSimulink ブロック線図または Stateflow チャートのスナップショットを作成します。
slreportgen.report.DocBlock

Simulink DocBlock についてレポートします。

slreportgen.report.ElementDiagram要素のブロック線図のスナップショットと表題についてレポートします。
slreportgen.report.ExecutionOrderモデルまたは非バーチャル サブシステムのタスクと各タスクのブロックを実行順序で並べ替えてレポートします。
slreportgen.report.LookupTableSimulink Lookup Table ブロックのブレークポイントと出力ポイントについてレポートします。
slreportgen.report.MATLABFunction

MATLAB Function ブロックまたは Stateflow MATLAB 関数についてレポートします。

slreportgen.report.ModelConfigurationモデルのアクティブなコンフィギュレーション セットについてレポートします。
slreportgen.report.ModelVariableモデル変数についてレポートします。
slreportgen.report.NotesSimulink または Stateflow のブロック線図メモについてレポートします。
slreportgen.report.Signal信号についてレポートします。
slreportgen.report.SimulinkObjectPropertiesSimulink オブジェクトのプロパティのテーブルを作成します。
slreportgen.report.StateflowObjectPropertiesStateflow オブジェクトのプロパティのテーブルを作成します。
slreportgen.report.SystemHierarchySimulink のモデルまたはサブシステムについて、サブシステムの入れ子形式のリストを作成します。
slreportgen.report.SystemIOSimulink システム入出力信号についてレポートします。
slreportgen.report.TestSequence

Simulink Test Sequence ブロックについてレポートします。

slreportgen.report.TruthTableSimulink Truth Table ブロックまたは Stateflow Truth Table オブジェクトについてレポートします。

モデル内のブロックの検索とレポート

この例では、BlockFinder クラスを使用して、slrgex_vdp モデル内のすべての Simulink ブロックを検索してレポートする方法を説明します。結果の HTML レポートには既定の情報が含まれ、ブロックごとに既定の書式設定が使用されます。

次のコマンドを実行して、この例で使用するサポート ファイルにアクセスします。

openExample('rptgenext/SimulinkReportGeneratorFilesExample');
  1. レポート API パッケージをインポートしますが、これによりパッケージ名を含めずにクラス名を使用できるようになります。たとえば、slreportgen.finder.BlockFinder の代わりに BlockFinder を使用できます。Simulink レポート API の基底クラスに加えて、MATLAB レポート API の基底クラスもインポートします。一般的なレポートには、タイトル ページ、目次、章、節が含まれます。これらはレポーター クラスとして MATLAB レポート API に含めます。

    import slreportgen.finder.*
    import slreportgen.report.*
    import mlreportgen.report.*
  2. slrgex_vdp モデルを読み込みます。

    model_name = 'slrgex_vdp';
    load_system(model_name)
  3. レポートを保持するコンテナー オブジェクトを作成し、レポートを開きます。この場合、出力レポートは圧縮された slrgex_vdp_model.htmx HTML レポートで保存されています。任意の出力名を使用できます。同じ出力ファイル名を使用して Report Generator を複数回実行すると、出力ファイルは上書きされます。Simulink レポート API のファインダーとレポーターを Report Generator プログラムで使用するには、完全修飾名を使用してコンテナー オブジェクトを作成する必要があります。

    rpt = slreportgen.report.Report('slrgex_vdp_model','html');
    open(rpt)
  4. 章を追加し、そのタイトルを指定します。

    ch = Chapter('Blocks in slrgex_vdp model');
  5. BlockFinder クラスを使用してファインダーを作成します。この場合、BlockFinder はモデル内のすべてのブロックを検索します。find メソッドを使用して、ファインダーで指定されたブロックを検索します。

    finder = BlockFinder(model_name); 
    results = find(finder);
    
  6. find メソッドの結果をループ処理して各ブロックの節を作成し、各節にブロックのプロパティ テーブルを追加します。次に、各節を章に追加します。すべてのブロックを追加した後、章をレポートに追加します。

    for result = results
         sect = Section('Title',result.Name);
         append(sect,result)
         append(ch,sect)
    end
    append(rpt,ch);
  7. レポートとモデルを閉じ、レポートを表示します。

    close(rpt);
    close_system(model_name);
    rptview(rpt);

完全なプログラムは以下のとおりです。

import slreportgen.finder.*
import slreportgen.report.*
import mlreportgen.report.*

model_name = 'slrgex_vdp';
load_system(model_name);

rpt = slreportgen.report.Report('slrgex_vdp_model','html');
open(rpt)

ch = Chapter('Blocks in slrgex_vdp model');
finder = BlockFinder(model_name); 
results = find(finder);
for result = results
     sect = Section('Title',result.Name);
     append(sect,result)
     append(ch,sect);
end
append(rpt,ch);

close(rpt)
close_system(model_name)
rptview(rpt)

結果として得られるレポートの章の見出し、節の見出し、および最初の 2 つのブロックのプロパティ テーブルを以下に示します。

異なるブロック タイプに対する特定のファインダーとレポーターの使用

slrgex_radar_eml モデル内のすべてのブロックを検索する、PDF レポート ジェネレーターを作成します。

次のコマンドを実行して、この例で使用するサポート ファイルにアクセスします。

openExample('rptgenext/SimulinkReportGeneratorFilesExample');

すべてのブロックを検索するには、BlockFinder を使用します。if ステートメントは MATLAB Function ブロックのテスト方法を示しています。MATLABFunction レポーターを使用して、MATLAB Function ブロックの詳細をレポートします。else ステートメントは、MATLAB Function ブロック以外のブロックで BlockFinder find メソッドの結果がどのように使用されるかを示しています。

blkfinder = BlockFinder(model_name);
blks = find(blkfinder);

if slreportgen.utils.isMATLABFunction(blks(i).Object)
     rptr = MATLABFunction(blks(i).Object);
     sec = Section(blks(i).Name);
     append(sec,rptr)
     append(ch,sec)

else
     sec = Section(blks(i).Name);
     append(sec,blks(i)) 
     append(ch,sec)
blkfinder = BlockFinder(model_name);
blks = find(blkfinder);

完全なプログラムは以下のとおりです。

import slreportgen.report.*
import slreportgen.finder.*
import mlreportgen.report.*

model_name = 'slrgex_radar_eml';
load_system(model_name)

rpt = slreportgen.report.Report('radar','pdf');
open(rpt)

blkfinder = BlockFinder(model_name);
blks = find(blkfinder);
ch = Chapter('Blocks in slrgex_radar_eml Model');

for i=1:length(blks)
   if slreportgen.utils.isMATLABFunction(blks(i).Object)
      rptr = MATLABFunction(blks(i).Object);
      sec = Section(blks(i).Name);
      append(sec,rptr)
      append(ch,sec)
   else
      sec = Section(blks(i).Name);
      append(sec,blks(i)) 
      append(ch,sec)
   end
end
append(rpt,ch)

close(rpt)
close_system(model_name)
rptview(rpt)

MATLAB Function ブロックについて MATLABFunction レポーターによりレポートされた情報の例を以下に示します。

BlockFinderfind メソッドによってレポートされた情報の例を以下に示します。

Stateflow 要素の検索とレポート

この例では、Stateflow のステート、遷移、およびジャンクションについて検索し、レポートする方法を説明します。slrgex_fuelsys_fuel_rate_control モデルの control_logic チャートについてレポートします。

次のコマンドを実行して、この例で使用するサポート ファイルにアクセスします。

openExample('rptgenext/SimulinkReportGeneratorFilesExample');

コードのこの部分では、StateFinder オブジェクトとその find メソッドを使用してチャート内のステートを検索し、レポートします。検出されたステートの配列をループ処理し、各ステートを章に追加します。

stFinder = StateFinder(subsys);
states = find(stFinder);
for state = states
   append(chapter,state)
end
append(rpt,chapter)

遷移についてレポートするには、StateflowDiagramElementFinder オブジェクトとその find メソッドを使用します。プロパティ テーブルを既定より狭い幅で表示するには、出力をカスタマイズします。まず、結果のレポーターを取得します。幅を設定するには、レポーターの TableWidth プロパティを使用します。

chapter = Chapter("Title","Transitions");
trFinder = StateflowDiagramElementFinder...
   ("Container",subsys,"Types","transition");
transitions = find(trFinder);
for transition = transitions
   rptr = transition.getReporter;
   rptr.PropertyTable.TableWidth = "3in"; 
   append(chapter,rptr)
end
append(rpt,chapter)

完全なプログラムは以下のとおりです。

import mlreportgen.report.*
import slreportgen.report.*
import slreportgen.finder.*

model_name = "slrgex_fuelsys_fuel_rate_control";
load_system(model_name);
subsys = "slrgex_fuelsys_fuel_rate_control/control_logic";

rpt = slreportgen.report.Report("output","pdf");
open(rpt)

tp = TitlePage("Title",...
   "Control Logic Chart of slrgex_fuelsys_fuel_rate_control");
append(rpt,tp)
append(rpt,TableOfContents);
   
chapter = Chapter("Title","States");
stFinder = StateFinder(subsys);
states = find(stFinder);
for state = states
   append(chapter,state)
end
append(rpt,chapter)

chapter = Chapter("Title","Transitions");
trFinder = StateflowDiagramElementFinder...
   ("Container",subsys,"Types","transition");
transitions = find(trFinder);
for transition = transitions
   rptr = transition.getReporter;
   rptr.PropertyTable.TableWidth = "3in"; 
   append(chapter,rptr)
end
append(rpt,chapter)

close(rpt)
close_system(model_name)
rptview(rpt)

参考

関連するトピック