Данные сигнала состоят из переменных, хранящих промежуточные результаты в глобальной памяти, так как сформированный алгоритмический код вычисляет значения выходных сигналов блока из входных сигналов блока, исключая сигналы, которые соединяются с корневыми блоками Inport и Outport. Данные сигнала не являются сигнальными линиями на схеме модели. Например, в этих случаях сигнальная линия не имеет представления данных в сгенерированном коде:
Передача порта функционального вызова
Выход из блока сообщений, например, из блока отправки
Пересекает границы подсистемы без блоков вычислений между ними
При конфигурировании модели для генерации кода выбираются входные и выходные сигналы блока для обеспечения доступа к создаваемому коду. Например, сконфигурируйте данные сигнала следующим образом:
Сделать данные доступными для взаимодействия и мониторинга во время выполнения созданного кода.
Минимизируйте объем данных, хранящихся в памяти.
Управление тем, где генератор кода помещает данные сигнала в память.
Передача данных сигналов на интерфейс модели, чтобы другие компоненты и системы могли получить доступ к этим данным.
Улучшение читаемости и прослеживаемости созданного кода.
Генератор кода проверяет непротиворечивость конфигурации сигнальной линии. Например, генератор кода проверяет, что конфигурация сигнальной линии, подаваемой в подсистему, соответствует конфигурации сигнальной линии, которая выходит из соответствующего входного порта подсистемы.
Для генерации кода в примерах показано, как конфигурировать сигналы блоков для модели rtwdemo_configinterface. Можно настроить сопоставления кода с помощью редактора сопоставлений кода или интерфейса программирования сопоставлений кода (coder.mapping.api.CodeMapping).
На основе требований к генерации кода определите, какие блочные сигналы должны быть представлены в сгенерированном коде и каким образом должны быть представлены данные сигнала. По умолчанию сигналы в модели отображаются в сгенерированном коде как поля глобальной структуры данных с именем . Если настройки не настроены, генератор кода определяет, следует ли исключить или изменить представление сигналов в сгенерированном коде в целях оптимизации. При настройке настроек решите:model_B
Какие сигналы следует сделать доступными в сгенерированном коде
Необходимо добавить сигналы, которые необходимо сделать доступными в сгенерированном коде, в сопоставления кода модели.
Настройка конфигурации по умолчанию
Если требуется получить доступ к значительному количеству (например, более 10) сигналов, эффективнее сконфигурировать сигналы с настройками по умолчанию, а затем переопределить эти настройки для особых случаев. Если требуется получить доступ к нескольким сигналам с уникальными требованиями к источнику, именованию или размещению, рекомендуется настроить сигналы по отдельности.
Объявление и обработка данных сигнала в сгенерированном коде
Как отдельные глобальные переменные
Считывание входных данных из глобальных переменных, определенных во внешнем коде
Как вызовы функций доступа. Требуется встроенный кодер ®
Дополнительные сведения об этих параметрах см. в разделе Управление данными и функциональным интерфейсом в сгенерированном коде.
Другие соображения включают в себя необходимость:
Имена сигналов в сгенерированном коде с помощью меток сигналов, отображаемых в модели, или с помощью уникальных идентификаторов кода.
Включить volatile квалификатор типа в определениях и объявлениях глобальных переменных. Требуется встроенный кодер. См. раздел Защита глобальных данных с помощью квалификаторов типа const и volative.
Поместите данные сигнала в определенную область памяти. Требуется встроенный кодер. См. раздел Управление данными и размещением функций в памяти путем вставки прагматиков.
Список требований к интерфейсам, относящихся к сигналам с соответствующими классами хранения и свойствами класса хранения, см. в разделе Выбор класса хранения и свойств класса хранения для хранилищ данных.
Требования к сигналу для примера модели rtwdemo_configinterface являются:
Сконфигурируйте сигналы, которые поступают в блок коммутатора и выходят из него для генерации кода. Сохранить эти данные сигнала для мониторинга во время выполнения сгенерированного кода.
Представить сигналы как отдельные глобальные переменные.
Применить префикс dout_ к именам переменных, представляющих сигналы.
Установка представления по умолчанию сигналов в сгенерированном коде в виде глобальных переменных, имеющих static квалификатор типа. Затем можно настроить выходные сигналы двух блоков таблицы поиска для использования класса хранения по умолчанию и уникальных идентификаторов кода, включающих требуемый префикс. dout_.
Перед конфигурированием сигнала для генерации кода добавьте сигнал в сопоставления кода модели. Добавьте выходные сигналы для двух блоков таблицы поиска в сопоставления кода модели.
Откройте пример rtwdemo_configinterface модели. Сохраните копию модели в доступном для записи расположении.

Откройте приложение Embedded Coder.
На вкладке Код C выберите Интерфейс кода > Сопоставления кодов отдельных элементов.
В редакторе сопоставлений кодов перейдите на вкладку «Сигналы/Состояния». Сигналы не перечислены.
Добавьте сигналы в сопоставления кода. Для выходного сигнала блоков таблицы поиска Table1 и Table2:
В модели выберите сигнал.
Чтобы открыть панель действий, сделайте паузу на многоточии, которое появляется выше или ниже сигнальной линии. Нажмите кнопку Add Signal (Добавить сигнал).

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

