calibration parameter является значением, сохраненным в глобальной памяти, которую алгоритм читает для использования в вычислениях, но не пишет в. Калибровочными параметрами является tunable, потому что можно изменить хранимую сумму во время осуществления алгоритма. Вы создаете калибровочные параметры так, чтобы вы могли:
Определите оптимальное значение параметров путем настройки параметра и контроля значений сигналов во время выполнения.
Эффективно адаптируйте алгоритм к различным условиям выполнения путем перезаписи значения параметров, сохраненного в памяти. Например, можно использовать тот же алгоритм управления для нескольких транспортных средств различных масс путем хранения различных значений параметров в блоке управления двигателем каждого транспортного средства.
В Simulink®, создайте Simulink.Parameter
объект представлять калибровочный параметр. Вы используете объект параметра, чтобы установить значения параметров блоков, такие как параметр Gain блока Gain. Чтобы управлять представлением объекта параметра в сгенерированном коде, вы применяете класс памяти к объекту.
Чтобы сделать параметры блоков доступными в сгенерированном коде по умолчанию, например, для быстрого прототипирования, устанавливают Default parameter behavior (см. поведение параметра По умолчанию) к Tunable
. Для получения дополнительной информации смотрите Переменные Заповедника в Сгенерированном коде.
В этом примере показано, как создать данные о настраиваемом параметре путем представления параметров блоков как глобальных переменных в сгенерированном коде.
Сконфигурируйте параметры блоков при помощи объекта параметра
Откройте модель rtwdemo_paraminline
в качестве примера и сконфигурируйте его, чтобы показать сгенерированные имена блоков.
load_system('rtwdemo_paraminline') set_param('rtwdemo_paraminline','HideAutomaticNames','off') open_system('rtwdemo_paraminline')
На вкладке Modeling нажмите Model Data Editor.
В Model Data Editor смотрите вкладку Parameters.
В модели нажмите G1
Блок Gain. Model Data Editor подсвечивает строку, которая соответствует параметру Усиления блока.
В Столбце значений Model Data Editor измените значение усиления от 2
к myGainParam
.
Рядом с myGainParam
, кликните по кнопке действий (с тремя вертикальными точками) и выберите Create.
В Создавании Нового диалогового окна Блока данных, установленного Значения к Simulink.Parameter(2)
. Нажмите Create. Simulink.Parameter
объект myGainParam
хранит значение параметров, 2
, в рабочем пространстве модели.
В myGainParam диалоговом окне, на вкладке Code Generation, нажимают Configure in Coder App.
В редакторе Отображений Кода, Классе памяти набора myGainParam
к ExportedGlobal
. Этот класс памяти заставляет объект параметра появляться в сгенерированном коде как настраиваемая глобальная переменная.
В качестве альтернативы, чтобы создать объект параметра и сконфигурировать модель, используйте эти команды в командной строке:
set_param('rtwdemo_paraminline/G1','Gain','myGainParam') mws = get_param('rtwdemo_paraminline', 'modelworkspace'); mws.assignin('myGainParam',Simulink.Parameter(2)); cm = coder.mapping.utils.create('rtwdemo_paraminline'); setModelParameter(cm,'myGainParam','StorageClass','ExportedGlobal');
Используйте Model Data Editor, чтобы создать объект параметра, myOtherGain
, для G2
Блок Gain. Примените класс памяти ExportedGlobal
.
В качестве альтернативы используйте эти команды в командной строке:
set_param('rtwdemo_paraminline/G2','Gain','myOtherGain') mws.assignin('myOtherGain',Simulink.Parameter(-2)); setModelParameter(cm,'myOtherGain','StorageClass','ExportedGlobal');
Сгенерируйте и смотрите код
Сгенерируйте код из модели.
slbuild('rtwdemo_paraminline')
### Starting build procedure for: rtwdemo_paraminline ### Successful completion of build procedure for: rtwdemo_paraminline Build Summary Top model targets built: Model Action Rebuild Reason ==================================================================================================== rtwdemo_paraminline Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 9.502s
Сгенерированный файл rtwdemo_paraminline.h
содержит extern
объявления глобальных переменных myGainParam
и myOtherGain
. Можно включать (#include
) этот заголовочный файл так, чтобы ваш код мог считать и записать значение переменной во время выполнения.
file = fullfile('rtwdemo_paraminline_grt_rtw','rtwdemo_paraminline.h'); rtwdemodbtype(file,... 'extern real_T myGainParam;','Referenced by: ''<Root>/G2''',1,1)
extern real_T myGainParam; /* Variable: myGainParam * Referenced by: '<Root>/G1' */ extern real_T myOtherGain; /* Variable: myOtherGain * Referenced by: '<Root>/G2'
Файл rtwdemo_paraminline.c
выделяет память для и инициализирует myGainParam
и myOtherGain
.
file = fullfile('rtwdemo_paraminline_grt_rtw','rtwdemo_paraminline.c'); rtwdemodbtype(file,... '/* Exported block parameters */','Referenced by: ''<Root>/G2''',1,1)
/* Exported block parameters */ real_T myGainParam = 2.0; /* Variable: myGainParam * Referenced by: '<Root>/G1' */ real_T myOtherGain = -2.0; /* Variable: myOtherGain * Referenced by: '<Root>/G2'
Алгоритм сгенерированного кода в модели step
функционируйте использует myGainParam
и myOtherGain
для вычислений.
rtwdemodbtype(file,... '/* Model step function */','/* Model initialize function */',1,0)
/* Model step function */ void rtwdemo_paraminline_step(void) { /* Outport: '<Root>/Out1' incorporates: * Gain: '<Root>/G1' * Gain: '<Root>/G2' * Inport: '<Root>/In1' * Sum: '<Root>/Sum' */ rtwdemo_paraminline_Y.Out1 = myGainParam * rtwdemo_paraminline_U.In1 + myOtherGain * -75.0; }
Если вы используете числовую переменную, чтобы установить значение параметров блоков, вы не можете применить класс памяти к переменной. Как обходное решение, можно преобразовать переменную в объект параметра, и затем применить класс памяти к объекту. Чтобы преобразовать переменную в объект параметра, выберите один из этих методов:
На вкладке Model Data Editor Parameters, с набором Change view к Code
, найдите строку, которая соответствует переменной. В столбце Storage Class, из выпадающего списка, выбирают Convert to parameter object
. Model Data Editor преобразует переменную в объект параметра. Затем используйте столбец Storage Class, чтобы применить класс памяти к объекту.
Можно также использовать этот метод в Model Explorer.
Используйте Мастер Объекта данных (см., Создают Объекты данных для Модели Используя Мастер Объекта данных). В Мастере установите флажок Parameters. Мастер преобразует переменные в объекты. Затем примените классы памяти к объектам, например, при помощи Model Data Editor или Model Explorer.
В этом примере показано, как создать класс памяти, который дает к калибровочному параметру в сгенерированном коде. Класс памяти вызывает каждый объект параметра (Simulink.Parameter
) появиться как глобальная переменная со специальными художественными оформлениями, такими как ключевые слова и прагмы.
В сгенерированном коде калибровочные параметры должны появиться как глобальные переменные, заданные в файле с именем calPrms.c
и объявленный в calPrms.h
. Определения переменной должны быть похожими на эти определения:
#pragma SEC(CALPRM) const volatile float param1 = 3.0F; const volatile float param2 = 5.0F; const volatile float param3 = 7.0F; #pragma SEC()
Переменные используют ключевые слова const
и volatile
. Прагма #pragma SEC(CALPRM)
управляет размещением переменных в памяти. Чтобы реализовать прагму, определения переменной должны появиться в непрерывном блоке кода.
Кроме того, сгенерированный код должен включать ASAP2 (a2l
) описание каждого параметра.
Теперь создайте пакет в своей текущей папке путем копирования пакета в качестве примера +SimulinkDemos
. Винные магазины определения Parameter
и Signal
классы, что вы дальнейшее использование, чтобы применить класс памяти к элементам данных в моделях. Позже, пакет также хранит определения класса памяти и связанного раздела memory.
Установите свой текущий MATLAB® папка к перезаписываемому местоположению.
Скопируйте +SimulinkDemos
папка пакета в вашу текущую папку. Назовите копию +myPackage
.
copyfile(fullfile(matlabroot,... 'toolbox','simulink','simdemos','dataclasses','+SimulinkDemos'),... '+myPackage','f')
Перейдите в +myPackage
папка к файлу Signal.m
отредактировать определение Signal
класс.
Не прокомментируйте methods
разделите, который задает метод setupCoderInfo
. В вызове функционального useLocalCustomStorageClasses
, замените 'packageName'
с 'myPackage'
. Когда вы закончили, раздел выглядит так:
methods function setupCoderInfo(h) % Use custom storage classes from this package useLocalCustomStorageClasses(h, 'myPackage'); end end % methods
Сохраните и закройте файл.
Перейдите в +myPackage
папка к файлу Parameter.m
отредактировать определение Parameter
класс. Не прокомментируйте methods
разделите, который задает метод setupCoderInfo
и замените 'packageName'
с 'myPackage'
.
Сохраните и закройте файл.
Установите свою текущую папку на папку, которая содержит папку +myPackage
пакета.
Откройте Custom Storage Class Designer.
cscdesigner('myPackage')
В Custom Storage Class Designer, на вкладке Memory Sections, нажимают New.
Для нового раздела memory, свойств набора согласно таблице.
Свойство | Значение |
---|---|
Name | CalMem |
Statements Surround | Group of variables |
Pre Statement | #pragma SEC(CALPRM) |
Post Statement | #pragma SEC() |
Is const | Выбрать |
Is volatile | Выбрать |
Нажмите Apply.
На вкладке Custom Storage Class нажмите New.
Для нового класса памяти, свойств набора согласно таблице.
Свойство | Значение |
---|---|
Name | CalParam |
For signals | Clear |
Data scope | Exported |
Header File | calPrms.h |
Definition File | calPrms.c |
Memory Section | CalMem |
Нажмите OK. В ответ на сообщение о сохранении изменений нажмите Yes.
myPackage.Parameter
Чтобы сделать применение класса памяти легче, используйте Model Explorer, чтобы изменить объект параметра по умолчанию от Simulink.Parameter
к myPackage.Parameter
.
В командной строке откройте Model Explorer.
daexplr
В панели Model Hierarchy Model Explorer выберите Base Workspace.
На панели инструментов Model Explorer кликните по стреле рядом с кнопкой Add Simulink Parameter. В выпадающем списке выберите Customize class lists.
В диалоговом окне Customize class lists, под Parameter classes, устанавливают флажок рядом с myPackage.Parameter. Нажмите OK.
На панели инструментов Model Explorer кликните по стреле рядом с кнопкой Add Simulink Parameter. В выпадающем списке выберите myPackage Parameter.
myPackage.Parameter
объект появляется в базовом рабочем пространстве. Можно удалить этот объект.
Теперь, когда вы используете инструменты, такие как Model Data Editor, чтобы создать объекты параметра, Simulink создает myPackage.Parameter
объекты вместо Simulink.Parameter
объекты.
В модели rtwdemo_roll
в качестве примера,
BasicRollMode
подсистема представляет ПИД-регулятор. Сконфигурируйте P, меня и параметры D как калибровочные параметры.
Откройте модель.
rtwdemo_roll
В модели перейдите в BasicRollMode
подсистема.
В галерее Apps нажмите Embedded Coder.
Под блок-схемой откройте Model Data Editor путем выбора вкладки Model Data Editor.
В Model Data Editor выберите вкладку Parameters и обновите блок-схему.
Теперь таблица данных содержит строки, которые соответствуют переменным рабочей области, используемым блоками Gain (которые представляют P, меня и параметры D контроллера).
В Model Data Editor, рядом с полем Filter contents, активируют кнопку Filter using selection.
В модели выберите три блока Gain.
В поле Filter contents введите model workspace
.
Переменные, что использование блоков Gain находится в рабочем пространстве модели.
В таблице данных выберите эти три строки и, в столбце Storage Class для строки, выберите Convert to parameter object
.
Model Data Editor преобразует переменные рабочей области в myPackage.Parameter
объекты. Теперь можно применить класс памяти к объектам.
В столбце Storage Class для строки выберите CalParam
.
Сконфигурируйте модель, чтобы сгенерировать a2l
файлы. Выберите Configuration Parameters> Code Generation> Interface> ASAP2 interface.
Сгенерируйте код из модели.
В отчете генерации кода смотрите calPrms.c
файл. Файл задает калибровочные параметры.
/* Exported data definition */ #pragma SEC(CALPRM) /* Definition for custom storage class: CalParam */ const volatile real32_T dispGain = 0.75F; const volatile real32_T intGain = 0.5F; const volatile real32_T rateGain = 2.0F; #pragma SEC()
Файл calPrms.h
объявляет параметры.
Смотрите интерфейсный файл rtwdemo_roll.a2l
. Файл содержит информацию о каждом параметре, например, для dispGain
.
/begin CHARACTERISTIC /* Name */ dispGain /* Long Identifier */ "" /* Type */ VALUE /* ECU Address */ 0x0000 /* @ECU_Address@dispGain@ */ /* Record Layout */ Scalar_FLOAT32_IEEE /* Maximum Difference */ 0 /* Conversion Method */ rtwdemo_roll_CM_single /* Lower Limit */ -3.4E+38 /* Upper Limit */ 3.4E+38 /end CHARACTERISTIC
Можно сгенерировать код, который инициализирует настраиваемый параметр значением, вычисленным от некоторых системных констант (макросы). Например, можно сгенерировать этот код, который инициализирует настраиваемый параметр totalVol
со значением, вычисленным от макросов numVessels
и vesInitVol
:
#define numVessels 16 #define vesInitVol 18.2 double totalVol = numVessels * vesInitVol;
Этот метод инициализации сохраняет математическое отношение между настраиваемым параметром и системными константами, которые могут сделать сгенерированный код более читаемым и легче обеспечить. Сгенерировать этот код:
Создайте объекты параметра, которые представляют системные константы.
numVessels = Simulink.Parameter(16); vesInitVol = Simulink.Parameter(18.2);
Сконфигурируйте объекты использовать класс памяти Define
, который дает к макросу в сгенерированном коде.
numVessels.CoderInfo.StorageClass = 'Custom'; numVessels.CoderInfo.CustomStorageClass = 'Define'; vesInitVol.CoderInfo.StorageClass = 'Custom'; vesInitVol.CoderInfo.CustomStorageClass = 'Define';
Создайте другой объект параметра, который представляет настраиваемый параметр. Сконфигурируйте объект использовать класс памяти ExportedGlobal
, который дает к глобальной переменной в сгенерированном коде.
totalVol = Simulink.Parameter;
totalVol.CoderInfo.StorageClass = 'ExportedGlobal';
Установите значение totalVol
при помощи выражения numVessels * vesInitVol
. Чтобы указать, что сгенерированный код сохраняет выражение, используйте slexpr
функция.
totalVol.Value = slexpr('numVessels * vesInitVol');
Используйте totalVol
устанавливать значения параметров блоков в вашей модели. Код, который вы генерируете из модели, инициализирует настраиваемый параметр значением на основе системных констант.
Для получения дополнительной информации и ограничения об использовании выражения, чтобы установить значение Simulink.Parameter
возразите, смотрите Установленное Значение переменных при помощи Математического выражения.
Можно создать объект параметра в базовом рабочем пространстве, рабочем пространстве модели или словаре данных. Однако, когда вы заканчиваете свой сеанс работы с MATLAB, переменные в базовом рабочем пространстве удалены. Чтобы определить, где сохранить объекты параметра и другие переменные, которые использует модель, смотрите, Определяют, Где Сохранить Переменные и Объекты для Моделей Simulink.
Местоположение объекта параметра может повлиять на размещение файла соответствующего определения данных в сгенерированном коде.
Если вы помещаете объект параметра в базовое рабочее пространство или словарь данных, генератор кода принимает, что соответствующие данные о параметре (например, глобальная переменная) принадлежат системе, от которой вы генерируете код, не к определенному компоненту в системе. Например, если модель в иерархии модели - ссылки использует объект параметра с классом памяти кроме Auto
, определение данных появляется в коде, сгенерированном для топ-модели в иерархии, не в коде, сгенерированном для модели, которая использует объект.
Однако, если у вас есть Embedded Coder®, некоторые классы памяти позволяют вам задать имя модели, которая владеет частью данных. Когда вы задаете модель владельца, код, сгенерированный для той модели, задает данные. Для получения дополнительной информации о владении данных, смотрите Размещение Управления Определений Глобальных данных и Объявлений в Сгенерированных Файлах.
Если вы помещаете объект параметра в рабочее пространство модели, генератор кода принимает, что модель владеет данными. Если вы генерируете код от ссылочной иерархии, которая включает содержание модели, определение данных появляется в коде, сгенерированном для содержания модели.
Для получения дополнительной информации о владении данных, смотрите Размещение Управления Определений Глобальных данных и Объявлений в Сгенерированных Файлах.
Если вы применяете класс памяти кроме Auto
к объекту параметра объект появляется в сгенерированном коде как глобальный символ. Поэтому в иерархии модели - ссылки, два таких объекта в различных рабочих пространствах модели или словарях не могут иметь того же имени. Имя каждого объекта должно быть уникальным в иерархии модели.
Однако, если у вас есть Embedded Coder, можно использовать класс памяти FileScope
предотвратить имя сталкивается между объектами параметра в различных рабочих пространствах модели. Смотрите Организуют Данные о Параметре в Структуру при помощи Класса памяти Struct.
Если вы храните AUTOSAR.Parameter
объект в рабочем пространстве модели, генератор кода игнорирует класс памяти, который вы задаете для объекта.
Когда вы настраиваете значение параметра во время осуществления алгоритма, вы контролируете или получаете значения выходного сигнала, чтобы анализировать результаты настройки. Чтобы представлять сигналы в сгенерированном коде как доступные данные, можно использовать методы, такие как тестовые точки и классы памяти. Смотрите Переменные Заповедника в Сгенерированном коде.
Можно сконфигурировать сгенерированный код, чтобы включать:
Прикладной программный интерфейс (API) C для настройки параметров, независимых от режима external mode. Сгенерированный код включает дополнительный код так, чтобы можно было записать собственный код, чтобы получить доступ к значениям параметров. Смотрите обмениваются Данными Между Сгенерированным и Внешним Кодом Используя API C.
API Компилятора Выходного языка для настройки параметров независимо от режима external mode. Смотрите Функции Параметра.
Это - лучшая практика, чтобы задать минимальные и максимальные значения для настраиваемых параметров.
Можно задать эти минимальные и максимальные значения:
В диалоговом окне блока, которое использует объект параметра. Используйте этот метод, чтобы хранить минимальную и максимальную информацию в модели.
При помощи свойств Simulink.Parameter
возразите, что вы используете, чтобы установить значение параметров. Используйте этот метод, чтобы хранить минимальную и максимальную информацию вне модели.
Для получения дополнительной информации смотрите, Задают Минимальные и Максимальные значения для Параметров блоков.
Цель | Факторы и больше информации |
---|---|
Примените спецификаторы типа хранения const и volatile | Если у вас есть Embedded Coder, чтобы сгенерировать спецификаторы типа хранения, смотрите, Защищают Глобальные данные с const и энергозависимыми Спецификаторами Типа. |
Предотвратите столкновения имени между параметрами в различных компонентах путем применения ключевого слова static | Если у вас есть Embedded Coder, используйте класс памяти |
Сгенерируйте ASAP2 (a2l Описание |
Можно сгенерировать |
Сгенерируйте AUTOSAR XML (ARXML) описание | Если у вас есть Embedded Coder, можно сгенерировать файл ARXML, который описывает калибровочные параметры, используемые моделями, которые вы конфигурируете для стандарта AUTOSAR. Смотрите Калибровочные Параметры AUTOSAR Модели и Интерполяционные таблицы (AUTOSAR Blockset). |
Храните данные об интерполяционной таблице для калибровки | Чтобы хранить данные об интерполяционной таблице для калибровки согласно ASAP2 или стандартам AUTOSAR (например, STD_AXIS, COM_AXIS или CURVE), можно использовать Однако некоторые ограничения применяются. Смотрите Для получения дополнительной информации смотрите, Задают информацию ASAP2 для Параметров и Сигналов и Конфигурируют Интерполяционные таблицы для Измерения AUTOSAR и Калибровки (AUTOSAR Blockset). |
Используйте прагмы, чтобы хранить данные о параметре в определенных ячейках памяти | Если у вас есть лицензия Embedded Coder, чтобы сгенерировать код, который включает пользовательские прагмы, разделы use storage classes и memory. Смотрите Данные об Управлении и Функциональное Размещение в Памяти Вставкой Прагм. |
Simulink.Parameter
| Simulink.LookupTable
| Simulink.Breakpoint