exponenta event banner

Конфигурирование данных сигнала для генерации кода C

Данные сигнала состоят из переменных, хранящих промежуточные результаты в глобальной памяти, так как сформированный алгоритмический код вычисляет значения выходных сигналов блока из входных сигналов блока, исключая сигналы, которые соединяются с корневыми блоками Inport и Outport. Данные сигнала не являются сигнальными линиями на схеме модели. Например, в этих случаях сигнальная линия не имеет представления данных в сгенерированном коде:

  • Передача порта функционального вызова

  • Выход из блока сообщений, например, из блока отправки

  • Пересекает границы подсистемы без блоков вычислений между ними

При конфигурировании модели для генерации кода выбираются входные и выходные сигналы блока для обеспечения доступа к создаваемому коду. Например, сконфигурируйте данные сигнала следующим образом:

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

  • Минимизируйте объем данных, хранящихся в памяти.

  • Управление тем, где генератор кода помещает данные сигнала в память.

  • Передача данных сигналов на интерфейс модели, чтобы другие компоненты и системы могли получить доступ к этим данным.

  • Улучшение читаемости и прослеживаемости созданного кода.

Генератор кода проверяет непротиворечивость конфигурации сигнальной линии. Например, генератор кода проверяет, что конфигурация сигнальной линии, подаваемой в подсистему, соответствует конфигурации сигнальной линии, которая выходит из соответствующего входного порта подсистемы.

Для генерации кода в примерах показано, как конфигурировать сигналы блоков для модели rtwdemo_configinterface. Можно настроить сопоставления кода с помощью редактора сопоставлений кода или интерфейса программирования сопоставлений кода (coder.mapping.api.CodeMapping).

Выбор опций конфигурации кода для сигналов

На основе требований к генерации кода определите, какие блочные сигналы должны быть представлены в сгенерированном коде и каким образом должны быть представлены данные сигнала. По умолчанию сигналы в модели отображаются в сгенерированном коде как поля глобальной структуры данных с именем model_B. Если настройки не настроены, генератор кода определяет, следует ли исключить или изменить представление сигналов в сгенерированном коде в целях оптимизации. При настройке настроек решите:

  • Какие сигналы следует сделать доступными в сгенерированном коде

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

  • Настройка конфигурации по умолчанию

    Если требуется получить доступ к значительному количеству (например, более 10) сигналов, эффективнее сконфигурировать сигналы с настройками по умолчанию, а затем переопределить эти настройки для особых случаев. Если требуется получить доступ к нескольким сигналам с уникальными требованиями к источнику, именованию или размещению, рекомендуется настроить сигналы по отдельности.

  • Объявление и обработка данных сигнала в сгенерированном коде

    • Как отдельные глобальные переменные

    • Считывание входных данных из глобальных переменных, определенных во внешнем коде

    • Как вызовы функций доступа. Требуется встроенный кодер ®

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

Другие соображения включают в себя необходимость:

Список требований к интерфейсам, относящихся к сигналам с соответствующими классами хранения и свойствами класса хранения, см. в разделе Выбор класса хранения и свойств класса хранения для хранилищ данных.

Требования к сигналу для примера модели rtwdemo_configinterface являются:

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

  • Представить сигналы как отдельные глобальные переменные.

  • Применить префикс dout_ к именам переменных, представляющих сигналы.

Установка представления по умолчанию сигналов в сгенерированном коде в виде глобальных переменных, имеющих static квалификатор типа. Затем можно настроить выходные сигналы двух блоков таблицы поиска для использования класса хранения по умолчанию и уникальных идентификаторов кода, включающих требуемый префикс. dout_.

Добавление сигналов в сопоставления кода модели

Перед конфигурированием сигнала для генерации кода добавьте сигнал в сопоставления кода модели. Добавьте выходные сигналы для двух блоков таблицы поиска в сопоставления кода модели.

  1. Откройте пример rtwdemo_configinterface модели. Сохраните копию модели в доступном для записи расположении.

    Simulink model to use for learning how to configure signals for code generation.

  2. Откройте приложение Embedded Coder.

  3. На вкладке Код C выберите Интерфейс кода > Сопоставления кодов отдельных элементов.

  4. В редакторе сопоставлений кодов перейдите на вкладку «Сигналы/Состояния». Сигналы не перечислены.

  5. Добавьте сигналы в сопоставления кода. Для выходного сигнала блоков таблицы поиска Table1 и Table2:

    1. В модели выберите сигнал.

    2. Чтобы открыть панель действий, сделайте паузу на многоточии, которое появляется выше или ниже сигнальной линии. Нажмите кнопку Add Signal (Добавить сигнал).

      Action bar that appears over signal line when you pause on ellipsis.

    В редакторе сопоставлений кодов узел «Сигналы» расширяет список двух добавленных сигналов.

    Code Mappings editor with Signals/States tab selected and Signals tree node expanded, listing signals Table1:1 and Table2:1.

