Два периодических перехода частоты дискретизации могут существовать в модели:
Более быстрый блок, управляющий более медленным блоком
Более медленный блок, управляющий более быстрым блоком
Следующие разделы касаются моделей периодическими шагами расчета с нулевым смещением только. Другие факторы применяются к многоскоростным моделям, которые включают асинхронные задачи. Для получения дополнительной информации о том, как сгенерировать код для асинхронной многозадачности, смотрите Асинхронную Поддержку.
В многозадачных и псевдомногозадачных системах отличающиеся частоты дискретизации могут заставить блоки выполняться в неправильном порядке. Чтобы предотвратить возможные ошибки в расчетных данных, вы должны выполнение модели управления при этих переходах. При соединении быстрее и более медленные блоки, вы или механизм Simulink® должны добавить блоки Перехода Уровня между ними. Быстрые-к-медленному переходы проиллюстрированы в следующей фигуре.
Переходы быстрого не спешения проиллюстрированы в следующей фигуре.
Несмотря на то, что блок Rate Transition предлагает надмножество возможностей блока Unit Delay (для переходов быстрого не спешения) и блока Zero-Order Hold (для быстрых-к-медленному переходов), необходимо использовать блок Rate Transition вместо этих блоков.
Блоки Перехода уровня занимаются проблемами целостности данных и детерминизма, сопоставленного с передачей данных между блоками, запускающимися на различных уровнях.
Целостность данных: проблема целостности данных существует, когда вход к блоку изменяется во время выполнения того блока. Проблемы целостности данных могут быть вызваны вытеснением.
Рассмотрите следующий сценарий:
Более быстрый блок подает входной сигнал к более медленному блоку.
Более медленный блок читает входное значение V1 из более быстрого блока и начинает вычисления с помощью того значения.
Вычисления вытесняются другим выполнением более быстрого блока, который вычисляет новое выходное значение V2.
Проблема целостности данных теперь возникает: когда более медленный блок возобновляет выполнение, он продолжает свои вычисления, теперь с помощью “нового” входного значения V2.
Такая передача данных называется незащищенная. Быстрее к Более медленным Переходам в режиме реального времени показывает незащищенную передачу данных.
В защищенной передаче данных сохранен вывод V1 более быстрого блока, пока более медленный блок не закончил выполняться.
Детерминированный по сравнению с недетерминированной передачей данных: В детерминированной передаче данных синхронизация передачи данных абсолютно предсказуема, как определено частотами дискретизации блоков.
Синхронизация недетерминированной передачи данных зависит от доступности данных, частот дискретизации блоков, и время, в которое блок получения начинает выполняться относительно ведущего блока.
Можно использовать блок Rate Transition, чтобы защитить передачи данных в приложении и сделать их детерминированными. Эти характеристики рассматриваются желательными в большинстве приложений. Однако блок Rate Transition поддерживает гибкие опции, которые позволяют вам ставить под угрозу целостность данных и детерминизм в пользу более низкой задержки. Следующий раздел обобщает эти опции.
При обработке передач данных между задачами генератор кода делает эти предположения:
Переходы данных происходят между одной задачей считывания и одной задачей записи.
Чтение или запись переменной размера байта являются атомарными.
Когда две задачи взаимодействуют посредством перехода данных, только один из них может вытеснить другой.
Для периодических задач более быстрая задача уровня имеет более высокий приоритет, чем более медленная задача уровня; более быстрая задача уровня вытесняет более медленную задачу уровня.
Все задачи работают на одном процессоре. Квантование времени не позволено.
Процессы не разрушают или перезапускают (особенно, в то время как данные передаются между задачами).
Несколько параметров блока Rate Transition относятся к его использованию в генерации кода для выполнения в реальном времени, как обсуждено ниже. Для полного описания блока смотрите Переход Уровня.
Блок Rate Transition обрабатывает периодический (быстро, чтобы замедлиться и замедлиться к быстрому) и асинхронные переходы. Когда вставлено между двумя блоками отличающихся частот дискретизации, блок Rate Transition автоматически конфигурирует свои частоты дискретизации ввода и вывода для типа перехода; вы не должны задавать, является ли переход быстрым не спешением или быстрый-к-медленному (низкий-к-высокому или высокий к низким приоритетам для асинхронных задач).
Критическое решение, которое необходимо принять в конфигурировании блока Rate Transition, является выбором механизма передачи данных, который будет использоваться между этими двумя уровнями. Ваш выбор диктуют факторы безопасности, использование памяти и производительность. Когда диалоговое окно параметров блоков Перехода Уровня в следующей фигуре показывает, механизмом передачи данных управляют две опции.
Ensure data integrity during data transfer: Когда эта опция идет, данные, переданные между уровнями, поддерживают свою целостность (передача данных защищена). Когда эта опция выключена, данные не могут поддержать свою целостность (передача данных незащищена). По умолчанию Ensure data integrity during data transfer включен.
Ensure deterministic data transfer (maximum delay): Эта опция поддерживается для периодических задач со смещением нуля и высоких и низких скоростей, которые являются множителями друг друга. Включите эту опцию для защищенных передач данных (когда Ensure data integrity during data transfer будет включен). Когда эта опция идет, блок Rate Transition ведет себя как блок Zero-Order Hold (для быстро, чтобы замедлить переходы) или блок Unit Delay (для медленного к быстрым переходам). Блок Rate Transition управляет синхронизацией передачи данных абсолютно предсказуемым способом. Когда эта опция выключена, передача данных недетерминирована. По умолчанию Ensure deterministic data transfer (maximum delay) включен для переходов между периодическими уровнями со смещением нуля; для асинхронных переходов это не может быть выбрано.
Таким образом блок Rate Transition предлагает три режима работы относительно передачи данных. В порядке уровня безопасности:
Protected/Deterministic (default): Это - самый безопасный режим. Недостаток этого режима - то, что он вводит детерминированную задержку в систему для случая быстрого не спешения периодические переходы уровня. Для того случая задержка, введенная блоком Rate Transition, является одним демонстрационным периодом более медленной задачи. Для случая быстрых-к-медленному периодических переходов уровня блок Rate Transition вводит, не вводит дополнительную задержку.
Protected/NonDeterministic: В этом режиме, для быстрого не спешения периодические переходы уровня, целостность данных защищена данными двойной буферизации, переданными между уровнями. Для быстрых-к-медленному периодических переходов уровня используется семафорный флаг. Блоки ниже блока Rate Transition используют последние доступные данные из блока, который управляет блоком Rate Transition. Максимальная задержка меньше чем или равна одному демонстрационному периоду более быстрой задачи.
Недостатки этого режима являются его недетерминированной синхронизацией. Преимуществом этого режима является своя низкая задержка.
Unprotected/NonDeterministic: Этот режим не рекомендуется для критически важных для миссии приложений. Задержка этого режима эквивалентна для режима Protected/NonDeterministic, но требования к памяти уменьшаются, ни начиная с требуются двойная буферизация, ни начиная с семафоры. Таким образом, блок Rate Transition ничего не делает в этом режиме кроме передать сигналы через; это просто существует, чтобы уведомить вас, что переход уровня существует (и может заставить сгенерированный код вычислять неправильные ответы). Выбор этого режима, однако, генерирует наименьшее количество объема кода.
В незащищенном режиме (опция Ensure data integrity during data transfer прочь), блок Rate Transition делает ничто кроме не позволяет переходу уровня существовать в модели.
Шаг расчета в выходном порту блока Rate Transition может только быть дискретен или фиксирован в незначительном временном шаге. Это означает, что, когда блок Rate Transition наследовал время непрерывной выборки от своего целевого блока, это обрабатывает наследованный шаг расчета как Фиксированный в Незначительном Временном шаге. Поэтому выходная функция блока Rate Transition запускается только на главных временных шагах. Если целевой шаг расчета блока непрерывен, блок Rate Transition, выходной шаг расчета является шагом расчета базовой ставки (если решатель является фиксированным шагом), или нулевой порядок содержит время непрерывной выборки (если решатель является переменным шагом).
Механизм Simulink может обнаружить переходы уровня, которым не соответствуют, в многозадачной модели во время схемы обновления и автоматически вставить блоки Перехода Уровня, чтобы обработать их. Чтобы включить это, в панели Solver образцовых параметров конфигурации, выбирают Automatically handle rate transition for data transfer. Настройка по умолчанию для этой опции выключена. Когда вы выбираете эту опцию:
Simulink обрабатывает переходы между периодическими шагами расчета и асинхронными задачами.
Simulink вставляет скрытые блоки Перехода Уровня в блок-схему.
Генератор кода производит код для блоков Перехода Уровня, которые были автоматически вставлены. Этот код идентичен коду, сгенерированному для блоков Перехода Уровня, которые были вставлены вручную.
Автоматически вставленные блоки Перехода Уровня действуют в защищенном режиме для периодических задач и асинхронных задач. Вы не можете изменить это поведение. Для периодических задач автоматически вставленные блоки Перехода Уровня действуют с уровнем детерминизма, заданного параметром Deterministic data transfer в панели Solver. Настройкой по умолчанию является Whenever possible
, который включает детерминизм для передач данных между периодическими шагами расчета, которые связаны целым числом несколько. Для получения дополнительной информации смотрите Детерминированную передачу данных (Simulink). Чтобы использовать другие режимы, необходимо вставить блоки Перехода Уровня и установить их режимы вручную.
Например, в этой модели, SineWave2 имеет шаг расчета 2, и SineWave3 имеет шаг расчета 3.
Когда вы выбираете Automatically handle rate transition for data transfer, Simulink вставляет блок Rate Transition между каждым блоком Sine Wave и блоком продукта. Вставленные блоки имеют значения параметров, чтобы согласовать шаги расчета блока Sine Wave.
Если входной порт и частоты дискретизации данных о выходном порте в модели не являются множителями друг друга, Simulink вставляет блок Rate Transition, частота дискретизации которого является наибольшим общим делителем (GCD) этих двух уровней. Если никакой другой блок в модели не содержит этот новый уровень, ошибка происходит во время симуляции. В этом случае необходимо вставить блок Rate Transition вручную.
Когда вы выбираете опцию Automatically handle rate transition for data transfer, Simulink вставляет блоки Перехода Уровня в пути, которые не соответствовали уровням перехода. Эти блоки скрыты по умолчанию. Чтобы визуализировать вставленные блоки, обновите схему. Метки значка появляются в модели и указывают, где Simulink вставил блоки Перехода Уровня во время фазы компиляции. Например, в этой модели, три блока Перехода Уровня были вставлены между двумя блоками Синусоиды и Мультиплексором и Интегратором, когда модель скомпилировала. ZOH и метки значка DbBuf указывают на эти блоки.
Можно показать или скрыть метки значка с помощью установки Display> Signals and Ports> Hidden Rate Transition Block Indicators.
Чтобы сконфигурировать скрытые блоки Перехода Уровня, щелкните правой кнопкой мыши по значку, маркируют и нажимают на Insert rate transition block, чтобы сделать блок видимым.
Когда вы делаете скрытые блоки Перехода Уровня видимыми:
Вы видите тип вставленного блока Rate Transition, а также местоположение в модель.
Можно установить Initial Conditions этих блоков.
Можно изменить параметры блоков для передачи уровня.
Подтвердите изменения в своей модели путем обновления схемы.
Отображение вставленных блоков Перехода Уровня не совместимо с:
Среда параллельного выполнения
Модели экспорта функций
Чтобы узнать больше о типах блоков Перехода Уровня, смотрите Переход Уровня.
Эти разделы описывают случаи, в которых блоки Перехода Уровня требуются для периодических переходов частоты дискретизации. Обсуждение и синхронизирующие схемы в этих разделах основаны на предположении, что блок Rate Transition используется в (защищенном/детерминированном) режиме его значения по умолчанию; то есть, Ensure data integrity during data transfer и опции Ensure deterministic data transfer (maximum delay) оба включены. Это настройки, используемые для автоматически вставленных блоков Перехода Уровня.
В модели, где более быстрый блок управляет более медленным блоком, имеющим прямое сквозное соединение, выходные параметры более быстрого блока вычисляются сначала. В интервалах симуляции, где более медленный блок не выполняется, симуляция прогрессирует более быстро, потому что существует меньше блоков, чтобы выполниться. Следующая фигура иллюстрирует эту ситуацию.
Симуляция Simulink не выполняется в режиме реального времени, что означает, что она не связана ограничениями реального времени. Симуляция ожидает или продвигается вперед к, независимо от того, что задачи требуются, чтобы завершать поток симуляции. Фактический временной интервал между шагами шага расчета может отличаться.
В моделях, где более быстрый блок управляет более медленным блоком, необходимо компенсировать то, что выполнение более медленного блока может охватить больше чем один период выполнения более быстрого блока. Это означает, что выходные параметры более быстрого блока могут измениться, прежде чем более медленный блок закончил вычислять свои выходные параметры. Следующие данные показывают ситуацию, в которой эта проблема возникает (T = шаг расчета). Обратите внимание на то, что более низкие приоритетные задачи вытесняются более высокими приоритетными задачами перед завершением.
В вышеупомянутой фигуре более быстрый блок выполняется во второй раз, прежде чем более медленный блок завершил выполнение. Это может вызвать непредсказуемые результаты, потому что входные данные к медленной задаче изменяются. Данные не могут поддержать свою целостность в этой ситуации.
Чтобы избежать этой ситуации, механизм Simulink должен содержать выходные параметры 1 секунды (быстрее) блокируются, пока 2-секундные (медленнее) не блокируют выполнение концов. Способ выполнить это путем вставки блока Rate Transition между 1 вторым и 2-секундным блоком. Вход к более медленному блоку не изменяется во время его выполнения, поддерживая целостность данных.
Это принято, что блок Rate Transition используется в (защищенном/детерминированном) режиме его значения по умолчанию.
Блок Rate Transition выполняется на уровне частоты дискретизации более медленного блока, но с приоритетом более быстрого блока.
Когда вы добавляете блок Rate Transition, блок выполняется перед 2-секундным блоком (его приоритет выше) и его выходным значением считается постоянным, в то время как 2-секундный блок выполняется (это выполняется на уровне более медленной частоты дискретизации).
В модели, где более медленный блок управляет более быстрым блоком, механизм Simulink снова вычисляет вывод ведущего блока сначала. Во время демонстрационных интервалов, где только более быстрый блок выполняется, симуляция прогрессирует более быстро.
Следующие данные показывают последовательность выполнения.
Как вы видите от предыдущих фигур, механизм Simulink может моделировать модели с несколькими частотами дискретизации эффективным способом. Однако симуляция Simulink не действует в режиме реального времени.
В моделях, где более медленный блок управляет более быстрым блоком, сгенерированный код присваивает более быстрый блок более высокий приоритет, чем более медленный блок. Это означает, что более быстрый блок выполняется перед более медленным блоком, который требует, чтобы специальный уход избежал неправильных результатов.
Эта схема синхронизации иллюстрирует две проблемы:
Выполнение более медленного блока разделено больше чем на одном более быстром интервале блока. В этом случае более быстрая задача выполняется во второй раз, прежде чем более медленная задача завершила выполнение. Это означает, что входные параметры к более быстрой задаче могут иметь неправильные значения часть времени.
Более быстрый блок выполняется перед более медленным блоком (который является обратным от способа, которым симуляция Simulink действует). В этом случае 1 второй блок выполняется сначала; но входные параметры к более быстрой задаче не были вычислены. Это может вызвать непредсказуемые результаты.
Чтобы устранить эти проблемы, необходимо вставить блок Rate Transition между медленнее и более быстрые блоки.
Это принято, что блок Rate Transition используется в (защищенном/детерминированном) режиме его значения по умолчанию.
Следующие данные показывают последовательность синхронизации, которая заканчивается с добавленным блоком Rate Transition.
Три ключевых пункта о переходах в этой схеме (относятся к окруженным числам):
Блок Rate Transition вывел выполнения в 1 второй задаче, но на более медленном уровне (2 секунды). Вывод блока Rate Transition питает 1 второй блок задачи.
Обновление Перехода Уровня использует вывод 2 вторых задач обновить ее внутреннее состояние.
Вывод Rate Transition в 1 второй задаче использует состояние Перехода Уровня, который был обновлен в 2 вторых задачах.
Первая проблема облегчена, потому что блок Rate Transition обновляет на более медленном уровне и на приоритете более медленного блока. Вход к блоку Rate Transition (который является выводом более медленного блока) читается после того, как более медленный блок завершает выполнение.
Вторая проблема облегчена, потому что блок Rate Transition выполняется на более медленном уровне, и его вывод не изменяется во время вычисления более быстрого блока, это является ведущим. Выходной фрагмент блока Rate Transition выполняется на уровне частоты дискретизации более медленного блока, но с приоритетом более быстрого блока. Поскольку блок Rate Transition управляет более быстрым блоком и имеет эффективно тот же приоритет, это выполняется перед более быстрым блоком.
Это использование блока Rate Transition изменяет модель. Вывод более медленного блока теперь задерживается одним временным шагом по сравнению с выводом без блока Rate Transition.
volatile
Когда вы выбираете Ensure data integrity during data transfer, код, сгенерированный для блока Rate Transition, задает глобальные буферы и семафоры и использует их, чтобы защитить целостность переданных данных.
Особенно для многозадачного приложения, задачи (уровни), вовлеченные в передачу данных, могут записать в переданные данные, буферы и семафоры время от времени, которые не может ожидать ваш компилятор. Чтобы препятствовать тому, чтобы ваш компилятор оптимизировал ассемблерный код способом, который ставит под угрозу целостность переданных данных, генератор кода применяет ключевое слово volatile
к буферам и семафорам. Генератор кода не применяет volatile
к глобальной переменной, которая представляет переданные данные, потому что буферы volatile
и семафоры обычно предлагают достаточно защиты.
С Embedded Coder® можно явным образом применить volatile
к переданным данным путем применения встроенного пользовательского класса памяти Volatile
к входу блока Rate Transition. Например, можно использовать этот метод, чтобы помочь защитить целостность данных, которые внешний код совместно использует со сгенерированным кодом.
Также, чтобы защитить данные, которые ваш внешний код совместно использует со сгенерированным кодом, можно записать собственные функции C, которые читают и написали данные в защищенном способе. Затем можно применить пользовательский класс памяти GetSet
к данным в модели, которая заставляет сгенерированный код вызывать функции вместо того, чтобы непосредственно получить доступ к данным.
Для получения дополнительной информации о применении volatile
, смотрите, Защищают Глобальные данные с const и энергозависимыми Спецификаторами Типа (Embedded Coder). Для получения дополнительной информации о GetSet
, см. Доступ к данным Через Функции с Пользовательским Классом памяти GetSet (Embedded Coder).
По умолчанию блочный код Перехода Уровня установлен встроенный с кодом алгоритма и данными. Если у вас есть Embedded Coder, можно разделить код и данные, так, чтобы сгенерированный код содержал отдельный get
и функции set
, что model_step
функционирует вызов и специализированная структура для данных состояния. Сгенерированный код также содержит отдельный start
и функции initialize
что вызовы функции model_initialize
. Чтобы разделить блочный код Перехода Уровня и данные из кода алгоритма и данные, в диалоговом окне Configuration Parameters, устанавливают параметр блочного кода Перехода Уровня на Function
.
Разделение блочного кода Перехода Уровня и данных из кода алгоритма и данных позволяет вам анализировать, оптимизировать, и протестировать блок Rate Transition и код алгоритма независимо друг от друга.