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

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

  • Титульная страница

  • Таблица

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

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

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

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

    Чтобы исключить необходимость использования полных имен функций Report, Finder и DOM API, используйте эти операторы. Например, вместо использования slreportgen.finder.BlockFinder, можно использовать BlockFinder.

    import slreportgen.report.*
    import slreportgen.finder.*
    import mlreportgen.report.*
  2. Загрузите slrgex_sf_car модель.

    model = load_system('slrgex_sf_car');
    
  3. Создайте объект отчета.

    Используйте конструктор отчета Simulink (slreportgen.report.Report), чтобы создать объект отчета для хранения содержимого отчета. Необходимо полностью определить имя конструктора, чтобы отличить его от конструктора отчетов MATLAB (mlreportgen.report.Report). Установите имя отчета равным sdd_ далее указывается значение Name свойство модели.

    rpt = slreportgen.report.Report(['sdd_'...
        get_param('slrgex_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);
    append(rpt,tp);
    

    Для настройки дополнительных свойств страницы заголовка смотрите mlreportgen.report.TitlePage.

  5. Добавить таблицы содержимого.

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

    toc = TableOfContents;
    append(rpt,toc);

    Для настройки таблицы содержимого смотрите mlreportgen.report.TableOfContents.

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

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

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

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

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

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

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

    Цикл через объекты результата блока. Для каждого результата создайте репортер раздела (mlreportgen.report.Section). Этот репортер генерирует нумерованный раздел отчета на основе его Title и Content свойства. Установите сечение Title свойство имени блока, о котором он сообщает.

    Добавьте текущий результат блока в раздел reporter. Добавление результата устанавливает раздел reporter Content свойство для simulink.report.SimulinkObjectProperties репортер. Этот SimulinkObjectProperties reporter генерирует таблицу свойств текущего блока, которая затем добавляется в раздел. Добавьте каждый подразделом к родительской главе. Затем добавьте главу в отчет.

    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 reporter, который создает снимок подсистемы.

    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 finders могут работать или в режиме массива, или в режиме итератора. В режиме array используйте finder find функция для возврата результатов поиска в виде массива результатов. В режиме итератора используйте finder hasNext и next функции для возврата результатов поиска один за другим. Используйте режим итератора при поиске схем в моделях, которые имеют много модели-ссылки. Режим итератора закрывает модель после компиляции и поиска, в то время как режим поиска сохраняет все модели, которые он ищет, открытыми. Наличие многих открытых моделей потенциально может потреблять всю системную память и медленную генерацию отчетов. Хотя модель, используемая в этом примере, не содержит моделей-ссылок, пример использует режим итератора, чтобы проиллюстрировать его синтаксис.

  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('slrgex_sf_car');
rpt = slreportgen.report.Report(['sdd_'...
    get_param('slrgex_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);

См. также