Создайте настраиваемый калибровочный параметр в сгенерированном коде

calibration parameter является значением, сохраненным в глобальной памяти, которую алгоритм читает для использования в вычислениях, но не пишет в. Калибровочными параметрами является tunable, потому что можно изменить хранимую сумму во время осуществления алгоритма. Вы создаете калибровочные параметры так, чтобы вы могли:

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

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

В Simulink® создайте объект Simulink.Parameter представлять калибровочный параметр. Вы используете объект параметра, чтобы установить значения параметров блоков, такие как параметр Gain блока Gain. Чтобы управлять представлением объекта параметра в сгенерированном коде, вы применяете класс памяти к объекту.

Чтобы сделать параметры блоков доступными в сгенерированном коде по умолчанию, например, для быстрого прототипирования, устанавливают Default parameter behavior (см. поведение параметра По умолчанию (Simulink Coder)) к Tunable. Для получения дополнительной информации смотрите, Конфигурируют Доступность Данных для Быстрого прототипирования.

Представляйте параметры блоков как настраиваемую глобальную переменную

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

Сконфигурируйте параметры блоков при помощи объекта параметра

Откройте модель rtwdemo_paraminline в качестве примера и сконфигурируйте ее, чтобы показать сгенерированные имена блоков.

load_system('rtwdemo_paraminline')
set_param('rtwdemo_paraminline','HideAutomaticNames','off')
open_system('rtwdemo_paraminline')

В модели выберите View> 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 диалоговом окне, Классе памяти набора к ExportedGlobal и нажимают ОК. Этот класс памяти заставляет объект параметра появляться в сгенерированном коде как настраиваемая глобальная переменная.

Также, чтобы создать объект параметра и сконфигурировать модель, используйте эти команды в командной строке:

set_param('rtwdemo_paraminline/G1','Gain','myGainParam')
myGainParam = Simulink.Parameter(2);
myGainParam.CoderInfo.StorageClass = 'ExportedGlobal';

Используйте Model Data Editor, чтобы создать объект параметра, myOtherGain, для блока G2 Gain. Примените класс памяти ExportedGlobal.

Также используйте эти команды в командной строке:

set_param('rtwdemo_paraminline/G2','Gain','myOtherGain')
myOtherGain = Simulink.Parameter(-2);
myOtherGain.CoderInfo.StorageClass = 'ExportedGlobal';

Сгенерируйте и осмотрите код

Сгенерируйте код из модели.

rtwbuild('rtwdemo_paraminline')
### Starting build procedure for model: rtwdemo_paraminline
### Successful completion of build procedure for model: rtwdemo_paraminline

Сгенерированный файл 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;
}

Примените класс памяти, когда параметры блоков будут относиться к числовой переменной MATLAB

Если вы используете числовую переменную, чтобы установить значение параметров блоков, вы не можете применить класс памяти к переменной. Как обходное решение, можно преобразовать переменную в объект параметра, и затем применить класс памяти к объекту. Чтобы преобразовать переменную в объект параметра, выберите один из этих методов:

  • На вкладке Model Data Editor Parameters, с набором Change view к Code, находят строку, которая соответствует переменной. В столбце Storage Class, из выпадающего списка, выбирают Convert to parameter object. Model Data Editor преобразовывает переменную в объект параметра. Затем используйте столбец Storage Class, чтобы применить класс памяти к объекту.

    Можно также использовать этот метод в Model Explorer.

  • Используйте Мастер Объекта данных (см., Создают Объекты данных для Модели Используя Мастер Объекта данных (Simulink)). В Мастере установите флажок Parameters. Мастер преобразовывает переменные в объекты. Затем примените классы памяти к объектам, например, при помощи Model Data Editor или Model Explorer.

Создайте класс памяти, который представляет калибровочные параметры (Embedded Coder)

Этот пример показывает, как создать класс памяти, который приводит к калибровочному параметру в сгенерированном коде. Класс памяти заставляет каждый объект параметра (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) описание каждого параметра.

Создайте пакет для хранения определения раздела Memory и класс памяти

