Моделирование семантических факторов

Распространение данных

Первая стадия генерации кода является компиляцией блок-схемы. Этот этап походит на этап программы C++ или C. Компилятор выполняет проверку типа и предварительную обработку. Точно так же механизм Simulink® проверяет, что типы данных ввода/вывода портов блока сопоставимы, ширины строки между блоками имеют ожидаемую толщину, и шаги расчета соединения блоков сопоставимы.

Механизм Simulink распространяет данные от одного блока до следующего вдоль сигнальных линий. Распространенные данные состоят из

  • Тип данных

  • Ширины строки

  • Шаги расчета

Можно проверить, какие типы данных блок Simulink поддерживает путем ввода

в подсказке MATLAB®, или (от Браузера документации) нажатие на команду выше.

Механизм Simulink обычно выводит атрибуты сигнала от исходного блока. Например, диалоговое окно параметров блока Inport задает атрибуты сигнала для блока.

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

Эти данные показывают распространение атрибутов сигнала, сопоставленных с блоком Inport через простую блок-схему.

В этом примере блоки Усиления и Выходного порта наследовали атрибуты, заданные для блока Inport.

Распространение шага расчета

Наследованные шаги расчета в исходных блоках (например, корневой импорт) могут иногда приводить к неожиданным и непреднамеренным присвоениям шага расчета. Поскольку блок может задать наследованный шаг расчета, информация, доступная в начале, часто недостаточна, чтобы скомпилировать блок-схему полностью.

В таких случаях механизм Simulink распространяет известные или присвоенные шаги расчета к тем блокам, которые наследовали шаги расчета, но которые еще не были присвоены шаг расчета. Таким образом механизм продолжает восполнять пробелы (неизвестные шаги расчета), пока шаги расчета не были присвоены как можно большему количеству блоков. Блоки, которые все еще не имеют шага расчета, присвоены шаг расчета по умолчанию.

Для абсолютно детерминированной модели (та, где никакие шаги расчета не установлены с помощью вышеупомянутых правил), необходимо явным образом задать шаги расчета исходных блоков. Исходные блоки включают корневые блоки импорта и блоки без входных портов. Вы не должны устанавливать шаги расчета входного порта подсистемы. Вы можете хотеть для этого однако при создании модульных систем.

Несвязанный вход неявно соединяется с землей. Для наземных блоков и заземлений, шаг расчета является всегда постоянным (inf).

Все блоки имеют наследованный шаг расчета (Ts =-1). Они присвоены шаг расчета (Tf - Ti)/50.

Блоки, Выходные параметры Которых имеют постоянные значения

Когда вы отображаете цвета шага расчета, по умолчанию, блоки Константа кажутся пурпурными в цвете, чтобы указать, что блок выходные параметры имеет постоянные значения во время симуляции. Нисходящий поток блокируется, чьи выходные значения являются также постоянными во время симуляции, такими как блоки Усиления, так же кажитесь пурпурными, если они используют наследованный шаг расчета. Код, сгенерированный для этих блоков, зависит частично от приспособляемости параметров блоков.

Если вы устанавливаете Configuration Parameters> Optimization> Default parameter behavior к Inlined, параметры блоков не являются настраиваемыми в сгенерированном коде. Поскольку блок выходные параметры является постоянным, генератор кода устраняет блочный код из-за сворачивания констант. Если генератор кода не может свернуть код, или если вы выбираете настройки, чтобы отключить сворачивание констант, блочный код появляется в образцовой функции инициализации. Сгенерированный код более эффективен, потому что он не вычисляет выходные параметры этих блоков во время выполнения.

Однако, если вы конфигурируете блок или модель так, чтобы параметры блоков появились в сгенерированном коде как настраиваемые переменные, генератор кода представляет блоки по-другому. Параметры блоков являются настраиваемыми если, например:

  • Вы устанавливаете Default parameter behavior на Tunable. По умолчанию числовые параметры блоков появляются как настраиваемые поля глобальной структуры параметра.

  • Вы используете настраиваемый параметр, такой как объект Simulink.Parameter, который использует класс памяти кроме Auto как значение одних или нескольких числовых параметров блоков. Эти параметры блоков являются настраиваемыми независимо от установки, которую вы выбираете для Default parameter behavior.