Настройка параметров генерации кода по умолчанию для сигналов

Настройка генерации кода по умолчанию для сигналов может уменьшить усилия по подготовке модели к генерации кода, особенно если модель имеет значительное количество сигналов, которые необходимо контролировать во время выполнения сгенерированного кода. Один раз выберите настройки конфигурации, и генератор кода применит эти настройки к сигналам в модели. Simulink ® сохраняет конфигурацию по умолчанию как часть модели.

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

В этом примере показано, как с помощью редактора сопоставлений кодов задать класс хранения по умолчанию для сигналов в модели. rtwdemo_configinterface кому FileScope. С помощью этого параметра класса хранения генератор кода представляет данные сигнала в сгенерированном коде как глобальные переменные, имеющие static квалификатор типа.

  1. Если это еще не сделано, добавьте сигналы в сопоставления кода модели, как описано в разделе Добавление сигналов в сопоставления кода модели.

  2. На вкладке Код C выберите Интерфейс кода > Сопоставления кодов по умолчанию.

  3. В редакторе сопоставлений кодов в разделе «Сигналы» выберите категорию «Сигналы, состояния и внутренние данные». Задать класс хранения по умолчанию как FileScope.

    Code Mappings editor with Data Defaults tab selected, Signals tree node expanded, and storage class for Signals, states, and internal data set to FileScope.

  4. Сохраните модель.

Настройка параметров генерации кода для отдельных сигналов

Для генерации кода можно сконфигурировать отдельные сигналы. Например, если модель имеет два сигнала, которые имеют уникальные требования к генерации кода, сконфигурируйте сигналы по отдельности. Кроме того, если настроить параметры по умолчанию для сигналов, можно переопределить эти параметры для определенных сигналов.

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

  • Использует несколько сигналов с уникальными требованиями к источнику, именованию или размещению.

  • Использует несколько сигналов.

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

В этом примере показано, как с помощью редактора сопоставлений кодов применить настройки класса хранения по умолчанию к выходным сигналам блоков таблицы поиска Table1 и Table2 в модели rtwdemo_configinterface. В примере также показано, как сконфигурировать идентификаторы кода для этих выходных сигналов. Можно указать идентификаторы генерации кода, например для интеграции, без изменения конструкции модели.

  1. Если это еще не сделано, выполните шаги в разделе Настройка параметров генерации кода по умолчанию для сигналов.

  2. В редакторе сопоставлений кодов перейдите на вкладку «Сигналы/Состояния». Разверните раздел «Сигналы». Редактор перечисляет имена или идентификаторы портов блоков сигналов, добавленных в сопоставления кода. Если сигнал распознается в сигнальном объекте, справа от имени элемента или идентификатора порта появляется значок «resolve-to-signal-object». Класс хранения для каждого сигнала установлен в Auto, что означает, что генератор кода может исключить или изменить представление соответствующего кода в целях оптимизации. Если оптимизация невозможна, генератор кода применяет конфигурацию модели по умолчанию. В этом примере конфигурация модели по умолчанию определяет класс хранения FileScope.

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

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

  3. В редакторе сопоставлений кодов выберите выходные сигналы для блоков Table1 и Table2. Задайте для класса хранения значение Model default: FileScope.

  4. Конфигурирование идентификатора кода для выходных сигналов для двух блоков таблицы поиска с именами, включающими префикс dout_. В редакторе сопоставлений кодов выберите сигнал Table1:1. В инспекторе свойств разверните узел «Код». Задайте для свойства класса хранения Identifier значение dout_Table1. Для сигнала Table2:1, задайте для параметра Identifier значение dout_Table2.

    Code Mappings editor with Signals/States tab selected, Signals tree node expanded, and storage class for signals Table1:1 and Table2:1 set to Model default: FileScope. Property Inspector shows Identifer property for signal Table2:1 set to dout_Table2.

  5. Сохраните модель.

  6. Создайте и просмотрите код. Например, в rtwdemo_configinterface.cнайдите определения данных для данных таблицы поиска.

    static MYTYPE dout_Table1;
    static MYTYPE dout_Table2;
    

    Найдите, где используются данные таблицы поиска в функции начального уровня шага.

    .
    .
    .
      dout_Table1 = look1_binlc(input2, ((const MYTYPE *)&(mp_Table1.BP[0])), ((
        const MYTYPE *)&(mp_Table1.Table[0])), 10U);
    
      if (mode) {
        output = (real_T)mp_K1 * dout_Table1;
      } else {
        output = dstate_X;
      }
    
      dout_Table2 = look2_binlc(input3, input4, ((const MYTYPE *)&(mp_Table2.BP1[0])),
        ((const MYTYPE *)&(mp_Table2.BP2[0])), ((const MYTYPE *)&(mp_Table2.Table[0])),
        ((const uint32_T *)&(rtwdemo_configi_Table2_maxIndex[0])), 3U);
    	
      dstate_X = dout_Table2;
    }
    

