Создайте отчет 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);
    append(rpt,tp);
    

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

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

    Используйте конструктора генератора отчетов оглавления (TOC), чтобы создать генератор отчетов TOC. Этот генератор отчетов генерирует TOC для отчета. Добавьте генератор отчетов 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), каждый из которых содержит блок.

    Цикл через объекты результата блока. Для каждого результата создайте генератор отчетов раздела (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 функции, чтобы возвратить результаты поиска один за другим. Используйте режим итератора при поиске схем в моделях, которые имеют много моделей - ссылок. Режим Iterator закрывает модель после компиляции и поиска его, тогда как находят, что режим сохраняет все модели, которые это ищет открытый. Наличие многих открытых моделей может потенциально использовать всю системную память и замедлить генерацию отчета. Несмотря на то, что модель, используемая в этом примере, не содержит модели - ссылки, пример использует режим итератора, чтобы проиллюстрировать его синтаксис.

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

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