exponenta event banner

Создание отчетов для элементов Simulink и Stateflow

Поисковики и репортеры сокращают время и сложность, необходимые для написания кода для поиска и создания отчетов по элементам модели Simulink ®, таким как диаграммы и блоки, а также по диаграммам и переходам Stateflow ® и т.д. API Simulink Report Generator™ Report является слоем поверх API DOM. Его поисковики и репортеры основаны на базовом классе поиска Simulink и Stateflow. Указывается контейнер для поиска определенных элементов, например блоков в подсистеме или состояний в диаграмме. Объекты поиска возвращают свои результаты в соответствующий массив объектов результатов поиска.

API Simulink Report также включает в себя классы репортеров, которые возвращают изображение контейнера. Это изображение является верхним уровнем модели.

Каждый объект результата, возвращенный поисковиком, имеет связанный объект reporter, который сообщает об этих результатах. Объект reporter содержит содержимое и форматирует его, например, таблицы свойств и графики данных. Объекты reporter добавляются в отчеты. Для определения общих элементов отчета используйте отчеты MATLAB ® Report API. Смотрите «Что такое репортер?» для информации.

Все поисковики и репортеры имеют следующие особенности:

  • Поведение и значения по умолчанию

  • Разрешить переопределение и настройку их выходных данных

Все поисковики имеют find, hasNext, и next методы. find метод находит и возвращает в массиве результирующих объектов все элементы для каждого найденного элемента указанного типа. hasNext и next методы находят и возвращают один элемент за раз и используются для итерации по списку результатов. hasNext проверяет, имеет ли контейнер хотя бы один из элементов указанного типа. Если контейнер имеет один или несколько элементов, то hasNext метод ставит его в очередь для next метод для поиска и возврата в качестве результирующего объекта.

Все репортеры имеют предопределенные шаблоны. Шаблон для каждого репортера определяет его форматирование, макет и отверстия содержимого. Нет необходимости изменять шаблон или задавать любые форматы, компоновки или отверстия, если не требуется пользовательский отчет. Можно настроить отчет, скопировав и отредактировав его шаблон по умолчанию или используя новый шаблон. Редактирование копии шаблона по умолчанию дает начальную точку и структуру для настройки шаблона. Использование нового шаблона позволяет полностью определить шаблон, начиная с пустого файла. Чтобы изменить порядок содержимого отчета, измените порядок отверстий в шаблоне. Поисковики не используют шаблоны. Другой способ настроить класс репортера - это его подкласс.

Шаблоны отчетов по умолчанию для каждого типа вывода находятся в библиотеке шаблонов, которая составляет

matlab\toolbox\shared\slreportgen\rpt\rpt\+slreportgen\
    +report\@<reporter>\resources\templates\<output>
Например, путь к шаблону по умолчанию для DiagramReporter для вывода в формате PDF:
matlab\toolbox\shared\slreportgen\rpt\rpt\+slreportgen\
    +report\@DiagramReporter\resources\templates\pdf\default.pdftx
Подробный пример редактирования шаблона см. в разделе «Настройка шаблона API отчета» документа Что такое Reporter?

Классы API отчетов Simulink

API Simulink Report предоставляет эти классы поиска, результатов и отчетов. Для использования этих классов в программе генератора отчетов необходимо создать контейнер типа slreportgen.report.Report для хранения отчета.

Классы поиска и результатов

Класс API отчетовОписание
slreportgen.finder.AnnotationFinderПоиск аннотаций блок-схемы Simulink.
slreportgen.finder.BlockFinderПоиск блоков в блок-схеме Simulink.
slreportgen.finder.BlockResultСодержит блок, найденный BlockFinder объект.
slreportgen.finder.ChartDiagramFinderПоиск диаграмм Stateflow в модели.
slreportgen.finder.DataDictionaryFinderПоиск словарей данных Simulink.
slreportgen.finder.DataDictionaryResultСодержит словарь данных, найденный DataDictionary объект.
slreportgen.finder.DiagramElementFinderПоиск элементов блок-схемы Simulink или диаграммы Stateflow.
slreportgen.finder.DiagramElementResultСодержит элемент схемы, найденный DiagramElementFinder объект.
slreportgen.finder.DiagramFinderПоиск блок-схем и диаграмм в модели Simulink.
slreportgen.finder.DiagramResultСодержит диаграмму, найденную DiagramFinder объект.
slreportgen.finder.ModelVariableFinderПоиск переменных, используемых моделью Simulink.
slreportgen.finder.ModelVariableResultСодержит переменную модели, найденную ModelVariableFinder объект.
slreportgen.finder.SignalFinderПоиск сигналов, используемых моделью или блоком.
slreportgen.finder.SignalResultСодержит сигнал, найденный SignalFinder объект.
slreportgen.finder.StateFinderПоиск состояний в диаграмме Stateflow.
slreportgen.finder.StateflowDiagramElementFinderПоиск элементов диаграммы Stateflow.
slreportgen.finder.SystemDiagramFinderПоиск системных блок-схем в модели Simulink.

