В этом примере показано, как сгенерировать код, который обменивается данными с внешним, существующим кодом. Создайте и сконфигурируйте модель, чтобы совпадать с типами данных внешнему коду и постараться не копировать определения типа и выделение памяти (определение глобальных переменных). Затем скомпилируйте сгенерированный код вместе с внешним кодом в отдельное приложение.
Создайте файл 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;
}
}
Код С задает глобальную переменную структуры под названием 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');
Словарь данных появляется в вашей текущей папке.
Чтобы смотреть содержимое словаря в Model Explorer, в вашей текущей папке, дважды кликают файл, ex_cc_integ.sldd.
Simulink.importExternalCTypes функция создает Simulink.Bus, Simulink.AliasType, и Simulink.data.dictionary.EnumTypeDefinition объекты, которые соответствуют пользовательским типам данных C от ex_cc_algorithm.h.
Создайте новую модель и сохраните ее в своей текущей папке как ex_struct_enum_integ.
Соедините модель со словарем данных. На вкладке Modeling, под Design, нажимают Data Dictionary.
Добавьте алгоритмические блоки, которые вычисляют поля inSigs.

Теперь, когда у вас есть модель алгоритма, вы должны:
Организуйте выходные сигналы в переменную структуры под названием inSigs.
Создайте переменную calPrms структуры.
Включайте ex_cc_algorithm.c в процессе сборки, который компилирует код после генерации кода.
Добавьте блок Bus Creator около существующих блоков Outport. Выход блока Bus Creator является сигналом шины, который можно сконфигурировать, чтобы появиться в сгенерированном коде как структура.
В блоке Bus Creator, установленном эти параметры:
Number of inputs к 3
Output data type к Bus: inSigs_T
Output as nonvirtual bus к выбранному
Удалите три существующих блока Outport (но не сигналы, которые вводят блоки).
Соедините три остающихся сигнальных линии с входными параметрами блока Bus Creator.
Добавьте блок Outport после блока Bus Creator. Соедините выход Bus Creator к Outport.
В блоке Outport, установленном параметр Data type на Bus: inSigs_T.
На вкладке Modeling нажмите Model Data Editor.
На вкладке Inports/Outports, для блоков Inport пометил In2 и In3, измените Data Type от Inherit: auto к float_32.
Измените Change View выпадающий список от Design к Code.
Для блока Outport, набор Signal Name к inSigs.
Установите Storage Class на ImportFromFile.
Установите Header File на ex_cc_algorithm.h.
Смотрите вкладку Signals.
В модели выберите выходной сигнал блока Multiport Switch.
В Model Data Editor, для выбранного сигнала, устанавливает Name на err.
Определите имя выходного сигнала блока Gain к sig1.
Определите имя выходного сигнала блока Gain1 к sig2.
Когда вы закончили, модель хранит данные о выходном сигнале (такие как сигналы err и sig1) в областях переменной структуры под названием inSigs.

Поскольку вы устанавливаете Storage Class на ImportFromFile, сгенерированный код не выделяет память для inSigs.
Сконфигурируйте сгенерированный код, чтобы задать глобальную переменную структуры, calPrms, то, что для внешнего кода нужно.
В панели Model Hierarchy Model Explorer, под узлом словаря ex_cc_integ, выбирают узел Design Data.
В панели Contents выберите Simulink.Bus объект calPrms_T.
В Диалоговой панели (правая панель), нажмите Launch Bus Editor.
В Редакторе Шины, на левой панели, выбирают calPrms_T.
На панели инструментов Bus Editor нажмите кнопку Create/Edit a Simulink.Parameter Object from a Bus Object.
В редакторе MATLAB скопируйте сгенерированный код MATLAB и запустите код в командной строке. Код создает Simulink.Parameter объект в базовом рабочем пространстве.
В панели Model Hierarchy Model Explorer выберите Base Workspace.
Используйте Model Explorer, чтобы переместить объект параметра, calPrms_T_Param, от базового рабочего пространства до раздела Design Data словаря данных.
С выбранным словарем данных, в панели Contents, переименовывают объект параметра как calPrms.
В Model Data Editor выберите вкладку Parameters.
Установите Change view выпадающий список на Design.
Для блока Gain замените значение 13.8900013 с calPrms.cal1.
В другом блоке Gain используйте calPrms.cal2.
При редактировании значения другого блока Gain, рядом с calPrms.cal2, кликните по кнопке действий
и выберите calPrms> Open.
В calPrms диалоговое окно свойства, рядом с полем Value, кликает по кнопке действий
и выбирает Open Variable Editor.
Используйте Редактора переменных, чтобы установить значения полей в объекте параметра.
Для полей cal1 и cal2, используйте числовые значения, которые Gain блокирует в модели, ранее используемой.
Для cal3, используйте ненулевой номер, такой как 15.2299995.
Когда вы закончили, закрываете Редактора переменных.
В диалоговом окне свойства, набор Storage class к ExportedGlobal. Нажмите OK.
Используйте Model Explorer, чтобы сохранить изменения, которые вы внесли в словарь.
Сконфигурируйте модель, чтобы включать ex_cc_algorithm.c в процессе сборки. Установите Configuration Parameters> Code Generation> Custom Code> Additional build information> Source files к 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, вместо того, чтобы вручную задать типы данных выходных сигналов блока и элементов шины, можно использовать замену типа данных (Configuration Parameters> Code Generation> Data Type Replacement). Для получения дополнительной информации смотрите Замену и Переименуйте Типы данных, чтобы Соответствовать Кодированию Стандартов.