Если у вас есть лицензия 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
.
Чтобы интегрировать код от предыдущих релизов со сгенерированным кодом от текущего релиза, используйте этот рабочий процесс:
Рабочий процесс интеграции кода перекрестного релиза не поддерживает:
Модели экспорта функций для кода ERT.
Simulink Функциональная и Функциональная Вызывающая сторона блокируется через контуры кода ERT, сгенерированного различными релизами.
Интегрирование сгенерированного кода от релизов перед R2010a.
Импорт сгенерированного кода от текущего релиза в предыдущий релиз (прямая совместимость).
Экспорт файлов, расположенных в корневой папке MATLAB® предыдущего релиза, например, blockset файлы библиотеки.
Экспорт и импорт сгенерированного кода из моделей с невстроенными S-функциями.
В конце процесса сборки модели отчет генерации кода отображает совместно используемые файлы, которые непосредственно используются моделью интегрирования, например, 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, используйте один из этих подходов.
Подход | Экспорт кода | Импорт кода |
---|---|---|
Автоматический |
В предыдущем релизе, прежде, чем сгенерировать код, устанавливает свойство Генератор кода создает определение типов |
В текущем релизе, прежде, чем запустить Когда вы создаете модель интегрирования, процесс сборки использует тип данных |
Экспортируемая шина |
В предыдущем релизе, прежде, чем сгенерировать код, задают эти свойства объекта
Генератор кода создает Для 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
для текущего релиза.
Для свойства Alias задайте совпадающее значение, только если свойство задано для объекта в компоненте, который вы хотите импортировать.
Сохраните объекты Simulink.Signal
. Объекты требуются каждый раз, когда вы моделируете или создаете импортированный блок SIL или PIL.
Для получения дополнительной информации смотрите Хранилища данных в Сгенерированном коде (Simulink Coder).
Рабочий процесс интеграции кода ERT перекрестного релиза поддерживает параметр, настраивающий модель интегрирования, которая содержит код компонента с настраиваемыми параметрами от предыдущих релизов.
В текущем релизе, прежде чем вы запустите crossReleaseImport
для каждого настраиваемого параметра компонента, который вы хотите импортировать:
Задайте объект Simulink.Parameter
в базовом рабочем пространстве MATLAB или словаре данных Simulink.
Для имени объекта и Data type, Complexity и свойства объектов Dimensions, задают значения, которые совпадают с предыдущими значениями объекта релиза. Если переменная в импортированном исходном коде не имеет того же имени как объект, для свойства Alias, задает значение, которое совпадает с именем переменной.
Если предыдущий объект релиза использует GetSet
пользовательский класс памяти, задайте:
Совпадающее значение для свойства объекта Storage class.
Заголовочный файл, который задает функции доступа set
и get
. Для получения дополнительной информации смотрите Представление данных Управления Configuring Custom Storage Class Properties и Доступом к данным Через Функции с Пользовательским Классом памяти 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);
Используя допускающую повторное использование модель, на которую ссылаются, можно задать уникальные образцовые значения аргументов (Simulink) для каждого экземпляра модели, на которую ссылаются, в родительской модели. Импортируйте ранее сгенерированный код для допускающей повторное использование модели, на которую ссылаются, в текущий релиз как параметризованный блок 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
, функция импортирует код AUTOSAR как блок Model перекрестного релиза вместо блока SIL или PIL. Параметр Simulation mode блока Model устанавливается на Software-in-the-loop (SIL)
или Processor-in-the-loop (PIL)
. Включите блок Model в текущую модель релиза.
Эти ограничения применяются:
Рабочий процесс перекрестного релиза не поддерживает память на экземпляр, это получает доступ к NVRAM.
Настраиваемые параметры должны быть сопоставлены с калибровочными параметрами AUTOSAR или внутренними калибровочными параметрами AUTOSAR.
Если исходная модель использует варианты или символьные размерности (варианты размерности), импортированная модель может использовать только ту же различную и символьную настройку размерности, которая использовалась при генерации кода в предыдущем релизе.
crossReleaseImport
| sharedCodeMATLABVersions
| sharedCodeUpdate