exponenta event banner

Инициализация данных сигнала, состояния и параметров в сгенерированном коде

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

Понимая, как созданный код инициализирует данные, можно:

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

  • Храните начальные значения в памяти как переменные, которые могут сохраняться между запусками выполнения. Затем эти значения можно перезаписать перед запуском или перезапуском системы.

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

Основные сведения о инициализации сигналов и состояний в модели см. в разделах Инициализация сигналов и дискретных состояний и Информация о состоянии нагрузки.

Статическая инициализация и динамическая инициализация

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

  • Статическая инициализация происходит в той же инструкции, которая определяет (выделяет память для) переменную. Инициализация не выполняется внутри определения функции.

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

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

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

Инициализация на основе реального мира, требующая не нулевого битового шаблона

Каждый элемент данных имеет реальное значение. Это значение может зависеть от типа данных элемента. Например, для сигнала с типом данных double или int8, реальное значение земли равно нулю. Для перечисления значение основания является элементом перечисления по умолчанию.

Для некоторых видов данных, чтобы представить реальное значение земли, компьютер хранит ноль в памяти (все биты ноль). Однако для некоторых других данных компьютер сохраняет ненулевое значение в памяти. Эти данные включают, например:

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

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

Инициализация сигнала и данных состояния

В модели можно управлять начальными значениями сигналов и состояний с помощью параметров блока. Например, для установки начального значения блока «Единичная задержка» используется параметр «Начальное условие». В некоторых случаях можно также использовать InitialValue свойство Simulink.Signal объект. Для большинства этих параметров блока значением по умолчанию является 0.

Можно также инициализировать состояния с помощью блоков записи состояний в подсистемах Initialize Function и параметра конфигурации модели Initial states.

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

  1. Инициализирует данные сигнала и состояния в созданных по умолчанию структурах, таких как структура DWork, до нулевого значения.

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

    Эта инициализация применяется только к данным, удовлетворяющим обоим критериям:

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

    • Данные используют класс хранения, отличный от Auto (класс хранения по умолчанию) или Model default (когда редактор отображения кода определяет Default класс хранения, значение по умолчанию).

    Например, код применяет эту операцию к элементам данных, использующим класс хранения ExportedGlobal.

  3. Инициализирует каждый сигнал и состояние до реального значения, которое модель задает, например, с помощью параметра Initial condition блока Unit Delay.

  4. Инициализирует каждое состояние в реальном значении, назначенном с помощью блока записи состояний. Функция выполняет эту инициализацию только в том случае, если в модели используется подсистема Initialize Function.

  5. Инициализирует каждое состояние по реальному значению, указанному параметром конфигурации Начальные состояния.

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

memset для массовой инициализации

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

Если это требуется приложению, можно запретить использование созданного кода memset для инициализации данных с плавающей запятой до нуля. См. раздел Использование memset для инициализации поплавков и двойников до 0.0.

Настраиваемые начальные значения

Можно настроить способ отображения настраиваемых параметров блока, таких как параметр усиления блока усиления, в сгенерированном коде. Большинство параметров блока, устанавливающих начальные значения (например, начальное условие), могут быть настроены. Например, поведение параметра конфигурации Default может определять, отображаются ли начальные значения в сгенерированном коде как встроенные константы или как настраиваемые глобальные данные. Для управления представлением этих начальных значений можно также использовать объекты параметров и классы хранения.

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

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

Инициализация данных параметров

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

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

Виды данных параметров

Эти элементы модели отображаются в сгенерированном коде как данные параметров:

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

  • Некоторые настраиваемые параметры блока, если для параметра «Поведение по умолчанию» задано значение Inlined. Если генератор кода не может встроить значение параметра в буквенное число, параметр отображается как поле выделенного глобального const структура.

  • Simulink.Parameter объекты, к которым применяется класс хранения, имеющий экспортированную область данных. Например, встроенный класс хранения ExportedGlobal имеет экспортированную область данных, но класс хранения ImportedExtern не делает.

Инициализация математическим выражением (встроенный кодер)

Можно задать значение объекта параметра (например, Simulink.Parameter) математическому выражению, включающему числа, переменные MATLAB ® и другие объекты параметров. См. раздел Задание значения переменной с помощью математического выражения.

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

Инициализация данных в сгенерированном коде

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

Изучение примера модели

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

open_system('rtwdemo_rtwintro')

В галерее Приложения щелкните Кодер Simulink.

Откройте Редактор данных модели (Model Data Editor). На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).

Проверьте вкладку Состояния. Для состояния блока единичной задержки начальное значение устанавливается равным 0, значение по умолчанию, которое означает, что начальное значение состояния равно нулю. Названо состояние X.

