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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ограничения

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

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

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

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

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

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

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

  • C-API (Embedded Coder).

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

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

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

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

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

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

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

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

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

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

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

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

Свойство класса памятиПоддержка значения свойства
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.

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

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

| |

Похожие темы