Код быстрого прототипирования определяет следующие функции, которые взаимодействуют с основной программой (main.c или main.cpp):
Model()Функция регистрации модели. Эта функция инициализирует рабочие области (например, назначение и установка указателей для различных структур данных), используемые моделью. Функция регистрации модели вызывает MdlInitializeSizes и MdlInitializeSampleTimes функции. Эти две функции очень похожи на S-функцию mdlInitializeSizes и mdlInitializeSampleTimes методы.
MdlStart(void)После регистрации модели MdlInitializeSizes и MdlInitializeSampleTimes execute, основная программа запускает выполнение путем вызова MdlStart. Эта подпрограмма вызывается один раз при запуске.
Функция MdlStart имеет четыре основных раздела:
Код для инициализации состояний для каждого блока в корневой модели, имеющего состояния. Выполняется вызов подпрограммы «initialize stations» подпрограмм условно выполняемых подсистем.
Код, генерируемый функцией одноразовой инициализации (запуска) для каждого блока в модели.
Код для включения блоков в корневой модели, имеющих методы включения, и блоков внутри инициированных подсистем или подсистем вызова функций, находящихся в корневой модели. Блоки Simulink ® могут иметь методы включения и отключения. Метод enable вызывается непосредственно перед началом выполнения блока, а метод disable вызывается сразу после прекращения выполнения блока.
Код для каждого блока модели, выходное значение которого является постоянным. Код блока отображается в MdlStart функция только в том случае, если параметры блока не могут быть настроены в сгенерированном коде и если генератор кода не может устранить код блока посредством постоянного сворачивания.
MdlOutputs(int_T tid): MdlOutputs обновляет выходные данные блоков. tid параметр (идентификатор задачи) идентифицирует задачу, которая, в свою очередь, отображает время выполнения блоков на основе их времени выборки. Эта подпрограмма вызывается основной программой во время основных и второстепенных временных шагов. Основные временные шаги - это когда основная программа делает фактический временной шаг (то есть, пришло время выполнить конкретную задачу). Если модель содержит непрерывные состояния, будут выполнены второстепенные временные шаги. Второстепенные временные шаги - это когда решатель генерирует этапы интегрирования, которые являются точками между основными выходами. Эти стадии интегрирования используются для вычисления производных, используемых для продвижения непрерывных состояний.
MdlUpdate(int_T tid): MdlUpdate обновляет состояния и информацию о состоянии рабочего вектора (т.е. состояния, которые не являются ни непрерывными, ни дискретными), сохраненные в рабочих векторах. tid параметр (идентификатор задачи) идентифицирует задачу, которая в свою очередь указывает, какие времена выборки активны, позволяя условно обновлять только состояния активных блоков. Эта подпрограмма вызывается интерфейсом после основного MdlOutputs был выполнен. Также вызывается решатель, и вызывается в виде незначительных шагов решателем на этапах интеграции. Все блоки, имеющие непрерывные состояния, имеют одинаковое количество производных. Эти блоки необходимы для вычисления производных, чтобы решатели могли интегрировать состояния.model_Derivatives
MdlTerminate(void): MdlTerminate содержит любой код завершения работы блока. MdlTerminate вызывается интерфейсом, как часть завершения программы реального времени.
Содержимое вышеупомянутых функций непосредственно связано с блоками в модели. Блок Simulink может быть обобщен на следующий набор уравнений.
xd, u)
Выход y является функцией непрерывного состояния xc, дискретного состояния xd и входа u. Каждый блок записывает свое конкретное уравнение в раздел MdlOutputs.
xd, u)
Дискретные состояния xd являются функцией текущего состояния и входного сигнала. Каждый блок, имеющий дискретное состояние, обновляет свое состояние в MdlUpdate.
u)
Производные x являются функцией входного тока. Каждый блок, имеющий непрерывные состояния, предоставляет решателю свои производные (например, ode5) в . Производные используются решателем для интеграции непрерывного состояния для получения следующего значения.model_Derivatives
Выходной сигнал y обычно записывается в структуру блочного ввода-вывода. Блоки Outport корневого уровня записываются в структуру внешних выходов. Непрерывные и дискретные состояния хранятся в структуре состояний. Вход u может исходить из выхода другого блока, который расположен в структуре блока ввода-вывода, внешнего входа (расположен в структуре внешних входов) или состояния. Эти структуры определены в , который создает программа Simulink Coder™.model.h
В следующем примере показано общее содержимое стиля быстрого прототипирования кода C, записанного в файл.model.c

На этом рисунке показана блок-схема, описывающая выполнение сгенерированного кода быстрого прототипирования.
Блок-схема выполнения быстрого прототипирования

Каждый блок помещает код в определенный Mdl подпрограммы в соответствии с алгоритмом, который он реализует. Блоки имеют входные, выходные, параметры и состояния, а также другие общие элементы. Например, в общем случае входы и выходы блока записываются в структуру блочного ввода-вывода (). Входы блоков также могут поступать из внешней структуры ввода (model_Bили структура состояния при подключении к порту состояния интегратора (model_U) или заземление (model_XrtGround) если не подключен или заземлен. Блочные выходы также могут поступать во внешнюю структуру вывода (). На этом рисунке показано общее сопоставление между этими элементами.model_Y
Просмотр данных созданного кода

Следующий список определяет структуры, показанные на предыдущем рисунке:
Структура блочного ввода-вывода (Эта структура состоит из постоянных блочных выходных сигналов. Количество выходных сигналов блока - это сумма значений ширины портов вывода данных невиртуальных блоков в модели. При активации оптимизации блочного ввода-вывода продукты Simulink и Simulink Coder уменьшают размер model_B структура поmodel_B
Повторное использование записей в структура model_B
Ввод других локальных переменных
Дополнительные сведения об этих оптимизациях см. в разделе Как сгенерированный код хранит данные внутреннего сигнала, состояния и параметра.
Имена полей структуры определяются либо именем выходного сигнала блока (если он присутствует), либо именем блока и номером порта, если выходной сигнал не помечен.
Структуры состояний блоков: Структура непрерывных состояний () содержит информацию о непрерывном состоянии для блоков в модели, имеющих непрерывное состояние. Дискретные состояния хранятся в структуре данных, называемой model_X.DWork vector (model_DWork)
Структура параметров блока (): Структура параметров содержит параметры блока, которые могут быть изменены во время выполнения (например, параметр блока усиления).model_P
Структура внешних вводов (): Структура внешних входов состоит из сигналов блока ввода корневого уровня. Имена полей определяются либо именем выходного сигнала блока, когда он присутствует, либо именем блока Inport, когда выходной сигнал остается незамеченным.model_U
Структура внешних выходов (): Структура внешних выходов состоит из блоков Outport корневого уровня. Имена полей определяются именами блоков Outport корневого уровня в модели.model_Y
Реальная работа, целочисленная работа и структуры работы указателя (, model_RWork, model_IWork): Блоки могут иметь потребность в вещественных, целых или указательных рабочих областях. Например, блок памяти использует реальный рабочий элемент для каждого сигнала. Эти области используются для сохранения внутренних состояний или аналогичной информации.model_PWork