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

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');

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

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

rtwbuild('rtwdemo_paraminline')
### Starting build procedure for: rtwdemo_paraminline
### Generated code for 'rtwdemo_paraminline' is up to date because no structural, parameter or code replacement library changes were found.
### Successful completion of build procedure for: rtwdemo_paraminline

Build Summary

0 of 1 models built (1 models already up to date)
Build duration: 0h 0m 3.222s

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

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

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

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

    Теперь таблица данных содержит строки, которые соответствуют переменным рабочей области, используемым блоками Gain (которые представляют P, меня и параметры 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, чтобы сгенерировать спецификаторы типа хранения, смотрите, Защищают Глобальные данные с const и энергозависимыми Спецификаторами Типа (Embedded Coder).

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

Если у вас есть Embedded Coder, используйте класс памяти FileScope или подобный класс памяти, который вы создаете. Смотрите Выбирают Storage Class for Controlling Data Representation in Generated Code (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, чтобы сгенерировать код, который включает пользовательские прагмы, разделы use storage classes и memory. Смотрите Данные об Управлении и Функциональное Размещение в Памяти Вставкой Прагм (Embedded Coder).

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

| |

Похожие темы