Обменивайтесь данными между сгенерированным и внешним кодом Используя API C

Некоторый Simulink® Приложения Coder™ должны взаимодействовать с сигналами, состояниями, входными параметрами/выходными параметрами корневого уровня или параметрами в сгенерированном коде для модели. Например, калибровочные приложения контролируют и изменяют параметры. Контроль сигналов или приложения регистрации данных взаимодействуют через интерфейс с сигналом, состоянием и данными о вводе/выводе корневого уровня. Используя Simulink Coder C API, можно создать целевые приложения, которые регистрируют сигналы, состояния, и входные параметры/выходные параметры корневого уровня, сигналы монитора, состояния, и входные параметры/выходные параметры корневого уровня и настройки параметров, в то время как сгенерированный код выполняется.

API C минимизирует свой объем потребляемой памяти, делясь информацией, характерной для сигналов, состояний, входных параметров/выходных параметров корневого уровня и параметров в меньших структурах. Сигнал, состояние, ввод/вывод корневого уровня и структуры параметра включают индекс в карту структуры, позволяя нескольким сигналам, состояниям, входным параметрам/выходным параметрам корневого уровня или параметрам осуществлять обмен данными.

Чтобы начать с примером, смотрите Использование C API к доступу к Сигналам Модели и состояниям или Использованию C API к доступу к Параметрам модели.

Сгенерированные файлы API C

Когда вы конфигурируете модель, чтобы использовать API C, генератор кода Simulink Coder генерирует два дополнительных файла, model_capi.c (или .cpp) и model_capi.h, где model имя модели. Генератор кода помещает два файла API C в папку сборки, на основе настроек в диалоговом окне Configuration Parameters. Файл исходного кода API C содержит информацию о глобальных выходных сигналах блока, состояниях, входных параметрах/выходных параметрах корневого уровня и глобальных параметрах, заданных в исходном коде модели сгенерированного кода. Заголовочный файл API C является интерфейсным заголовочным файлом между исходным кодом модели и сгенерированным API C. Можно использовать информацию в этих файлах API C, чтобы создать приложение. Среди сгенерированных файлов показанные на следующем рисунке.

Сгенерированные файлы с выбранным API C

Примечание

Когда вы конфигурируете генератор кода, чтобы произвести код, который включает поддержку API-интерфейса C и регистрации данных, генератор кода может включать текст для имен блока в путях к блоку, регистрируемых к файлам API C model_capi.c (или .cpp) и model_capi.h. Если текст включает символы, которые не представлены в кодировании набора символов для модели, генератор кода заменяет символы на escape-последовательности XML. Например, генератор кода заменяет японскую полноширинную букву Katakana ア на escape-последовательность ア. Для получения дополнительной информации смотрите Интернационализацию и Генерацию кода.

Сгенерируйте файлы API C

Сгенерировать файлы API C для вашей модели:

  1. Выберите C API interface для своей модели. Существует два способа выбрать C API interface для вашей модели, как описано в следующих разделах.

  2. Сгенерируйте код для своей модели.

После генерации кода можно исследовать файлы model_capi.c (или .cpp) и model_capi.h в папке сборки модели.

Выберите C API with Configuration Parameters Dialog

  1. Откройте свою модель и откройте диалоговое окно Configuration Parameters.

  2. В Code Generation> панель Interface, в подгруппе Data exchange interface, выберите один или несколько C API опции. На основе опций вы выбираете, поддержка доступа к сигналам, параметрам, состояниям, и ввод-вывод корневого уровня появится в сгенерированном коде API C.

    • Если вы хотите сгенерировать код API C для глобальных выходных сигналов блока, выберите Generate C API for: signals.

    • Если вы хотите сгенерировать код API C для глобальных параметров блоков, выберите Generate C API for: parameters.

    • Если вы хотите сгенерировать код API C для дискретных и непрерывных состояний, выберите Generate C API for: states.

    • Если вы хотите сгенерировать код API C для вводов и выводов корневого уровня, выберите Generate C API for: root-level I/O.

Выберите C API из командной строки

Из MATLAB® командная строка, можно использовать set_param функционируйте, чтобы выбрать или очистить параметры конфигурации модели C API. В командной строке MATLAB введите один или несколько следующих команд, где modelname имя вашей модели.

Выбрать Generate C API for: signals, введите:

set_param('modelname','RTWCAPISignals','on')

Очистить Generate C API for: signals, введите:

set_param('modelname','RTWCAPISignals','off')

Выбрать Generate C API for: parameters, введите:

set_param('modelname','RTWCAPIParams','on')

Очистить Generate C API for: parameters, введите:

set_param('modelname','RTWCAPIParams','off')

