Simulink® Report Generator™ Report API содержит набор объектов, предназначенных для поиска и форматирования модели и данных моделирования. Можно использовать эти объекты с MATLAB® Сообщите объекты API и DOM API, чтобы создать программы MATLAB, которые генерируют отчеты о моделях и симуляциях Simulink. Следующий пример иллюстрирует использование Simulink Report API и MATLAB Report API для создания программы MATLAB. Эта программа генерирует отчет о содержимом модели Simulink. В докладе содержатся следующие разделы:
Титульная страница
Таблица
Корневая системная глава - Содержит корневую блок-схему и свойства каждого блока в корневой схеме
Глава подсистем -- Содержит схему и свойства блоков каждой подсистемы модели
Stateflow® Глава графиков - Содержит графики и свойства объектов графика каждого графика в модели
Импортируйте функции API.
Чтобы исключить необходимость использования полных имен функций Report, Finder и DOM API, используйте эти операторы. Например, вместо использования slreportgen.finder.BlockFinder
, можно использовать BlockFinder
.
import slreportgen.report.* import slreportgen.finder.* import mlreportgen.report.*
Загрузите slrgex_sf_car
модель.
model = load_system('slrgex_sf_car');
Создайте объект отчета.
Используйте конструктор отчета 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
.
Добавить страницу заголовка.
Используйте заголовок конструктор репортеров страниц (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
.
Добавить таблицы содержимого.
Используйте конструктор репортера таблицы содержимого (TOC) для создания репортера TOC. Этот репортер генерирует TOC для отчета. Добавьте репортера TOC в отчет.
toc = TableOfContents; append(rpt,toc);
Для настройки таблицы содержимого смотрите mlreportgen.report.TableOfContents
.
Добавьте главу для корневой системы.
Используйте конструктор глав (mlreportgen.report.Chapter
), чтобы создать главу reporter. Этот репортер генерирует главу, основанную на его Title
и Content
свойства. Автор автоматически назначает заголовок главы. Глава reporter также генерирует верхние и нижние колонтитулы страниц и их номера.
Добавьте репортер диаграммы модели в главу. Этот репортер возвращает изображение блока модели, которую вы добавляете к главе.
ch = Chapter("Title","RootSystem"); append(ch,Diagram(model));
Для получения информации о настройке глав см. mlreportgen.report.Chapter
.
Добавьте разделы глав для каждого корневого системного блока.
Используйте конструктор поиска блоков (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
, соответственно.
Добавьте главу для подсистем.
Создайте главу для подсистем модели и блоков в каждой подсистеме.
ch = Chapter("Title","Subsystems");
Найдите схемы подсистем в модели.
Найдите все схемы подсистем в модели. Искатель возвращает массив DiagramResult
объекты, каждый из которых содержит Diagram
reporter, который создает снимок подсистемы.
sysdiagFinder = SystemDiagramFinder(model); sysdiagFinder.IncludeRoot = false;
Для получения дополнительной информации смотрите slreportgen.finder.SystemDiagramFinder
и slreportgen.finder.DiagramResult
Добавьте результаты в разделы главы.
Используя циклы, создайте раздел главы для каждой подсистемы. Найдите блоки и элементы блоков в каждой подсистеме. Добавьте таблицу элементов блоков к каждому разделу главы и добавьте каждый раздел к главе. Затем добавьте главу в отчет.
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
функции для возврата результатов поиска один за другим. Используйте режим итератора при поиске схем в моделях, которые имеют много модели-ссылки. Режим итератора закрывает модель после компиляции и поиска, в то время как режим поиска сохраняет все модели, которые он ищет, открытыми. Наличие многих открытых моделей потенциально может потреблять всю системную память и медленную генерацию отчетов. Хотя модель, используемая в этом примере, не содержит моделей-ссылок, пример использует режим итератора, чтобы проиллюстрировать его синтаксис.
Добавьте главу для диаграмм и объектов 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
.
Закройте отчет, запустите отчет и закройте модель.
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);