主要内容

使用调度编辑器 API 为模型创建和分析随机调度

此示例使用调度编辑器 API 对调度执行操作。然后,它使用函数来生成随机调度,并在仿真数据检查器中对这些调度进行分析

打开模型并获取调度对象

打开节气门位置控制系统的模型,使用 get_param 获得 simulink.schedule.OrderedSchedule 对象。此对象包含当前调度。

model = 'ScheduleEditorAPIWithSubsystemPartitions';
open_system(model);
schedule = get_param(model,'Schedule')
schedule = 

  OrderedSchedule with properties:

           Order: [7×3 table]
    RateSections: [3×1 simulink.schedule.RateSection]
          Events: [0×1 simulink.schedule.Event]
     Description: ''

检查调度对象

调度对象具有 Order 属性,该属性包含模型中各分区的执行顺序。Order 属性显示一个包含分区名称、其索引、类型及其触发器的表。

schedule.Order
ans =

  7×3 table

                          Index      Type      Trigger
                          _____    ________    _______

    Cont                    1      Periodic    "0"    
    TPSSecondaryRun5ms      2      Periodic    "0.005"
    MonitorRun5ms           3      Periodic    "0.005"
    ControllerRun5ms        4      Periodic    "0.005"
    ActuatorRun5ms          5      Periodic    "0.005"
    APPSnsrRun              6      Periodic    "0.01" 
    TPSPrimaryRun10ms       7      Periodic    "0.01" 

使用 Order 表中的索引变量来更改模型的执行顺序

schedule.Order.Index('ActuatorRun5ms') = 2;
schedule.Order
ans =

  7×3 table

                          Index      Type      Trigger
                          _____    ________    _______

    Cont                    1      Periodic    "0"    
    ActuatorRun5ms          2      Periodic    "0.005"
    TPSSecondaryRun5ms      3      Periodic    "0.005"
    MonitorRun5ms           4      Periodic    "0.005"
    ControllerRun5ms        5      Periodic    "0.005"
    APPSnsrRun              6      Periodic    "0.01" 
    TPSPrimaryRun10ms       7      Periodic    "0.01" 

Order 属性内为修改调度而进行的任何移动都应产生有效的调度。为了更轻松地执行调度修改和有效移动,每个分区都与 RateSections 属性中速率相同的分区组合在一起。RateSection 属性的每个元素都包含一个顺序表,该表包含具有相同速率的分区。

schedule.RateSections(2)
schedule.RateSections(2).Order
ans = 

  RateSection with properties:

     Rate: "0.005"
    Order: [4×3 table]


ans =

  4×3 table

                          Index      Type      Trigger
                          _____    ________    _______

    ActuatorRun5ms          2      Periodic    "0.005"
    TPSSecondaryRun5ms      3      Periodic    "0.005"
    MonitorRun5ms           4      Periodic    "0.005"
    ControllerRun5ms        5      Periodic    "0.005"

使用索引变量在 RateSections 中移动分区。

schedule.RateSections(2).Order.Index('ActuatorRun5ms') = 5;
schedule.Order
ans =

  7×3 table

                          Index      Type      Trigger
                          _____    ________    _______

    Cont                    1      Periodic    "0"    
    TPSSecondaryRun5ms      2      Periodic    "0.005"
    MonitorRun5ms           3      Periodic    "0.005"
    ControllerRun5ms        4      Periodic    "0.005"
    ActuatorRun5ms          5      Periodic    "0.005"
    APPSnsrRun              6      Periodic    "0.01" 
    TPSPrimaryRun10ms       7      Periodic    "0.01" 

创建函数来生成随机调度

在本节中,我们创建三个不同函数:randomSchedulegenerateSimulationInputssimulateRandomSchedules

randomSchedule 函数用于通过在 schedule 对象中使用索引修改的随机排列来创建随机调度。使用 schedule 对象的 OrderRateSections 属性,调度中的分区以不同随机组合移动。使用这些随机创建的调度,对模型进行仿真并比较,以研究不同调度对仿真的影响。在函数 randomSchedule 中,输入是模型名称。然后使用 get_param 获得模型的 simulink.schedule.OrderedSchedule 对象。schedule 对象及其属性用于修改和随机化调度。为模型的第一个速率部分创建一个变量 firstExecutionOrderrateSections(1).ExecutionOrder = [firstExecutionOrder(1,:); reSchedule(firstExecutionOrder(2:end,:))] 代码行调用函数 reSchedule 来创建索引的随机排列。