Выбрать Generate C API for: states, введите:

set_param('modelname','RTWCAPIStates','on')

Очистить Generate C API for: states, введите:

set_param('modelname','RTWCAPIStates','off')

Выбрать Generate C API for: root-level I/O, введите:

set_param('modelname','RTWCAPIRootIO','on')

Очистить Generate C API for: root-level I/O, введите:

set_param('modelname','RTWCAPIRootIO','off')

Описание файлов API C

О файлах API C

model_capi.c (или .cpp) файл предоставляет внешним приложениям сопоставимый интерфейс к данным модели. В зависимости от ваших параметров конфигурации данные могли быть сигналом, состоянием, вводом или выводом корневого уровня или параметром. В этом документе термин data item относится или к сигналу, состоянию, вводу или выводу корневого уровня или к параметру. API C использует структуры, которые обеспечивают интерфейс к свойствам элемента данных. Интерфейсные пакеты свойства каждого элемента данных в структуре данных. Если модель содержит несколько элементов данных, интерфейс генерирует массив структур данных. Члены структуры данных сопоставляют со свойствами данных.

Чтобы взаимодействовать через интерфейс с элементами данных, приложение требует следующих свойств для каждого элемента данных:

  • Имя

  • Блок path

  • Номер порта (для сигналов и корневого уровня вводит/выводит только),

  • Адрес

  • Информация о типе данных: собственный тип данных, размер данных, сложность и другие атрибуты

  • Информация о размерностях: количество строк, количество столбцов и ориентация данных (скаляр, вектор, матрица, или n-мерный)

  • Информация о фиксированной точке: наклон, смещение, масштабирует тип, размер слова, экспоненту и другие атрибуты

  • Информация о шаге расчета (для сигналов, состояний и корневого уровня вводит/выводит только): шаг расчета, идентификатор задачи, системы координат

Как проиллюстрировано на следующем рисунке, свойства элемента данных A, например, расположены в структуре данных DS_A. Свойства элемента данных B расположены в структуре данных DS_B.

Некоторые значения свойств могут быть уникальны для каждого элемента данных, и существуют некоторые значения свойств, которые несколько элементов данных могут совместно использовать вместе. Назовите, например, имеет уникальное значение для каждого элемента данных. Интерфейс помещает значения уникального свойства непосредственно в структуру для элемента данных. Значение имени элемента данных A находится в DS_A, и значение имени элемента данных B находится в DS_B.

Но тип данных мог быть свойством, значение которого несколько элементов данных имеют общего. Способность некоторых элементов данных совместно использовать свойство позволяет API C иметь функцию повторного использования. В этом случае интерфейс помещает только значение индекса в DS_A и значение индекса в DS_B. Эти индексы указывают на различную структуру данных, DS_C, который содержит фактическое значение типа данных. Следующий рисунок показывает эту схему с большим количеством детали.

Рисунок показывает три сигнала. signal1 и signal2 совместно используйте совпадающий тип данных, double. Вместо того, чтобы задать это значение типа данных в каждой структуре данных сигнала, интерфейс вводит только значение индекса, 0, в структуре. "double" описан записью 0 в rtDataTypeMap массив, на который ссылаются оба сигнала. Кроме того, значения свойств могут быть совместно использованы сигналами, состояниями, входными параметрами/выходными параметрами корневого уровня и параметрами, так состояния, входные параметры/выходные параметры корневого уровня, и параметры также могут сослаться на double запись в rtDataTypeMap массив. Это повторное использование информации уменьшает емкость памяти сгенерированного интерфейса.

Массивы структур, сгенерированные в файлах API C

