Первым этапом формирования кода является составление блок-схемы. Этот этап аналогичен этапу программы C или C++. Компилятор выполняет проверку типов и предварительную обработку. Аналогично, модуль Simulink ® проверяет, что типы входных/выходных данных блочных портов являются согласованными, ширина линий между блоками является ожидаемой толщиной, а время выборки соединительных блоков - согласованным.
Механизм Simulink распространяет данные от одного блока к следующему по сигнальным линиям. Распространяемые данные состоят из
Тип данных
Ширина линии
Время выборки
Можно проверить, какие типы данных поддерживает блок Simulink, введя
в подсказке MATLAB ® или (в браузере справки), щелкнув приведенную выше команду.
Механизм Simulink обычно извлекает атрибуты сигнала из блока источника. Например, в диалоговом окне «Параметры блока ввода» указываются атрибуты сигнала для блока.

В этом примере блок Inport имеет ширину порта 3, время выборки 0,01 секунды, тип данных двойной и сигнал сложный.
На этом рисунке показано распространение атрибутов сигнала, связанных с блоком Inport, посредством простой блок-схемы.

В этом примере блоки Gain и Outport наследуют атрибуты, указанные для блока Inport.
Унаследованное время выборки в исходных блоках (например, корневой вход) иногда может привести к неожиданным и непреднамеренным назначениям времени выборки. Поскольку блок может задавать наследуемое время выборки, информация, доступная в начале, часто недостаточна для полной компиляции блок-схемы.
В таких случаях механизм Simulink распространяет известное или назначенное время выборки на те блоки, которые унаследовали время выборки, но которым еще не было назначено время выборки. Таким образом, механизм продолжает заполнять пробелы (неизвестные времена выборки) до тех пор, пока времена выборки не будут назначены как можно большему количеству блоков. Блокам, по-прежнему не имеющим времени выборки, назначается время выборки по умолчанию.
Для полностью детерминированной модели (модели, в которой значения времени выборки не заданы с использованием приведенных выше правил) следует явно указать значения времени выборки исходных блоков. Исходные блоки включают корневые блоки ввода и блоки без входных портов. Нет необходимости устанавливать время выборки входного порта подсистемы. Однако это может потребоваться при создании модульных систем.
Неподключенный вход неявно подключается к заземлению. Для заземляющих блоков и заземляющих соединений время выборки всегда является постоянным (inf).
Все блоки имеют наследуемое время выборки (Ts = -1). Им назначается время выборки (Tf-Ti )/50.
При отображении образцов временных цветов по умолчанию блоки константы отображаются пурпурным цветом, что указывает на то, что выходные данные блоков имеют постоянные значения во время моделирования. Дочерние блоки, выходные значения которых также являются постоянными во время моделирования, такие как блоки усиления, также отображаются пурпурными, если они используют наследуемое время выборки. Код, генерируемый для этих блоков, частично зависит от возможности настройки параметров блока.
Если задан параметр конфигурации модели Поведение параметра по умолчанию Inlinedпараметры блока не настраиваются в сгенерированном коде. Поскольку выходные сигналы блока являются постоянными, генератор кода устраняет код блока из-за постоянного сворачивания. Если генератор кода не может сложить код или если выбраны параметры для отключения постоянного сворачивания, код блока появляется в функции инициализации модели. Созданный код более эффективен, поскольку не вычисляет выходные данные этих блоков во время выполнения.
Однако если настроить блок или модель таким образом, чтобы параметры блока отображались в сгенерированном коде как настраиваемые переменные, генератор кода представляет блоки другим способом. Параметры блока настраиваются, например:
Для параметра Поведение параметра по умолчанию задано значение Tunable. По умолчанию числовые параметры блока отображаются как настраиваемые поля глобальной структуры параметров.
Используется настраиваемый параметр, например Simulink.Parameter объект, использующий класс хранения, отличный от Auto, как значение одного или нескольких числовых параметров блока. Эти параметры блока настраиваются независимо от настроек, выбранных для параметра конфигурации модели По умолчанию (Default parameter behavior).
Если параметр блока настраивается, генерируемый код должен вычислять выходные данные блока во время выполнения. Поэтому код блока появляется в модели step функция. Если модель использует несколько дискретных скоростей, блочный код появляется в функции вывода для самой быстрой скорости нисходящего потока, которая использует блочные выходы.
Если блок Inport является источником сигнала для подсистемы с триггерным вызовом или с функциональным вызовом, можно использовать опции фиксации для сохранения входных значений во время выполнения подсистемы. Опции блокировки блока ввода включают в себя:
| Для | Использовать |
|---|---|
| Инициируемые подсистемы | Вход защелки путем задержки внешнего сигнала |
| Подсистемы вызова функций | Вход защелки для сигналов обратной связи выходов подсистемы функционального вызова |
При выборе параметра блока подсистемы Latch input для сигналов обратной связи выходных сигналов подсистемы function-call для подсистемы function-call генератор кода
Сохраняет блокировки в сгенерированном коде независимо от оптимизации, которая может быть установлена
Размещение кода для защелок в начале функции вывода/обновления подсистемы
Дополнительные сведения об этих параметрах см. в описании блока Inport.
Как только модуль Simulink компилирует блок-схему, он создает (аналогично файлу объекта, сгенерированному из файла C или C++). 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 по умолчанию заключается в объединении методов вывода и обновления для подсистемы, что создает очевидный алгебраический цикл, даже если блок Unit Delay в подсистеме не имеет прямого канала.
Механизм Simulink позволяет решить проблему, разбивая методы вывода и обновления инициируемых и активируемых подсистем, когда это возможно. Если требуется, чтобы генератор кода пользовался преимуществами этой функции, выберите параметр блока подсистемы Минимизировать вхождения алгебраического цикла. Выберите этот параметр, чтобы избежать алгебраических предупреждений о петлях в запускаемых подсистемах, задействованных в петлях.
Примечание
Если этот флажок установлен, сгенерированный код подсистемы может содержать разделенные методы вывода и обновления, даже если подсистема фактически не участвует в цикле. Кроме того, если блок прямого канала (например, блок усиления) подключен к входу в вышеуказанной запускаемой подсистеме, механизм Simulink не может решить проблему, и генератор кода не может генерировать код.
Также доступен параметр конфигурации модели Минимизировать вхождения алгебраического цикла. Выбор этого параметра позволяет генератору кода создавать код для моделей, содержащих блоки модели, которые участвуют в алгебраических циклах.