Main Content

simulink.schedule.OrderedSchedule クラス

名前空間: simulink.schedule

モデルの分割の優先順位が含まれる OrderedSchedule オブジェクトを作成

R2020a 以降

説明

simulink.schedule.OrderedSchedule オブジェクトは、指定されたモデルの分割の実行順序を表しています。get_param を使用してモデル パラメーターとしてこのオブジェクトにアクセスします。OrderedSchedule オブジェクトを使用して、コマンド ラインでモデルの分割のスケジュールを変更できます。

set_param を使用すると、スケジュールをモデルに適用できます。

作成

get_param(mdl,'Schedule') は指定されたモデル mdlOrderedSchedule オブジェクトを作成します。

プロパティ

すべて展開する

分割の優先順位。次のような table として指定します。

  • 行名は分割の名前。

  • 最初の列は分割のインデックス。分割の順序を変更するには、インデックスを変更します。

  • 2 番目の列は分割の種類を示す。

  • 3 番目の列は分割のトリガーを示す。この列には、分割のサンプル時間、または分割が実行されるヒット時間のいずれかがリストされます。

RateSections は、シングル レートを使用する順序テーブルの一部が含まれるオブジェクトの配列です。RateSections を使用すると、有効なグループ内の分割の実行順序を簡単に変更できます。

個々のスケジュール オブジェクトの目的。string として指定します。

非周期的分割のトリガーとなる可能性のあるスケジュール エディターのイベント。スケジュール エディターのイベントは、Stateflow® チャートによって、また Simulink® の入力イベントによって送信され、simulink.schedule.Event オブジェクトの配列として指定されます。

すべて折りたたむ

この例では、スケジュール エディター API を使用して、スケジュールの操作を実行します。その後、関数を使用してランダムなスケジュールを生成し、シミュレーション データ インスペクターでそれを解析します。

モデルを開いてスケジュール オブジェクトを取得

スロットル位置制御システムのモデルを開いて、get_param を使用して simulink.schedule.OrderedSchedule オブジェクトを取得します。このオブジェクトには現在のスケジュールが含まれています。

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

  OrderedSchedule with properties:

           Order: [9x3 table]
    RateSections: [3x1 simulink.schedule.RateSection]
          Events: [0x1 simulink.schedule.Event]
     Description: ''

スケジュール オブジェクトの調査

このスケジュール オブジェクトには Order プロパティがあり、それにはモデル内の分割の実行順序が含まれています。Order プロパティは、分割名、インデックス、タイプ、そのトリガーを含むテーブルを表示します。

schedule.Order
ans =

  9x3 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"
    D2                      6      Periodic    "0.005"
    D3                      7      Periodic    "0.01" 
    APPSnsrRun              8      Periodic    "0.01" 
    TPSPrimaryRun10ms       9      Periodic    "0.01" 

Order テーブルのインデックス変数を使用して、モデルの実行順序を変更します。

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

  9x3 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"
    D2                      6      Periodic    "0.005"
    D3                      7      Periodic    "0.01" 
    APPSnsrRun              8      Periodic    "0.01" 
    TPSPrimaryRun10ms       9      Periodic    "0.01" 

スケジュールを変更するために行われた Order プロパティ内のすべての移動は、有効なスケジュールになります。スケジュールの変更と有効な移動の実行を簡単にするため、各分割は RateSections プロパティで同じレートをもつ分割とグループ化されています。RateSection プロパティの各要素に、レートが同じ分割を含む順序テーブルがあります。

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

  RateSection with properties:

     Rate: "0.005"
    Order: [5x3 table]


ans =

  5x3 table

                          Index      Type      Trigger
                          _____    ________    _______

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

インデックス変数を使用して、RateSections 内で分割を移動します。

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

  9x3 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"
    D2                      6      Periodic    "0.005"
    D3                      7      Periodic    "0.01" 
    APPSnsrRun              8      Periodic    "0.01" 
    TPSPrimaryRun10ms       9      Periodic    "0.01" 

ランダムなスケジュールを生成する関数の作成

この節では、randomSchedulegenerateSimulationInputssimulateRandomSchedules の 3 つの異なる関数を作成します。

関数 randomSchedule は、schedule オブジェクトのインデックス変更のランダム置換によってランダムなスケジュールを作成するために使用されます。schedule オブジェクトの Order プロパティと RateSections プロパティを使用して、スケジュール内の分割が、異なるランダムな組み合わせで移動されます。これらのランダムに作成されたスケジュールを使用してモデルをシミュレートして比較し、異なるスケジュールがシミュレーションに与える影響を調べます。関数 randomSchedule において、入力はモデル名です。次に、get_param を使用してモデルの simulink.schedule.OrderedSchedule オブジェクトを取得します。この schedule オブジェクトとそのプロパティは、スケジュールを変更してランダム化するために使用されます。モデルの最初のレートのセクションに対して変数 firstExecutionOrder を作成します。コード行 rateSections(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)
[25-Jan-2024 18:30:38] Running simulations...
[25-Jan-2024 18:30:55] Completed 1 of 15 simulation runs
[25-Jan-2024 18:30:58] Completed 2 of 15 simulation runs
[25-Jan-2024 18:31:00] Completed 3 of 15 simulation runs
[25-Jan-2024 18:31:03] Completed 4 of 15 simulation runs
[25-Jan-2024 18:31:05] Completed 5 of 15 simulation runs
[25-Jan-2024 18:31:07] Completed 6 of 15 simulation runs
[25-Jan-2024 18:31:09] Completed 7 of 15 simulation runs
[25-Jan-2024 18:31:10] Completed 8 of 15 simulation runs
[25-Jan-2024 18:31:12] Completed 9 of 15 simulation runs
[25-Jan-2024 18:31:14] Completed 10 of 15 simulation runs
[25-Jan-2024 18:31:16] Completed 11 of 15 simulation runs
[25-Jan-2024 18:31:18] Completed 12 of 15 simulation runs
[25-Jan-2024 18:31:20] Completed 13 of 15 simulation runs
[25-Jan-2024 18:31:22] Completed 14 of 15 simulation runs
[25-Jan-2024 18:31:24] Completed 15 of 15 simulation runs

ans = 

1x15 Simulink.SimulationOutput array


バージョン履歴

R2020a で導入