Как с типом данных, интерфейс сопоставляет другую общую собственность (такую как адрес, размерность, масштабирование фиксированной точки и шаг расчета) в отдельные структуры и обеспечивает индекс в структуре для элемента данных. Для полного списка определений структуры отошлите к файлу matlabroot/rtw/c/src/rtw_capi.h. Этот файл также описывает каждый член в структуре. Массивы структур сгенерированы в model_capi.c (или .cpp) файл имеет типы структуры, заданные в rtw_capi.h файл. Вот краткое описание массивов структур, сгенерированных в model_capi.c (или .cpp):

  • rtBlockSignals массив структур, который содержит информацию о глобальных выходных сигналах блока в модели. Каждый элемент в массиве имеет тип struct rtwCAPI_Signals. Члены этой структуры обеспечивают имя сигнала, блок path, номер порта блока, адрес и индексы к типу данных, размерности, фиксированной точке и массивам структур шага расчета.

  • rtBlockParameters массив структур, который содержит информацию о настраиваемых параметрах блоков в модели именем блока и названием параметра. Каждый элемент в массиве имеет тип struct rtwCAPI_BlockParameters. Члены этой структуры обеспечивают название параметра, блок path, адрес и индексы к типу данных, размерности и массивам структур фиксированной точки.

  • rtBlockStates массив структур, который содержит информацию о дискретных и непрерывных состояниях в модели. Каждый элемент в массиве имеет тип struct rtwCAPI_States. Члены этой структуры обеспечивают имя состояния, блок path, вводят (непрерывный или дискретный), и индексы к адресу, типу данных, размерности, фиксированной точке и массивам структур шага расчета.

  • rtRootInputs массив структур, который содержит информацию о входных параметрах корневого уровня в модели. Каждый элемент в массиве имеет тип struct rtwCAPI_Signals. Члены этой структуры обеспечивают входное имя корневого уровня, блок path, номер порта блока, адрес и индексы к типу данных, размерности, фиксированной точке и массивам структур шага расчета.

  • rtRootOutputs массив структур, который содержит информацию о корневом уровне выходные параметры в модели. Каждый элемент в массиве имеет тип struct rtwCAPI_Signals. Члены этой структуры предоставляют корневому уровню выходное имя, блок path, номер порта блока, адрес и индексы к типу данных, размерности, фиксированной точке и массивам структур шага расчета.

  • rtModelParameters массив структур, который содержит информацию о переменных рабочего места что один или несколько блоков или Stateflow® графики в модели - ссылке как параметры блоков. Каждый элемент в массиве имеет тип данных rtwCAPI_ModelParameters. Члены этой структуры обеспечивают имя переменной, адрес и индексы к типу данных, размерности и массивам структур фиксированной точки.

  • rtDataAddrMap массив базовых адресов сигналов, состояний, входных параметров/выходных параметров корневого уровня и параметров, которые появляются в rtBlockSignals, rtBlockParameters, rtBlockStates, и rtModelParameters массивы. Каждый элемент rtDataAddrMap массив является указателем на void (void*).

  • rtDataTypeMap массив структур, который содержит информацию о различных типах данных в модели. Каждый элемент этого массива имеет тип struct rtwCAPI_DataTypeMap. Члены этой структуры обеспечивают имя типа данных, размер типа данных и информацию о том, являются ли данные комплексными.

  • rtDimensionMap массив структур, который содержит информацию о различных размерностях данных в модели. Каждый элемент этого массива имеет тип struct rtwCAPI_DimensionMap. Члены этой структуры предоставляют информацию о количестве размерностей в данных, ориентации данных (является ли это скаляром, вектором или матрицей), и фактические размерности данных.

  • rtFixPtMap массив структур, который содержит информацию о фиксированной точке о сигналах, состояниях, входных параметрах/выходных параметрах корневого уровня и параметрах. Каждый элемент этого массива имеет тип struct rtwCAPI_FixPtMap. Члены этой структуры предоставляют информацию о масштабировании данных, смещении, экспоненте, и подписываются ли данные фиксированной точки. Если модель не имеет данных фиксированной точки (сигнал, состояние, ввод/вывод корневого уровня или параметр), программное обеспечение Simulink Coder присваивает NULL или нулевые значения к элементам rtFixPtMap массив.

  • rtSampleTimeMap массив структур, который содержит информацию о выборке о глобальных сигналах, состояниях и входных параметрах/выходных параметрах корневого уровня в модели. (Этот массив не содержит информацию о параметрах.) Каждый элемент этого массива имеет тип struct rtwCAPI_SampleTimeMap. Члены этой структуры предоставляют информацию о периоде расчета, возмещают, и основаны ли данные на системе координат или основаны на выборке.

Сгенерируйте пример C файлы API

Подтемы C Сигналы API, C состояния API, C Вводы и выводы Корневого Уровня API и Параметры API C обсуждают сгенерированные структуры API C с помощью модели rtwdemo_capi в качестве примера. Чтобы сгенерировать код из модели в качестве примера, сделайте следующее:

  1. Откройте модель путем нажатия на rtwdemo_capi соединитесь выше или путем ввода rtwdemo_capi на командной строке MATLAB.

  2. Если вы хотите сгенерировать структуры API C для входных параметров/выходных параметров корневого уровня в rtwdemo_capi, выберите параметр конфигурации модели Generate C API for: root-level I/O.

    Установка этого параметра должна соответствовать между топ-моделью и моделью, на которую ссылаются. Если вы изменяете установку параметра, сохраняете топ-модель и модель, на которую ссылаются, к той же перезаписываемой папке работы.

  3. Сгенерируйте код для модели.

Примеры кода API C в следующих подтемах сгенерированы с C как выходной язык.

