Подготовьте содержащую вариант модель к генерации кода

Используя Embedded Coder®, можно сгенерировать код от Simulink® модели, содержащие один или несколько вариантов. Сгенерированный код содержит условные выражения препроцессора, которые управляют активацией каждого варианта.

Примечание

Поддержки Simulink с помощью мультиэкземпляра сослались на модели с вариантом Simulink Functions для генерации кода.

Для получения информации об использовании STF_make_rtw_hook файл, чтобы настроить процесс сборки, смотрите, Настраивают Процесс сборки с Файлом STF_make_rtw_hook (Simulink Coder)

Преобразуйте различные контрольные переменные в Simulink.Parameter Объекты

MATLAB® переменные позволяют вам выражениям управления вариантом быстрого прототипирования, когда вы создаете свою модель и генерируете условные выражения препроцессора для генерации кода. Однако, если вы хотите задать другие атрибуты генерации кода (такие как тип данных), можно преобразовать переменные MATLAB в Simulink.Parameter объекты.

  1. Задайте модель, в которой вы хотите заменить контрольные переменные варианта MATLAB на Simulink.Parameter объекты.

    model = 'my_model_containing_variant_choices';
    open_system(model);
    
  2. Получите переменные, на которые ссылаются в различных выражениях управления.

    vars = Simulink.VariantManager.findVariantControlVars(model)
    vars = 
    
    4x1 struct array with fields:
    
        Name
        Value
        Exists
        Source
        SourceType
  3. Создайте внешний заголовочный файл для определения различных значений управления так, чтобы определения переменной были импортированы, когда код запускается.

    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 с заголовком bfile заданный

    • CompilerFlag

    • SystemConstant (AUTOSAR)

    • Ваш собственный класс памяти, который задает данные как макрос

    Примечание

    Если вы генерируете код с startup время активации, задайте поддерживаемый пользовательский класс памяти для объектов. Для получения дополнительной информации о встроенных и пользовательских классах памяти, поддержанных с startup время активации видит Классы памяти в течение Различных Различных Времен Активации.

  4. Цикл через все переменные 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 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 класс памяти.

Сконфигурируйте модель для генерации условных выражений препроцессора

Если вы представляете варианты в блоке Variant Subsystem или блоке Variant Model, код, сгенерированный для каждого варианта, заключен в условных выражениях препроцессора C #if, #else, #elif, и #endif.

Если вы представляете варианты с помощью блока Variant Source или блока Variant Sink, код, сгенерированный для каждого варианта, заключен в условных выражениях препроцессора C #if и #endif.

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

Примечание

У вас должна быть лицензия Embedded Coder®, чтобы сгенерировать код.

  1. Во вкладке Modeling панели инструментов Simulink нажмите Model Settings.

  2. Выберите панель Code Generation и установите System target file на ert.tlc.

  3. В панели Report выберите Create code generation report.

    Примечание

    В панели Code Placement, если Compact опция выбрана от File packaging format выпадающий список, model_types.h файл не сгенерирован и содержимое model_types.h файл перемещен в model.h файл.

  4. Выберите панель Code Generation и очистите Ignore custom storage classes и Apply.

  5. В вашей модели щелкните правой кнопкой по блоку, содержащему варианты (Variant Subsystem, Variant Source, Variant Sink или блок Variant Model), и выберите Block Parameters.

  6. Убедитесь, что Expression (опция по умолчанию) выбрана для параметра Variant control mode.

  7. Из списка Variant activation time выберите code compile.

    Simulink анализирует все варианты во время схемы обновления или симуляции. Этот анализ обеспечивает раннюю валидацию готовности генерации кода ко всем вариантам.

  8. Создайте модель.

Связанные примеры

Больше о