Данные сигнала состоят из переменных, которые хранят промежуточные результаты в глобальной памяти, когда сгенерированный алгоритмический код вычисляет значения выходных сигналов блока входных сигналов блока, исключая сигналы, которые соединяются с корневыми блоками Inport и Outport. Данные сигнала не являются сигнальными линиями в диаграмме модели. Например, в этих случаях, сигнальная линия не имеет никакого представления данных в сгенерированном коде:
Питает порт вызова функции
Выходит из блока сообщения, такого как блок Send
Перекрестные контуры подсистемы без расчета блокируются промежуточный
Когда вы конфигурируете модель для генерации кода, вы выбираете сигналы ввода и вывода блока сделать доступным в сгенерированном коде. Например, сконфигурируйте данные сигнала к:
Сделайте данные доступными для взаимодействия и контроля, в то время как сгенерированный код выполняется.
Минимизируйте объем данных, который хранится в памяти.
Управляйте, куда генератор кода помещает данные сигнала в память.
Продвиньте данные сигнала интерфейс модели так, чтобы другие компоненты и системы могли получить доступ к тем данным.
Улучшите удобочитаемость и трассируемость сгенерированного кода.
Генератор кода проверяет на непротиворечивость настройки сигнальной линии. Например, генератор кода проверяет, что настройка сигнальной линии, питающейся в подсистему, совпадает с настройкой сигнальной линии, которая выходит из соответствующего импорта подсистемы.
Для генерации кода примеры показывают, как сконфигурировать блоки-сигналы для модели rtwdemo_configinterface
. Можно сконфигурировать отображения кода при помощи Code Mappings Editor или API отображений кода (coder.mapping.api.CodeMapping
).
На основе ваших требований генерации кода решите, какие блоки-сигналы представлять в сгенерированном коде и как представлять данные сигнала. По умолчанию сигналы в модели появляются в сгенерированном коде как поля структуры глобальных данных под названием
. Если вы не конфигурируете индивидуальные настройки, генератор кода определяет, устранить ли или изменить представление сигналов в сгенерированном коде в целях оптимизации. Если вы конфигурируете индивидуальные настройки, решаете:model
B
Который сигнализирует, чтобы сделать доступным в сгенерированном коде
Необходимо добавить сигналы, что вы хотите сделать доступным в сгенерированном коде к отображениям типового кодекса.
Настроить ли настройку по умолчанию
Если необходимо получить доступ к значительному количеству (например, больше чем 10) сигналов, более эффективно сконфигурировать сигналы с настройками по умолчанию и затем заменить те настройки для особых случаев. Если необходимо получить доступ к нескольким сигналам, которые имеют уникальный источник, именование, или требования размещения, рассматривают конфигурирование сигналов индивидуально.
Как объявить и обработать данные сигнала в сгенерированном коде
Как разделяют глобальные переменные
Считать входные данные из глобальных переменных, заданных во внешнем коде
Как вызывает к функциям доступа. Требует Embedded Coder®
Для получения дополнительной информации об этих опциях, смотрите Данные об Управлении и Функциональный Интерфейс в Сгенерированном коде.
Другие факторы включают ли в:
Назовите сигналы в сгенерированном коде при помощи меток сигнала, которые появляются в модели или при помощи идентификаторов уникального кода.
Включайте volatile
введите спецификатор в определениях глобальной переменной и объявлениях. Требует Embedded Coder. Смотрите Защищают Глобальные данные с const и энергозависимыми Спецификаторами Типа.
Поместите данные сигнала в определенную область памяти. Требует Embedded Coder. Смотрите Данные об Управлении и Функциональное Размещение в Памяти Вставкой Прагм.
Для списка интерфейсных требований, которые относятся к сигналам с соответствующими классами памяти и свойствами класса памяти, смотрите Choose Storage Class and Storage Class Properties для Хранилищ данных.
Требования сигнала, например, модель rtwdemo_configinterface
:
Сконфигурируйте сигналы, которые питаются в и выход из блока switch для генерации кода. Сохраните это данные сигнала для контроля, в то время как сгенерированный код выполняется.
Представляйте сигналы как отдельные глобальные переменные.
Примените префиксный dout_
к именам переменных, которые представляют сигналы.
Установите представление по умолчанию сигналов в сгенерированном коде как глобальные переменные, которые имеют static
введите спецификатор. Затем вы конфигурируете выходные сигналы двух блоков интерполяционной таблицы, чтобы использовать класс памяти по умолчанию и идентификаторы уникального кода, которые включают необходимый префиксный dout_
.
Прежде чем можно будет сконфигурировать сигнал для генерации кода, добавьте сигнал в отображения типового кодекса. Добавьте выходные сигналы для двух блоков интерполяционной таблицы к отображениям типового кодекса.
Открытая модель в качестве примера rtwdemo_configinterface. Сохраните копию модели к перезаписываемому местоположению.
Откройте приложение Embedded Coder.
Во вкладке C Code выберите Code Interface> Individual Element Code Mappings.
В редакторе Отображений Кода кликните по вкладке Signals/States. Никакие сигналы не перечислены.
Добавьте сигналы в отображения кода. Поскольку выходной сигнал интерполяционной таблицы блокирует Table1
и Table2
:
В модели выберите сигнал.
Сделайте паузу на замещающем знаке, который, кажется, выше или ниже сигнальной линии открывает строку меню. Нажмите Добавить Сигнальную кнопку.
В редакторе Отображений Кода узел Signals расширяет и перечисляет два сигнала, что вы добавили.
Настройка генерации кода по умолчанию для сигналов может уменьшать усилие по подготовке модели для генерации кода, особенно если модель имеет значительное количество сигналов, что вы хотите контролировать, в то время как сгенерированный код выполняется. Выберите параметры конфигурации однажды, и генератор кода применяет те настройки к сигналам через модель. Simulink® хранит настройку по умолчанию как часть модели.
Рассмотрите конфигурирующие настройки генерации кода по умолчанию для сигналов модели, если ваша модель использует несколько сигналов, которые не имеют уникальных требований, или использует разделяемый Словарь Embedded Coder.
В этом примере показано, как использовать Code Mappings Editor, чтобы установить класс памяти по умолчанию для сигналов в модели rtwdemo_configinterface
к FileScope
. С той установкой класса памяти генератор кода представляет данные сигнала в сгенерированном коде как глобальные переменные, которые имеют static
введите спецификатор.
Если вы уже не сделали так, добавьте, что сигналы к отображениям типового кодекса как описано в Добавляют Сигналы в Отображения Типового кодекса.
Во вкладке C Code выберите Code Interface> Default Code Mappings.
В редакторе Отображений Кода, под Signals, избранная категория Signals, states, and internal data. Установите класс памяти по умолчанию на FileScope
.
Сохраните модель.
Можно сконфигурировать отдельные сигналы для генерации кода. Например, если модель имеет два сигнала, которые имеют требования генерации уникального кода, конфигурируют сигналы индивидуально. Или, если вы конфигурируете настройки по умолчанию для сигналов, можно заменить те настройки для определенных сигналов.
Если ваша модель соответствует по крайней мере одному из этих критериев, рассмотрите настройки генерации кода конфигурирования для сигналов индивидуально:
Использование несколько сигналов, которые имеют уникальный источник, именование или требования размещения.
Использование несколько сигналов.
Имеет настройку по умолчанию для сигналов, и необходимо заменить настройку для некоторых определенных сигналов.
В этом примере показано, как использовать редактор Отображений Кода, чтобы применяться, ваша установка класса памяти по умолчанию на выходные сигналы интерполяционной таблицы блокирует Table1
и Table2
в модели rtwdemo_configinterface
. Пример также показывает, как конфигурируют идентификаторы кода для тех выходных сигналов. Можно задать идентификаторы генерации кода, например, для интегрирования, не изменяя проект модели.
Если вы уже не сделали так, завершитесь, шаги в Конфигурируют Настройки генерации кода По умолчанию для Сигналов.
В редакторе Отображений Кода кликните по вкладке Signals/States. Расширьте Signals. Редактор перечисляет имена или идентификаторы портов блока сигналов, что вы добавили к отображениям кода. Если сигнал решает к объекту сигнала, решимость сигнализировать, что объектный значок появляется справа от имени элемента или идентификатора портов. Класс памяти для каждого сигнала установлен в Auto
, что означает, что генератор кода может устранить или изменить представление соответствующих норм в целях оптимизации. Если оптимизация не возможна, генератор кода применяет настройку по умолчанию модели. В данном примере настройка по умолчанию модели задает класс памяти FileScope
.
Чтобы избежать оптимизации и обеспечить генератор кода, чтобы использовать настройку по умолчанию, установите класс памяти на Model default
.
Чтобы заменить настройку по умолчанию, задайте класс памяти, который удовлетворяет требования генерации кода для того сигнала.
В редакторе Отображений Кода выберите выходные сигналы для блоков Table1
и Table2
. Установите класс памяти на Model default: FileScope
.
Сконфигурируйте идентификатор кода для выходных сигналов для двух блоков интерполяционной таблицы с именами, которые включают префиксный dout_
. В редакторе Отображений Кода выберите Table1:1
сигнала. В Property Inspector расширьте узел Code. Установите свойство Identifier класса памяти на
dout_Table1
. Для Table2:1
сигнала, установите Identifier на
dout_Table2
.
Сохраните модель.
Сгенерируйте и просмотрите код. Например, в 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; }
Во вкладке C Code выберите Code Interface> Individual Element Code Mappings.
В редакторе Отображений Кода кликните по вкладке Signals/States.
Для каждого сигнала, что вы хотите удалить:
В модели выберите сигнал.
Сделайте паузу на замещающем знаке, который, кажется, выше или ниже сигнальной линии открывает строку меню. Нажмите Удалить Сигнальную кнопку.
Чтобы автоматизировать настройку сигналов для генерации кода, используйте интерфейс программирования для отображений кода. Например, при создании библиотек пользовательского блока или части тестовой среды приложения, используйте интерфейс программирования, чтобы автоматизировать настройку данных.
В этом примере показано, как использовать интерфейс программирования, чтобы сконфигурировать сигналы для модели rtwdemo_configinterface
. Установите представление по умолчанию сигналов в сгенерированном коде как глобальные переменные, которые имеют static
введите спецификатор. Затем сконфигурируйте outpout сигналы двух блоков интерполяционной таблицы использовать класс памяти по умолчанию и идентификаторы уникального кода, которые включают необходимый префиксный dout_
.
Откройте модель в качестве примера.
open_system('rtwdemo_configinterface')
Создайте объект cm
путем вызывания функции coder.mapping.api.get
. Объектно-ориентированная память настройка генерации кода для данных и функции для модели rtwdemo_configinterface
.
cm = coder.mapping.api.get('rtwdemo_configinterface');
Сконфигурируйте настройки по умолчанию для сигналов путем вызывания функции setDataDefault
. Для аргументов задайте эти значения:
Объект, возвращенный coder.mapping.api.get
InternalData
для категории по умолчанию
Имя свойства StorageClass
со значением свойства FileScope
setDataDefault(cm,'InternalData','StorageClass','FileScope');
Проверьте свою настройку по умолчанию для сигналов. Издайте приказ к getDataDefault
это задает объект, возвращенный coder.mapping.api.get
и категория InternalData
. Задайте третий аргумент как свойство StorageClass
.
getDataDefault(cm,'InternalData','StorageClass') ans = 'FileScope'
Доберитесь указатели на выходные порты для интерполяционной таблицы блокирует 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;
Добавьте выходные сигналы блоков интерполяционной таблицы к отображениям типового кодекса.
addSignal(cm,[lut1D_outPort,lut2D_outPort]);
Примените настройку по умолчанию для сигналов к выходному сигналу блоков интерполяционной таблицы.
По умолчанию 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');
Проверьте свои параметры конфигурации путем вызывания функции 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'
Сохраните модель.
Сгенерируйте и просмотрите код. Например, в 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 (Только отдельные отображения) |
Сгенерируйте структуру, которая хранит булевы данные в именованных битовых полях. | Битовое поле (Индивидуум, сопоставляющий только) |
Сгенерируйте определение глобальной переменной и объявление, которые имеют volatile введите спецификатор. | Volatile (См. Const, энергозависимый, и ConstVolatile), |
Сгенерируйте определение глобальной переменной и объявление. | ExportedGlobal |
Сгенерируйте определение глобальной переменной и объявление к заданному файлу. | ExportToFile |
Сгенерируйте определение глобальной переменной и объявление, которые имеют static введите спецификатор. | FileScope |
Сгенерируйте код, который взаимодействует с данными путем вызывания пользовательских функций средства доступа. | GetSet |
Сгенерируйте код, который читает из и пишет в указатель глобальной переменной или глобальной переменной, заданный вашим внешним кодом. | ImportedExtern, ImportedExternPointer |
Сгенерируйте код, который читает из и пишет в глобальную переменную, заданную вашим внешним заголовочным файлом. | ImportFromFile |
Сгенерируйте переменные, которые локальны для функций. | Локализуемый |
Сгенерируйте глобальную структуру, которая имеет имя, которое можно задать. | Struct (Только отдельные отображения) |
Список доступных классов памяти может включать другие специфичные для проекта классы памяти, заданные в Словарь Embedded Coder. Если у вас есть особые требования, которым не отвечают перечисленные классы памяти, и у вас есть программное обеспечение Embedded Coder, можно задать класс памяти. Смотрите Задают Классы памяти, Разделы Памяти и Шаблоны функций для Программной архитектуры.
Для отдельного сигнала используйте свойство класса памяти Identifier сконфигурировать имя для переменной, представляющей сигнал в сгенерированном коде. С Embedded Coder, в зависимости от класса памяти, который вы выбираете, можно также сконфигурировать эти свойства.
Свойство | Описание | Соответствующие классы памяти |
---|---|---|
DefinitionFile | Исходный файл определения, который содержит определения для глобальных данных, которые считаны и внешним кодом сигнала | ExportToFile и Volatile |
GetFunction | сигнал появляется в сгенерированном коде как вызов заданного get функция | GetSet |
HeaderFile | Исходный заголовочный файл, который содержит объявления для глобальных данных, которые считаны и внешним кодом сигнала | ExportToFile , GetSet , ImportFromFile , и Volatile |
Memory Section (значение по умолчанию сигнализирует только о настройке), | Раздел Memory, который содержит данные, считанные сигналом | Default |
Owner | Генератор кода помещает определение для сигналов в коде, сгенерированном для одной из многоуровневых моделей в иерархии модели та доля определения. Необходимо выбрать параметр конфигурации модели Use owner from data object for data definition placement. Смотрите Размещение Управления Определений Глобальных данных и Объявлений в Сгенерированных Файлах. | ExportToFile и Volatile |
PreserveDimensions | Генератор кода сохраняет размерности данных сигнала, который представлен в сгенерированном коде как многомерный массив. Необходимо установить параметр конфигурации модели Array layout на Row-major . Смотрите размерности заповедника многомерных массивов в сгенерированном коде. | ExportToFile , FileScope , ImportFromFile , Localizable и Volatile |
SetFunction | Сигнал появляется в сгенерированном коде как вызов заданного set функция. | GetSet |
StructName | Назовите для структуры в сгенерированном коде для сигнала. | BitField и Struct |
Редактор отображений кода | coder.mapping.api.CodeMapping