Удаление сигналов из сопоставлений кода модели

  1. На вкладке Код C выберите Интерфейс кода > Сопоставления кодов отдельных элементов.

  2. В редакторе сопоставлений кодов перейдите на вкладку «Сигналы/Состояния».

  3. Для каждого сигнала, который требуется удалить:

    1. В модели выберите сигнал.

    2. Чтобы открыть панель действий, сделайте паузу на многоточии, которое появляется выше или ниже сигнальной линии. Нажмите кнопку Remove Signal (удалить сигнал).

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

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

В этом примере показано, как использовать интерфейс программирования для конфигурирования сигналов для модели rtwdemo_configinterface. Установка представления по умолчанию сигналов в сгенерированном коде в виде глобальных переменных, имеющих static квалификатор типа. Затем настройте выходные сигналы двух блоков таблицы поиска, чтобы использовать класс хранения по умолчанию и уникальные идентификаторы кода, которые включают требуемый префикс. dout_.

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

    open_system('rtwdemo_configinterface')
    
  2. Создать объект cm путем вызова функции coder.mapping.api.get. Объект сохраняет конфигурацию генерации кода для данных и функций для модели. rtwdemo_configinterface.

    cm = coder.mapping.api.get('rtwdemo_configinterface');
  3. Настройка параметров по умолчанию для сигналов путем вызова функции setDataDefault. Для аргументов укажите следующие значения:

    • Объект, возвращенный coder.mapping.api.get

    • InternalData для категории по умолчанию

    • Имя свойства StorageClass со значением свойства FileScope

    setDataDefault(cm,'InternalData','StorageClass','FileScope');
  4. Проверьте конфигурацию сигналов по умолчанию. Выполните вызов getDataDefault который указывает объект, возвращенный coder.mapping.api.get и категория InternalData. Укажите третий аргумент в качестве свойства StorageClass.

    getDataDefault(cm,'InternalData','StorageClass')
    
    ans =
    
        'FileScope'
    
  5. Получение дескрипторов выходных портов для блоков таблицы поиска Table1 и Table2. Маркеры портов используются для добавления сигнальных данных в сопоставления кода модели.

    lut1D_ports = get_param('rtwdemo_configinterface/Table1','PortHandles');
    lut2D_ports = get_param('rtwdemo_configinterface/Table2','PortHandles');
    
    lut1D_outPort = lut1D_ports.Outport;
    lut2D_outPort = lut2D_ports.Outport;
    
  6. Добавьте выходные сигналы блоков таблицы поиска в сопоставления кода модели.

    addSignal(cm,[lut1D_outPort,lut2D_outPort]);
    
  7. Примените конфигурацию по умолчанию для сигналов к выходному сигналу блоков таблицы поиска.

    По умолчанию Simulink устанавливает класс хранения для отдельных сигналов на Auto. Генератор кода:

    • Определяет необходимость исключения данных из созданного кода в целях оптимизации.

    • При сохранении данных определяет способ эффективного представления данных в сгенерированном коде с учетом настроек конфигурации по умолчанию.

    Для управления конфигурацией сигнала вызовите функцию setSignal.

    Для каждого сигнала выполните вызов setSignal которая определяет:

    • Объект, возвращенный coder.mapping.api.get

    • Ручка порта для сигнала, lut1D_outport или lut2D_outport.

    • Класс хранения по умолчанию, ранее установленный для сигналов с помощью свойства StorageClass и значение свойства Model default.

    • Собственность Identifier и значение свойства dout_Table1 или dout_Table2

    setSignal(cm,lut1D_outPort,'StorageClass','Model default','Identifier','dout_Table1');
    setSignal(cm,lut2D_outPort,'StorageClass','Model default','Identifier','dout_Table2');
    
  8. Проверьте настройки конфигурации, вызвав функцию getsignal. Укажите объект, возвращенный coder.mapping.api.get, ручку порта для сигнала (lut1D_outport или lut2D_outport), и собственность StorageClass или Identifier.

    getSignal(cm,lut1D_outPort,'StorageClass')
    
    ans =
    
        'Model default'
    
    getSignal(cm,lut1D_outPort,'Identifier')
    
    ans =
    
        'dout_Table1'
    
    getSignal(cm,lut2D_outPort,'StorageClass')
    
    ans =
    
        'Model default'
    
    getSignal(cm,lut2D_outPort,'Identifier')
    
    ans =
    
        'dout_Table2'
    
  9. Сохраните модель.

  10. Создайте и просмотрите код. Например, в rtwdemo_configinterface.cнайдите определения данных для данных таблицы поиска.

    static MYTYPE dout_Table1;
    static MYTYPE dout_Table2;
    

    Найдите, где используются данные таблицы поиска в функции начального уровня шага.

    .
    .
    .
      dout_Table1 = look1_binlc(input2, ((const MYTYPE *)&(mp_Table1.BP[0])), ((
        const MYTYPE *)&(mp_Table1.Table[0])), 10U);
    
      if (mode) {
        output = (real_T)mp_K1 * dout_Table1;
      } else {
        output = dstate_X;
      }
    
      dout_Table2 = look2_binlc(input3, input4, ((const MYTYPE *)&(mp_Table2.BP1[0])),
        ((const MYTYPE *)&(mp_Table2.BP2[0])), ((const MYTYPE *)&(mp_Table2.Table[0])),
        ((const uint32_T *)&(rtwdemo_configi_Table2_maxIndex[0])), 3U);
    	
      dstate_X = dout_Table2;
    }
    

