使用报告 API 生成系统设计报告
本示例展示如何基于报告 API 生成系统设计报告。系统设计报告是从系统的 Simulink® 模型生成的动态系统设计的描述。
基于报告 API 的系统设计报告使用报告 API 类的对象来报告系统组件。请参阅为 Simulink 和 Stateflow 元素创建报告生成器。
gensdd
函数
此示例中包含的 gensdd
函数生成包含以下节的报告:
标题页面
目录
图窗列表
表列表
系统层次结构
根系统章节,包含根模块图、模型注释(如有)、任务和模块执行顺序,以及根图中每个模块的属性。
子系统章节,包含模型子系统的图、模型注释(如有)、模块执行顺序和模块属性。
图章节包含每个模型图的图和图对象属性
包含模型变量的设计数据章节
系统模型配置章节包含有关模型活动配置集的详细信息
完整的 gensdd
函数列在本示例末尾。您可以修改 gensdd.m
file
来创建自定义系统设计报告。
为 sf_car
模型生成 PDF 系统设计报告
为 sf_car
模型生成系统设计报告,并指定文档为 PDF。
gensdd("sf_car","PDF");
以下是报告的第一页:
此示例包括文件 sdd_sf_car_copy.pdf
中的报告副本。
自定义报告
gensdd
函数使用这些报告 API 类的对象来查找系统设计元素并报告系统设计:
报告器类
查找器和结果类
您可以使用这些对象的属性来过滤和格式化报告的信息。例如,在 makeSystemHierarchy
文件中的 gensdd.m
函数中,可以通过设置 istFormatter
报告器的 Lslreportgen.report.SystemHierarchy
属性将系统层次结构列表格式更改为有序列表。
function makeSystemHierarchy(rpt, hModel) % Create a chapter reporting on the system hiearchy import mlreportgen.report.* import slreportgen.report.* ch = Chapter("Title", "System Hierarchy"); ol = mlreportgen.dom.OrderedList(); add(ch,SystemHierarchy("Source",hModel,"ListFormatter",ol)); add(rpt, ch); end
该报告还使用这些报告 API 类的对象来创建和格式化报告的各个节:
您可以自定义报告和节的外观。请参阅报告格式化方法。
完整的 gensdd
函数
type gensdd.m
function gensdd(model,doctype) %GENSDD Generates a system design description from the system"s model % gensdd() generates a PDF system design description for the sf_car % model. % % gensdd(model) generates a PDF system design description for the % specified model. % % gensdd(model, doctype) generates a system design description % document from the specified model and document type: "html", % "docx", or "pdf". % % The generated document is a description of a dynamic system"s design % generated from its Simulink model. The description contains the % following sections: % % * Title Page % * Table of Contents % * List of Figures % * List of Tables % * System Hierarchy % * Root System Chapter -- Contains root block diagram, notes % (if any), task and block execution order, and properties of each % block in the root diagram. % * Subsystems Chapter -- Contains diagram, , notes (if any), block % execution order, and block properties of the subsystems. % * Charts Chapter -- Contains charts and chart object properties of % each of the charts in the model. % * Design Data Chapter -- Contains the model variables. % * System Model Configuration Chapter -- Contains details about the % active configuration set for the model. import mlreportgen.dom.* import mlreportgen.report.* import slreportgen.report.* if nargin < 1 model = "sf_car"; doctype = "pdf"; end if nargin < 2 doctype = "pdf"; end hModel = load_system(model); rpt = slreportgen.report.Report(... "sdd_" + get_param(model, "Name"), doctype); open(rpt); makeTitlePage(rpt, hModel); add(rpt, TableOfContents); add(rpt, ListOfFigures); add(rpt, ListOfTables); makeSystemHierarchy(rpt, hModel); makeRootSystemChapter(rpt, hModel); makeSubsystemsChapter(rpt, hModel); makeChartsChapter(rpt, hModel); makeDesignDataChapter(rpt, hModel); makeModelConfigurationChapter(rpt, hModel); close(rpt); rptview(rpt); close_system(model); end function makeTitlePage(rpt, hModel) import mlreportgen.report.* import slreportgen.report.* tp = TitlePage; tp.Title = upper(get_param(hModel, "Name")); tp.Subtitle = "System Design Description"; tp.Author = "John Doe"; diag = Diagram(hModel); diag.Scaling = "custom"; diag.Height = "2in"; diag.Width = "3in"; tp.Image = getSnapshotImage(diag, rpt); add(rpt, tp); end function makeSystemHierarchy(rpt, hModel) % Create a chapter reporting on the system hierarchy import mlreportgen.report.* import slreportgen.report.* ch = Chapter("Title", "System Hierarchy"); add(ch,SystemHierarchy(hModel)); add(rpt, ch); end function makeRootSystemChapter(rpt, hModel) % Create a chapter reporting on the root system diagram and its blocks % and add the chapter to the main report. import mlreportgen.report.* import slreportgen.report.* import slreportgen.finder.* ch = Chapter("Title", "Root System"); diag = Diagram(hModel); add(ch, diag); add(ch, SystemIO(hModel)); % If model has notes, add Notes section makeNotesSection(ch, hModel); % Add block execution order section makeExecutionOrderSection(ch, hModel); % Add subsections containing the properties for each block in the % subsystem diagram. makeBlockSections(ch, hModel); add(rpt, ch); end function makeSubsystemsChapter(rpt, hModel) % Create a chapter reporting on the subsystems and the blocks that % they contain and add the chapter to the main report. import mlreportgen.report.* import slreportgen.report.* import slreportgen.finder.* % Create a chapter to hold the subsystems. ch = Chapter("Title", "Subsystems"); % Use a finder to find all the subsystem diagrams in the model. The % finder returns an array of SystemDiagramResult objects, each of which % contains a Diagram reporter that creates a snapshot of the subsystem % diagram finder = SystemDiagramFinder(hModel); finder.IncludeRoot = false; systems = find(finder); % Add the subsystem diagram results to the chapter. for system = systems % Create a subsection to contain the subsystem diagram. section = Section("Title", system.Name); % Add the subsystem diagram reporter to the diagram subsection. % Add the subsystem diagram results to the chapter. diag = getReporter(system); diag.MaskedSystemLinkPolicy = "system"; add(section, diag); % If subsystem has notes, add Notes section makeNotesSection(section, system) ioSect = Section("Title", "System Interface"); add(ioSect, SystemIO("Object", system, "ShowDetails", false)); add(section, ioSect); % If the subsystem is nonvirtual, add a subsection detailing the % block execution order if strcmp(system.Type, "Simulink.BlockDiagram") || ... strcmp(get_param(system.Object, ... "IsSubsystemVirtual"), "off") makeExecutionOrderSection(section, system); end % Add subsections containing the properties for each block in the % subsystem diagram. makeBlockSections(section, system); % Add the subsystem diagram section to the chapter. add(ch, section); end % Add the subsystems chapter to the main report. add(rpt, ch); end function makeChartsChapter(rpt, hModel) % Create a chapter reporting on the Stateflow charts and the % objects that they contain and add the chapter to the main report. import mlreportgen.report.* import slreportgen.report.* import slreportgen.finder.* finder = ChartDiagramFinder(hModel); charts = find(finder); if ~isempty(charts) ch = Chapter("Title", "Charts"); for chart = charts section = Section("Title", chart.Name); diag = getReporter(chart); add(section, diag); % Report the objects in this chart objFinder = StateflowDiagramElementFinder(chart); sfObjects = find(objFinder); for sfObj = sfObjects objSection = Section("Title", sfObj.Name); add(objSection, sfObj); add(section, objSection); end add(ch, section); end add(rpt, ch); end end function makeDesignDataChapter(rpt, hModel) % Create a chapter reporting on the model variables import mlreportgen.dom.* import mlreportgen.report.* import slreportgen.report.* import slreportgen.finder.* ch = Chapter("Title", "Design Data"); finder = ModelVariableFinder(hModel); results = find(finder); n = numel(results); if n > 0 s = Section("Title", "Design Data Summary"); vars = cell(n, 4); for i = 1:n result = results(i); % Get link target for variable reporter lt = getVariableID(result); value = getVariableValue(results(i)); vars{i, 1} = InternalLink(lt, results(i).Name); vars{i, 2} = class(value); vars{i, 3} = results(i).Source; vars{i, 4} = results(i).SourceType; end t = FormalTable(["Name", "Type", "Source", "Source Type"], vars); % Set styles for table header t.Header.TableEntriesStyle = {Bold, BackgroundColor("lightgrey")}; % Set styles for entire table t.Width = "100%"; t.Border = "solid"; t.RowSep = "solid"; t.ColSep = "solid"; add(s, t); add(ch, s); s = Section("Title", "Design Data Details"); % Separate multiple variable details be a horizontal rule if n > 1 for result = results(1:end-1) add(s, result); add(s, HorizontalRule); end end add(s, results(end)); add(ch, s); add(rpt, ch); end end function makeModelConfigurationChapter(rpt, hModel) % Create a chapter reporting on the active configuration set of the % reported model. import mlreportgen.report.* import slreportgen.report.* ch = Chapter("Title", "System Model Configuration"); modelConfig = ModelConfiguration(hModel); % Add the reporter to the chapter and chapter to the report add(ch,modelConfig); add(rpt,ch); end function section = makeBlockSections(parent, system) % Create subsections containing the properties of each block in the % system and add it to the parent chapter or subsection. import mlreportgen.report.* import slreportgen.finder.* blocksSection = Section("Title", "Blocks"); finder = BlockFinder(system); elems = find(finder); for elem = elems section = Section("Title", strrep(elem.Name, newline, " ")); add(section, elem); % If this block creates a bus or selects signals from a bus, report % the bus signal details busRptr = slreportgen.report.Bus(elem); add(section, busRptr); add(blocksSection, section); end add(parent, blocksSection); end function makeExecutionOrderSection(parent, system) % Create a section to display a list of blocks in the system in order of % execution. If the system is a top-level model, display information % about all tasks in the model. import mlreportgen.report.* import slreportgen.report.* section = Section("Title", "Block Execution Order"); eo = ExecutionOrder(system); if ~slreportgen.utils.isModel(system) % Only show task details for top-level models eo.ShowTaskDetails = false; end add(section, eo) add(parent, section); end function makeNotesSection(parent, system) % Create a section to display any existing model notes import mlreportgen.report.* import slreportgen.report.* section = Section("Title", "Notes"); notes = Notes(system); if ~isequal(notes.NoteType,"None") add(section,notes); add(parent,section); end end
另请参阅
slreportgen.report.SystemHierarchy
| slreportgen.report.Diagram
| slreportgen.report.SystemIO
| slreportgen.finder.SystemDiagramFinder
| slreportgen.finder.DiagramResult
| slreportgen.finder.DiagramElementResult
| slreportgen.finder.StateflowDiagramElementFinder
| slreportgen.finder.ModelVariableFinder
| slreportgen.finder.ModelVariableResult
| slreportgen.report.ModelVariable
| slreportgen.finder.BlockFinder
| slreportgen.finder.BlockResult
| slreportgen.finder.ChartDiagramFinder
| slreportgen.report.SimulinkObjectProperties