Классы репортеров

Класс API отчетовОписание
slreportgen.report.BusОтчеты о шинах, выбранных или созданных блоками Simulink.
slreportgen.report.BusObjectОтчеты о Simulink.Bus объекты, используемые моделью.
slreportgen.report.DataDictionaryОтчеты по словарю данных Simulink.
slreportgen.report.DiagramСоздает снимок блок-схемы Simulink или диаграммы Stateflow.
slreportgen.report.DocBlock

Отчеты по DocBlock Simulink.

slreportgen.report.ElementDiagramОтчеты о моментальном снимке схемы элементов и подписи
slreportgen.report.ExecutionOrderОтчеты о задачах модели или невиртуальной подсистемы и блоках в каждой задаче, отсортированные по порядку выполнения.
slreportgen.report.LookupTableОтчеты о точках останова и точках вывода блока таблицы поиска Simulink.
slreportgen.report.MATLABFunction

Отчеты по MATLAB Function блок или функция Stateflow MATLAB.

slreportgen.report.ModelConfigurationОтчеты об активном наборе конфигурации модели.
slreportgen.report.ModelVariableОтчеты по переменной модели.
slreportgen.report.NotesОтчеты по заметкам диаграммы Simulink или Stateflow.
slreportgen.report.SignalСообщает о сигнале.
slreportgen.report.SimulinkObjectPropertiesСоздание таблицы свойств объекта Simulink.
slreportgen.report.StateflowObjectPropertiesСоздание таблицы свойств объекта Stateflow.
slreportgen.report.SystemHierarchyСоздание вложенного списка подсистем модели или подсистемы Simulink.
slreportgen.report.SystemIOОтчеты по входным и выходным сигналам системы Simulink.
slreportgen.report.TestSequence

Отчеты о блоке тестовой последовательности Simulink.

slreportgen.report.TruthTableОтчеты о блоке таблицы истинности Simulink или объекте таблицы истинности Stateflow.

Поиск и создание отчетов по блокам в модели

В этом примере показано, как найти все блоки Simulink в vdp модель с использованием BlockFinder класс. Полученный отчет HTML содержит информацию по умолчанию и использует форматирование по умолчанию для каждого блока.

  1. Импортируйте пакет API Report, который позволяет использовать имена классов, не включая их имена. Например, можно использовать BlockFinder вместо slreportgen.finder.BlockFinder. Помимо импорта базовых классов API Simulink Report, импортируйте базовый класс API MATLAB Report. Типичный отчет включает титульную страницу, оглавление, главы и разделы, которые включаются как классы репортеров в API отчетов MATLAB.

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

    model_name = 'vdp';
    load_system(model_name)
  3. Создайте объект-контейнер для хранения отчета и откройте отчет. В этом случае выходной отчет сохраняется в архиве vdp_model.htmx HTML-отчет. Можно использовать любое имя вывода. Если генератор отчетов запускается несколько раз с одним и тем же именем выходного файла, выходной файл перезаписывается. Для использования в программе-генераторе отчетов средств поиска и отчетов Simulink Report API необходимо использовать полное имя для создания объекта-контейнера.

    rpt = slreportgen.report.Report('vdp_model','html');
    open(rpt)
  4. Добавьте главу и укажите ее название.

    ch = Chapter('Blocks in Simulink vdp model');
  5. Используйте BlockFinder для создания поиска. В этом случае BlockFinder находит все блоки в модели. Используйте find для поиска блоков, указанных поисковиком.

    finder = BlockFinder(model_name); 
    results = find(finder);
    
  6. Выполните цикл по результатам метода поиска и создайте раздел для каждого блока, а затем добавьте таблицу свойств блока в раздел. Затем добавьте каждый раздел в главу. После добавления всех блоков добавьте главу в отчет.

    for result = results
         sect = Section('Title',result.Name);
         append(sect,result)
         append(ch,sect)
    end
    append(rpt,ch);
  7. Закройте отчет и модель и просмотрите отчет.

    close(rpt);
    close_system(model_name);
    rptview(rpt);

Полная программа:

import slreportgen.finder.*
import slreportgen.report.*
import mlreportgen.report.*

model_name = 'vdp';
load_system(model_name);

rpt = slreportgen.report.Report('vdp_model','html');
open(rpt)