Настройка генерации кода по умолчанию для сигналов может уменьшить усилия по подготовке модели к генерации кода, особенно если модель имеет значительное количество сигналов, которые необходимо контролировать во время выполнения сгенерированного кода. Один раз выберите настройки конфигурации, и генератор кода применит эти настройки к сигналам в модели. Simulink ® сохраняет конфигурацию по умолчанию как часть модели.
Рекомендуется настроить параметры генерации кода по умолчанию для сигналов модели, если модель использует несколько сигналов, не имеющих уникальных требований, или использует общий словарь встроенного кодера.
В этом примере показано, как с помощью редактора сопоставлений кодов задать класс хранения по умолчанию для сигналов в модели. rtwdemo_configinterface кому FileScope. С помощью этого параметра класса хранения генератор кода представляет данные сигнала в сгенерированном коде как глобальные переменные, имеющие static квалификатор типа.
Если это еще не сделано, добавьте сигналы в сопоставления кода модели, как описано в разделе Добавление сигналов в сопоставления кода модели.
На вкладке Код C выберите Интерфейс кода > Сопоставления кодов по умолчанию.
В редакторе сопоставлений кодов в разделе «Сигналы» выберите категорию «Сигналы, состояния и внутренние данные». Задать класс хранения по умолчанию как FileScope.

Сохраните модель.
Для генерации кода можно сконфигурировать отдельные сигналы. Например, если модель имеет два сигнала, которые имеют уникальные требования к генерации кода, сконфигурируйте сигналы по отдельности. Кроме того, если настроить параметры по умолчанию для сигналов, можно переопределить эти параметры для определенных сигналов.
Если модель удовлетворяет хотя бы одному из этих критериев, рассмотрите возможность настройки параметров генерации кода для сигналов по отдельности:
Использует несколько сигналов с уникальными требованиями к источнику, именованию или размещению.
Использует несколько сигналов.
Имеет конфигурацию по умолчанию для сигналов, и необходимо переопределить конфигурацию для некоторых конкретных сигналов.
В этом примере показано, как с помощью редактора сопоставлений кодов применить настройки класса хранения по умолчанию к выходным сигналам блоков таблицы поиска Table1 и Table2 в модели rtwdemo_configinterface. В примере также показано, как сконфигурировать идентификаторы кода для этих выходных сигналов. Можно указать идентификаторы генерации кода, например для интеграции, без изменения конструкции модели.
Если это еще не сделано, выполните шаги в разделе Настройка параметров генерации кода по умолчанию для сигналов.
В редакторе сопоставлений кодов перейдите на вкладку «Сигналы/Состояния». Разверните раздел «Сигналы». Редактор перечисляет имена или идентификаторы портов блоков сигналов, добавленных в сопоставления кода. Если сигнал распознается в сигнальном объекте, справа от имени элемента или идентификатора порта появляется значок «resolve-to-signal-object». Класс хранения для каждого сигнала установлен в Auto, что означает, что генератор кода может исключить или изменить представление соответствующего кода в целях оптимизации. Если оптимизация невозможна, генератор кода применяет конфигурацию модели по умолчанию. В этом примере конфигурация модели по умолчанию определяет класс хранения FileScope.
Чтобы избежать оптимизации и заставить генератор кода использовать конфигурацию по умолчанию, задайте для класса хранения значение Model default.
Чтобы переопределить конфигурацию по умолчанию, укажите класс хранения, соответствующий требованиям к генерации кода для этого сигнала.
В редакторе сопоставлений кодов выберите выходные сигналы для блоков Table1 и Table2. Задайте для класса хранения значение Model default: FileScope.
Конфигурирование идентификатора кода для выходных сигналов для двух блоков таблицы поиска с именами, включающими префикс dout_. В редакторе сопоставлений кодов выберите сигнал Table1:1. В инспекторе свойств разверните узел «Код». Задайте для свойства класса хранения 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 выберите Интерфейс кода > Сопоставления кодов отдельных элементов.
В редакторе сопоставлений кодов перейдите на вкладку «Сигналы/Состояния».
Для каждого сигнала, который требуется удалить:
В модели выберите сигнал.
Чтобы открыть панель действий, сделайте паузу на многоточии, которое появляется выше или ниже сигнальной линии. Нажмите кнопку Remove Signal (удалить сигнал).
Для автоматизации конфигурирования сигналов для генерации кода используйте интерфейс программирования для отображения кода. Например, при создании пользовательских библиотек блоков или части тестовой среды приложения используйте интерфейс программирования для автоматизации настройки данных.
В этом примере показано, как использовать интерфейс программирования для конфигурирования сигналов для модели rtwdemo_configinterface. Установка представления по умолчанию сигналов в сгенерированном коде в виде глобальных переменных, имеющих static квалификатор типа. Затем настройте выходные сигналы двух блоков таблицы поиска, чтобы использовать класс хранения по умолчанию и уникальные идентификаторы кода, которые включают требуемый префикс. 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 (Только отдельные сопоставления) |
| Создание структуры, хранящей логические данные в именованных битовых полях. | 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 |
Редактор сопоставлений кода | coder.mapping.api.CodeMapping