exponenta event banner

Интеграция кода для нескольких версий

При наличии лицензии Embedded Coder ® сгенерированный код C из предыдущих версий (R2010a и более поздних) можно интегрировать с сгенерированным кодом из текущей версии, если исходные модели односкоростные, а сгенерированный код C - из:

  • Процессы построения модели или подсистемы верхнего уровня, использующие неиспользуемый интерфейс кода функции.

  • Процессы построения ссылок на модели с одним или несколькими экземплярами, которые подавляют мониторинг состояния ошибок (SuppressErrorStatus является on).

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

Технологический процесс

Рассмотрим модель системы управления.

Controller Блок модели ссылается на модель, состоящую из трех компонентов:

  • P1 является блоком Model, который ссылается на модель, разработанную с предыдущей версией, например, R2015b. Созданный код модели с автономным интерфейсом кода находится в папке P1_ert_rtw.

  • C1 является блоком модели, который ссылается на модель, разрабатываемую в текущей версии.

  • P2 - блок подсистемы, разработанный с предыдущей версией, например, R2016a. Созданный код подсистемы находится в папке P2_ert_rtw.

  • P3 является блоком Model, который ссылается на модель, разработанную с предыдущей версией, например, R2016b. Созданный код модели с интерфейсом ссылочного кода модели находится в папке slprj/ert/P3.

Для интеграции кода из предыдущих версий с кодом, созданным из текущей версии, используйте следующий рабочий процесс:

  1.  Укажите существующую папку с общим кодом

  2.  Импорт компонентов в текущую версию

  3.  Включение компонентов в текущую модель выпуска

Ограничения

Рабочий процесс интеграции кода между версиями не поддерживает:

  • Экспорт моделей функций для кода ERT.

  • Функция Simulink и вызывающая функция блокируют границы кода ERT, генерируемого различными версиями.

  • Интеграция сгенерированного кода из версий перед R2010a.

  • Импорт созданного кода из текущей версии в предыдущую (прямая совместимость).

  • Экспорт файлов, расположенных в корневой папке MATLAB ® предыдущей версии, например файлов библиотеки блоксета.

  • Экспорт и импорт сгенерированного кода из моделей с неинлинированными S-функциями.

  • C-API (встроенный кодер).

В конце процесса построения модели в отчете о создании кода отображаются общие файлы, которые непосредственно используются моделью интеграции, например: Controller. В отчете не отображаются общие файлы, используемые компонентами модели, например: P1 и P2.

Если модель имеет:

  • Блок SIL или PIL перекрестного выпуска не позволяет выполнять быстрое моделирование режима ускорителя.

  • Блок модели, который ссылается на модель, содержащую блок SIL или PIL перекрестного выпуска, нельзя запустить режим ускорения или моделирование режима быстрого ускорения.

Можно выполнить:

  • Моделирование SIL верхней модели моделей, содержащих блоки SIL или PIL перекрестного выпуска. Модели не должны содержать блоки модели AUTOSAR перекрестного выпуска.

  • Моделирование SIL блока модели ссылочных моделей, содержащих блоки SIL или PIL перекрестного выпуска. Ссылочные модели не должны содержать блоки модели AUTOSAR перекрестного выпуска.

Сведения о других ограничениях интеграции кода AUTOSAR для всех версий см. в разделе Импорт кода AUTOSAR из предыдущих версий.

Simulink.Bus Поддержка

Для использования объекта шины в качестве типа данных в интеграции кода ERT кросс-версии используйте один из этих подходов.

ПодходЭкспорт кодаИмпорт кода
Автоматический

В предыдущей версии перед созданием кода установите DataScope имущества Simulink.Bus объект в Auto. Не присваивайте значение HeaderFile собственность.

Генератор кода создает Simulink.Bus определение типа данных в файле заголовка по умолчанию (Embedded Coder), который находится в папке генерации кода для модели.

В текущей версии, перед запуском crossReleaseImport (Встроенный кодер), установите DataScope имущества Simulink.Bus объект в Auto.

При построении интеграционной модели в процессе построения используется Simulink.Bus тип данных из файла заголовка в импортированном коде.

Экспортированная шина

В предыдущей версии перед созданием кода укажите эти свойства Simulink.Bus объект:

  • DataScope - Установить на Exported.

  • HeaderFile - Укажите имя файла, например: prevRelBusType.

Генератор кода создает prevRelBusType.h в папке общего служебного кода. Этот файл заголовка содержит определение для Simulink.Bus тип данных. Использовать sharedCodeUpdate (Встроенный кодер) для добавления prevRelBusType.h в папку с общим кодом, ExistingSharedCode указывает.