Эта модель имеет три глобальных выходных сигнала блока, которые появятся в сгенерированном коде API C:

  • top_sig1, который является тестовой точкой при выходе блока Gain1 в топ-модели

  • sig2_eg, который появляется в топ-модели и задан в базовом рабочем пространстве как Simulink.Signal объект, имеющий класс памяти ExportedGlobal

  • bot_sig1, который появляется в модели rtwdemo_capi_bot, на которую ссылаются, и задан как Simulink.Signal объект, имеющий класс памяти Model default

Модель также имеет два дискретных состояния, которые появятся в сгенерированном коде API C:

  • top_state, который задан для блока Delay1 в топ-модели

  • bot_state, который задан для блока Discrete Filter в модели, на которую ссылаются,

Модель имеет входные параметры/выходные параметры корневого уровня, которые появятся в сгенерированном коде API C, если вы выберете параметр конфигурации модели Generate C API for: root-level I/O:

  • Четыре входных параметров корневого уровня, In1 через In4

  • Шесть корневых уровней выходные параметры, Out1 через Out6

Кроме того, модель имеет пять глобальных параметров блоков, которые появятся в сгенерированном коде API C:

  • Kp (топ-модель Gain1 блокируйтесь и модель Gain2, на которую ссылаются, блокируйте долю),

  • Ki (модель Gain3, на которую ссылаются, блокируйтесь),

  • p1 (интерполяционная таблица lu1d)

  • p2 (интерполяционная таблица lu2d)

  • p3 (интерполяционная таблица lu3d)

C сигналы API

rtwCAPI_Signals структура получает информацию сигнала включая имя сигнала, адрес, блок path, номер выходного порта, информацию о типе данных, информацию о размерностях, информацию о фиксированной точке и информацию о шаге расчета.

Вот раздел кода в rtwdemo_capi_capi.c это предоставляет информацию о сигналах API C для топ-модели в rtwdemo_capi:

/* Block output signal information */
static const rtwCAPI_Signals rtBlockSignals[] = {
  /* addrMapIndex, sysNum, blockPath,
   * signalName, portNumber, dataTypeIndex, dimIndex, fxpIndex, sTimeIndex
   */
  { 0, 0, "rtwdemo_capi/Gain1",
    "top_sig1", 0, 0, 0, 0, 0 },

  { 1, 0, "rtwdemo_capi/lu2d",
    "sig2_eg", 0, 0, 1, 0, 0 },

  {
    0, 0, (NULL), (NULL), 0, 0, 0, 0, 0
  }
};

Примечание

Чтобы лучше изучить код, считайте комментарии в файле. Например, заметьте комментарий, который начинается на третьей линии в предыдущем коде. Этот комментарий перечисляет члены rtwCAPI_Signals структура, в порядке. Это говорит вам порядок, в котором присвоенные значения для каждого члена появляются для сигнала. В этом примере комментарий говорит вам тот signalName четвертый член структуры. Следующие линии описывают первый сигнал:

  { 0, 0, "rtwdemo_capi/Gain1",
    "top_sig1", 0, 0, 0, 0, 0 },

От этих линий вы выводите, что именем первого сигнала является top_sig1.

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

  { 1, 0, "rtwdemo_capi/lu2d",
    "sig2_eg", 0, 0, 1, 0, 0 },

Этот сигнал, названный sig2_eg, выходной сигнал первого порта блока rtwdemo_capi/lu2d. (Этот порт является первым портом потому что основанный на нуле индекс для portNumber отображенный на второй линии присвоен значение 0.)

Адрес этого сигнала дан addrMapIndex, который, в этом примере, отображен на первой линии как 1. Это обеспечивает индекс в rtDataAddrMap массив, найденный позже в rtwdemo_capi_capi.c:

/* Declare Data Addresses statically */
static void* rtDataAddrMap[] = {
  &rtwdemo_capi_B.top_sig1,            /* 0: Signal */
  &sig2_eg[0],                         /* 1: Signal */
  &rtwdemo_capi_DWork.top_state,       /* 2: Discrete State */
  &rtP_Ki,                             /* 3: Model Parameter */
  &rtP_Kp,                             /* 4: Model Parameter */
  &rtP_p1[0],                          /* 5: Model Parameter */
  &rtP_p2[0],                          /* 6: Model Parameter */
  &rtP_p3[0],                          /* 7: Model Parameter */
};

Индекс 1 точки к второму элементу в rtDataAddrMap массив. От rtDataAddrMap массив, можно вывести, что адресом этого сигнала является &sig2_eg[0].

