exponenta event banner

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

Код быстрого прототипирования определяет следующие функции, которые взаимодействуют с основной программой (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 может быть обобщен на следующий набор уравнений.

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™.

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

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

Блок-схема выполнения быстрого прототипирования

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

Просмотр данных созданного кода

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

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

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

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

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

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

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

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

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

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

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

Связанные темы