Выбор класса хранения и свойств класса хранения для сигналов

В зависимости от требований к созданию кода выберите один из этих классов хранения, чтобы настроить создание кода для блочных сигналов.

ТребованияВыбираемый класс хранения
Активизируйте оптимизацию, потенциально создавая более эффективный код.Авто (только отдельные сопоставления)
Для элементов данных, которые не могут быть оптимизированы, представляют данные как поле стандартной структуры данных.По умолчанию (только сопоставление по умолчанию)
Предотвращение исключения оптимизации хранилища для элемента данных и использование класса хранения по умолчанию для категории элементов данных.Модель по умолчанию (только отдельные сопоставления), Dictionary Default (Только отдельные сопоставления)
Создание структуры, хранящей логические данные в именованных битовых полях.Bitfield (только индивидуальное сопоставление)
Создание определения и объявления глобальной переменной, имеющих volatile квалификатор типа.Volatile (См. Const, Volatile и ConstVolatile)
Создание определения и объявления глобальной переменной.ExportedGlobal
Создание определения и объявления глобальной переменной для указанного файла.ExportToFile
Создание определения и объявления глобальной переменной, имеющих static квалификатор типа.FileScope
Создайте код, который взаимодействует с данными, вызвав пользовательские функции доступа.GetSet
Создание кода, считывающего и записывающего в глобальную переменную или указатель глобальной переменной, определенный внешним кодом.ImportedExtern, ImportedExternPointer
Создание кода, который считывает и записывает в глобальную переменную, определенную внешним заголовочным файлом.ImportFromFile
Создание переменных, локальных для функций.Локализуемый
Создайте глобальную структуру с именем, которое можно указать.Структура (только отдельные сопоставления)

Список доступных классов хранения может включать другие классы хранения для конкретного проекта, определенные в словаре встроенного кодера. При наличии специальных требований, не удовлетворяющих указанным классам хранения, и наличии программного обеспечения Embedded Coder можно определить класс хранения. См. раздел Определение классов хранения, разделов памяти и шаблонов функций для архитектуры программного обеспечения.

Для отдельного сигнала используйте свойство Identifier storage class, чтобы настроить имя переменной, представляющей сигнал в сгенерированном коде. С помощью встроенного кодера в зависимости от выбранного класса хранения можно также настроить эти свойства.

СобственностьОписаниеСоответствующие классы хранения
DefinitionFileФайл определения источника, содержащий определения глобальных данных, считываемый сигналом и внешним кодомExportToFile и Volatile
GetFunctionсигнал появляется в сгенерированном коде как вызов указанного get функцияGetSet
HeaderFileИсходный файл заголовка, содержащий объявления для глобальных данных, считываемые сигналом и внешним кодомExportToFile, GetSet, ImportFromFile, и Volatile
Memory Section(только конфигурация сигнала по умолчанию)Раздел памяти, содержащий данные, считываемые сигналомDefault
OwnerГенератор кода помещает определение сигналов в код, созданный для одной из нескольких моделей, в иерархию модели, которая использует определения. Необходимо выбрать параметр конфигурации модели Использовать владельца из объекта данных для размещения определения данных. См. раздел Управление размещением глобальных определений и деклараций данных в созданных файлах.ExportToFile и Volatile
PreserveDimensionsГенератор кода сохраняет размеры сигнальных данных, которые представлены в сформированном коде в виде многомерного массива. Необходимо установить параметр конфигурации модели Array layout равным Row-major. См. раздел Сохранение измерений многомерных массивов в сгенерированном коде.ExportToFile, FileScope, ImportFromFile, Localizable и Volatile
SetFunctionСигнал появляется в сгенерированном коде как вызов указанного set функция.GetSet
StructNameИмя структуры в сгенерированном коде для сигнала.BitField и Struct

См. также

|

Связанные темы