ch = Chapter('Blocks in Simulink vdp model');
finder = BlockFinder(model_name); 
results = find(finder);
for result = results
     sect = Section('Title',result.Name);
     append(sect,result)
     append(ch,sect);
end
append(rpt,ch);

close(rpt)
close_system(model_name)
rptview(rpt)

Показаны заголовок главы и заголовки разделов и таблицы свойств первых двух блоков итогового отчета.

Использование определенных методов поиска и отчетов для различных типов блоков

Создание генератора отчетов PDF, который находит все блоки в sldemo_radar_eml модель.

Чтобы найти все блоки, используйте BlockFinder. if оператор показывает, как тестировать функциональные блоки MATLAB. Используйте MATLABFunction reporter, чтобы сообщить подробные данные функционального блока MATLAB. else оператор показывает, как блоки, отличные от функциональных блоков MATLAB, используют BlockFinder find результаты способа.

blkfinder = BlockFinder(model_name);
blks = find(blkfinder);

if slreportgen.utils.isMATLABFunction(blks(i).Object)
     rptr = MATLABFunction(blks(i).Object);
     sec = Section(blks(i).Name);
     append(sec,rptr)
     append(ch,sec)

else
     sec = Section(blks(i).Name);
     append(sec,blks(i)) 
     append(ch,sec)
blkfinder = BlockFinder(model_name);
blks = find(blkfinder);

Полная программа:

import slreportgen.report.*
import slreportgen.finder.*
import mlreportgen.report.*

model_name = 'sldemo_radar_eml';
load_system(model_name)

rpt = slreportgen.report.Report('radar','pdf');
open(rpt)

blkfinder = BlockFinder(model_name);
blks = find(blkfinder);
ch = Chapter('Blocks in sldemo_radar_eml Model');

for i=1:length(blks)
   if slreportgen.utils.isMATLABFunction(blks(i).Object)
      rptr = MATLABFunction(blks(i).Object);
      sec = Section(blks(i).Name);
      append(sec,rptr)
      append(ch,sec)
   else
      sec = Section(blks(i).Name);
      append(sec,blks(i)) 
      append(ch,sec)
   end
end
append(rpt,ch)

close(rpt)
close_system(model_name)
rptview(rpt)

Пример информации, сообщаемой для функционального блока MATLAB посредством MATLABFunction репортер -

Пример информации, сообщенной find способ BlockFinder является

Поиск и создание отчетов по элементам потока состояний

В этом примере описывается поиск состояний, переходов и соединений Stateflow и создание отчетов по ним. Он сообщает о control_logic график sldemo_fuelsys модель.

Эта часть кода использует StateFinder и его find метод поиска состояний в диаграмме и создания отчета о них. Он проходит через массив найденных состояний и добавляет каждое из них в главу.

stFinder = StateFinder(subsys);
states = find(stFinder);
for state = states
   append(chapter,state)
end
append(rpt,chapter)

Чтобы сообщить о переходах, используйте StateflowDiagramElementFinder и его find способ. Чтобы показать таблицу свойств с более узкой шириной, чем по умолчанию, настройте выходные данные. Сначала получите репортера для результата. Чтобы задать ширину, используйте TableWidth собственность репортера.

chapter = Chapter('Title','Transitions');
trFinder = StateflowDiagramElementFinder...
   ('Container',subsys,'Types','transition');
transitions = find(trFinder);
for transition = transitions
   rptr = transition.getReporter;
   rptr.PropertyTable.TableWidth = '3in'; 
   append(chapter,rptr)
end
append(rpt,chapter)

Полная программа:

import mlreportgen.report.*
import slreportgen.report.*
import slreportgen.finder.*

model_name = 'sldemo_fuelsys';
load_system(model_name);
subsys = strcat(model_name,...
   '/fuel_rate_control/control_logic');

rpt = slreportgen.report.Report('output','pdf');
open(rpt)

tp = TitlePage('Title',...
   'Control Logic Chart of sldemo_fuelsys');
append(rpt,tp)
append(rpt,TableOfContents);
   
chapter = Chapter('Title','States');
stFinder = StateFinder(subsys);
states = find(stFinder);
for state = states
   append(chapter,state)
end
append(rpt,chapter)

chapter = Chapter('Title','Transitions');
trFinder = StateflowDiagramElementFinder...
   ('Container',subsys,'Types','transition');
transitions = find(trFinder);
for transition = transitions
   rptr = transition.getReporter;
   rptr.PropertyTable.TableWidth = '3in'; 
   append(chapter,rptr)
end
append(rpt,chapter)

close(rpt)
close_system(model_name)
rptview(rpt)

См. также

Связанные темы