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

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 смотрите вкладку Параметры.

В модели кликните G1 Блок усиления. В Model Data Editor подсвечивается строка, которая соответствует параметру Gain блока.

В столбце Model Data Editor Value измените значение усиления от 2 на myGainParam.

Рядом с myGainParam, нажмите кнопку действия (с тремя вертикальными точками) и выберите Create.

В Данные Create New диалогового окна блока установите значение Simulink.Parameter(2). Нажмите кнопку Создать. A Simulink.Parameter myGainParam объекта сохраняет значение параметров, 2, в рабочем пространстве модели.

В диалоговом окне myGainParam, на вкладке Генерации кода, нажатия кнопки Configure in Coder Приложения.

В редакторе Отображения установите Класс памяти 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 Блок усиления. Применить класс памяти 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;
}

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

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

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

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

  • Используйте Мастер объектов данных (см. «Создание объектов данных для модели с использованием Мастера объектов данных»). В мастере установите флажок 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) описание каждого параметра.

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

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

  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. Сохраните и закройте файл.

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

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

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

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

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

    СвойствоЗначение
    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 signalsЯсно
    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.

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

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

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

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

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

    rtwdemo_roll

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

  3. В галерее Apps нажмите Embedded Coder.

  4. Под блоком откройте Model Data Editor, выбрав вкладку Model Data Editor.

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

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

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

  7. В модели выберите три блока Gain.

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

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

  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 объект, см. «Задать значение переменных при помощи математического выражения».

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

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

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

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

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

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

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

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

    Однако, если у вас есть Embedded Coder, можно использовать класс памяти FileScope чтобы предотвратить конфликты имен между объектами параметров в различных рабочих пространствах модели. Смотрите Организуйте Данные Параметра в Структуру при Помощи Struct Класса памяти (Embedded Coder).

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

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

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

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

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

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

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

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

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

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

Для получения дополнительной информации смотрите Задать минимальные и максимальные значения для параметров блоков.

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

ЦельФакторы и дополнительная информация
Применить проверку типа склада const и volatile

Если у вас есть Embedded Coder, чтобы сгенерировать проверку типа хранилища, смотрите Protect Global Data with const и Volatile Type Qualifiers (Embedded Coder).

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

Если у вас есть Embedded Coder, используйте класс памяти FileScope или аналогичный класс памяти, который вы создаете. Смотрите раздел «Выбор класса памяти для управления представлением данных в сгенерированном коде (Embedded Coder)».

Сгенерируйте 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, чтобы сгенерировать код, который включает пользовательские прагмы, используйте классы памяти и разделы памяти. Смотрите Control Data and Function Placement in Memory by Inserting Pragmas (Embedded Coder).

См. также

| |

Похожие темы