Для R2010a и R2010b, DataScope свойство недоступно. Не присваивайте значение HeaderFile собственность. Генератор кода создает Simulink.Bus определение типа данных в modelName_types.h, которая находится в папке генерации кода для модели.

В текущей версии, перед запуском crossReleaseImport (Встроенный кодер), установите DataScope имущества Simulink.Bus объект в Imported.

При построении интеграционной модели, включающей импортированный блок SIL или PIL, в процессе построения используется Simulink.Bus определение типа данных в prevRelBusType.h.

Если импортированный код из R2010a или R2010b, укажите эти свойства Simulink.Bus объект:

  • DataScope - Установить на Imported.

  • HeaderFile - Установить путь к файлу для modelName_types.h, которая находится в папке импортированного кода.

При построении интеграционной модели в процессе построения используется Simulink.Bus определение типа данных в modelName_types.h.

Импортированная шина

В предыдущей версии перед созданием кода укажите эти свойства Simulink.Bus объект:

  • DataScope - Установить на Imported.

  • HeaderFile - Укажите путь к файлу, содержащему Simulink.Bus определение типа данных, например, aBusType.h.

Для R2010a и R2010b, DataScope свойство недоступно. Для HeaderFile , укажите путь к файлу, содержащему Simulink.Bus определение типа данных, например, aBusType.h.

В текущей версии после импорта сгенерированного кода не требуется изменять Simulink.Bus.

При построении интеграционной модели, включающей импортированный блок SIL или PIL, в процессе построения используется Simulink.Bus определение типа данных из aBusType.h.

Если импортированный код из R2010a или R2010b, укажите эти свойства Simulink.Bus объект:

  • DataScope - Установить на Imported.

  • HeaderFile - Установить на aBusType.h.

При построении интеграционной модели в процессе построения используется Simulink.Bus определение типа данных в aBusType.h.

Ввод-вывод на корневом уровне через глобальные переменные в сгенерированном коде

Когда импортированный код ERT из предыдущей версии реализует входной или выходной порт через глобальную переменную, код, генерируемый из интеграционной модели, зависит от свойств сигнала, подключенного к порту в интеграционной модели.

Если сигнал интеграционной модели не отображается на сгенерированную кодовую переменную, имя которой совпадает с именем сигнала в импортированном коде, генерируемый код:

  • Определяет переменную, если она объявлена, но не определена в импортированном коде.

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

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

Свойство класса храненияПоддержка значения свойства
НапечататьUnstructured только
Доступ к данным

Не удается подключить порт, реализованный как Pointer переменная в импортированном коде к сигналу с тем же именем, который реализуется через Direct класс хранения в интеграционной модели

Не удается подключить порт, реализованный как Direct переменная в импортированном коде к сигналу с тем же именем, который реализован как Pointer в модели интеграции

Объем данных

Если импортированный код объявляет, но не определяет переменную (т.е. код генерируется из сигнала, который использует Imported значение), то требуется одно из следующих:

  • В интеграционной модели используется Exported значение.

  • Внешний код определяет переменную.

Если импортированный код определяет переменную (т.е. код генерируется из сигнала, который использует Exported значение):

  • Для сигналов в интеграционной модели, подключенных к портам ввода/вывода корневого уровня:

    • Установите EnableDataOwnership параметр конфигурации для on.

    • Используйте пользовательский класс хранения со следующими свойствами:

      • Тип - Unstructured

      • Доступ к данным - Direct

      • Объем данных - Exported

      • Владелец - непустое значение, не являющееся именем интеграционной модели. Например, значение может быть именем импортированного компонента.

  • Для сигналов в интеграционной модели, не подключенных к портам ввода-вывода корневого уровня, используйте пользовательский класс хранения со следующими значениями свойств:

    • Объем данных - Imported

    • Доступ к данным - Direct

Обмен данными между компонентами текущей и предыдущей версий через глобальные хранилища данных

Компоненты текущей и предыдущей версий могут взаимодействовать через глобальные хранилища данных, связанные с Simulink.Signal объекты в базовом рабочем пространстве MATLAB или словаре данных Simulink. Описанный здесь поток операций применим к интеграции кода ERT для всех версий.

Конфигурация генерации кода

Перед созданием кода компонента модели в старой версии настройте память хранилища данных для использования класса хранения, который импортирует внешний код.

Если в процессе построения верхней модели или подсистемы создается код, задайте свойство класса Storage для Simulink.Signal объекты к одному из следующих классов:

  • ImportedExtern

  • ImportedExternPointer

  • ImportFromFile пользовательский класс хранения

