exponenta event banner

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  2. Откройте приложение Simulink 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_configrpinterface кому ExportedGlobal. С помощью этого параметра класса хранения генератор кода представляет данные сигнала в сгенерированном коде в виде глобальных переменных.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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: ExportedGlobal. Property Inspector shows Identifier property for signal Table2:1 set to dout_Table2.

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

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

    real_T dout_Table1;                   
    real_T dout_Table2;                                         
    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    lut1D_ports = get_param('rtwdemo_configrpinterface/Table1','PortHandles');
    lut2D_ports = get_param('rtwdemo_configrpinterface/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_configrpinterface.cнайдите определения данных для данных таблицы поиска.

    real_T dout_Table1;                   
    real_T dout_Table2;                                         
    

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

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

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

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

ТребованияВыбираемый класс хранения
Активизируйте оптимизацию, потенциально создавая более эффективный код.Авто (только отдельные сопоставления)
Для элементов данных, которые не могут быть оптимизированы, представляют данные как поле стандартной структуры данных.По умолчанию (только сопоставление по умолчанию)
Предотвращение исключения оптимизации хранилища для элемента данных и использование класса хранения по умолчанию для категории элементов данных.Модель по умолчанию (только отдельные сопоставления), Dictionary Default (Только отдельные сопоставления)
Создание определения и объявления глобальной переменной.ExportedGlobal
Создание кода, считывающего и записывающего в глобальную переменную или указатель глобальной переменной, определенный внешним кодом.ImportedExtern, ImportedExternPointer

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

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

См. также

|

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