主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

报告 Simulink 系统中任务和模块的执行顺序

此示例显示如何创建一个报告,该报告显示有关模型执行的所有任务以及模块在每个任务期间执行的顺序的信息。

如果选择了将每个离散速率视为单独任务配置参数,则模块执行可以根据采样时间分为不同的任务。包含某些模块的导出函数模型和系统(例如异步中断或事件触发子系统)也将模块执行分组为不同的任务。有关在 Simulink® 中查看任务信息和模块执行顺序的详细信息,请参阅控制和显示执行顺序

该图显示了示例模型 slreportgen_demo_ExecutionOrder 的图以及该模型的任务摘要和模块执行顺序。

因为该模型是一个连续系统,所以主要任务 Cont 的采样时间值为 0。在所有模型中,常量模块都被分为 Constant 任务。

MultiplyMu 是一个非虚拟子系统。默认情况下,模块执行顺序列表中的非虚拟子系统条目包含指向该子系统的模块执行顺序列表的链接。或者,您可以配置 ExecutionOrder 报告器选项以将子系统模块显示为嵌套列表。

打开模型

打开一个模型。此示例使用单任务模型,即除常量模块之外的所有模块都在同一任务期间执行。

model = "slreportgen_ExecutionOrder_example";
open_system(model);

报告设置

导入报告生成器 API 命名空间,这样您就不必使用长而完全限定的类名。

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

创建并打开 Simulink 报告对象。要创建 Microsoft® Word、HTML 或单文件 HTML 报告,请分别将 pdf" 更改为 docx"html"html-file"

rpt = slreportgen.report.Report(model + "_Report","pdf");
open(rpt);

添加标题页和目录。

titlepage = TitlePage("Title",model + ": Execution Order Report","Author","Jane Doe");
add(rpt,titlepage);
toc = TableOfContents();
add(rpt, toc);

任务和模块执行顺序报告

查找并循环遍历模型中的所有系统。

finder = SystemDiagramFinder(model);
while hasNext(finder)
    system = next(finder);

创建新章节并添加图结果。

    ch = Chapter("Title",sprintf("System %s",system.Name));
    add(ch,system);

仅当系统是模块图或非虚拟子系统时才报告系统的执行顺序。虚拟子系统内的模块按父模块的执行顺序进行报告。

    isNonvirtualSubsystem = strcmp(system.Type, "Simulink.SubSystem") ...
        && strcmp(get_param(system.Object, "IsSubsystemVirtual"), "off");
    if strcmp(system.Type,"Simulink.BlockDiagram") || isNonvirtualSubsystem

创建一个 Execution Order 节和一个 ExecutionOrder 报告器。

        eoSect = Section("Execution Order");
        eoRptr = ExecutionOrder(system);        

对于子系统,设置 ExecutionOrder 选项以便不报告任务详细信息,因为此信息已由父模块图执行顺序报告。

        if isNonvirtualSubsystem
            eoRptr.ShowTaskDetails = false;
        end

ExecutionOrder 报告器添加到 Execution Order 章节,并将该章节添加到报告中。

        add(eoSect,eoRptr);
        add(ch,eoSect);
    end

创建一个节来包含有关系统中每个模块的详细信息。ExecutionOrder 模块执行顺序列表中包含的模块链接到本节中相应的模块详细信息。

    blkSect = Section("Blocks");
    blkFinder = BlockFinder(system);
    results = find(blkFinder);
    add(blkSect,results);
    add(ch,blkSect);

将章节添加到报告中。

    add(rpt,ch);
end

关闭并查看报告

close(rpt);
rptview(rpt);

查看示例报告

要了解如何报告其他类型模型的执行顺序,请查看此示例提供的示例报告。

多任务模型

样本模型 slreportgen_demo_Multitasking 配置为将每个离散采样时间视为单独的任务。模块 In1_1sSS1SS2 的采样时间为 1 秒,模块 In2_2s 的采样时间为 2 秒。

该模型还配置为显示按采样时间颜色编码的模块。以 1 秒采样时间执行的模块为红色,以 2 秒采样时间执行的模块为绿色。多速率块(例如 Integrator 模块和两个子系统之间的速率转换模块)为黄色。要以这种方式以编程方式配置模型,请执行以下命令:

set_param(model, "SampleTimeColors", "on");

该模型的执行顺序报告了两个任务。任务详情表的 Trigger 列报告每个任务的采样时间(以秒为单位)。

模型模块按任务分开。速率转换模块在两个任务期间执行,因此它包含在两个列表中。但是,在任务 D1 期间只有其输出端口执行,在任务 D2 期间只有其输入端口执行。

要查看完整的示例报告,请执行以下命令:

rptview("slreportgen_demo_Multitasking_Report.pdf")

非周期性任务

某些任务(例如由异步中断或事件监听器创建的任务)不基于采样时间执行。例如,示例模型 slreportgen_demo_InitResetTerm 使用三个子系统,由事件监听器控制执行。每个事件监听器都配置为在接收到初始化、重置或终止函数调用事件时执行子系统。

初始化、重置和终止事件按执行顺序被报告为单独的任务。它们的执行并不直接依赖于模型的采样时间,因此在任务表中没有为它们赋予顺序号。SourceBlock 列表示由哪个模块定义该任务。

要查看完整的示例报告,请执行以下命令:

rptview("slreportgen_demo_InitResetTerm_Report.pdf")

条件执行

示例模型 slreportgen_demo_ConditionalExecution 包含一个 If 模块块和一个 Function-Call Generator 模块,用于控制模型内某些子系统的执行时间。

条件执行的子系统不会在模块执行顺序列表中报告,因为它们不一定在每个时间步骤都执行。相反,它们包含在模块执行顺序列表之后报告的 Conditional Execution 表中。

要查看完整的示例报告,请执行以下命令:

rptview("slreportgen_demo_ConditionalExecution_Report.pdf")

另请参阅

主题