В этом примере показано, как создать код, который обменивается данными с внешним существующим кодом. Создайте и настройте модель, чтобы сопоставить типы данных с внешним кодом и избежать дублирования определений типов и выделения памяти (определение глобальных переменных). Затем скомпилируйте созданный код вместе с внешним кодом в одно приложение.
Создание файла ex_cc_algorithm.c в текущей папке.
#include "ex_cc_algorithm.h"
inSigs_T inSigs;
float_32 my_alg(void)
{
if (inSigs.err == TMP_HI) {
return 27.5;
}
else if (inSigs.err == TMP_LO) {
return inSigs.sig1 * calPrms.cal3;
}
else {
return inSigs.sig2 * calPrms.cal3;
}
}
Код C определяет глобальную структурную переменную с именем inSigs. Код также определяет функцию, my_alg, которая использует inSigs и другая структурная переменная с именем calPrms.
Создание файла ex_cc_algorithm.h в текущей папке.
#ifndef ex_cc_algorithm_h
#define ex_cc_algorithm_h
typedef float float_32;
typedef enum {
TMP_HI = 0,
TMP_LO,
NORM,
} err_T;
typedef struct inSigs_tag {
err_T err;
float_32 sig1;
float_32 sig2;
} inSigs_T;
typedef struct calPrms_tag {
float_32 cal1;
float_32 cal2;
float_32 cal3;
} calPrms_T;
extern calPrms_T calPrms;
extern inSigs_T inSigs;
float_32 my_alg(void);
#endif
Файл определяет float_32 как псевдоним типа данных C float. Файл также определяет перечисляемый тип данных. err_Tи два типа структуры, inSigs_T и calPrms_T.
Функция my_alg предназначен для вычисления возвращаемого значения с помощью полей inSigs и calPrms, которые являются глобальными структурными переменными типов inSigs_T и calPrms_T. Функция требует другого алгоритма для подачи данных сигнала, которые inSigs магазины.
Этот код выделяет память для inSigs, но не для calPrms. Создание модели, код которой:
Определяет и инициализирует calPrms.
Вычисляет значения для полей inSigs.
Повторное использование определений типов (например, err_T и float_32), который определяет внешний код.
Для создания перечисляемых и структурированных данных в модели Simulink ® сначала создайте представления Simulink типов данных, определяемых внешним кодом. Сохранение типов Simulink в новом словаре данных с именемex_cc_integ.sldd.
Simulink.importExternalCTypes('ex_cc_algorithm.h',... 'DataDictionary','ex_cc_integ.sldd');
Словарь данных появится в текущей папке.
Чтобы проверить содержимое словаря в обозревателе моделей, в текущей папке дважды щелкните файл. ex_cc_integ.sldd.
Simulink.importExternalCTypes функция создает Simulink.Bus, Simulink.AliasType, и Simulink.data.dictionary.EnumTypeDefinition объекты, которые соответствуют пользовательским типам данных C из ex_cc_algorithm.h.
Создайте новую модель и сохраните ее в текущей папке как ex_struct_enum_integ.
Свяжите модель со словарем данных. На вкладке «Моделирование» в разделе «Проект» выберите «Словарь данных».
Добавление алгоритмических блоков, вычисляющих поля inSigs.

Теперь, когда у вас есть модель алгоритма, вы должны:
Организация выходных сигналов в структурную переменную с именем inSigs.
Создание структурной переменной calPrms.
Включать ex_cc_algorithm.c в процессе построения, который компилирует код после создания кода.
Добавьте блок Bus Creator рядом с существующими блоками Outport. Выходной сигнал блока Bus Creator представляет собой сигнал шины, который можно настроить для отображения в сгенерированном коде в виде структуры.
В блоке Bus Creator задайте следующие параметры:
Количество входов в 3
Тип выходных данных для Bus: inSigs_T
Вывод в качестве невиртуальной шины в выбранный
Удалите три существующих блока Outport (но не сигналы, которые поступают в блоки).
Подключите три оставшиеся сигнальные линии к входам блока Bus Creator.
Добавьте блок Outport после блока Bus Creator. Подключите выход Bus Creator к выходному порту.
В блоке Outport установите для параметра Data type значение Bus: inSigs_T.
На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).
На вкладке Inports/Outports для блоков Inport с меткой In2 и In3, изменить тип данных с Inherit: auto кому float_32.
Изменить раскрывающийся список Изменить представление с Design кому Code.
Для блока Outport установите для параметра Signal Name значение inSigs.
Задайте для класса хранения значение ImportFromFile.
Задать для файла заголовка значение ex_cc_algorithm.h.
Проверьте закладку Signals (Сигналы).
В модели выберите выходной сигнал блока многопортового коммутатора.
В Редакторе данных модели (Model Data Editor) для выбранного сигнала задайте для параметра Имя (Name) значение err.
Установите имя выходного сигнала блока усиления в значение sig1.
Установите имя выходного сигнала блока Gain1 в sig2.
По завершении модель сохраняет данные выходного сигнала (например, сигналы). err и sig1) в полях структурной переменной с именем inSigs.

