Функции модели быстрого прототипирования

Код быстрого прототипирования определяет следующие функции, которые взаимодействуют с основной программой (main.c или main.cpp):

  • Model(): Функция регистрации модели. Эта функция инициализирует рабочие области (для примера, распределения и настройки указателей на различные структуры данных), используемые моделью. Функция регистрации модели вызывает MdlInitializeSizes и MdlInitializeSampleTimes функций. Эти две функции очень похожи на S-функцию mdlInitializeSizes и mdlInitializeSampleTimes методы.

  • MdlStart(void): После моделирования регистрационных функций MdlInitializeSizes и MdlInitializeSampleTimes execute, основная программа начинает выполняться вызовом MdlStart. Эта стандартная программа вызывается один раз при запуске.

    Функция MdlStart имеет четыре основных раздела:

    • Код для инициализации состояний для каждого блока в корневой модели, который имеет состояния. Вызов стандартной подпрограммы выполняется в стандартные программы «initialize states» условно выполненных подсистем.

    • Код, сгенерированный разовой функцией инициализации (start) для каждого блока в модели.

    • Код, чтобы включить блоки в корневой модели, которые имеют методы включения, и блоки, находящиеся внутри срабатывающих подсистем или подсистем вызова функций, находящихся в корневой модели. Simulink® блоки могут иметь методы включения и отключения. Метод enable вызывается непосредственно перед тем, как блок начинает выполняться, и метод disable вызывается сразу после того, как блок перестает выполняться.

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

  • MdlOutputs(int_T tid): MdlOutputs обновляет выходы блоков. The tid (идентификатор задачи) определяет задачу, которая, в свою очередь, отображает время выполнения блоков на основе их шага расчета. Эта стандартная программа вызывается основной программой во время основного и незначительного временных шагов. Основные временные шаги - это время, когда основная программа принимает фактический временной шаг (то есть время для выполнения определенной задачи). Если ваша модель содержит непрерывные состояния, будут сделаны незначительные временные шаги. Незначительные временные шаги - это когда решатель генерирует интегрирование каскада, которые являются точками между основными выходами. Эти стадии интегрирования используются для вычисления производных, используемых в продвижении непрерывных состояний.

  • MdlUpdate(int_T tid): MdlUpdate обновляет сведения о состояниях и состоянии рабочих векторов (то есть состояния, которые не являются ни непрерывными, ни дискретными), сохраненные в рабочих векторах. The tid (идентификатор задачи) идентифицирует задачу, которая в свою очередь указывает, какие шаги расчета активны, позволяя вам по условию обновлять только состояния активных блоков. Эта стандартная программа вызывается интерфейсом после основной MdlOutputs выполнена. Решатель также называется, и model_Derivatives вызывается решателем в мелкие шаги во время его этапов интегрирования. Все блоки, которые имеют непрерывные состояния, имеют одинаковое количество производных. Эти блоки необходимы для вычисления производных, чтобы решатели могли интегрировать состояния.

  • MdlTerminate(void): MdlTerminate содержит любой код завершения работы блока. MdlTerminate вызывается интерфейсом, как часть завершения программы в реальном времени.

Содержимое вышеописанных функций напрямую связано с блоками в вашей модели. Блок Simulink может быть обобщен на следующий набор уравнений.

y=f0(t,xc,xd,u)

Выход y является функцией непрерывного состояния xc, дискретного состояния xd и входа u. Каждый блок записывает свое конкретное уравнение в раздел MdlOutputs.

xd+1=fu(t,xd,u)

Дискретные состояния xd являются функцией текущего состояния и входа. Каждый блок, который имеет дискретное состояние, обновляет свое состояние в MdlUpdate.

x˙=fd(t,xc,u)

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

Выход y обычно записывается в структуру ввода-вывода блоков. Блоки Outport корневого уровня записывают в структуру внешних выходов. Непрерывное и дискретное состояния сохраняются в структуре состояний. Вход u может происходить из выхода другого блока, который расположен в структуре ввода-вывода блока, внешнем входе (расположенном в структуре внешних входов) или состоянии. Эти структуры определены в model.h файл, который генерирует программное обеспечение Simulink Coder™.

В следующем примере показано общее содержимое стиля быстрого прототипирования кода С, записанного в model.c файл.

Этот рисунок показывает график потока операций, описывающую выполнение сгенерированного кода быстрого прототипирования.

Быстрый поток выполнения прототипирования Графика

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

Представление данных сгенерированного кода

Следующий список определяет структуры, показанные на предыдущем рисунке:

  • Ввод-вывод блоков (model_B): Эта структура состоит из постоянных выходных сигналов блоков. Количество выходных сигналов блоков является суммой ширин выходных портов данных невиртуальных блоков в вашей модели. Если вы активируете оптимизацию ввода-вывода блоков, продукты Simulink и Simulink Coder уменьшают размер model_B структуру по

    • Повторное использование записей в model_B структура

    • Создание других локальных переменных

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

    Имена структурных полей определяются либо именем выходного сигнала блока (когда он присутствует), либо именем блока и номером порта, когда выходной сигнал оставлен без маркировки.

  • Состояния блока: Структура непрерывных состояний (model_X) содержит информацию о непрерывном состоянии для блоков в вашей модели, которые имеют непрерывные состояния. Дискретные состояния хранятся в структуре данных, называемой DWork vector (model_DWork).

  • Структура параметров блоков (model_P): Структура параметров содержит параметры блоков, которые могут быть изменены во время выполнения (для примера, параметр блока Gain).

  • Структура внешних входов (model_U): Структура внешних входов состоит из сигналов блока Inport корневого уровня. Имена полей определяются либо именем выходного сигнала блока, когда он присутствует, либо именем блока Inport, когда выходной сигнал оставлен без маркировки.

  • Структура внешних выходов (model_Y): Структура внешних выходов состоит из блоков Outport корневого уровня. Имена полей определяются именами блоков Outport корневого уровня в вашей модели.

  • Реальная работа, целочисленная работа и рабочие структуры указателя (model_RWork, model_IWork, model_PWork): Блоки могут иметь потребность в действительных, целочисленных, или указательных рабочих областях. Для примера блок Памяти использует действительный рабочий элемент для каждого сигнала. Эти области используются для сохранения внутренних состояний или аналогичной информации.

Похожие темы