Если процесс построения ссылки на модель генерирует код, можно также использовать следующие классы:

  • ExportedGlobal

  • ExportToFile пользовательский класс хранения

Конфигурация импорта

В текущей версии перед запуском crossReleaseImport, определить Simulink.Signal объект в базовой рабочей области MATLAB или словарь данных Simulink для каждого глобального хранилища данных компонента, который требуется импортировать:

  1. Для имени объекта и свойств объекта «Тип данных», «Сложность» и «Размеры» укажите значения, соответствующие значениям соответствующего объекта в компоненте, который требуется импортировать.

  2. Для свойства класса Storage укажите совместимое значение. Если предыдущее значение версии равно ImportedExtern, укажите одно из следующих значений для текущей версии:

    • ImportedExtern

    • ExportedGlobal

    • ImportFromFile или ExportToFile пользовательский класс хранения.

    Если предыдущее значение версии равно ImportedExternPointer, затем укажите ImportedExternPointer для текущей версии.

  3. Для свойства Идентификатор (Identifier) укажите соответствующее значение, только если свойство указано для объекта в компоненте, который требуется импортировать.

  4. Сохранить Simulink.Signal объекты. Объекты требуются при каждом моделировании или построении импортированного блока SIL или PIL.

Дополнительные сведения см. в разделе Хранилища данных в сгенерированном коде.

Настройка параметров

Рабочий процесс интеграции кода ERT для всех версий поддерживает настройку параметров в модели интеграции, которая содержит код компонента с настраиваемыми параметрами из предыдущих версий.

В текущей версии перед запуском crossReleaseImport, для каждого настраиваемого параметра компонента, который требуется импортировать:

  1. Определение Simulink.Parameter в базовом рабочем пространстве MATLAB или в словаре данных Simulink.

  2. Для имени объекта и свойств объекта «Тип данных», «Сложность» и «Размеры» укажите значения, соответствующие значениям объекта предыдущей версии. Если имя переменной в импортированном исходном коде не совпадает с именем объекта, для свойства «Идентификатор» укажите значение, соответствующее имени переменной.

  3. Если в предыдущем объекте версии используется GetSet пользовательский класс хранения, укажите:

    Поддержка GetSet пользовательский класс хранения из предыдущей версии применяется только для R2011a и более поздних версий.

Для кода, созданного процессом сборки верхней модели или подсистемы в предыдущей версии, применяются следующие ограничения:

  • Если настраиваемый параметр, заданный Simulink.Parameter для объекта в предыдущей версии установлен класс хранения ExportedGlobal и класс хранения Simulink.Parameter объект в текущей версии также ExportedGlobalпри построении интеграционной модели возникает ошибка.

  • В операционной системе Mac, если настраиваемый параметр указан Simulink.Parameter для объекта в предыдущей версии установлен класс хранения ExportedGlobal, невозможно построить модель интеграции, если класс хранения Simulink.Parameter объект в текущей версии (с тем же именем или псевдонимом): ImportedExtern. Чтобы обойти это ограничение, измените параметры по умолчанию:

    1. Получите инструмент построения из цепочки инструментов по умолчанию.

      tc = coder.make.getDefaultToolchain;
      cComp = tc.getBuildTool('C Compiler');

    2. Извлеките стандартные параметры компилятора Си.

      stdMaps = cComp.SupportedStandard.getLangStandardMaps;
      optionValues = stdMaps.getCompilerOptions('*');  

    3. Удалить -fno-common из стандартных параметров компиляторов C и C++.

      optionToRemove = '-fno-common';
      optionsToKeep = strrep(optionValues, optionToRemove, '');
      c_standard_opts_id = '$(C_STANDARD_OPTS)';
      
      custToolChainOpts = get_param(model,'CustomToolchainOptions');
      custToolChainOpts{2} = ...
         strrep(custToolChainOpts{2}, c_standard_opts_id, optionsToKeep);
      
      set_param(model, 'CustomToolchainOptions',custToolChainOpts);

Использование нескольких экземпляров кода, созданного из повторно используемой ссылочной модели