Этот уровень абстракции поддерживает несколько экземпляров кода той же модели. Для нескольких экземпляров информация сигнала остается постоянной, за исключением адреса. В этом случае модель является одним экземпляром. Поэтому rtDataAddrMap объявляется статически. Если вы принимаете решение сгенерировать повторно используемый код, инициализировать функция сгенерирована, который инициализирует адреса динамически на экземпляр. Для получения дополнительной информации при генерации повторно используемого кода, смотрите, Конфигурируют генерацию кода C для Функций Точки входа Модели и видят, Конфигурируют Поддержку Повторного использования кода (Embedded Coder).

dataTypeIndex обеспечивает индекс в rtDataTypeMap массив, найденный позже в rtwdemo_capi_capi.c, указание на тип данных сигнала:

/* Data Type Map - use dataTypeMapIndex to access this structure */
static const rtwCAPI_DataTypeMap rtDataTypeMap[] = {
  /* cName, mwName, numElements, elemMapIndex, dataSize, slDataId, *
   * isComplex, isPointer */
  { "double", "real_T", 0, 0, sizeof(real_T), SS_DOUBLE, 0, 0 }
};

Поскольку индексом является 0 для sig2_eg, индекс указывает на первый элемент структуры в массиве. Можно вывести, что типом данных сигнала является double. Значение isComplex 0, указание, что сигнал не является комплексным. Вместо того, чтобы предоставлять информацию о типе данных непосредственно в rtwCAPI_Signals структура, уровень абстракции введен. Косвенность позволяет несколько сигналов, которые совместно используют совпадающий тип данных, чтобы указать на одну структуру карты, сохраняя память для каждого сигнала.

dimIndex (индекс размерностей), обеспечивает индекс в rtDimensionMap массив, найденный позже в rtwdemo_capi_capi.c, указание на размерности сигнала. Поскольку этим индексом является 1 для sig2_eg, индекс указывает на второй элемент в rtDimensionMap массив:

/* Dimension Map - use dimensionMapIndex to access elements of ths structure*/
static const rtwCAPI_DimensionMap rtDimensionMap[] = {
  /* dataOrientation, dimArrayIndex, numDims, vardimsIndex */
  { rtwCAPI_SCALAR, 0, 2, 0 },

  { rtwCAPI_VECTOR, 2, 2, 0 },
...
};

От этой структуры можно вывести, что это - нескалярный сигнал, имеющий размерность 2. dimArrayIndex значение, 2, обеспечивает индекс в rtDimensionArray, найденный позже в rtwdemo_capi_capi.c:

/* Dimension Array- use dimArrayIndex to access elements of this array */
static const uint_T rtDimensionArray[] = {
  1,                                   /* 0 */
  1,                                   /* 1 */
  2,                                   /* 2 */
...
};

fxpIndex (индекс фиксированной точки), обеспечивает индекс в rtFixPtMap массив, найденный позже в rtwdemo_capi_capi.c, указание на информацию о фиксированной точке о сигнале. Ваш код может использовать масштабирующуюся информацию, чтобы вычислить реальное значение сигнала, с помощью уравнения V=SQ+B, где V “реально” (то есть, основа 10), значение, S задано пользователями, наклон, Q является “квантованным значением фиксированной точки” или “сохраненным целым числом”, и B задан пользователями смещение. Для получения дополнительной информации смотрите Масштабирующийся (Fixed-Point Designer).

Поскольку этим индексом является 0 для sig2_eg, сигнал не имеет информации о фиксированной точке. Индекс карты фиксированной точки нулевых средних значений, что сигнал не имеет информации о фиксированной точке.

sTimeIndex (индекс шага расчета), предоставляет индекс rtSampleTimeMap массив, найденный позже в rtwdemo_capi_capi.c, указание на информацию о задаче о сигнале. Если вы регистрируете многоскоростные сигналы или условно выполняемые сигналы, информация о выборке может быть полезной.

Примечание

model_capi.c (или .cpp) включает rtw_capi.h. Исходный файл это ссылается на rtBlockSignals массив также должен включать rtw_capi.h.

C состояния API

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

Вот раздел кода в rtwdemo_capi_capi.c это предоставляет информацию о состояниях API C для топ-модели в rtwdemo_capi:

/* Block states information */
static const rtwCAPI_States rtBlockStates[] = {
  /* addrMapIndex, contStateStartIndex, blockPath,
   * stateName, pathAlias, dWorkIndex, dataTypeIndex, dimIndex,
   * fixPtIdx, sTimeIndex, isContinuous
   */
  { 2, -1, "rtwdemo_capi/Delay1",
    "top_state", "", 0, 0, 0, 0, 0, 0 },

  {
    0, -1, (NULL), (NULL), (NULL), 0, 0, 0, 0, 0, 0
  }
};

