Первый этап генерации кода - компиляция блока. Этот этап аналогичен этапу программы на C или C++. Компилятор выполняет проверку типа и предварительную обработку. Точно так же Simulink® Модуль проверяет, что типы входных/выходных данных блочных портов являются допустимыми, ширины линии между блоками имеют ожидаемую толщину, и шаги расчета соединительных блоков являются допустимым.
Механизм Simulink распространяет данные из одного блока в следующий по сигнальным линиям. Распространенные данные состоят из
Тип данных
Ширины линии
Шаги расчета
Можно проверить, какие типы данных поддерживает блок Simulink, введя
в MATLAB® или (из браузера документации) нажав на команду выше.
Механизм Simulink обычно выводит атрибуты сигнала из исходного блока. Например, диалоговое окно параметров блока Inport задает атрибуты сигнала для блока.
В этом примере блок Inport имеет ширину порта 3, шага расчета 0,01 секунды, тип данных двойной точности и сигнал сложный.
Этот рисунок показывает распространение атрибутов сигнала, сопоставленных с блоком Inport, через простую блок-схему.
В этом примере блоки Gain и Outport наследуют атрибуты, заданные для блока Inport.
Унаследованное время расчета в исходных блоках (для примера, корневой входной порт) может иногда привести к неожиданным и непреднамеренным временным назначениям расчета. Поскольку блок может задавать унаследованный шаг расчета, информации, доступной в начале, часто недостаточно, чтобы полностью скомпилировать блок-схему.
В таких случаях механизм Simulink распространяет известные или назначенные шаги расчета на те блоки, которые унаследовали шаги расчета но которые еще не получили шага расчета. Таким образом, двигатель продолжает заполнять заготовки (неизвестные шаги расчета), пока шаги расчета не будут назначены как можно большему числу блоков. Блокам, которые все еще не имеют шага расчета, назначается время расчета по умолчанию.
Для полностью детерминированной модели (такой, где никакие шаги расчета не устанавливаются с помощью вышеописанных правил) необходимо явным образом задать шаги расчета ваших исходных блоков. Исходные блоки включают корневые блоки входных портов и блоки без входных портов. Вам не нужно устанавливать шаги расчета входного порта подсистемы. Однако это может потребоваться при создании модульных систем.
Несвязанный вход неявно соединяется с землей. Для наземных блоков и соединений заземления шаг расчета всегда постоянное (inf
).
Все блоки имеют унаследованный шаг расчета (Ts = -1). Им назначается шаг расчета (Tf-Ti )/50.
Когда вы отображаете шаг расчета цвета, по умолчанию Constant блоки появляются пурпурно в цвете, чтобы указать, что блок выходов иметь постоянные значения во время симуляции. Нисходящие блоки, выходные значения которых также являются постоянными во время симуляции, такие как блоки Gain, аналогично появляются пурпурными, если они используют унаследованный шаг расчета. Код, сгенерированный для этих блоков, частично зависит от настраиваемости параметров блоков.
Если вы задаете Default parameter behavior параметра конфигурации модели Inlined
, параметры блоков не настраиваются в сгенерированном коде. Поскольку выходы блоков постоянны, генератор кода устраняет блочный код из-за постоянного складывания. Если генератор кода не может сложить код, или если вы выбираете настройки, чтобы отключить постоянное складывание, блочный код появляется в функции инициализации модели. Сгенерированный код более эффективен, потому что он не вычисляет выходы этих блоков во время выполнения.
Однако, если вы конфигурируете блок или модель так, чтобы параметры блоков появились в сгенерированном коде как настраиваемые переменные, генератор кода представляет блоки другим способом. Параметры блоков настраиваются, если, например:
Вы устанавливаете Default parameter behavior параметра равным Tunable
. По умолчанию числовые параметры блоков появляются как настраиваемые поля глобальной структуры параметра.
Вы используете настраиваемый параметр, такой как Simulink.Parameter
объект, который использует класс памяти, отличный от Auto
, как значение одного или нескольких числовых параметров блоков. Эти параметры блоков настраиваются независимо от настройки, которую вы выбираете для параметра конфигурации <reservedrangesplaceholder0> модели.
Если параметры блоков настраиваются, сгенерированный код должен вычислить выходы блоков во время выполнения. Поэтому блочный код появляется в модели step
функция. Если в модели используется несколько дискретных скоростей, блочный код появляется в выходной функции для самой быстрой скорости нисходящего потока, которая использует выходы блоков.
Когда блок Inport является источником сигнала для срабатывающей подсистемы или подсистемы вызова функций, можно использовать опции фиксации, чтобы сохранить входные значения во время выполнения подсистемы. Опции блока Inport включают:
Для | Использовать |
---|---|
Триггируемые подсистемы | Latch input by delaying outside signal |
Подсистемы вызова функций | Latch input for feedback signals of function-call subsystem outputs |
Когда вы выбираете параметры блоков подсистемы Latch input for feedback signals of function-call subsystem outputs для подсистемы вызова функций, генератор кода
Сохраняет защелки в сгенерированном коде независимо от оптимизации, которая может быть установлена
Помещает код для защелок в начало функции вывода/обновления подсистемы
Для получения дополнительной информации об этих опциях смотрите описание Inport блоков.
Когда механизм Simulink компилирует блок, он создает
файл (аналогичный файлу объекта, сгенерированному из файла C или C++). The model
.rtw
файл содержит информацию о соединении модели, а также атрибуты сигнала. Таким образом, механизм синхронизации в может определить, когда должны выполняться блоки с различными скоростями.model
.rtw
Вы не можете переопределить этот порядок выполнения, непосредственно вызвав блок (в рукописном коде) в модели. Для примера на следующем рисунке disconnected_trigger
модель слева имеет свой триггерный порт, соединенный с землей, что может привести к тому, что блоки наследуют постоянный шаг расчета. Вызов функции триггера, f()
, непосредственно из пользовательского кода не работает. Вместо этого вы должны использовать генератор вызова функции, чтобы задать скорость, с которой f()
должна выполняться, как показано на connected_trigger
модель справа.
Вместо генератора вызова функции можно использовать другой блок, который может управлять портом триггера. Затем необходимо вызвать главную точку входа модели, чтобы выполнить функцию триггера.
Для многоскоростных моделей общее использование генератора кода состоит в том, чтобы сгенерировать код для отдельных моделей отдельно, а затем вручную кодировать ввод-вывод между модулями сгенерированного кода. Этот подход возлагает бремя согласованности данных между моделями на разработчика моделей. Другой подход состоит в том, чтобы позволить Simulink и генератору кода поддерживать согласованность данных между скоростями и генерировать многократный код для использования в многозадачном окружении. Блок Rate Transition способен взаимодействовать с периодическими и асинхронными сигналами. Описание библиотек блоков Simulink Coder™ см. в разделе «Асинхронные события». Для получения дополнительной информации о генерации многомерного кода смотрите Моделирование для выполнения многозадачности.
Алгебраические циклы являются круговыми зависимостями между переменными. Это препятствует прямому прямому расчету их значений. Для примера, в случае системы уравнений
x = y + 2
y = -x
значения x
и y
не может быть непосредственно вычислен.
Чтобы решить эту проблему, или неоднократно попробуйте потенциальные решения для x
и y
(интеллектуальным способом, например, с использованием основанного на градиенте поиска) или «решить» систему уравнений. В предыдущем примере решение системы в явную форму приводит к
2x = 2
y = -x
x = 1
y = -1
Алгебраический цикл существует всякий раз, когда выход блока, имеющего прямое сквозное соединение (такую как Gain, Sum, Product и Transfer Fcn), подается назад как вход в тот же блок. Механизм Simulink часто способен решить модели, которые содержат алгебраические циклы, такие как следующая схема.
Генератор кода не производит код, который решает алгебраические циклы. Это ограничение включает модели, которые используют блоки Алгебраических ограничений в путях обратной связи. Однако механизм Simulink может часто устранять возникающие алгебраические циклы, группируя уравнения определенными способами в моделях, которые их содержат. Это делается путем разделения обновления и выходных функций, чтобы избежать циклических зависимостей. Для получения дополнительной информации смотрите Алгебраические Циклы Концепций.
В то время как механизм Simulink может минимизировать алгебраические циклы с атомарными и активированными подсистемами, особый фактор применяется к некоторым триггируемым подсистемам. Пример, для которого может быть сгенерирован код, показан в следующей подсистеме модели и триггируемой подсистеме.
Поведение Simulink по умолчанию состоит в том, чтобы объединить выход и методы обновления для подсистемы, которая создает очевидный алгебраический цикл, хотя блок Unit Delay в подсистеме не имеет прямых сквозных соединений.
Можно позволить движку Simulink решить проблему, разделив выходы и обновленные методы триггерных и активированных подсистем, когда это возможно. Если вы хотите, чтобы генератор кода использовал преимущества этой функции, выберите параметры блоков подсистемы Minimize algebraic loop occurrences. Выберите этот параметр, чтобы избежать предупреждений алгебраического цикла в триггируемых подсистемах, участвующих в циклах.
Примечание
Если установить этот флажок, сгенерированный код для подсистемы может содержать методы разделения выхода и обновления, даже если подсистема фактически не участвует в цикле. Кроме того, если блок прямой передачи (такой как блок Gain) соединяется с входным портом в вышеуказанной триггируемой подсистеме, механизм Simulink не может решить проблему, и генератор кода не может сгенерировать код.
Также доступен параметр конфигурации <reservedrangesplaceholder1> модели. Выбор позволяет генератору кода производить код для моделей, содержащих блоки Model, которые участвуют в алгебраических циклах.