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

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

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

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

  • Тип данных

  • Ширины линии

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если вы устанавливаете параметр конфигурации модели 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™ смотрите Асинхронные События (Simulink Coder). Для получения дополнительной информации о многоскоростной генерации кода смотрите Моделирование для Многозадачного Выполнения (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 может минимизировать алгебраические циклы, включающие атомарные и активированные подсистемы, специальное замечание применяется к некоторым инициированным подсистемам. Пример, для которого может быть сгенерирован код, показывают в следующей модели и инициированной подсистеме.

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

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

Примечание

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

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