Каждый элемент массива, кроме последнего, описывает состояние в модели. Итоговый элемент массива является сигнальной меткой с установленными в NULL значениями всех элементов. В этом примере код API C для топ-модели отображает одно состояние:

  { 2, -1, "rtwdemo_capi/Delay1",
    "top_state", "", 0, 0, 0, 0, 0, 0 },

Это состояние, названное top_state, задан для блока rtwdemo_capi/Delay1. Значение isContinuous нуль, указывая, что состояние дискретно, а не непрерывно. Другие поля соответствуют подобно названным эквивалентам сигнала, описанным в Сигналах API C, можно следующим образом:

  • Адрес сигнала дан addrMapIndex, который, в этом примере, 2. Это - индекс в rtDataAddrMap массив, найденный позже в rtwdemo_capi_capi.c. Поскольку индекс является базирующимся нулем, 2 соответствует третьему элементу в rtDataAddrMap, который является &rtwdemo_capi_DWork.top_state.

  • dataTypeIndex обеспечивает индекс в rtDataTypeMap массив, найденный позже в rtwdemo_capi_capi.c, указание на тип данных параметра. Значение 0 соответствует двойному, некомплексному параметру.

  • dimIndex (индекс размерностей), обеспечивает индекс в rtDimensionMap массив, найденный позже в rtwdemo_capi_capi.c. Значение 0 соответствует первой записи, которая является { rtwCAPI_SCALAR, 0, 2, 0 }.

  • fixPtIndex (индекс фиксированной точки), обеспечивает индекс в rtFixPtMap массив, найденный позже в rtwdemo_capi_capi.c, указание на информацию о фиксированной точке о параметре. Как с соответствующим атрибутом сигнала, индексом карты фиксированной точки нулевых средних значений, что параметр не имеет информации о фиксированной точке.

C вводы и выводы Корневого Уровня API

rtwCAPI_Signals структура получает информацию о вводе/выводе корневого уровня включая имя ввода/вывода, адрес, блок path, номер порта, информацию о типе данных, информацию о размерностях, информацию о фиксированной точке и информацию о шаге расчета. (Эта структура также используется для выходных сигналов блока, как ранее описано в Сигналах API C.)

Вот раздел кода в rtwdemo_capi_capi.c это предоставляет информацию о входных параметрах/выходных параметрах корневого уровня API C для топ-модели в rtwdemo_capi:

/* Root Inputs information */
static const rtwCAPI_Signals rtRootInputs[] = {
  /* addrMapIndex, sysNum, blockPath,
   * signalName, portNumber, dataTypeIndex, dimIndex, fxpIndex, sTimeIndex
   */
  { 3, 0, "rtwdemo_capi/In1",
    "", 1, 0, 0, 0, 0 },

  { 4, 0, "rtwdemo_capi/In2",
    "", 2, 0, 0, 0, 0 },

  { 5, 0, "rtwdemo_capi/In3",
    "", 3, 0, 0, 0, 0 },

  { 6, 0, "rtwdemo_capi/In4",
    "", 4, 0, 0, 0, 0 },

  {
    0, 0, (NULL), (NULL), 0, 0, 0, 0, 0
  }
};

/* Root Outputs information */
static const rtwCAPI_Signals rtRootOutputs[] = {
  /* addrMapIndex, sysNum, blockPath,
   * signalName, portNumber, dataTypeIndex, dimIndex, fxpIndex, sTimeIndex
   */
  { 7, 0, "rtwdemo_capi/Out1",
    "", 1, 0, 0, 0, 0 },

  { 8, 0, "rtwdemo_capi/Out2",
    "", 2, 0, 0, 0, 0 },

  { 9, 0, "rtwdemo_capi/Out3",
    "", 3, 0, 0, 0, 0 },

  { 10, 0, "rtwdemo_capi/Out4",
    "", 4, 0, 0, 0, 0 },

  { 11, 0, "rtwdemo_capi/Out5",
    "sig2_eg", 5, 0, 1, 0, 0 },

  { 12, 0, "rtwdemo_capi/Out6",
    "", 6, 0, 1, 0, 0 },

  {
    0, 0, (NULL), (NULL), 0, 0, 0, 0, 0
  }
};

Примечание

Когда вы генерируете Код С++, генератор кода не предоставляет информацию о входных параметрах/выходных параметрах корневого уровня API C.

Для получения информации об интерпретации значений в rtwCAPI_Signals структура, смотрите предыдущий раздел C Сигналы API.

C параметры API

rtwCAPI_BlockParameters и rtwCAPI_ModelParameters структуры получают информацию о параметре включая название параметра, блок path (для параметров блоков), адрес, информация о типе данных, информация о размерностях и информация о фиксированной точке.

