Перекрестный выпустите интеграцию кода

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

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

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

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

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

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

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

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

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

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

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

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

  1.  Задайте существующую разделяемую папку кода

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

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

Ограничения

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

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

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

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

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

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

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

  • C-API (Embedded Coder).

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

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

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

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

Можно запуститься:

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

  • SIL симуляции блока Model моделей, на которые ссылаются, которые содержат перекрестный релиз блоки PIL или SIL. Модели, на которые ссылаются, не должны содержать перекрестный релиз блоки Model 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.

  • Заголовочный файл Задайте имя файла, например, 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.

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

Когда вы создаете модель интегрирования, процесс сборки использует определение типов Simulink.Bus в modelName_types.h.

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

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

  • DataScope — Установите на Imported.

  • Заголовочный файл Задайте путь к файлу, который содержит определение типов 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.

  • Заголовочный файл Установите на aBusType.h.

Когда вы создаете модель интегрирования, процесс сборки использует определение типов Simulink.Bus в aBusType.h.

Ввод-вывод корневого уровня Через Глобальные переменные в Сгенерированном коде

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

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

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

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

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

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

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

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

Data scope

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

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

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

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

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

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

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

      • Ввод Unstructured

      • Data accessDirect

      • Data scopeExported

      • Owner – Непустое значение, которое не является именем модели интегрирования. Например, значение может быть именем импортированного компонента.

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

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

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

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

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

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

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

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

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

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

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

Используя допускающую повторное использование модель, на которую ссылаются, можно задать уникальные образцовые значения аргументов (Simulink) для каждого экземпляра модели, на которую ссылаются, в родительской модели. Импортируйте ранее сгенерированный код для допускающей повторное использование модели, на которую ссылаются, в текущий релиз как параметризованный блок 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. Принесите компонент модели в текущий релиз как блок Model с набором параметров блоков Simulation mode к Normal.

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

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

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

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

  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, можно импортировать в текущий релиз код компонента AUTOSAR, который вы сгенерировали в предыдущем релизе.

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

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

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

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

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

Смотрите также

| |

Похожие темы