exponenta event banner

Создание отчета генератора отчетов Simulink

API Simulink ® Report Generator™ Report содержит набор объектов, предназначенных для поиска и форматирования данных модели и моделирования. Эти объекты можно использовать с объектами MATLAB ® Report 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 = 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 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);
     

    Примечание

    Симуляторы могут работать в режиме массива или итератора. В режиме массива используйте поисковик find функция для возврата результатов поиска в виде массива результатов. В режиме итератора используйте искатель 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);

См. также