Сконфигурируйте данные сигнала для генерации кода C

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

  • Питает порт вызова функции

  • Выходит из блока сообщения, такого как блок Send

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

Когда вы конфигурируете модель для генерации кода, вы выбираете сигналы ввода и вывода блока сделать доступным в сгенерированном коде. Например, сконфигурируйте данные сигнала к:

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

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

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

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

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

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

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

Выберите Code Configuration Options for Signals

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

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

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

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

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

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

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

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

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

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

Другие факторы включают ли в:

Для списка интерфейсных требований, которые относятся к сигналам с соответствующими классами памяти и свойствами класса памяти, смотрите Choose Storage Class and Storage Class Properties для Хранилищ данных.

Требования сигнала, например, модель rtwdemo_configrpinterface :

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

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

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

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

Добавьте сигналы в отображения типового кодекса

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

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

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

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

  3. Во вкладке C Code выберите Code Interface> Individual Element Code Mappings.

  4. В редакторе Отображений Кода кликните по вкладке Signals/States. Никакие сигналы не перечислены.

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

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

    2. Сделайте паузу на замещающем знаке, который, кажется, выше или ниже сигнальной линии открывает строку меню. Нажмите Добавить Сигнальную кнопку.

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

    В редакторе Отображений Кода узел Signals расширяет и перечисляет два сигнала, что вы добавили.

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

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

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

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

В этом примере показано, как использовать Code Mappings Editor, чтобы установить класс памяти по умолчанию для сигналов в модели rtwdemo_configrpinterface к ExportedGlobal. С той установкой класса памяти генератор кода представляет данные сигнала в сгенерированном коде как глобальные переменные.

  1. Если вы уже не сделали так, добавьте, что сигналы к отображениям типового кодекса как описано в Добавляют Сигналы в Отображения Типового кодекса.

  2. Во вкладке C Code выберите Code Interface> Default Code Mappings.

  3. В редакторе Отображений Кода, под Signals, избранная категория Signals, states, and internal data. Установите класс памяти по умолчанию на 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. В редакторе Отображений Кода кликните по вкладке Signals/States. Расширьте Signals. Редактор перечисляет имена или идентификаторы портов блока сигналов, что вы добавили к отображениям кода. Если сигнал решает к объекту сигнала, решимость сигнализировать, что объектный значок появляется справа от имени элемента или идентификатора портов. Класс памяти для каждого сигнала установлен в Auto, что означает, что генератор кода может устранить или изменить представление соответствующих норм в целях оптимизации. Если оптимизация не возможна, генератор кода применяет настройку по умолчанию модели. В данном примере настройка по умолчанию модели задает класс памяти ExportedGlobal.

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

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

  3. В редакторе Отображений Кода выберите выходные сигналы для блоков Table1 и Table2. Установите класс памяти на Model default: ExportedGlobal.

  4. Сконфигурируйте идентификатор кода для выходных сигналов для двух блоков интерполяционной таблицы с именами, которые включают префиксный dout_. В редакторе Отображений Кода выберите Table1:1 сигнала. В Property Inspector расширьте узел Code. Установите свойство 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 Code выберите Code Interface> Individual Element Code Mappings.

  2. В редакторе Отображений Кода кликните по вкладке Signals/States.

  3. Для каждого сигнала, что вы хотите удалить:

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

    2. Сделайте паузу на замещающем знаке, который, кажется, выше или ниже сигнальной линии открывает строку меню. Нажмите Удалить Сигнальную кнопку.

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

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

В этом примере показано, как использовать интерфейс программирования, чтобы сконфигурировать сигналы для модели rtwdemo_configrpinterface. Установите представление по умолчанию сигналов в сгенерированном коде как глобальные переменные. Затем сконфигурируйте outpout сигналы двух блоков интерполяционной таблицы использовать класс памяти по умолчанию и идентификаторы уникального кода, которые включают необходимый префиксный 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;
    }
    

Выберите Storage Class и Storage Class Properties for Signals

В зависимости от ваших требований генерации кода примите решение из этих классов памяти сконфигурировать генерацию кода для блоков-сигналов.

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

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

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

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

|

Похожие темы