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