为 Simulink 和 Stateflow 元素创建报告生成器
查找器和报告器减少了编写代码查找和报告 Simulink® 模型元素(例如图和模块)以及 Stateflow® 图和转移等所需的时间和复杂性。Simulink Report Generator™ 报告 API 是 DOM API 之上的一层。其查找器和报告器基于 Simulink 和 Stateflow 查找基类。您可以指定用于查找特定元素的容器,例如子系统中的模块或图中的状态。查找器对象在相应的查找器结果对象数组中返回其结果。
Simulink 报告 API 还包括报告器类,它返回容器的图像。该图像是模型的顶层。
查找器返回的每个结果对象都有一个关联的报告器对象,用于报告这些结果。报告器对象保存内容并格式化内容,例如属性表和数据图。您将报告器对象添加到您的报告中。使用 MATLAB® 报告 API 报告器定义常见的报告元素。请参阅什么是报告器?了解更多信息。
所有查找器和报告器均具有以下特点:
默认行为和值
允许覆盖和自定义其输出
所有查找器都有 find
、hasNext
和 next
方法。find
方法在结果对象数组中查找并返回每个找到的指定类型的元素的所有元素。hasNext
和 next
方法一次查找并返回一个元素,并用于遍历结果列表。hasNext
方法检查容器是否至少具有一个指定类型的元素。如果容器具有一个或多个元素,则 hasNext
方法将其排队,以便 next
方法查找并返回结果对象。
所有报告器都有预定义的模板。每个报告器的模板定义了其格式、布局和内容漏洞。除非您想要自定义报告,否则您不需要更改模板或指定任何格式、布局或孔。您可以通过复制和编辑报告的默认模板或使用新模板来自定义报告。编辑默认模板的副本为您提供了自定义模板所需的起点和结构体。使用新模板可以让您从空白文件开始完全定义您的模板。要更改报告内容的顺序,请重新排序模板中的孔。查找器不使用模板。自定义报告器类的另一种方法是将其子类化。
每种输出类型的默认报告器模板位于模板库中,位于
matlab\toolbox\shared\slreportgen\rpt\rpt\+slreportgen\ +report\@<reporter>\resources\templates\<output>
DiagramReporter
的默认模板路径为 matlab\toolbox\shared\slreportgen\rpt\rpt\+slreportgen\ +report\@DiagramReporter\resources\templates\pdf\default.pdftx
Simulink 报告 API 类
Simulink 报告 API 提供了这些查找器、结果和报告器类。要在报告生成器程序中使用这些类,您必须创建一个 slreportgen.report.Report
类型的容器来保存报告。
查找器和结果类
报告器类
查找并报告模型中的模块
此示例显示如何使用 vdp
类查找并报告 BlockFinder
模型中的所有 Simulink 模块。生成的 HTML 报告包含默认信息并使用每个模块的默认格式。
导入报告 API 包,这样您就可以使用类名而不包含其包名。例如,您可以使用 BlockFinder
代替 slreportgen.finder.BlockFinder
。除了导入 Simulink 报告 API 基类之外,还要导入 MATLAB 报告 API 基类。典型的报告包括标题页、目录、章节和节,您可以将其作为报告器类包含在 MATLAB 报告 API 中。
import slreportgen.finder.* import slreportgen.report.* import mlreportgen.report.*
加载 vdp
模型。
model_name = "vdp";
load_system(model_name)
创建容器对象来保存报告并打开报告。在这种情况下,输出报告保存在压缩的 vdp_model.htmx
HTML 报告中。您可以使用任何您想要的输出名称。如果使用相同的输出文件名多次运行报告生成器,则会覆盖输出文件。要在报告生成器程序中使用 Simulink 报告 API 查找器和报告器,您必须使用完全限定名称来创建容器对象。
rpt = slreportgen.report.Report('vdp_model','html'); open(rpt)
添加章节并指定其标题。
ch = Chapter("Blocks in vdp model");
使用 BlockFinder
类创建一个查找器。在这种情况下,BlockFinder
会找到模型中的所有模块。使用 find
方法查找查找器指定的模块。
finder = BlockFinder(model_name); results = find(finder);
遍历 find 方法的结果并为每个模块创建一个小节,将模块属性表添加到该节中。然后,将每个部分添加到章节中。添加所有模块后,将章节添加到报告中。
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 报告生成器,查找 slrgex_radar_eml
模型中的所有模块。
要查找所有模块,请使用 BlockFinder
。if
语句显示如何测试 MATLAB Function 模块。使用 MATLABFunction
报告器报告 MATLAB Function 模块详细信息。else
语句显示了除 MATLAB Function 模块之外的模块如何使用 BlockFinder
find
方法结果。
import slreportgen.report.* import slreportgen.finder.* import mlreportgen.report.* model_name = 'slrgex_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 slrgex_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)
MATLABFunction
报告器针对 MATLAB Function 模块报告的信息示例如下:
find
的 BlockFinder
方法报告的信息示例如下:
查找并报告 Stateflow 元素
此示例描述了如何查找和报告 Stateflow 状态、转移和结点。它报告了 control_logic
模型的 sldemo_fuelsys
图。
首先,设置报告。
import mlreportgen.report.* import slreportgen.report.* import slreportgen.finder.* model_name = "sldemo_fuelsys"; load_system(model_name); subsys = "sldemo_fuelsys/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);
接下来,使用 StateFinder
对象及其 find
方法来查找并报告图中的状态。循环遍历找到的状态数组并将每个状态添加到章节中。
chapter = Chapter("Title","States"); 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)
关闭报告和模型,然后查看报告。
close(rpt) close_system(model_name) rptview(rpt)