rtModelParameters массив содержит записи для переменных рабочей области, на которые ссылаются как настраиваемые параметры блока Simulink или данные Stateflow осциллографа машины. Например, настраиваемые параметры включают Simulink.Parameter объекты, которые используют класс памяти кроме Auto. Программное обеспечение Simulink Coder присваивает свои элементы только NULL или нулевые значения в отсутствие таких данных.

Установка, что вы выбираете для параметра конфигурации модели Default parameter behavior, определяет, как информация сгенерирована в rtBlockParameters массив в model_capi.c (или .cpp).

  • Если вы устанавливаете Default parameter behavior на Tunable, rtBlockParameters массив содержит запись для каждого модифицируемого параметра каждого блока в модели. Однако, если вы используете переменную MATLAB или настраиваемый параметр, чтобы задать параметры блоков, параметры блоков не появляются в rtBlockParameters. Вместо этого переменная или настраиваемый параметр появляются в rtModelParameters.

  • Если вы устанавливаете Default parameter behavior на Inlined, rtBlockParameters массив пуст. Программное обеспечение Simulink Coder присваивает свои элементы только NULL или нулевые значения.

Последний член каждого массива является сигнальной меткой с установленными в NULL значениями всех элементов.

Вот rtBlockParameters массив, который сгенерирован по умолчанию в rtwdemo_capi_capi.c:

/* Individual block tuning is not valid when inline parameters is *
 * selected. An empty map is produced to provide a consistent     *
 * interface independent  of inlining parameters.                 *
 */
static const rtwCAPI_BlockParameters rtBlockParameters[] = {
  /* addrMapIndex, blockPath,
   * paramName, dataTypeIndex, dimIndex, fixPtIdx
   */
  {
    0, (NULL), (NULL), 0, 0, 0
  }
};

В этом примере, только финал, элемент массива сигнальной метки сгенерирован со всеми членами структуры rtwCAPI_BlockParameters установите на NULL и нулевые значения. Это вызвано тем, что Default parameter behavior установлен в Inlined по умолчанию для rtwdemo_capi модель в качестве примера. Если вы устанавливаете Default parameter behavior на Tunable, параметры блоков сгенерированы в rtwCAPI_BlockParameters структура. Однако переменные MATLAB и настраиваемые параметры появляются в rtwCAPI_ModelParameters структура.

Вот rtModelParameters массив, который сгенерирован по умолчанию в rtwdemo_capi_capi.c:

/* Tunable variable parameters */
static const rtwCAPI_ModelParameters rtModelParameters[] = {
  /* addrMapIndex, varName, dataTypeIndex, dimIndex, fixPtIndex */
  { 2, TARGET_STRING("Ki"), 0, 0, 0 },

  { 3, TARGET_STRING("Kp"), 0, 0, 0 },

  { 4, TARGET_STRING("p1"), 0, 2, 0 },

  { 5, TARGET_STRING("p2"), 0, 3, 0 },

  { 6, TARGET_STRING("p3"), 0, 4, 0 },

  { 0, (NULL), 0, 0, 0 }
};

В этом примере, rtModelParameters массив содержит записи для каждой переменной, на которую ссылаются как настраиваемый параметр блока Simulink.

Например, varName (именем переменной) четвертого параметра является p2. Другие поля соответствуют подобно названным эквивалентам сигнала, описанным в Сигналах API C, можно следующим образом:

  • Адрес четвертого параметра дан addrMapIndex, который, в этом примере, 5. Это - индекс в rtDataAddrMap массив, найденный позже в rtwdemo_capi_capi.c. Поскольку индекс является базирующимся нулем, 5 соответствует шестому элементу в rtDataAddrMap, который является rtP_p2.

  • dataTypeIndex обеспечивает индекс в rtDataTypeMap массив, найденный позже в rtwdemo_capi_capi.c, указание на тип данных параметра. Значение 0 соответствует двойному, некомплексному параметру.

  • dimIndex (индекс размерностей), обеспечивает индекс в rtDimensionMap массив, найденный позже в rtwdemo_capi_capi.c. Значение 3 соответствует четвертой записи, которая является { rtwCAPI_MATRIX_COL_MAJOR, 6, 2, 0 }.

  • fixPtIndex (индекс фиксированной точки), обеспечивает индекс в rtFixPtMap массив, найденный позже в rtwdemo_capi_capi.c, указание на информацию о фиксированной точке о параметре. Как с соответствующим атрибутом сигнала, индексом карты фиксированной точки нулевых средних значений, что параметр не имеет информации о фиксированной точке.

Для получения дополнительной информации об устройстве хранения данных настраиваемого параметра в сгенерированном коде, смотрите Как Хранилища Сгенерированного кода Внутренний Сигнал, состояние и Данные о Параметре.

