Main Content

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

Simulink Report Generator レポートの作成

Simulink® Report Generator™ レポート API は、モデルとシミュレーション データを検索し書式設定するよう設計された、一連のオブジェクトから構成されています。これらのオブジェクトを MATLAB® レポート API オブジェクトおよび DOM API オブジェクトと共に使用して、Simulink のモデルとシミュレーションに関するレポートを生成する MATLAB プログラムを作成できます。次の例では、Simulink レポート API と MATLAB レポート API を使用して MATLAB プログラムを作成する方法を説明します。このプログラムは、Simulink モデルのコンテンツに関するレポートを生成します。レポートには次のセクションが含まれます。

  • タイトル ページ

  • 目次

  • ルート システムの章 — ルート ブロック線図と、ルート ブロック線図内にある各ブロックのプロパティが含まれる

  • サブシステムの章 — モデルの各サブシステムのブロック線図とブロック プロパティが含まれる

  • Stateflow® チャートの章 — モデル内のチャートと各チャートのチャート オブジェクトのプロパティが含まれる

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

openExample('rptgenext/SimulinkReportGeneratorFilesExample');
  1. API 関数をインポートします。

    レポート API、ファインダー API、DOM API の関数の完全修飾名を使用する必要をなくすには、次のステートメントを使用します。たとえば、slreportgen.finder.BlockFinder を使用する代わりに、BlockFinder を使用できます。

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

    model = load_system('sf_car');
    
  3. レポート オブジェクトを作成します。

    Simulink レポート コンストラクター (slreportgen.report.Report) を使用して、レポートの内容を保持するレポート オブジェクトを作成します。このコンストラクターと MATLAB レポート コンストラクター (mlreportgen.report.Report) を区別するには、コンストラクターの名前を完全に修飾しなければなりません。レポートの名前を、sdd_ の後にモデルの Name プロパティの値が続くよう設定します。

    rpt = slreportgen.report.Report(['sdd_'...
        get_param('sf_car','Name')],'pdf');
    

    レポート全体に適用するプロパティをカスタマイズするには、slreportgen.report.Report を参照してください。

  4. タイトル ページを追加します。

    タイトル ページ レポーター コンストラクター (mlreportgen.report.TitlePage) を使用して、タイトル ページ レポーターを作成します。このレポーターはプロパティに基づいてタイトル ページを生成します。TitleSubtitle、および 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 を参照してください。

  5. 目次を追加します。

    目次 (TOC) レポーター コンストラクターを使用して目次レポーターを作成します。このレポーターは、レポートの目次を生成します。目次レポーターをレポートに追加します。

    toc = TableOfContents;
    append(rpt,toc);

    目次をカスタマイズするには、mlreportgen.report.TableOfContents を参照してください。

  6. ルート システムの章を追加します。

    章コンストラクター (mlreportgen.report.Chapter) を使用して章レポーターを作成します。このレポーターは、その Title プロパティと Content プロパティに基づいて章を生成します。レポーターは、自動的に章タイトルに番号を付けます。章レポーターは、章ページのヘッダーとフッターおよびそのページ番号も生成します。

    モデルのブロック線図レポーターを章に追加します。このレポーターは、章に追加するモデルのブロック線図のイメージを返します。

    ch = Chapter("Title","RootSystem");
    append(ch,Diagram(model));

    章のカスタマイズの詳細については、mlreportgen.report.Chapter を参照してください。

  7. 各ルート システム ブロックの章内の節を追加します。

    ブロック ファインダー コンストラクター (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 をそれぞれ参照してください。

  8. サブシステムの章を追加します。

    モデルのサブシステムと各サブシステム内のブロックについての章を作成します。

    ch = Chapter("Title","Subsystems");
  9. モデル内のサブシステムのブロック線図を検索します。

    モデル内のサブシステムのブロック線図をすべて検索します。ファインダーは、DiagramResult オブジェクトの配列を返します。それぞれのオブジェクトには、サブシステムのブロック線図のスナップショットを作成する Diagram レポーターが含まれます。

    sysdiagFinder = SystemDiagramFinder(model);
    sysdiagFinder.IncludeRoot = false;

    詳細については、slreportgen.finder.SystemDiagramFinder およびslreportgen.finder.DiagramResult を参照してください。

  10. 結果を章内の節に追加します。

    ループを使用して、各サブシステムについて、章内の節を作成します。各サブシステムでブロックとブロック要素を検索します。ブロック要素のテーブルを章内の各節に追加し、各節を章に追加します。その後、章をレポートに追加します。

    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 つずつ返します。多くのモデル参照をもつモデル内のブロック線図を検索する場合は、反復子モードを使用します。反復子モードではモデルのコンパイルと検索の後にモデルを閉じますが、検索モードでは検索したすべてのモデルを開いたままにします。開いたモデルが多数あると、すべてのシステム メモリを消費し、レポート生成が遅くなる可能性があります。この例で使用するモデルにはモデル参照はありませんが、反復子モードを使用して構文を説明しています。

  11. 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 を参照してください。

  12. レポートを閉じて、レポートを実行し、モデルを閉じます。

    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);

参考