Задайте для параметра «Начальное значение» ненулевое число, например: 5.

set_param('rtwdemo_rtwintro/X','InitialCondition','5')

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

На закладке Signals/States в разделе Stations set Storage Class for X кому ExportedGlobal. С помощью этого параметра состояние блока отображается в сгенерированном коде как отдельная глобальная переменная.

coder.mapping.utils.create('rtwdemo_rtwintro');
cm = coder.mapping.api.get('rtwdemo_rtwintro');
setState(cm,'rtwdemo_rtwintro/X','StorageClass','ExportedGlobal');

В модели откройте Amplifier подсистема, которая является запускаемой подсистемой.

В Редакторе данных модели (Model Data Editor) проверьте вкладку Параметры (Parameters). Для установки и проверки начальных значений сигналов и состояний можно использовать вкладку Параметры вместо вкладки Состояния.

Редактор данных модели показывает, что для блока «Исходящий» (Outport) вывод «Начальный» (Initial) (InitialOutput) параметр имеет значение 0, значение по умолчанию. Этот выход подсистемы требует начального значения, поскольку подсистема выполняется условно. Оставьте начальное значение по умолчанию.

В модели снимите флажок Configuration Parameters (Параметры конфигурации) > Signal storage reuse (Повторное использование хранилища сигналов). При снятии этой настройки сигнальные линии отображаются в сгенерированном коде как поля сгенерированной структуры, предназначенная для хранения сигнальных данных. Это представление сигналов облегчает просмотр того, как генератор кода инициализирует данные.

set_param('rtwdemo_rtwintro','OptimizeBlockIOStorage','off')

В модели проверьте параметры конфигурации Параметры конфигурации > Оптимизация > Поведение параметров по умолчанию. Параметр конфигурации имеет значение Inlined, что означает, что параметры блока, включая начальные значения, отображаются в сгенерированном коде как встроенные литералы или как const данные.

Перейдите к корневому уровню модели.

В редакторе данных модели нажмите кнопку Показать/обновить дополнительную информацию.

Рядом с полем Содержимое фильтра (Filter contents) нажмите кнопку Фильтр с помощью выбора (Filter using selection).

В модели щелкните блок «Константа» с меткой INC. Редактор данных модели показывает, что значение константы (Value) для параметра блока установлено значение INC. INC является переменной MATLAB в базовой рабочей области.

Для INC, установите значение в столбце «Значение» в Simulink.Parameter(uint8(1)). Преобразование MATLAB INC в Simulink.Parameter объект.

В редакторе Сопоставления кодов на вкладке Параметры примените класс хранения ExportedGlobal кому INC. С помощью этого параметра генерируемый код определяет INC как глобальная переменная. Относительно инициализации, INC является элементом данных параметра.

INC = Simulink.Parameter(INC);
INC.StorageClass = 'ExportedGlobal';

Создание и проверка кода

Чтобы создать модель и создать код, нажмите клавиши CTRL + B.

slbuild('rtwdemo_rtwintro');
### Starting build procedure for: rtwdemo_rtwintro
### Successful completion of build procedure for: rtwdemo_rtwintro

Build Summary

Top model targets built:

Model             Action                       Rebuild Reason                                    
=================================================================================================
rtwdemo_rtwintro  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 18.384s

В созданном файле rtwdemo_rtwintro.c, вне определения функции, код статически инициализирует данные параметра INC. Значение INC является 1.

file = fullfile('rtwdemo_rtwintro_grt_rtw','rtwdemo_rtwintro.c');
rtwdemodbtype(file,'/* Exported block parameters */','uint8_T INC = 1U;',1,1)
/* Exported block parameters */
uint8_T INC = 1U;                      /* Variable: INC

В том же файле проверьте определение rtwdemo_rtwintro_initialize функция. Во-первых, функция использует memset для инициализации внутренних сигналов в модели в сохраненное значение 0.

rtwdemodbtype(file,'/* block I/O */','sizeof(B_rtwdemo_rtwintro_T));',1,1)
  /* block I/O */
  (void) memset(((void *) &rtwdemo_rtwintro_B), 0,
                sizeof(B_rtwdemo_rtwintro_T));

Затем функция инициализирует состояние Unit Delay, X, до значения земли. В этом случае значение земли равно нулю.

rtwdemodbtype(file,'/* exported global states */','X = 0U;',1,1)
  /* exported global states */
  X = 0U;

Функция также инициализирует другие данные, включая входы и выходы корневого уровня (блоки Inport и Outport), до значений ground.

