В этом примере показано, как сгенерировать код, который обменивается данными с внешним, существующим кодом. Создайте и сконфигурируйте модель, чтобы соответствовать типам данных с внешним кодом и избежать дублирования определений типов и выделения памяти (определение глобальных переменных). Затем скомпилируйте сгенерированный код вместе с внешним кодом в одно приложение.
Создайте файл 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
.
На панели инструментов редактора шин нажмите кнопку 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). Для получения дополнительной информации см. Раздел «Замена и переименование типов данных для соответствия стандартам кодирования».