Кросс-Release Code Интегрирования

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

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

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

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

Рабочий процесс

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

The Controller Model блок ссылается на модель, которая состоит из трех компонентов:

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

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

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

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

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

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

  2.  Импортируйте компоненты в текущий релиз

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

Ограничения

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

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

  • Simulink Function и Function Caller блоки через контуры кода ERT, сгенерированные различными релизами.

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

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

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

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

  • C-API.

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

Если ваша модель имеет:

  • Блок cross-release SIL или PIL, вы не можете запускать симуляции быстрого режима Accelerator.

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

Вы можете запустить:

  • Верхняя модель SIL симуляций моделей, которые содержат блоки cross-release SIL или PIL. Модели не должны содержать блоки cross-release AUTOSAR Model.

  • Model блочные SIL симуляции моделей-ссылок, которые содержат блоки cross-release SIL или PIL. Ссылочные модели не должны содержать блоки Model AUTOSAR с перекрестной версией.

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

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

Чтобы использовать объект шины как тип данных при кросс-релизном интегрировании кода ERT, используйте один из следующих подходов.

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

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

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

В текущем релизе, перед запуском 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 из предыдущего релиза реализует вход или выход порт через глобальную переменную, код, который генерируется из модели интегрирования, зависит от свойств сигнала, соединенного с портом в модели интегрирования.

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

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

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

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

Свойство класса памятиПоддержка значения свойств
TypeUnstructured только
Data access

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

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

Data scope

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

  • Модель интегрирования использует Exported значение.

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

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

  • Для сигналов в модели интегрирования, которые соединяются с портами ввода-вывода корневого уровня:

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

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

      • TypeUnstructured

      • Data accessDirect

      • Data scopeExported

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

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

    • Data scope - Imported

    • Data access - Direct

Связь между текущими и предыдущими компонентами Релиза через Глобальные данные хранилища

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

Строение генерации кода

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

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

  • ImportedExtern

  • ImportedExternPointer

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

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

  • ExportedGlobal

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

Импортируйте строение

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

  1. Для имени объекта и Data type, Complexity и Dimensions свойств объекта задайте значения, которые совпадают со значениями соответствующего объекта в компоненте, который вы хотите импортировать.

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

    • ImportedExtern

    • ExportedGlobal

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

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

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

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

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

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

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

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

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

  2. Для имени объекта и Data type, Complexity и Dimensions свойств объекта задайте значения, которые соответствуют предыдущим значениям объекта релиза. Если переменная в импортированном исходном коде не имеет того же имени, что и объект, для свойства Identifier задайте значение, совпадающее с именем переменной.

  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. Извлеките стандартные опции компилятора C

      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);

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

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

  1. Обновление существующей папки общего кода.

    sharedCodeUpdate(sourceFolder,destinationFolder)

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

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

  3. В модели интегрирования замените, например, два образцов модели-ссылки на образцы блока cross-release 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, являются переменными рабочей области. В этом случае можно задать значения аргументов для образцов блоков cross-release, которые являются переменными рабочей области.

    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™. С помощью Test Manager (Simulink Test) можно выполнять обратные тесты и выводить сравнения:

  1. Приведите компонент модели в текущую версию как блок Model с параметром Simulation mode block, установленным на Normal.

  2. С помощью блока Model создайте верхнюю часть, которая задает тестовые входные данные.

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

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

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

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

Для получения дополнительной информации смотрите Тестирование Двух Симуляций для Эквивалентности ( Simulink Test).

Примечание

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

  • Установите Simulation mode значение Software-in-the-loop (SIL) или Processor-in-the-loop (PIL).

  • Установите Code interface значение Top model.

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

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

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

Эти ограничения применяются:

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

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

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

См. также

| |

Похожие темы