Теперь, создайте пакет в своей текущей папке путем копирования пакета в качестве примера +SimulinkDemos. Винные магазины определения Parameter и классов Signal, что вы дальнейшее использование, чтобы применить класс памяти к элементам данных в моделях. Позже, пакет также хранит определения класса памяти и связанного раздела memory.

  1. Установите свою текущую папку MATLAB® на перезаписываемое местоположение.

  2. Скопируйте папку пакета +SimulinkDemos в свою текущую папку. Назовите копию +myPackage.

    copyfile(fullfile(matlabroot,...
        'toolbox','simulink','simdemos','dataclasses','+SimulinkDemos'),...
        '+myPackage','f')

  3. Переместитесь в папке +myPackage к файлу по Signal.m, чтобы отредактировать определение класса Signal.

  4. Не прокомментируйте раздел methods, который задает метод setupCoderInfo. В вызове функционального useLocalCustomStorageClasses замените 'packageName' на 'myPackage'. Когда вы закончили, раздел выглядит так:

      methods
        function setupCoderInfo(h)
          % Use custom storage classes from this package
          useLocalCustomStorageClasses(h, 'myPackage');
        end
      end % methods

  5. Сохраните и закройте файл.

  6. Переместитесь в папке +myPackage к файлу по Parameter.m, чтобы отредактировать определение класса Parameter. Не прокомментируйте раздел methods, который задает метод setupCoderInfo и замена 'packageName' с 'myPackage'.

  7. Сохраните и закройте файл.

Создайте класс памяти и раздел Memory

  1. Установите свою текущую папку на папку, которая содержит папку +myPackage пакета.

  2. Откройте Custom Storage Class Designer.

    cscdesigner('myPackage')
  3. В Custom Storage Class Designer, на вкладке Memory Sections, нажимают New.

  4. Для нового раздела memory, свойств набора согласно таблице.

    СвойствоЗначение
    NameCalMem
    Statements SurroundGroup of variables
    Pre Statement#pragma SEC(CALPRM)
    Post Statement#pragma SEC()
    Is constВыбрать
    Is volatileВыбрать

  5. Нажмите Apply.

  6. На вкладке Custom Storage Class нажмите New.

  7. Для нового класса памяти, свойств набора согласно таблице.

    СвойствоЗначение
    NameCalParam
    For signalsClear
    Data scopeExported
    Header FilecalPrms.h
    Definition FilecalPrms.c
    Memory SectionCalMem

  8. Нажмите OK. В ответ на сообщение о сохранении изменений нажмите Yes.

Установите объект параметра по умолчанию на myPackage.Parameter

Чтобы сделать применение класса памяти легче, используйте Model Explorer, чтобы изменить объект параметра по умолчанию от Simulink.Parameter до myPackage.Parameter.

  1. В командной строке откройте Model Explorer.

    daexplr

  2. В панели Model Hierarchy Model Explorer выберите Base Workspace.

  3. На панели инструментов Model Explorer кликните по стрелке рядом с кнопкой Add Simulink Parameter. В выпадающем списке выберите Customize class lists.

  4. В диалоговом окне Customize class lists, под Parameter classes, устанавливают флажок рядом с myPackage.Parameter. Нажмите OK.

  5. На панели инструментов Model Explorer кликните по стрелке рядом с кнопкой Add Simulink Parameter. В выпадающем списке выберите myPackage Parameter.

    Объект myPackage.Parameter появляется в базовом рабочем пространстве. Можно удалить этот объект.

Теперь, когда вы используете инструменты, такие как Model Data Editor, чтобы создать объекты параметра, Simulink создает объекты myPackage.Parameter вместо объектов Simulink.Parameter.

Примените класс памяти

В модели rtwdemo_roll в качестве примера подсистема BasicRollMode представляет ПИД-регулятор. Сконфигурируйте P, меня и параметры D как калибровочные параметры.

  1. Откройте модель.

    rtwdemo_roll

  2. В модели перейдите в подсистему BasicRollMode.

  3. Выберите Code> C/C++ Code> Configure Model in Code Perspective.

  4. Под блок-схемой откройте Model Data Editor путем выбора вкладки Model Data Editor.

  5. В Model Data Editor выберите вкладку Parameters и обновите блок-схему.

    Теперь, таблица данных содержит строки, которые соответствуют переменным рабочей области, используемым блоками Усиления (которые представляют P, меня и параметры D контроллера).

  6. В Model Data Editor, рядом с полем Filter contents, активируют кнопку Filter using selection.

  7. В модели выберите три блока Усиления.

  8. В поле Filter contents введите model workspace.

    Переменные, что использование блоков Усиления находится в рабочем пространстве модели.

  9. В таблице данных выберите эти три строки и, в столбце Storage Class для строки, выберите Convert to parameter object.

    Model Data Editor преобразовывает переменные рабочей области в объекты myPackage.Parameter. Теперь, можно применить класс памяти к объектам.

  10. В столбце Storage Class для строки выберите CalParam.

