Код быстрого прототипирования задает следующие функции, которые взаимодействуют через интерфейс с основной программой (main.c
или main.cpp
):
Model()
: образцовая регистрационная функция. Эта функция инициализирует рабочие области (например, выделяя и устанавливая указатели на различные структуры данных) используемый моделью. Образцовые регистрационные вызовы функции MdlInitializeSizes
и функции MdlInitializeSampleTimes
. Эти две функции очень похожи на S-функцию методы mdlInitializeSampleTimes
и mdlInitializeSizes
.
MdlStart(void)
: После образцовых регистрационных функций выполняются MdlInitializeSizes
и MdlInitializeSampleTimes
, основная программа запускает выполнение путем вызова MdlStart
. Эта стандартная программа называется однажды при запуске.
Функциональный MdlStart
имеет четыре основных раздела:
Код, чтобы инициализировать состояния для каждого блока в корневой модели, которая имеет состояния. Вызов подпрограммы сделан к, “инициализируют состояния” стандартные программы условно выполняемых подсистем.
Код, сгенерированный одноразовой инициализацией, (запускает) функцию для каждого блока в модели.
Код, чтобы включить блоки в корневой модели, которые имеют, включает методы и блоки, внутри инициированные или подсистемы вызова функций, находящиеся в корневой модели. Блоки Simulink® могут иметь, включают и отключают методы. Разрешать метод называется непосредственно перед тем, как блок начинает выполняться, и запрещать метод называется сразу после того, как блок прекращает выполняться.
Код для каждого блока в модели, выходное значение которой является постоянным. Блочный код появляется в функции MdlStart
, только если параметры блоков не являются настраиваемыми в сгенерированном коде и если генератор кода не может устранить блочный код посредством сворачивания констант.
MdlOutputs(int_T tid)
: MdlOutputs
обновляет вывод блоков. tid
(идентификатор задачи) параметр идентифицирует задачу, которая в свою очередь сопоставляет, когда выполнить блоки, основанные на их шаге расчета. Эта стандартная программа вызывается основной программой во время главных и незначительных временных шагов. Главные временные шаги - когда основная программа берет фактический временной шаг (то есть, пора выполнить определенную задачу). Если ваша модель будет содержать непрерывные состояния, незначительные временные шаги будут взяты. Незначительные временные шаги - когда решатель генерирует этапы интегрирования, которые являются точками между основными выходными параметрами. Эти этапы интегрирования используются, чтобы вычислить производные, используемые в усовершенствовании непрерывных состояний.
MdlUpdate(int_T tid)
: MdlUpdate
обновляет состояния, и работайте векторная информация состояния (то есть, состояния, которые не непрерывны и не дискретны), сохраненный в векторах работы. tid
(идентификатор задачи) параметр идентифицирует задачу, которая в свою очередь указывает, какие шаги расчета активны, позволяя вам условно обновить только состояния активных блоков. Эта стандартная программа вызывается интерфейсом после того, как главный MdlOutputs
был выполнен. Решатель также называется, и
называется на незначительных шагах решателем во время его этапов интегрирования. Все блоки, которые имеют непрерывные состояния, имеют идентичное количество производных. Эти блоки требуются, чтобы вычислять производные так, чтобы решатели могли интегрировать состояния.model_Derivatives
MdlTerminate(void)
: MdlTerminate
содержит любой код завершения работы блока. MdlTerminate
вызван интерфейсом как часть завершения программы в реальном времени.
Содержимое вышеупомянутых функций непосредственно связано с блоками в вашей модели. Блок Simulink может быть обобщен к следующей системе уравнений.
Выходной y является функцией непрерывного состояния xc, дискретное состояние xd и вход u. Каждый блок написал свое определенное уравнение в разделе MdlOutputs
.
Дискретные состояния xd являются функцией текущего состояния и входа. Каждый блок, который имеет дискретное состояние, обновляет свое состояние в MdlUpdate
.
Производные x являются функцией текущего входа. Каждый блок, который имеет непрерывные состояния, предоставляет свои производные решателю (например, ode5
) в
. Производные используются решателем, чтобы интегрировать непрерывное состояние, чтобы произвести следующее значение.model_Derivatives
Вывод, y, обычно пишется в структуру блока I/O. Блоки Выходного порта корневого уровня пишут во внешнюю выходную структуру. Непрерывные и дискретные состояния хранятся в структуре состояний. Вход, u, может произойти из вывода другого блока, который расположен в структуре блока I/O, внешний вход (расположенный во внешней входной структуре), или состояние. Эти структуры заданы в файле
, который генерирует программное обеспечение Simulink Coder™.model.h
Следующий пример показывает общее содержимое стиля быстрого прототипирования кода С, записанного в файл
.model.c
Следующие данные показывают блок-схему, описывающую выполнение сгенерированного кода быстрого прототипирования.
Блок-схема выполнения быстрого прототипирования
Каждый блок помещает код в определенные стандартные программы Mdl
согласно алгоритму, который это реализует. Блоки ввели, вывели, параметры, и состояния, а также другие общие элементы. Например, в целом, блокируйтесь, вводы и выводы записаны в структуру блока I/O (
). Блокируйтесь входные параметры могут также прибыть из внешней входной структуры (model_B
) или структура состояния, когда соединено с портом состояния интегратора (model_U
) или земля (model_X
rtGround
) если несвязанный или основанный. Блокируйтесь выходные параметры могут также перейти к внешней выходной структуре (
). Следующие данные показывают общее отображение между этими элементами.model_Y
Представление данных сгенерированного кода
Следующий список задает структуры, показанные в предыдущей фигуре:
Структура ввода-вывода блока (
): Эта структура состоит из персистентных выходных сигналов блока. Количество выходных сигналов блока является суммой ширин портов вывода данных всех невиртуальных блоков в вашей модели. Если вы активируете оптимизацию блока I/O, Simulink и продукты Simulink Coder уменьшают размер model_B
структуры
model_B
Многократное использование записей в структуре
model_B
Создание других локальных переменных записей
Смотрите Как Хранилища Сгенерированного кода Внутренний Сигнал, состояние и Данные о Параметре для получения дополнительной информации об этой оптимизации.
Имена полей структуры определяются любой именем выходного сигнала блока (когда существующий) или именем блока и номером порта, когда выходной сигнал оставляют немаркированным.
Структуры состояний блока: непрерывная структура состояний (
) содержит непрерывную информацию состояния для блоков в вашей модели, которые имеют непрерывные состояния. Дискретные состояния хранятся в структуре данных, названной model_X
.DWork vector (model_DWork)
Структура параметров блоков (
): структура параметров содержит параметры блоков, которые могут быть изменены во время выполнения (например, параметр блока Gain).model_P
Внешняя входная структура (
): внешняя входная структура состоит из всего корневого уровня блоки-сигналы Inport. Имена полей определяются или именем выходного сигнала блока, когда существующий, или именем блока Inport, когда выходной сигнал оставляют немаркированным.model_U
Внешняя выходная структура (
): внешняя выходная структура состоит из всех блоков Выходного порта корневого уровня. Имена полей определяются именами блока Выходного порта корневого уровня в вашей модели.model_Y
Действительная работа, целочисленная работа и указатель работают структуры (
, model_RWork
, model_IWork
): Блоки могут иметь потребность в действительном, целочисленном, или рабочие области указателя. Например, Блок памяти использует действительный рабочий элемент для каждого сигнала. Эти области используются, чтобы сохранить внутренние состояния или подобную информацию.model_PWork