Используя Embedded Coder®, можно сгенерировать код из моделей Simulink®, содержащих один или несколько вариантов. Сгенерированный код содержит условные выражения препроцессора, которые управляют активацией каждого варианта.
Поддержки Simulink с помощью мультиэкземпляра сослались на модели с различными Функциями Simulink для генерации кода.
Для получения информации об использовании файла STF_make_rtw_hook
, чтобы настроить процесс сборки, смотрите, Настраивают Процесс сборки с Файлом STF_make_rtw_hook (Simulink Coder)
Simulink.Parameter
Переменные MATLAB® позволяют вам выражениям управления вариантом быстрого прототипирования, когда вы создаете свою модель и генерируете условные выражения препроцессора для генерации кода. Однако, если вы хотите задать другие атрибуты генерации кода (такие как тип данных), можно преобразовать переменные MATLAB в объекты Simulink.Parameter
.
Задайте модель, в которой вы хотите заменить контрольные переменные варианта MATLAB на объекты Simulink.Parameter
.
model = 'my_model_containing_variant_choices';
open_system(model);
Получите переменные, на которые ссылаются в различных выражениях управления.
vars = Simulink.VariantManager.findVariantControlVars(model)
vars = 4x1 struct array with fields: Name Value Exists Source SourceType
Создайте внешний заголовочный файл для определения различных значений управления так, чтобы определения переменной были импортированы, когда код запускается.
headerFileName = [model '_importedDefines.h']; headerPreamble = strrep(upper(headerFileName),'.','_'); fid = fopen(headerFileName,'w+'); fidErr = (fid == -1); if (fidErr) fprintf('There was an error creating header file %s:... \n', headerFileName); else fprintf('+++ Creating header file ''%s'' with variant control... variable definitions.\n\n', headerFileName); fprintf(fid, '#ifndef %s\n', headerPreamble); fprintf(fid, '#define %s\n', headerPreamble); end
Различные контрольные переменные, заданные как объекты Simulink.Parameter
, могут иметь один из этих классов памяти.
Define
или ImportedDefine
с заданным заголовочным файлом
CompilerFlag
SystemConstant (AUTOSAR)
Ваш собственный класс памяти, который задает данные как макрос
Цикл через все переменные MATLAB, чтобы преобразовать их в объекты Simulink.Parameter
.
count = 0; for countVars = 1:length(vars) var = vars(countVars).Name; val = vars(countVars).Value; if isa(val, 'Simulink.Parameter') % Do nothing continue; end count = count+1; % Create and configure Simulink.Parameter objects % corresponding to the control variable names. % Specify the custom storage class as Define (Custom). newVal = Simulink.Parameter(val); newVal.DataType = 'int16'; newVal.CoderInfo.StorageClass = 'Custom'; newVal.CoderInfo.CustomStorageClass = 'Define (Custom)'; newVal.CoderInfo.CustomAttributes.HeaderFile = headerFileName; Simulink.data.assigninGlobal(model, var, newVal); if ~fidErr fprintf(fid, '#endif\n'); fclose(fid); end end
Заголовочный файл может быть пустым для Define
пользовательский класс памяти.
Если вы представляете варианты в Различном блоке Subsystem или Различном блоке Model, код, сгенерированный для каждого варианта, заключен в условных выражениях препроцессора C #if
, #else
, #elif
и #endif
.
Если вы представляете варианты с помощью Различного Исходного блока или блока Variant Sink, код, сгенерированный для каждого варианта, заключен в условных выражениях препроцессора C #if
и #endif
.
Поэтому активный вариант выбран во время компиляции, и условные выражения препроцессора определяют который разделы кода выполниться.
У вас должна быть лицензия Embedded Coder®, чтобы сгенерировать код.
В редакторе Simulink выберите Simulation> Model Configuration Parameters.
Выберите панель Code Generation и установите System target file на ert.tlc
.
В панели Report выберите Create code generation report.
В панели Code Placement, если опция Compact
выбрана из File packaging format выпадающий список, не сгенерирован файл model_types.h
, и содержимое файла model_types.h
перемещено в файл model.h
.
Выберите панель Code Generation и очистите Ignore custom storage classes и Apply.
В вашей модели щелкните правой кнопкой по блоку, содержащему варианты (Различная Подсистема, Различный Источник, Различный Приемник или Различная Модель), и выберите Block Parameters.
Гарантируйте, что Expression
(опция по умолчанию) выбран для параметра Variant control mode.
Выберите опцию Analyze all choices during update diagram and generate preprocessor conditionals.
Simulink анализирует все варианты во время схемы обновления или симуляции. Этот анализ обеспечивает раннюю валидацию готовности генерации кода ко всем вариантам.
Создайте модель.