このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
Simulink Report Generator レポートの作成
Simulink® Report Generator™ レポート API は、モデルとシミュレーション データを検索し書式設定するよう設計された、一連のオブジェクトから構成されています。これらのオブジェクトを MATLAB® レポート API オブジェクトおよび DOM API オブジェクトと共に使用して、Simulink のモデルとシミュレーションに関するレポートを生成する MATLAB プログラムを作成できます。次の例では、Simulink レポート API と MATLAB レポート API を使用して MATLAB プログラムを作成する方法を説明します。このプログラムは、Simulink モデルのコンテンツに関するレポートを生成します。レポートには次のセクションが含まれます。
タイトル ページ
目次
ルート システムの章 — ルート ブロック線図と、ルート ブロック線図内にある各ブロックのプロパティが含まれる
サブシステムの章 — モデルの各サブシステムのブロック線図とブロック プロパティが含まれる
Stateflow® チャートの章 — モデル内のチャートと各チャートのチャート オブジェクトのプロパティが含まれる
次のコマンドを実行して、この例で使用するサポート ファイルにアクセスします。
openExample('rptgenext/SimulinkReportGeneratorFilesExample');
API 関数をインポートします。
レポート API、ファインダー API、DOM API の関数の完全修飾名を使用する必要をなくすには、次のステートメントを使用します。たとえば、
slreportgen.finder.BlockFinder
を使用する代わりに、BlockFinder
を使用できます。import slreportgen.report.* import slreportgen.finder.* import mlreportgen.report.*
sf_car
モデルを読み込みます。model = load_system('sf_car');
レポート オブジェクトを作成します。
Simulink レポート コンストラクター (
slreportgen.report.Report
) を使用して、レポートの内容を保持するレポート オブジェクトを作成します。このコンストラクターと MATLAB レポート コンストラクター (mlreportgen.report.Report
) を区別するには、コンストラクターの名前を完全に修飾しなければなりません。レポートの名前を、sdd_
の後にモデルのName
プロパティの値が続くよう設定します。rpt = slreportgen.report.Report(['sdd_'... get_param('sf_car','Name')],'pdf');
レポート全体に適用するプロパティをカスタマイズするには、
slreportgen.report.Report
を参照してください。タイトル ページを追加します。
タイトル ページ レポーター コンストラクター (
mlreportgen.report.TitlePage
) を使用して、タイトル ページ レポーターを作成します。このレポーターはプロパティに基づいてタイトル ページを生成します。Title
、Subtitle
、およびAuthor
の各プロパティを、レポート タイトル、サブタイトル、作成者を指定する文字配列にそれぞれ設定します。ブロック線図レポーター コンストラクター (
slreportgen.report.Diagram
) を使用して、このモデルのブロック線図レポーターを作成します。このレポーターは、モデルのブロック線図のイメージを生成します。このイメージをレポートのタイトル ページに含めるには、タイトル ページ レポーターのImage
プロパティにブロック線図レポーターを割り当てます。続いて、タイトル ページをレポートに追加します。tp = TitlePage; tp.Title = upper(get_param(model,'Name')); tp.Subtitle = 'System Design Description'; tp.Author = 'MathWorks'; tp.Image = Diagram(model); append(rpt,tp);
追加のタイトル ページ プロパティをカスタマイズするには、
mlreportgen.report.TitlePage
を参照してください。目次を追加します。
目次 (TOC) レポーター コンストラクターを使用して目次レポーターを作成します。このレポーターは、レポートの目次を生成します。目次レポーターをレポートに追加します。
toc = TableOfContents; append(rpt,toc);
目次をカスタマイズするには、
mlreportgen.report.TableOfContents
を参照してください。ルート システムの章を追加します。
章コンストラクター (
mlreportgen.report.Chapter
) を使用して章レポーターを作成します。このレポーターは、そのTitle
プロパティとContent
プロパティに基づいて章を生成します。レポーターは、自動的に章タイトルに番号を付けます。章レポーターは、章ページのヘッダーとフッターおよびそのページ番号も生成します。モデルのブロック線図レポーターを章に追加します。このレポーターは、章に追加するモデルのブロック線図のイメージを返します。
ch = Chapter("Title","RootSystem"); append(ch,Diagram(model));
章のカスタマイズの詳細については、
mlreportgen.report.Chapter
を参照してください。各ルート システム ブロックの章内の節を追加します。
ブロック ファインダー コンストラクター (
slreportgen.report.BlockFinder
) を使用して、ルートのブロック線図のブロック ファインダーを作成します。次に、ブロック ファインダーの関数find
を使用します。関数find
はブロックの結果オブジェクトの配列 (slreportgen.report.BlockResult
) を返します。各オブジェクトにはブロックが 1 つ含まれます。ブロックの結果オブジェクトをループ処理します。各結果に対して、節レポーター (
mlreportgen.report.Section
) を作成します。このレポーターは、そのTitle
プロパティとContent
プロパティに基づいて、番号付けされたレポートの節を生成します。節のTitle
プロパティを、節がレポートするブロックの名前に設定します。現在のブロックの結果を節レポーターに追加します。結果を追加することで、節レポーターの
Content
プロパティがsimulink.report.SimulinkObjectProperties
レポーターに設定されます。このSimulinkObjectProperties
レポーターは現在のブロックのプロパティ テーブルを生成し、テーブルはその後節に追加されます。各節を親の章に追加します。その後、章をレポートに追加します。blkFinder = BlockFinder(model); blocks = find(blkFinder); for block = blocks section = Section("Title", ... strrep(block.Name, newline,' ')); append(section,block); append(ch,section); end append(rpt,ch);
ブロックの検索および節のカスタマイズ方法の詳細については、
slreportgen.finder.BlockFinder
およびmlreportgen.report.Section
をそれぞれ参照してください。サブシステムの章を追加します。
モデルのサブシステムと各サブシステム内のブロックについての章を作成します。
ch = Chapter("Title","Subsystems");
モデル内のサブシステムのブロック線図を検索します。
モデル内のサブシステムのブロック線図をすべて検索します。ファインダーは、
DiagramResult
オブジェクトの配列を返します。それぞれのオブジェクトには、サブシステムのブロック線図のスナップショットを作成するDiagram
レポーターが含まれます。sysdiagFinder = SystemDiagramFinder(model); sysdiagFinder.IncludeRoot = false;
詳細については、
slreportgen.finder.SystemDiagramFinder
およびslreportgen.finder.DiagramResult
を参照してください。結果を章内の節に追加します。
ループを使用して、各サブシステムについて、章内の節を作成します。各サブシステムでブロックとブロック要素を検索します。ブロック要素のテーブルを章内の各節に追加し、各節を章に追加します。その後、章をレポートに追加します。
while hasNext(sysdiagFinder) system = next(sysdiagFinder); section1 = Section("Title",system.Name); append(section1,system); blkFinder1 = BlockFinder(system); elems = find(blkFinder1); for elem = elems section2 = Section("Title",... strrep(elem.Name,newline,' ')); append(section2,elem); append(section1,section2); end append(ch,section1); end append(rpt,ch);
メモ
Simulink ファインダーは、配列モードまたは反復子モードのいずれかで稼働できます。配列モードでは、ファインダー関数
find
を使用して、検索結果を配列として返します。反復子モードでは、ファインダー関数hasNext
およびnext
を使用して、検索結果を 1 つずつ返します。多くのモデル参照をもつモデル内のブロック線図を検索する場合は、反復子モードを使用します。反復子モードではモデルのコンパイルと検索の後にモデルを閉じますが、検索モードでは検索したすべてのモデルを開いたままにします。開いたモデルが多数あると、すべてのシステム メモリを消費し、レポート生成が遅くなる可能性があります。この例で使用するモデルにはモデル参照はありませんが、反復子モードを使用して構文を説明しています。Stateflow のチャートとオブジェクトの章を追加します。
モデル内のすべての Stateflow チャートを検索します。章を作成します。ループを使用して各チャートの節を追加します。各チャートのすべての要素を検索して、節にそれらを追加します。次に、節を章に追加し、章をレポートに追加します。
ch = Chapter("Title", "Stateflow Charts"); chdiagFinder = ChartDiagramFinder(model); while hasNext(chdiagFinder) chart = next(chdiagFinder); section = Section("Title",chart.Name); append(section,chart); objFinder = StateflowDiagramElementFinder(chart); sfObjects = find(objFinder); for sfObj = sfObjects title = sfObj.Name; if isempty(title) title = sfObj.Type; end objSection = Section("Title",title); append(objSection,sfObj); append(section,objSection); end append(ch,section); end append(rpt,ch);
チャートとブロック線図の要素のファインダーの詳細については、
slreportgen.finder.ChartDiagramFinder
およびslreportgen.finder.StateflowDiagramElementFinder
を参照してください。レポートを閉じて、レポートを実行し、モデルを閉じます。
close(rpt); rptview(rpt); close_system(model);
コードの完成形は、以下のようになります。
import slreportgen.report.* import slreportgen.finder.* import mlreportgen.report.* model = load_system('sf_car'); rpt = slreportgen.report.Report(['sdd_'... get_param('sf_car','Name')],'pdf'); tp = TitlePage; tp.Title = upper(get_param(model,'Name')); tp.Subtitle = 'System Design Description'; tp.Author = 'MathWorks'; tp.Image = Diagram(model); append(rpt,tp); toc = TableOfContents; append(rpt,toc); ch = Chapter("Title","RootSystem"); append(ch,Diagram(model)); blkFinder = BlockFinder(model); blocks = find(blkFinder); for block = blocks section = Section("Title", ... strrep(block.Name, newline, ' ')); append(section,block); append(ch,section); end append(rpt,ch); ch = Chapter("Title","Subsystems"); sysdiagFinder = SystemDiagramFinder(model); sysdiagFinder.IncludeRoot = false; while hasNext(sysdiagFinder) system = next(sysdiagFinder); section1 = Section("Title",system.Name); append(section1,system); blkFinder1 = BlockFinder(system); elems = find(blkFinder1); for elem = elems section2 = Section("Title",... strrep(elem.Name, newline, ' ')); append(section2,elem); append(section1,section2); end append(ch,section1); end append(rpt,ch); ch = Chapter("Title", "Stateflow Charts"); chdiagFinder = ChartDiagramFinder(model); while hasNext(chdiagFinder) chart = next(chdiagFinder); section = Section("Title",chart.Name); append(section,chart); objFinder = StateflowDiagramElementFinder(chart); sfObjects = find(objFinder); for sfObj = sfObjects title = sfObj.Name; if isempty(title) title = sfObj.Type; end objSection = Section("Title",title); append(objSection,sfObj); append(section,objSection); end append(ch,section); end append(rpt,ch); close(rpt); rptview(rpt); close_system(model);