С помощью повторно используемой ссылочной модели можно задать уникальные значения аргументов модели для каждого экземпляра ссылочной модели в родительской модели. Импортируйте ранее созданный код для повторно используемой ссылочной модели в текущую версию в качестве параметризованного блока SIL или PIL перекрестного выпуска, а затем вставьте несколько экземпляров блока в интеграционную модель. Для каждого экземпляра блока можно указать уникальные значения аргументов модели.

  1. Обновить существующую папку с общим кодом.

    sharedCodeUpdate(sourceFolder,destinationFolder)

  2. Импорт созданного кода для повторно используемой ссылочной модели в текущую версию в качестве параметризованного блока перекрестного освобождения, например блока SIL.

    handleSILBlock = crossReleaseImport(reusableReferencedModelcodeLocation, ...
     configSetIntegrationModel, 'SimulationMode', 'SIL');

  3. В интеграционной модели замените, например, два экземпляра ссылочной модели экземплярами блока SIL перекрестного выпуска.

    open_system(integrationModel);
    
    blockInstanceName1 = 'refModelInstanceName1';
    blockinstanceName2 = 'refModelInstanceName2';
    
    SILBlockFullName = getfullname(handleSILBlock);
    replace_block(integrationModel, 'Name', blockInstanceName1, ...
                  SILBlockFullName, 'noprompt');
    replace_block(integrationModel, 'Name', blockInstanceName2, ...
                  SILBlockFullName, 'noprompt');

  4. Предположим, что повторно используемая ссылочная модель имеет аргументы модели paramA и paramBи значения для ссылочных экземпляров модели, refModelInstanceName1 и refModelInstanceName2, являются переменными рабочей области. В этом случае можно указать значения аргументов для экземпляров блоков перекрестного выпуска, которые являются переменными рабочей области.

    pathToBlockInstanceName1 = [integrationModel, '/', blockInstanceName1];
    pathToBlockInstanceName2 = [integrationModel, '/', blockInstanceName2];
    
    set_param(pathToBlockInstanceName1, 'paramA', 'paramA_instName1');
    set_param(pathToBlockInstanceName1, 'paramB', 'paramB_instName1');
    
    set_param(pathToBlockInstanceName2, 'paramA', 'paramA_instName2');
    set_param(pathToBlockInstanceName2, 'paramB', 'paramB_instName2');
    

  5. Чтобы задать уникальные значения аргументов модели для экземпляров блоков в интеграционной модели, назначьте значения переменным рабочей области, paramA_instName1, paramB_instName1, paramA_instName2, и paramB_instName2.

Сравнение поведения моделирования компонента модели в текущей версии и сгенерированного кода из предыдущей версии

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

Чтобы проверить числовую эквивалентность между компонентом модели и кодом, созданным в предыдущей версии, используйте Simulink Test™. Менеджер тестов (Simulink Test) позволяет выполнять обратные тесты и сравнения выходных данных:

  1. Включение компонента модели в текущую версию в качестве блока модели с параметром блока режима моделирования, равным Normal.

  2. С помощью блока «Модель» создайте модель верхнего уровня, определяющую входные данные теста.

  3. Импортируйте код, созданный в предыдущей версии, в текущую версию как блок SIL.

  4. С помощью блока SIL создайте другую модель верхнего уровня, определяющую те же самые входные данные теста.

  5. В диспетчере тестов создайте тест эквивалентности, в котором выполняется моделирование верхних моделей и сравнение выходных данных.

  6. Запустите тестовый случай и просмотрите результаты.

Дополнительные сведения см. в разделе Тестирование двух имитаций эквивалентности (Simulink Test).

Примечание

Если требуется сравнить поведение сгенерированного кода из текущей и предыдущей версий, на шаге 1 задайте следующие параметры блока модели:

  • Установить режим моделирования в значение Software-in-the-loop (SIL) или Processor-in-the-loop (PIL).

  • Установка для интерфейса Code значения Top model.

Импорт кода AUTOSAR из предыдущих версий

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

При выполнении crossReleaseImport (Встроенный кодер), функция импортирует код AUTOSAR в виде блока модели перекрестного выпуска вместо блока SIL или PIL. Параметр режима моделирования блока модели имеет значение Software-in-the-loop (SIL) или Processor-in-the-loop (PIL). Включение блока «Модель» в текущую модель выпуска.

Применяются следующие ограничения:

  • Рабочий процесс перекрестного выпуска не поддерживает память для каждого экземпляра, которая получает доступ к NVRAM.

  • Настраиваемые параметры должны быть сопоставлены с параметрами калибровки AUTOSAR или внутренними параметрами калибровки AUTOSAR.

  • Если в исходной модели используются исполнения или символьные размеры (исполнения размеров), импортированная модель может использовать только те же варианты и конфигурации символьных размеров, которые использовались при создании кода в предыдущей версии.

См. также

(Встроенный кодер) | (Встроенный кодер) | (Встроенный кодер)

Связанные темы