rtwdemodbtype(file,'/* external inputs */','Amplifier_Trig_ZCE = POS_ZCSIG;',1,1)
  /* external inputs */
  rtwdemo_rtwintro_U.Input = 0;

  /* external outputs */
  rtwdemo_rtwintro_Y.Output = 0;
  rtwdemo_rtwintro_PrevZCX.Amplifier_Trig_ZCE = POS_ZCSIG;

Затем функция инициализируется X к значению, указанному в параметре Initial condition block.

rtwdemodbtype(file,'/* InitializeConditions for UnitDelay: ''<Root>/X'' */',...
    'X = 5U;',1,1)
  /* InitializeConditions for UnitDelay: '<Root>/X' */
  X = 5U;

Наконец, функция инициализирует выходные данные Amplifier подсистема.

rtwdemodbtype(file,'SystemInitialize for Triggered SubSystem',...
    'End of SystemInitialize for SubSystem',1,1)
  /* SystemInitialize for Triggered SubSystem: '<Root>/Amplifier' */
  /* SystemInitialize for Outport: '<Root>/Output' incorporates:
   *  Outport: '<S1>/Out'
   */
  rtwdemo_rtwintro_Y.Output = 0;

Проверка разницы между хранимой стоимостью и реальной стоимостью

Для некоторых данных, даже если реальное начальное значение равно нулю, компьютер сохраняет ненулевое значение в памяти. Чтобы увидеть это различие, примените к состоянию блока тип данных с фиксированной точкой смещения наклона. X. Для выполнения этого примера необходимо иметь Designer™ Fixed-Point.

В Редакторе данных модели (Model Data Editor) проверьте вкладку Сигналы (Signals).

В модели щелкните выходной сигнал блока Switch, switch_out.

Используйте столбец Тип данных (Data Type) Редактора данных модели (Model Data Editor), чтобы задать тип данных сигнала как fixdt(1,16,1,3). Это выражение представляет тип данных с фиксированной точкой с наклоном 1 и предвзятое 3.

set_param('rtwdemo_rtwintro/Switch','OutDataTypeStr',...
    'fixdt(1,16,1,3)')

В модели выберите блок «Сумма». В инспекторе свойств в разделе «Атрибуты сигнала» снимите флажок Требовать, чтобы все входные данные имели один и тот же тип данных.

set_param('rtwdemo_rtwintro/Sum','InputSameDT','off')

Чтобы предотвратить ошибки компиляции на различных платформах, выберите параметр конфигурации модели Generate only. Этот параметр приводит к тому, что модель генерирует только код.

set_param('rtwdemo_rtwintro','GenCodeOnly','on')

Чтобы создать модель и создать код, нажмите клавиши CTRL + B.

slbuild('rtwdemo_rtwintro')
### Starting build procedure for: rtwdemo_rtwintro
### Successful completion of code generation for: rtwdemo_rtwintro

Build Summary

Top model targets built:

Model             Action          Rebuild Reason                   
===================================================================
rtwdemo_rtwintro  Code generated  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 6.4884s

Сначала инициализируется функция инициализации модели X для реального наземного значения, 0. Из-за типа данных «наклон-смещение», который имеет смещение 3, это реальное значение соответствует сохраненному значению -3.

rtwdemodbtype(file,'/* exported global states */','X = -3;',1,1)
  /* exported global states */
  X = -3;

Затем функция инициализируется X к реальному начальному значению, указанному в параметре Initial condition block, 5. Это реальное значение соответствует сохраненному значению 2.

rtwdemodbtype(file,'/* InitializeConditions for UnitDelay: ''<Root>/X'' */',...
    'X = 2;',1,1)
  /* InitializeConditions for UnitDelay: '<Root>/X' */
  X = 2;

Моделирование целей

ЦельДополнительные сведения
Поведение явной инициализации модели с использованием блоков

Можно явно моделировать поведение инициализации и сброса с помощью подсистем Инициализация функции (Initialize Function) и Сброс функции (Reset Function). В подсистемах используйте блоки записи состояния для динамического вычисления и назначения начального значения состояния. Соответствующий код появляется в функции инициализации модели.

Дополнительные сведения см. в разделе Создание кода, отвечающего на события инициализации, сброса и завершения.

Запретить создание кода, который явно инициализирует данные до нуля

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

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

  • Данные, реальное начальное значение которых равно нулю, но соответствующее сохраненное значение не равно нулю.

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

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

Создание кода для импорта данных из внешнего кода

Можно создать код, который повторно использует (импортирует) данные, определенные внешним кодом. Например, можно применить класс хранения ImportedExtern к сигнальной линии, состоянию блока или объекту параметра. Для импортированных данных:

  • Созданный код не инициализирует данные параметров. Код должен инициализировать импортированные данные параметров.

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

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

См. также

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