Сконфигурируйте генерацию интерфейса ASAP2

Сконфигурируйте модель, чтобы сгенерировать файлы a2l. Выберите Configuration Parameters> Code Generation> Interface> ASAP2 interface.

Сгенерируйте и осмотрите код

  1. Сгенерируйте код из модели.

  2. В отчете генерации кода осмотрите файл 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 объявляет параметры.

  3. Осмотрите интерфейсный файл 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

Инициализируйте значение параметров от системы постоянный или другой макрос (Embedded Coder)

Можно сгенерировать код, который инициализирует настраиваемый параметр со значением, вычисленным от некоторых системных констант (макросы). Например, можно сгенерировать этот код, который инициализирует настраиваемый параметр totalVol со значением, вычисленным от макросов numVessels и vesInitVol:

#define numVessels 16
#define vesInitVol 18.2

double totalVol = numVessels * vesInitVol;

Этот метод инициализации сохраняет математическое отношение между настраиваемым параметром и системными константами, которые могут сделать сгенерированный код более читаемым и легче поддержать. Сгенерировать этот код:

  1. Создайте объекты параметра, которые представляют системные константы.

    numVessels = Simulink.Parameter(16);
    vesInitVol = Simulink.Parameter(18.2);

  2. Сконфигурируйте объекты использовать класс памяти Define, который приводит к макросу в сгенерированном коде.

    numVessels.CoderInfo.StorageClass = 'Custom';
    numVessels.CoderInfo.CustomStorageClass = 'Define';
    
    vesInitVol.CoderInfo.StorageClass = 'Custom';
    vesInitVol.CoderInfo.CustomStorageClass = 'Define';

  3. Создайте другой объект параметра, который представляет настраиваемый параметр. Сконфигурируйте объект использовать класс памяти ExportedGlobal, который приводит к глобальной переменной в сгенерированном коде.

    totalVol = Simulink.Parameter;
    totalVol.CoderInfo.StorageClass = 'ExportedGlobal';

  4. Установите значение totalVol при помощи выражения numVessels * vesInitVol. Чтобы указать, что сгенерированный код сохраняет выражение, используйте функцию slexpr.

    totalVol.Value = slexpr('numVessels * vesInitVol');

  5. Используйте totalVol, чтобы установить значения параметров блоков в вашей модели. Код, который вы генерируете из модели, инициализирует настраиваемый параметр со значением на основе системных констант.

Для получения дополнительной информации и ограничения об использовании выражения, чтобы установить значение объекта Simulink.Parameter, смотрите Установленное Значение переменных при помощи Математического выражения (Simulink).

Влияние генерации кода места хранения для объектов параметра

Можно создать объект параметра в базовом рабочем пространстве, рабочем пространстве модели или словаре данных. Однако, когда вы заканчиваете свой сеанс работы с MATLAB, переменные в базовом рабочем пространстве удалены. Чтобы определить, где сохранить объекты параметра и другие переменные, которые использует модель, смотрите, Определяют, Где Сохранить Переменные и Объекты для Моделей Simulink (Simulink).

Местоположение объекта параметра может повлиять на размещение файла соответствующего определения данных в сгенерированном коде.

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

    Однако, если у вас есть Embedded Coder®, некоторые пользовательские классы памяти позволяют вам задать имя модели, которая владеет частью данных. Когда вы задаете модель владельца, код, сгенерированный для той модели, задает данные. Для получения дополнительной информации о владении данных, смотрите Размещение Управления Определений Глобальных данных и Объявлений в Сгенерированных Файлах.

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

    Для получения дополнительной информации о владении данных, смотрите Размещение Управления Определений Глобальных данных и Объявлений в Сгенерированных Файлах.

  • Если вы применяете класс памяти кроме Auto к объекту параметра, объект появляется в сгенерированном коде как глобальный символ. Поэтому в иерархии модели - ссылки, два таких объекта в различных рабочих пространствах модели или словарях не могут иметь того же имени. Имя каждого объекта должно быть уникальным в иерархии модели.

    Однако, если у вас есть Embedded Coder, можно использовать класс памяти FileScope, чтобы предотвратить столкновения имени между объектами параметра в различных рабочих пространствах модели. Смотрите Применяют Пользовательские Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра.