Карта C Структуры данных API к rtModel

Структура данных модели реального времени инкапсулирует данные модели и сопоставленную информацию, которая описывает модель полностью. Когда вы выбираете функцию API C и генерируете код, генератор кода Simulink Coder добавляет другой член в структуру данных модели реального времени, сгенерированную в modelH:

/*
 * DataMapInfo:
 * The following substructure contains information regarding
 * structures generated in the model's C API.
 */
struct {
  rtwCAPI_ModelMappingInfo mmi;
} DataMapInfo;

Этот член задает mmi (для модели, сопоставляющей информацию) типа struct rtwCAPI_ModelMappingInfo. Структура расположена в matlabroot/rtw/c/src/rtw_modelmap.h. mmi подструктура задает интерфейс между моделью и файлами API C. А именно, члены mmi сопоставьте структуру данных модели реального времени со структурами в model_capi.c (или .cpp).

Инициализация значений mmi члены к массивам выполняют отображение, как показано в Модели Карты к Массивам API C Структур. Каждый член указывает на один из массивов структур в сгенерированном файле API C. Например, адрес rtBlockSignals массив структур выделяется первому члену mmi подструктура в modelC (или .cpp), с помощью следующего кода в rtw_modelmap.h файл:

/* signals */
struct {
    rtwCAPI_Signals const *signals;     /* Signals Array */
    uint_T                numSignals;   /* Num Signals   */
    rtwCAPI_Signals const *rootInputs;  /* Root Inputs array */
    uint_T               numRootInputs; /* Num Root Inputs  */
    rtwCAPI_Signals const *rootOutputs; /* Root Outputs array */
    uint_T               numRootOutputs;/* Num Root Outputs  */
} Signals;

Модель инициализирует функцию в modelC (или .cpp) выполняет инициализацию путем вызова API C, инициализируют функцию. Например, следующий код сгенерирован в модели, инициализируют функцию, например, модель rtwdemo_capi:

/* Initialize DataMapInfo substructure containing ModelMap for C API */
rtwdemo_capi_InitializeDataMapInfo(rtwdemo_capi_M);

Модель карты к массивам API C структур

Примечание

Этот рисунок перечисляет массивы в порядке, что их структуры появляются в rtw_modelmap.h, который отличается немного от их сгенерированного порядка в model_capi.c.

Сгенерируйте файл определения данных API C для обмена данными с целевой системой

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

Открытая модель в качестве примера

Откройте модель rtwdemo_capi в качестве примера.

open_system('rtwdemo_capi');

API C полезен для взаимодействия с данными приложения в сгенерированном коде, не останавливая выполнение программы или перекомпилировав сгенерированный код. Использовать API-интерфейс C, для топ-модели и его моделей, на которые ссылаются:

1. Настройте клиент-серверный протокол (такой как TCP/IP или связь ЗУ со сдвоенным портом) между вашим компьютером разработчика и целевым компьютером.

2. Выберите по крайней мере один из параметров конфигурации модели C API: сигналы, параметры, состояния и ввод-вывод корневого уровня.

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

C параметры конфигурации API для топ-модели и моделей, на которые ссылаются, должен соответствовать.

Генератор кода помещает API-интерфейс C в файл model_capi.c. В зависимости от ваших параметров конфигурации данные могут представлять сигналы, состояния, параметры и ввод-вывод корневого уровня, сконфигурированный с адресуемыми классами памяти. Файл включает структуры, которые обеспечивают интерфейс к свойствам данных.

C ограничения API

Функция API C имеет нижеследующие ограничения.

  • API C не поддерживает следующие значения для CodeFormat Переменная TLC:

    • S-Function

    • Accelerator_S-Function (для ускоренной симуляции)

  • Для основанных на ERT целей API C требует, чтобы поддержка кода с плавающей точкой была включена.

  • Локальные выходные сигналы блока не поддерживаются.

  • Локальные параметры Stateflow не поддерживаются.

  • Следующие пользовательские объекты класса памяти не поддерживаются:

    • Объекты без пакета csc_registration файл

    • Сгруппированные пользовательские классы памяти

    • Объекты заданы при помощи макросов

    • BitField объекты

    • FileScope объекты

  • Индивидуально настраиваемое размещение данных отключено, когда вы используете API C. Интерфейс ищет объявление глобальных данных в modelH и model_private.h. Объявления, помещенные в любой другой файл индивидуально настраиваемым размещением данных, приводят к коду, который не компилирует.

Примечание

Пользовательские объекты Класса памяти работают в генерации кода, только если вы используете системный конечный файл ERT и очищаете параметр конфигурации модели Ignore custom storage classes.

Похожие темы