Если у вас есть 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
.
Чтобы интегрировать код из предыдущих релизов с сгенерированным кодом из текущего релиза, используйте этот рабочий процесс:
Рабочий процесс интегрирования кросс-release кода не поддерживает:
Модели экспорта функций для кода ERT.
Simulink Function и Function Caller блоки через контуры кода ERT, сгенерированные различными релизами.
Интегрирование сгенерированного кода из релизов перед R2010a.
Импорт сгенерированного кода из текущего релиза в предыдущий релиз (прямая совместимость).
Экспорт файлов, расположенных в MATLAB® корневая папка предыдущего релиза, например, файлы библиотеки blockset.
Экспорт и импорт сгенерированного кода из моделей с нелинейными S-функциями.
В конце процесса сборки модели отчет о генерации кода отображений общие файлы, которые непосредственно используются моделью интегрирования, для примера 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, используйте один из следующих подходов.
Подход | Экспорт кода | Импорт кода |
---|---|---|
Автоматический |
В предыдущем релизе, перед генерацией кода, установите Генератор кода создает |
В текущем релизе, перед запуском Когда вы создаете модель интегрирования, процесс сборки использует |
Экспортированная шина |
В предыдущем релизе, перед генерацией кода, задайте эти свойства
Генератор кода создает Для R2010a и R2010b, |
В текущем релизе, перед запуском Когда вы создаете интеграционную модель, которая включает импортированный блок SIL или PIL, процесс сборки использует Если импортированный код из R2010a или R2010b, задайте эти свойства
Когда вы создаете модель интегрирования, процесс сборки использует |
Импортированная шина |
В предыдущем релизе, перед генерацией кода, задайте эти свойства
Для R2010a и R2010b, |
В текущем релизе после импорта сгенерированного кода вы не должны изменять Когда вы создаете интеграционную модель, которая включает импортированный блок SIL или PIL, процесс сборки использует Если импортированный код из R2010a или R2010b, задайте эти свойства
Когда вы создаете модель интегрирования, процесс сборки использует |
Когда импортированный код ERT из предыдущего релиза реализует вход или выход порт через глобальную переменную, код, который генерируется из модели интегрирования, зависит от свойств сигнала, соединенного с портом в модели интегрирования.
Если сигнал интеграционной модели не сопоставлен с сгенерированной переменной кода, которая имеет то же имя, что и сигнал в импортированном коде, сгенерированный код:
Определяет переменную, если она объявлена, но не определена в импортированном коде.
Создает дополнительный код для копирования данных между переменной, сгенерированной из модели интегрирования, и переменной в импортированном коде.
Если сигнал интеграционной модели преобразуется в переменную с таким же именем, как и сигнал в импортированном коде, переменная, используемая импортированным кодом, также используется кодом, сгенерированным из интеграционной модели. Для сигнала необходимо использовать совместимый класс памяти.
Свойство класса памяти | Поддержка значения свойств |
---|---|
Type | Unstructured только |
Data access |
Не удается подключить порт, реализованный как Не удается подключить порт, реализованный как |
Data scope |
Если импортированный код объявляет, но не определяет переменную (т.е. код генерируется из сигнала, который использует
Если импортированный код определяет переменную (т.е. код генерируется из сигнала, который использует
|
Текущие и предыдущие компоненты релиза могут обмениваться данными через хранилища глобальными данными, сопоставленные с Simulink.Signal
объекты в базовом рабочем пространстве MATLAB или словаре данных Simulink. Описанный здесь рабочий процесс применяется к интегрированию кода ERT с перекрестной версией.
Перед генерацией кода компонента модели в старом релизе сконфигурируйте память хранилища данных, чтобы использовать класс памяти, который импортирует внешний код.
Если процесс сборки верхней модели или подсистемы генерирует код, задайте свойство Storage class Simulink.Signal
объекты одному из следующих классов:
ImportedExtern
ImportedExternPointer
ImportFromFile
пользовательский класс памяти
Если процесс сборки модели-ссылки генерирует код, можно также использовать следующие классы:
ExportedGlobal
ExportToFile
пользовательский класс памяти
В текущем релизе, перед запуском crossReleaseImport
, задайте Simulink.Signal
объект в базовом рабочем пространстве MATLAB или словаре данных Simulink для каждых глобальных данных хранилища компонента, который вы хотите импортировать:
Для имени объекта и Data type, Complexity и Dimensions свойств объекта задайте значения, которые совпадают со значениями соответствующего объекта в компоненте, который вы хотите импортировать.
Для свойства Storage class задайте значение, которое совместимо. Если предыдущее значение релиза ImportedExtern
, задайте одно из следующих значений для текущего релиза:
ImportedExtern
ExportedGlobal
ImportFromFile
или ExportToFile
пользовательский класс памяти.
Если предыдущее значение релиза ImportedExternPointer
, затем задайте ImportedExternPointer
для текущего релиза.
Для свойства Identifier задайте соответствующее значение, только если свойство задано для объекта в компоненте, который вы хотите импортировать.
Сохраните Simulink.Signal
объекты. Объекты требуются каждый раз, когда вы моделируете или создаете импортированный блок SIL или PIL.
Для получения дополнительной информации смотрите Хранилища данных в Сгенерированный код.
Рабочий процесс интегрирования кода ERT с перекрестной версией поддерживает настройку параметров в интеграционной модели, которая содержит код компонента с настраиваемыми параметрами из предыдущих релизов.
В текущем релизе, перед запуском crossReleaseImport
, для каждого настраиваемого параметра компонента, который вы хотите импортировать:
Задайте Simulink.Parameter
объект в базовом рабочем пространстве MATLAB или словаре данных Simulink.
Для имени объекта и Data type, Complexity и Dimensions свойств объекта задайте значения, которые соответствуют предыдущим значениям объекта релиза. Если переменная в импортированном исходном коде не имеет того же имени, что и объект, для свойства Identifier задайте значение, совпадающее с именем переменной.
Если предыдущий объект релиза использует GetSet
пользовательский класс памяти, укажите:
Соответствующее значение для свойства Storage class объект.
Заголовочный файл, который определяет get
и set
функции доступа. Для получения дополнительной информации смотрите Control Data Representation путем настройки свойств класса памяти и доступа к данным через функции с GetSet класса памяти.
Поддержка GetSet
пользовательский класс памяти из предыдущего релиза применяется только для R2011a и более поздних релизов.
Для кода, сгенерированного процессом сборки верхней модели или подсистемы в предыдущем релизе, применяются эти ограничения:
Если настраиваемый параметр, заданный как Simulink.Parameter
для объекта в предыдущем релизе установлен класс памяти ExportedGlobal
и класс памяти Simulink.Parameter
объект в текущем релизе также ExportedGlobal
ошибка возникает, когда вы создаете модель интегрирования.
В операционной системе Mac, если настраиваемый параметр задан как Simulink.Parameter
для объекта в предыдущем релизе установлен класс памяти ExportedGlobal
, вы не можете создать модель интегрирования, если класс памяти Simulink.Parameter
объект в текущем релизе (с таким же именем или псевдонимом) ImportedExtern
. Чтобы обойти это ограничение, измените настройки по умолчанию:
Получите инструмент сборки из набора инструментов по умолчанию.
tc = coder.make.getDefaultToolchain;
cComp = tc.getBuildTool('C Compiler');
Извлеките стандартные опции компилятора C
stdMaps = cComp.SupportedStandard.getLangStandardMaps;
optionValues = stdMaps.getCompilerOptions('*');
Удаление -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, а затем вставьте несколько образцы блока в модель интегрирования. Для каждого образца блока можно задать уникальные значения аргументов модели.
Обновление существующей папки общего кода.
sharedCodeUpdate(sourceFolder,destinationFolder)
Импортируйте сгенерированный код для переиспользуемой ссылочной модели в текущий релиз как параметризованный блок перекрестного освобождения, для примера, блок SIL.
handleSILBlock = crossReleaseImport(reusableReferencedModelcodeLocation, ... configSetIntegrationModel, 'SimulationMode', 'SIL');
В модели интегрирования замените, например, два образцов модели-ссылки на образцы блока 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');
Предположим, что переиспользуемая модель-ссылка имеет аргументы модели
и paramA
, и значения для ссылочных образцов модели, paramB
и refModelInstanceName1
, являются переменными рабочей области. В этом случае можно задать значения аргументов для образцов блоков cross-release, которые являются переменными рабочей области.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');
Чтобы задать уникальные значения аргументов модели для образцов блоков в модели интегрирования, присвоения значения переменным рабочей области
, paramA_instName1
, paramB_instName1
, и paramA_instName2
.paramB_instName2
В предыдущем релизе предположим, что вы разработали компонент модели, сгенерировали код для компонента, а также протестировали и развернули сгенерированный код. Теперь в текущем релизе вы хотите добавить функции к компоненту модели и использовать компонент модели в разработке системы и генерации кода. Прежде чем вы продолжите, можно сравнить функциональное поведение компонента модели и сгенерированного кода из предыдущего релиза.
Чтобы протестировать числовую эквивалентность между компонентом модели и сгенерированным кодом из предыдущего релиза, используйте Simulink Test™. С помощью Test Manager (Simulink Test) можно выполнять обратные тесты и выводить сравнения:
Приведите компонент модели в текущую версию как блок Model с параметром Simulation mode block, установленным на Normal
.
С помощью блока Model создайте верхнюю часть, которая задает тестовые входные данные.
Импортируйте код, сгенерированный в предыдущем релизе, в текущий релиз как блок SIL.
С помощью блока SIL создайте другую верхнюю часть модель, которая задает те же самые тестовые воздействия данные.
В Test Manager создайте тест эквивалентности, который запускает симуляции верхних моделей и сравнивает выходы.
Запустите тест и проверьте результаты.
Для получения дополнительной информации смотрите Тестирование Двух Симуляций для Эквивалентности ( Simulink Test).
Примечание
Если вы хотите сравнить поведение сгенерированного кода из текущего и предыдущего релиза, на шаге 1 задайте следующие Model параметры блоков:
Установите Simulation mode значение Software-in-the-loop (SIL)
или Processor-in-the-loop (PIL)
.
Установите Code interface значение Top model
.
Если вы устанавливаете пакет поддержки 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.
Если в исходной модели используются варианты или символьные размерности (варианты размерности), в импортированной модели могут использоваться только те же варианты и символьные строения размерности, которые использовались при генерации кода в предыдущем релизе.
crossReleaseImport
| sharedCodeMATLABVersions
| sharedCodeUpdate