Если вы храните объект AUTOSAR.Parameter в рабочем пространстве модели, генератор кода игнорирует класс памяти, который вы задаете для объекта.

Сконфигурируйте доступность данных сигнала

Когда вы настраиваете значение параметра во время осуществления алгоритма, вы контролируете или получаете значения выходного сигнала, чтобы анализировать результаты настройки. Чтобы представлять сигналы в сгенерированном коде как доступные данные, можно использовать методы, такие как тестовые точки и классы памяти. Смотрите Конфигурируют Доступность Данных для Быстрого прототипирования.

Программируемые интерфейсы для настройки параметров

Можно сконфигурировать сгенерированный код, чтобы включать:

Установите настраиваемый параметр минимальные и максимальные значения

Это - лучшая практика задать минимальные и максимальные значения для настраиваемых параметров.

Можно задать эти минимальные и максимальные значения:

  • В диалоговом окне блока, которое использует объект параметра. Используйте этот метод, чтобы хранить минимальную и максимальную информацию в модели.

  • При помощи свойств объекта Simulink.Parameter, который вы используете, чтобы установить значение параметров. Используйте этот метод, чтобы хранить минимальную и максимальную информацию вне модели.

Для получения дополнительной информации смотрите, Задают Минимальные и Максимальные значения для Параметров блоков (Simulink).

Факторы для других целей моделирования

ЦельФакторы и больше информации
Примените спецификаторы типа хранения const и volatile

Если у вас есть Embedded Coder, чтобы сгенерировать спецификаторы типа хранения, смотрите, Защищают Глобальные данные с const и энергозависимыми Спецификаторами Типа.

Предотвратите столкновения имени между параметрами в различных компонентах путем применения ключевого слова static

Если у вас есть Embedded Coder, используйте класс памяти FileScope или подобный класс памяти, который вы создаете. Смотрите Выбирают Класс памяти для Управления Представлением данных в Сгенерированном коде.

Сгенерируйте ASAP2 (a2l) описание

Можно сгенерировать файл a2l, который использует стандарт ASAP2, чтобы описать калибровочные параметры. Для получения дополнительной информации смотрите, Задают информацию ASAP2 для Параметров и Сигналов.

Сгенерируйте AUTOSAR XML (arxml) описание

Если у вас есть Embedded Coder, можно сгенерировать файл arxml, который описывает калибровочные параметры, используемые моделями, которые вы конфигурируете для стандарта AUTOSAR. Смотрите Образцовые Калибровочные Параметры AUTOSAR и Интерполяционные таблицы (AUTOSAR Blockset).

Храните данные об интерполяционной таблице для калибровки

Чтобы хранить данные об интерполяционной таблице для калибровки согласно ASAP2 или стандартам AUTOSAR (например, STD_AXIS, COM_AXIS или CURVE), можно использовать Simulink.LookupTable и объекты Simulink.Breakpoint в блоках интерполяционной таблицы.

Однако некоторые ограничения применяются. Смотрите Simulink.LookupTable. Чтобы работать вокруг ограничений Simulink.LookupTable и объектов Simulink.Breakpoint, используйте объекты Simulink.Parameter вместо этого.

Для получения дополнительной информации смотрите, Задают информацию ASAP2 для Параметров и Сигналов и Конфигурируют Интерполяционные таблицы для Измерения AUTOSAR и Калибровки (AUTOSAR Blockset).

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

Если у вас есть лицензия Embedded Coder, чтобы сгенерировать код, который включает пользовательские прагмы, используйте разделы custom storage classes и memory. Смотрите Данные об Управлении и Функциональное Размещение в Памяти Вставкой Прагм.

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

| |

Похожие темы