Если параметры блоков являются настраиваемыми, сгенерированный код должен вычислить блок выходные параметры во время выполнения. Поэтому блочный код появляется в функции модели step. Если модель использует несколько дискретных уровней, блочный код появляется в выходной функции для самого быстрого нисходящего уровня, который использует блок выходные параметры.

Фиксаторы для блоков Subsystem

Когда блок Inport является источником сигнала для инициированного или подсистемы вызова функций, можно использовать опции фиксатора, чтобы сохранить входные значения, в то время как подсистема выполняется. Опции фиксатора блока Inport включают:

ДляИспользование
Инициированные подсистемыLatch input by delaying outside signal
Function-Call подсистемыLatch input for feedback signals of function-call subsystem outputs

Когда вы используете Latch input for feedback signals of function-call subsystem outputs для подсистемы вызова функций, генератора кода

  • Консервы фиксируются в сгенерированном коде независимо от оптимизации, которая может быть установлена

  • Помещает код для фиксаторов в начале функции вывода/обновления подсистемы

Для получения дополнительной информации об этих опциях см. описание блока Inport.

Блокируйте порядок выполнения

Если механизм Simulink компилирует блок-схему, он создает файл model.rtw (аналогичный объектному файлу, сгенерированному от C или файла C++). Файл 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

Алгебраический цикл существует каждый раз, когда вывод блока, имеющего прямое сквозное соединение (такое как Усиление, Сумма, продукт и Передача Fcn), возвращен как вход к тому же блоку. Механизм Simulink часто может решить модели, которые содержат алгебраические циклы, такие как следующая схема.

Генератор кода не производит код, который решает алгебраические циклы. Это ограничение включает модели, которые используют блоки Алгебраического ограничения в путях к обратной связи. Однако механизм Simulink может часто устранять алгебраические циклы, которые возникают путем группировки уравнений определенными способами в моделях, которые содержат их. Это делает это путем разделения обновления и выходных функций, чтобы избежать круговых зависимостей. Для получения дополнительной информации смотрите Алгебраические Концепции Цикла (Simulink).

Алгебраические циклы в инициированных подсистемах

В то время как механизм Simulink может минимизировать алгебраические циклы, включающие атомарные и активированные подсистемы, специальное замечание применяется к некоторым инициированным подсистемам. Пример, для которого может быть сгенерирован код, показывают в следующей модели и инициированной подсистеме.

Поведение Simulink по умолчанию должно объединить методы вывода и обновления для подсистемы, которая создает очевидный алгебраический цикл, даже при том, что блок Unit Delay в подсистеме не имеет никакого прямого сквозного соединения.

Можно позволить механизму Simulink решать проблему путем разделения методов вывода и обновления инициированных и активировано инициированных подсистем, когда выполнимо. Если вы хотите, чтобы генератор кода использовал в своих интересах эту функцию, установите флажок Minimize algebraic loop occurrences в диалоговом окне Subsystem Parameters. Выберите эту опцию, чтобы избежать алгебраических предупреждений цикла в инициированных подсистемах, вовлеченных в циклы.

Примечание

Если вы устанавливаете этот флажок, сгенерированный код для подсистемы может содержать разделение вывод и обновить методы, даже если подсистема на самом деле не вовлечена в цикл. Кроме того, если прямой проходной блок (такой как блок Gain) соединяется с импортом в вышеупомянутой инициированной подсистеме, механизм Simulink не может решить проблему, и генератор кода не может сгенерировать код.

Подобная опция Minimize algebraic loop occurrences появляется на панели Model Referencing диалогового окна Configuration Parameters. Выбор его позволяет программному обеспечению Simulink Coder сгенерировать код для моделей, содержащих блоки Model, которые вовлечены в алгебраические циклы.