Создайте и анализируйте случайные расписания для модели Используя редактор расписания API

Этот пример использует Редактор Расписания 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" 

Создайте функцию, чтобы сгенерировать случайные расписания

В этом разделе мы создаем три различных функции: randomSchedule, generateSimulationInputs и simulateRandomSchedules

randomSchedule функция используется, чтобы создать случайные расписания при помощи случайных сочетаний модификаций индекса в schedule объект. Используя Order и RateSections свойства schedule объект, разделы в расписаниях перемещены в различных, случайных комбинациях. С этими случайным образом созданными расписаниями модели симулированы и сравнены, чтобы изучить эффект различных расписаний на симуляции. В функциональном randomSchedule, вход является именем модели. Затем используйте get_param получить simulink.schedule.OrderedSchedule объект модели. Объект расписания и его свойства используются, чтобы изменить и рандомизировать расписания. Создайте переменную 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 объекты, можно применить расписания к модели с setModelParameters метод Simulink.SimulationInput объект.

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)
[30-Jul-2020 16:47:58] Running simulations...
[30-Jul-2020 16:48:13] Completed 1 of 15 simulation runs
[30-Jul-2020 16:48:21] Completed 2 of 15 simulation runs
[30-Jul-2020 16:48:25] Completed 3 of 15 simulation runs
[30-Jul-2020 16:48:30] Completed 4 of 15 simulation runs
[30-Jul-2020 16:48:34] Completed 5 of 15 simulation runs
[30-Jul-2020 16:48:38] Completed 6 of 15 simulation runs
[30-Jul-2020 16:48:42] Completed 7 of 15 simulation runs
[30-Jul-2020 16:48:46] Completed 8 of 15 simulation runs
[30-Jul-2020 16:48:50] Completed 9 of 15 simulation runs
[30-Jul-2020 16:48:54] Completed 10 of 15 simulation runs
[30-Jul-2020 16:48:58] Completed 11 of 15 simulation runs
[30-Jul-2020 16:49:02] Completed 12 of 15 simulation runs
[30-Jul-2020 16:49:07] Completed 13 of 15 simulation runs
[30-Jul-2020 16:49:11] Completed 14 of 15 simulation runs
[30-Jul-2020 16:49:15] Completed 15 of 15 simulation runs

ans = 

1x15 Simulink.SimulationOutput array