Потому что для класса хранения установлено значение ImportFromFile, сгенерированный код не выделяет память для inSigs.
Сконфигурируйте созданный код для определения глобальной структурной переменной. calPrms, который необходим внешнему коду.
На панели «Иерархия моделей» обозревателя моделей в разделе «ex_cc_integ узла словаря» выберите узел «Конструкторские данные».
На панели «Содержимое» выберите Simulink.Bus объект calPrms_T.
В диалоговом окне (правая панель) выберите «Запустить редактор шины».
В редакторе шины на левой панели выберите calPrms_T.
На панели инструментов редактора шин нажмите кнопку «Создать/редактировать объект Simulink.Parameter from a Bus Object».
В редакторе MATLAB скопируйте созданный код MATLAB и запустите его в командной строке. Код создает Simulink.Parameter в базовой рабочей области.
На панели «Иерархия моделей» обозревателя моделей выберите «Базовая рабочая область».
Для перемещения объекта параметра используйте обозреватель моделей. calPrms_T_Param, из базового рабочего пространства в раздел «Конструкторские данные» словаря данных.
Выбрав словарь данных, на панели «Содержимое» переименуйте объект параметра как calPrms.
В Редакторе данных модели (Model Data Editor) выберите вкладку Параметры (Parameters).
Установите в раскрывающемся списке Изменить представление значение Design.
Для блока усиления замените значение 13.8900013 с calPrms.cal1.
В другом блоке усиления используйте calPrms.cal2.
При редактировании значения другого блока усиления рядом с calPrms.cal2нажмите кнопку действия
и выберите calPrms > Открыть.
В calPrms , нажмите кнопку действия
и выберите «Открыть редактор переменных».
Используйте редактор переменных для установки значений полей в объекте параметра.
Для полей cal1 и cal2используйте числовые значения, которые ранее использовались блоками усиления в модели.
Для cal3, используйте ненулевое число, например 15.2299995.
По завершении закройте редактор переменных.
В диалоговом окне свойств задайте для класса Storage значение ExportedGlobal. Нажмите кнопку ОК.
Используйте Обозреватель моделей для сохранения изменений, внесенных в словарь.
Настройка модели для включения ex_cc_algorithm.c в процессе построения. Задать параметры конфигурации > Создание кода > Пользовательский код > Дополнительные сведения о построении > Исходные файлы для ex_cc_algorithm.c.
Создайте код из модели.
Проверка созданного файла ex_struct_enum_integ.c. Файл определяет и инициализирует calPrms.
/* Exported block parameters */
calPrms_T calPrms = {
13.8900013F,
0.998300076F,
15.23F
} ; /* Variable: calPrms
Сгенерированный алгоритм в модели step функция определяет локальную переменную для буферизации значения сигнала err.
err_T rtb_err;
Затем алгоритм вычисляет и сохраняет данные в полях inSig.
inSigs.err = rtb_err; inSigs.sig1 = (rtU.In2 + rtDW.DiscreteTimeIntegrator_DSTATE) * calPrms.cal1; inSigs.sig2 = (real32_T)(calPrms.cal2 * rtDW.DiscreteTimeIntegrator_DSTATE);
Создание кода, использующего float_32 вместо значения по умолчанию, real32_Tвместо указания вручную типов данных выходных сигналов блоков и элементов шины можно использовать замену типа данных (Параметры конфигурации > Генерация кода > Замена типа данных). Дополнительные сведения см. в разделе Замена и переименование типов данных в соответствии со стандартами кодирования.