Если у вас есть лицензия 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
.
Чтобы интегрировать код от предыдущих релизов со сгенерированным кодом от текущего релиза, используйте этот рабочий процесс:
Рабочий процесс интеграции кода перекрестного релиза не поддерживает:
Модели экспорта функций для кода ERT.
Simulink Function и Function Caller блокируются через контуры кода ERT, сгенерированного различными релизами.
Интегрирование сгенерированного кода от релизов перед R2010a.
Импорт сгенерированного кода от текущего релиза в предыдущий релиз (прямая совместимость).
Экспорт файлов, расположенных в корневой папке MATLAB® предыдущего релиза, например, файлов библиотеки библиотеки.
Экспорт и импорт сгенерированного кода из моделей с невстроенными 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, используйте один из этих подходов.
Подход | Экспорт кода | Импорт кода |
---|---|---|
Автоматический |
В предыдущем релизе, прежде, чем сгенерировать код, устанавливает Генератор кода создает |
В текущем релизе, перед выполнением Когда вы создаете модель интегрирования, процесс сборки использует |
Экспортируемая шина |
В предыдущем релизе, прежде, чем сгенерировать код, задают эти свойства
Генератор кода создает Для 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
функции доступа. Для получения дополнительной информации смотрите Представление данных Управления Configuring Storage Class Properties (Embedded Coder) и Доступ к данным Через Функции с Классом памяти GetSet (Embedded Coder).
Поддержка 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);
Используя допускающую повторное использование модель, на которую ссылаются, можно задать уникальные значения аргументов модели для каждого экземпляра модели, на которую ссылаются, в родительской модели. Импортируйте ранее сгенерированный код для допускающей повторное использование модели, на которую ссылаются, в текущий релиз как параметрированный блок SIL или PIL перекрестного релиза, и затем вставьте несколько экземпляров блока в модель интегрирования. Для каждого экземпляра блока можно задать уникальные значения аргументов модели.
Обновите существующую разделяемую папку кода.
sharedCodeUpdate(sourceFolder,destinationFolder)
Импортируйте сгенерированный код для допускающей повторное использование модели, на которую ссылаются, в текущий релиз как параметрированный блок перекрестного релиза, например, блок SIL.
handleSILBlock = crossReleaseImport(reusableReferencedModelcodeLocation, ... configSetIntegrationModel, 'SimulationMode', 'SIL');
В модели интегрирования, замене, например, двух экземплярах модели, на которую ссылаются, с экземплярами блока 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
, переменные рабочей области. В этом случае можно задать значения аргументов для экземпляров блока перекрестного релиза, которые являются переменными рабочей области.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™. С менеджером по Тесту (Simulink Test) можно выполнить компенсационные тесты и вывести сравнения:
Принесите компонент модели в текущий релиз как блок Model с набором параметров блоков Simulation mode к Normal
.
С блоком Model создайте топ-модель, которая задает данные о тестовом воздействии.
Импортируйте код, сгенерированный в предыдущем релизе в текущий релиз как блок SIL.
С блоком SIL создайте другую топ-модель, которая задает то же самое данные о тестовом воздействии.
В менеджере по Тесту создайте эквивалентный тест, который запускает симуляции топ-моделей и сравнивает выходные параметры.
Запустите тест и рассмотрите результаты.
Для получения дополнительной информации смотрите Тест Две Симуляции для Эквивалентности (Simulink Test).
Примечание
Если вы хотите сравнить поведение сгенерированного кода от текущего и предыдущего релиза на шаге 1, задайте эти параметры блоков Model:
Установите Simulation mode на Software-in-the-loop (SIL)
или Processor-in-the-loop (PIL)
.
Установите Code interface на Top model
.
Если вы устанавливаете Пакет Поддержки Embedded Coder для Стандарта AUTOSAR, можно импортировать в текущий релиз код компонента AUTOSAR, который вы сгенерировали в предыдущем релизе.
Когда вы запускаетесь crossReleaseImport
(Embedded Coder), функция импортирует код AUTOSAR как блок Model перекрестного релиза вместо блока SIL или PIL. Параметр Simulation mode блока Model устанавливается на Software-in-the-loop (SIL)
или Processor-in-the-loop (PIL)
. Включите блок Model в текущую модель релиза.
Эти ограничения применяются:
Рабочий процесс перекрестного релиза не поддерживает память на экземпляр, это получает доступ к NVRAM.
Настраиваемые параметры должны быть сопоставлены с калибровочными параметрами AUTOSAR или внутренними калибровочными параметрами AUTOSAR.
Если исходная модель использует варианты или символьные размерности (варианты размерности), импортированная модель может использовать только ту же различную и символьную настройку размерности, которая использовалась при генерации кода в предыдущем релизе.
crossReleaseImport
(Embedded Coder) | sharedCodeMATLABVersions
(Embedded Coder) | sharedCodeUpdate
(Embedded Coder)