type randomSchedule
function schedule = randomSchedule(model)
    % schedule = randomSchedule(model) Produces a
    % simulink.schedule.OrderedSchedule that has a randomized permutation
    % of the model's original execution order schedule
    
    arguments
        model char = bdroot
    end
    
    schedule = get_param(model, 'Schedule');
    
    rateSections = schedule.RateSections;
    firstOrder = rateSections(1).Order;
    
    % This assumes that the slowest discrete rate is at index 1. This may
    % not be the case for all models (ex. JMAAB-B).
    rateSections(1).Order = [firstOrder(1,:); reSchedule(firstOrder(2:end,:))];    
    
    for i=2:length(rateSections)
        rateSections(i).Order = reSchedule(rateSections(i).Order);
    end
    
    schedule.RateSections = rateSections;
end

function out = reSchedule(in)
    numPartitions = height(in);
    in.Index = in.Index(randperm(numPartitions));
    out = in;
end

要分析不同调度对模型的影响,请使用不同调度对模型进行仿真。在此函数中,创建一个由 Simulink.SimulationInput 对象组成的数组。通过此 Simulink.SimulationInput 对象数组,您可以使用 Simulink.SimulationInput 对象的 setModelParameters 方法将调度应用于模型。

type generateSimulationInputs
function in = generateSimulationInputs(model, numSimulations)
    % in = generateSimulationInputs(model, numSimulations) Generates
    % numSimulations Simulink.SimulationInput objects each containing a
    % different, randomized execution order schedule
    arguments
        model char = bdroot
        numSimulations double = 10
    end
    
    in(numSimulations) = Simulink.SimulationInput();
    in = in.setModelName(model);
    for idx = 1:numSimulations
        in(idx) = in(idx).setModelParameter('Schedule', randomSchedule(model));
    end
end

在最后一个函数中,使用 Simulink.SimulationInput 对象数组来运行多个仿真。在仿真完成后,您可以在仿真数据检查器中绘制所有仿真的输出。

type simulateRandomSchedules
function out = simulateRandomSchedules(model, numSimulations)
    % out = simulateRandomSchedules(model, numSimulations) Simulates a 
    % model numSimulations number of times.  Each simulation has a
    % randomized execution order schedule.
    arguments
        model char = bdroot
        numSimulations double = 10
    end
        
    in = generateSimulationInputs(model, numSimulations);
    out = sim(in);
    plot(out);
end

执行函数

现在为 ScheduleEditorAPIWithSubsystemPartitions 模型运行上述函数。首先,使用 randomSchedule 函数创建随机生成的调度,然后,使用 generateSimulationInputs 函数生成 Simulink.SimulationInput 对象数组,并使用 simulateRandomSchedule 函数对具有不同调度的模型进行仿真,并且绘制其结果以供比较。我们用 15 个随机生成的调度运行仿真。

simulateRandomSchedules(model,15)
[12-Aug-2025 19:14:11] Running simulations...
[12-Aug-2025 19:14:24] Completed 1 of 15 simulation runs
[12-Aug-2025 19:14:26] Completed 2 of 15 simulation runs
[12-Aug-2025 19:14:28] Completed 3 of 15 simulation runs
[12-Aug-2025 19:14:31] Completed 4 of 15 simulation runs
[12-Aug-2025 19:14:34] Completed 5 of 15 simulation runs
[12-Aug-2025 19:14:36] Completed 6 of 15 simulation runs
[12-Aug-2025 19:14:38] Completed 7 of 15 simulation runs
[12-Aug-2025 19:14:39] Completed 8 of 15 simulation runs
[12-Aug-2025 19:14:41] Completed 9 of 15 simulation runs
[12-Aug-2025 19:14:43] Completed 10 of 15 simulation runs
[12-Aug-2025 19:14:45] Completed 11 of 15 simulation runs
[12-Aug-2025 19:14:47] Completed 12 of 15 simulation runs
[12-Aug-2025 19:14:49] Completed 13 of 15 simulation runs
[12-Aug-2025 19:14:51] Completed 14 of 15 simulation runs
[12-Aug-2025 19:14:53] Completed 15 of 15 simulation runs

ans = 

1x15 Simulink.SimulationOutput array