Report Execution Order of Tasks and Blocks in Simulink Systems
This example shows how to create a report that displays information about all tasks executed by a model and the order in which blocks execute during each task.
Block execution can be separated into different tasks based on sample time if the Treat each discrete rate as a separate task configuration parameter is selected. Export-function models and systems containing certain blocks, such as asynchronous interrupts or event-triggered subsystems, also group block execution into different tasks. See Control and Display Execution Order for more information on viewing task information and block execution order in Simulink®.
This image shows a diagram of the sample model slreportgen_demo_ExecutionOrder
and the task summary and block execution order for the model.
Because the model is a continuous system, the main task, Cont
, has a sample time value of 0
. In all models, constant blocks are separated into Constant
tasks.
MultiplyMu
is a nonvirtual subsystem. By default, nonvirtual subsystem entries in a block execution order list contain a link to the block execution order list for that subsystem. Alternatively, you can configure the ExecutionOrder
reporter options to display subsystem blocks as a nested list.
Open Model
Open a model. This example uses a single-tasking model, that is, all blocks except constant blocks execute during the same task.
model = "slreportgen_ExecutionOrder_example";
open_system(model);
Report Setup
Import the Report Generator API namespaces so you do not have to use long, fully qualified class names.
import mlreportgen.report.* import slreportgen.report.* import slreportgen.finder.*
Create and open a Simulink report object. To create a Microsoft® Word, HTML, or single-file HTML report, change "pdf"
to "docx"
, "html"
, or "html-file"
, respectively.
rpt = slreportgen.report.Report(model + "_Report","pdf"); open(rpt);
Add a title page and table of contents.
titlepage = TitlePage("Title",model + ": Execution Order Report","Author","Jane Doe"); add(rpt,titlepage); toc = TableOfContents(); add(rpt, toc);
Report on Task and Block Execution Order
Find and loop through all systems in the model.
finder = SystemDiagramFinder(model);
while hasNext(finder)
system = next(finder);
Create a new chapter and add the diagram result.
ch = Chapter("Title",sprintf("System %s",system.Name)); add(ch,system);
Report the execution order of the system only if it is a block diagram or a nonvirtual subsystem. Blocks within virtual subsystems are reported in the parent's block execution order.
isNonvirtualSubsystem = strcmp(system.Type, "Simulink.SubSystem") ... && strcmp(get_param(system.Object, "IsSubsystemVirtual"), "off"); if strcmp(system.Type,"Simulink.BlockDiagram") || isNonvirtualSubsystem
Create an Execution Order
section and an ExecutionOrder
reporter.
eoSect = Section("Execution Order");
eoRptr = ExecutionOrder(system);
For subsystems, set the ExecutionOrder
options so that task details are not reported, because this information is already reported by the parent block diagram execution order.
if isNonvirtualSubsystem eoRptr.ShowTaskDetails = false; end
Add the ExecutionOrder
reporter to the Execution Order
chapter, and add the chapter to the report.
add(eoSect,eoRptr);
add(ch,eoSect);
end
Create a section to include details about each block in the system. Blocks included in ExecutionOrder
block execution order lists link to the corresponding block details in this section.
blkSect = Section("Blocks");
blkFinder = BlockFinder(system);
results = find(blkFinder);
add(blkSect,results);
add(ch,blkSect);
Add the chapter to the report.
add(rpt,ch);
end
Close and View the Report
close(rpt); rptview(rpt);
View Sample Reports
To see how execution order is reported for other types of models, view the sample reports available with this example.
Multitasking Models
The sample model slreportgen_demo_Multitasking
is configured to treat each discrete sample time as a separate task. The sample time for blocks In1_1s
, SS1
, and SS2
is 1 second, and the sample time for block In2_2s
is 2 seconds.
The model is also configured to display blocks color-coded by sample time. Blocks that execute at a 1 second sample time are red, and blocks that execute at a 2 second sample time are green. Multirate blocks, such as the rate-transition block between the Integrator
block and the two subsystems, are yellow. To programmatically configure a model in this way, execute this command:
set_param(model, "SampleTimeColors", "on");
The execution order for this model reports two tasks. The Trigger
column of the task details table reports the sample time, in seconds, for each task.
The model blocks are separated by task. The rate-transition block executes during both tasks, so it is included in both lists. However, only its output port executes during task D1
, and only its input port executes during task D2
.
To view the full sample report, execute this command:
rptview("slreportgen_demo_Multitasking_Report.pdf")
Nonperiodic Tasks
Some tasks, such as those created by asynchronous interrupts or event listeners, do not execute based on sample time. For example, the sample model slreportgen_demo_InitResetTerm
uses three subsystems with the execution controlled by event listeners. Each event listener is configured to execute a subsystem when it receives an initialize, reset, or terminate function-call event.
The initialize, reset, and terminate events are reported as separate tasks in the execution order. Their execution does not directly depend on the sample time of the model, so they are not given an order number in the task table. The SourceBlock
column denotes which block defines the task.
To view the full sample report, execute this command:
rptview("slreportgen_demo_InitResetTerm_Report.pdf")
Conditional Execution
The sample model slreportgen_demo_ConditionalExecution
contains an If block and a Function-Call Generator block that control when certain subsystems within the model execute.
The conditionally executed subsystems are not reported in the block execution order list because they do not necessarily execute at every time step. Instead, they are included in a Conditional Execution
table that is reported after the block execution order list.
To view the full sample report, execute this command:
rptview("slreportgen_demo_ConditionalExecution_Report.pdf")
See Also
slreportgen.report.ExecutionOrder