Создайте отчет Simulink Report Generator

Simulink® Report Generator™ Report API включает набор объектов, разработанных, чтобы найти и отформатировать модель и данные моделирования. Можно использовать эти объекты с MATLAB® Report API, и ДОМ АПИ возражает, чтобы создать программы MATLAB, которые генерируют отчеты относительно моделей Simulink и симуляций. Следующий пример иллюстрирует использование Отчета Simulink АПИ и Отчет MATLAB АПИ, чтобы создать программу MATLAB. Эта программа генерирует отчет относительно содержимого модели Simulink. Отчет содержит эти разделы:

  • Титульный лист

  • Оглавление

  • Глава Корневой системы — Содержит корневую блок-схему и свойства каждого блока в корневой схеме

  • Глава подсистем - Содержит схему и свойства блока каждой подсистемы модели

  • Глава Графиков Stateflow® - Содержит графики и свойства объекта диаграммы каждого графика в модели

  1. Импортируйте API-функции.

    Чтобы избавить от необходимости использовать полностью определенные имена Отчета, Средство поиска и API-функции DOM, используют эти операторы. Например, вместо того, чтобы использовать 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), чтобы создать генератор отчетов титульного листа. Этот генератор отчетов генерирует титульный лист на основе своих свойств. Установите 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);
    add(rpt,tp);
    

    Чтобы настроить дополнительные свойства титульного листа, смотрите mlreportgen.report.TitlePage.

  5. Добавьте оглавление.

    Используйте конструктора генератора отчетов оглавления (TOC), чтобы создать генератор отчетов TOC. Этот генератор отчетов генерирует TOC для отчета. Добавьте генератор отчетов TOC в отчет.

    toc = TableOfContents;
    add(rpt,toc);

    Чтобы настроить оглавление, смотрите mlreportgen.report.TableOfContents.

  6. Добавьте главу для корневой системы.

    Используйте конструктора главы (mlreportgen.report.Chapter), чтобы создать генератор отчетов главы. Этот генератор отчетов генерирует главу на основе своих свойств Title и Content. Генератор отчетов автоматически нумерует заголовок главы. Генератор отчетов главы также генерирует верхние колонтитулы страницы главы и нижние колонтитулы и ее номера страниц.

    Добавьте генератор отчетов диаграммы модели в главу. Этот генератор отчетов возвращает изображение блок-схемы модели, которую вы добавляете в главу.

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

    Для получения информации о настройке глав смотрите mlreportgen.report.Chapter.

  7. Добавьте разделы главы для каждого блока корневой системы.

    Используйте конструктора средства поиска блока (slreportgen.report.BlockFinder), чтобы создать средство поиска блока для корневой схемы. Затем используйте функцию find средства поиска блока. Функция find возвращает массив объектов результата блока (slreportgen.report.BlockResult), каждый из которых содержит блок.

    Цикл через объекты результата блока. Для каждого результата создайте генератор отчетов раздела (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,' '));
        add(section,block);
        add(ch,section);
    end
    add(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);
        add(section1,system);
        
        blkFinder1 = BlockFinder(system);
        elems = find(blkFinder1);
        for elem = elems
           section2 = Section("Title",...
               strrep(elem.Name,newline,' '));
           add(section2,elem);
           add(section1,section2);
        end
        add(ch,section1);
    end
    add(rpt,ch);
     

    Примечание

    Средства поиска Simulink могут действовать или в массиве или в режиме итератора. В режиме массивов используйте средство поиска функция find, чтобы возвратить результаты поиска как массив результатов. В режиме итератора используйте средство поиска hasNext и функции next, чтобы возвратить результаты поиска один за другим. Используйте режим итератора при поиске схем в моделях, которые имеют много моделей - ссылок. Режим Iterator закрывает модель после компиляции и поиска его, тогда как находят, что режим сохраняет все модели, которые это ищет открытый. Наличие многих открытых моделей может потенциально использовать всю системную память и замедлить генерацию отчета. Несмотря на то, что модель, используемая в этом примере, не содержит модели - ссылки, пример использует режим итератора, чтобы проиллюстрировать его синтаксис.

  11. Добавьте главу для диаграмм Stateflow и объектов.

    Найдите все диаграммы Stateflow в модели. Создайте главу. Используя циклы, добавьте подразделы для каждого графика. Найдите все элементы в каждом графике и добавьте их в подразделы. Затем добавьте раздел в главу и главу к отчету.

    ch = Chapter("Title", "Stateflow Charts");
    
    chdiagFinder = ChartDiagramFinder(model);
    while hasNext(chdiagFinder) 
       chart = next(chdiagFinder); 
       section = Section("Title",chart.Name);
       add(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);
           add(objSection,sfObj);
           add(section,objSection);
       end
       add(ch,section);
    end
    add(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);
add(rpt,tp);
toc = TableOfContents;
add(rpt,toc);

ch = Chapter("Title","RootSystem");
add(ch,Diagram(model));
blkFinder = BlockFinder(model);
blocks = find(blkFinder);
for block = blocks
    section = Section("Title", ...
       strrep(block.Name, newline, ' '));
    add(section,block);
    add(ch,section);
end
add(rpt,ch);

ch = Chapter("Title","Subsystems");
sysdiagFinder = SystemDiagramFinder(model);
sysdiagFinder.IncludeRoot = false;

while hasNext(sysdiagFinder)
    system = next(sysdiagFinder);
    section1 = Section("Title",system.Name);
    add(section1,system);
    
    blkFinder1 = BlockFinder(system);
    elems = find(blkFinder1);
    for elem = elems
       section2 = Section("Title",...
           strrep(elem.Name, newline, ' '));
       add(section2,elem);
       add(section1,section2);
    end
    add(ch,section1);
end
add(rpt,ch);

ch = Chapter("Title", "Stateflow Charts");
chdiagFinder = ChartDiagramFinder(model);
while hasNext(chdiagFinder) 
   chart = next(chdiagFinder); 
   section = Section("Title",chart.Name);
   add(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);
       add(objSection,sfObj);
       add(section,objSection);
   end
   add(ch,section);
end
add(rpt,ch);

close(rpt);
rptview(rpt);
close_system(model);

Смотрите также

Для просмотра документации необходимо авторизоваться на сайте