Сгенерируйте код для невиртуальных шин

Если у вас есть Simulink® Coder™, используете ли вы виртуальную или невиртуальную шину, может существенно различие эффективность, размер и читаемость сгенерированного кода. Например, невиртуальная шина появляется как структура в сгенерированном коде, и существует только одна копия любого алгоритма, который использует bus.Использование структуры в сгенерированном коде может быть полезно при отслеживании соответствия между моделью и кодом. Например, вот сгенерированный код для блока COUNTERBUSCreator в ex_bus_logging модель.

COUNTERBUS contains a signal named data and a bus named limits that contains two elements: upper_saturation_limit and lower_saturation_limit.

data, upper_saturation_limit, and lower_saturation_limit appear in the generated code.

Виртуальная шина не отображается как структура или какой-либо другой когерентный модуль в сгенерированном коде. Отдельная копия любого алгоритма, который манипулирует шиной, существует для каждого элемента. В целом виртуальные шины не влияют на сгенерированный код.

Для группирования сигналов в структуры в сгенерированном коде используйте невиртуальные шины. См. «Организация данных в структуры» в Сгенерированном коде (Simulink Coder).

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

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

Генерация кода для массивов шин создает структуры с определенным форматом. Смотрите Генерацию кода для массивов шин.

Управление Данных типами полей структуры начальных условий

Можно использовать структуру MATLAB, чтобы инициализировать сигнальные элементы в шине. См. «Задание начальных условий для элементов шины».

Если элементы сигнала целевой шины используют типы числовых данных double, в целом:

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

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

Метод, который вы выбираете, может повлиять на эффективность и читаемость сгенерированного кода.

Для примеров и дополнительной информации о настраиваемых начальных условиях в сгенерированном коде, смотрите Сигнал управления и Инициализация Состояния в Сгенерированном Коде (Simulink Coder).

Встроенные числовые значения структурных полей в сгенерированном коде

Если вы устанавливаете параметр конфигурации Default parameter behavior равным InlinedПо умолчанию значения полей начальной структуры условий появляются в сгенерированном коде в виде встроенных чисел (не настраиваемых). Для этих структур используйте нетипичные выражения, чтобы задать значения полей в Simulink. Значения полей не требуют типов данных, поскольку структура не настраивается в сгенерированном коде.

Однако, если вы позже установили для Default parameter behavior значение Tunable или применить класс памяти к структуре при помощи Simulink.Parameter объект, код может содержать запоминающее устройство с плавающей точкой и неэффективные явные typecasts и битовые сдвиги. Чтобы избежать этих проблем, рассмотрите соответствие типов данных полей структуры типам данных соответствующих элементов сигнала.

Сгенерируйте настраиваемую структуру, заданную непосредственно в диалоговом окне блока

Предположим, что вы задаете начальную структуру условия непосредственно в диалоговом окне блока или в Simulink.Signal объект с выражением, таким как struct('signal1',5,'signal2',7.2) (вместо хранения структуры в переменной или Simulink.Parameter объект). В этом случае, чтобы сгенерировать настраиваемую структуру в коде, вы устанавливаете Default parameter behavior равной Tunable.

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

ЦельМетод

Используйте невиртуальную шину.

Используйте нетипичные выражения, чтобы задать значения полей.

Используйте виртуальную шину.

Избегайте ручного согласования типов данных поля с типами элементов сигнала.

Используйте нетипичные выражения, чтобы задать значения полей.

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

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

Сгенерируйте настраиваемую структуру, сохраненную в переменной или объекте параметра

Предположим, что вы храните начальную структуру условия в переменной или Simulink.Parameter объект, который вы создаете в базовом рабочем пространстве или словаре данных. Например, вы используете этот метод, чтобы поделиться структурой между несколькими блоками или сгенерировать настраиваемую структуру, когда вы задаете Default parameter behavior равной Inlined. В этом случае таблица используется для определения способа управления типами данных полей в структуре начальных условий.

ЦельМетод

Избегайте ручного согласования типов данных поля с типами элементов сигнала.

Используйте нетипичные выражения, чтобы задать значения полей. В сгенерированном коде в полях структуры используется тип данных double. Сгенерированный алгоритм использует явные typecasts, чтобы согласовать несоответствия типов данных.

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

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

Чтобы использовать Model Advisor для проверки модели на потенциально дорогие несоответствия типов данных, смотрите Проверку использования параметра структуры с сигналами шины.

Инициализируйте массив шин в ссылочной модели с помощью массива структур. Передайте массив структур в модель-ссылку как значение аргумента модели в блоке Model.

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

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

Использование нетипичных выражений для задания значений полей

Можно использовать нетипичные выражения, чтобы задать значения полей структуры. Поля неявно используют тип данных double. Установите значения полей, чтобы представлять идеальные, реальные значения инициализации.

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

Предположим, что вы создаете шину myBusSig с этими сигнальными элементами. Каждый элемент использует определенный тип данных.

myBusSig
   signalElement1 (int32)
   signalElement2 (boolean)
   signalElement3 (single)

Создайте начальную структуру условия initStruct. Используйте нетипичные выражения, чтобы задать значения полей. Опционально для повышения читаемости логического поля signalElement2, используйте значение false вместо 0.

initStruct.signalElement1 = 3;
initStruct.signalElement2 = false;
initStruct.signalElement3 = 17.35;

Если вы используете функцию Simulink.Bus.createMATLABStruct для создания структуры функция хранит информацию о типах данных в полях структуры. После создания структуры можно, опционально, использовать нетипированные выражения для изменения значений полей. Смотрите раздел Использование Simulink .Bus.createMATLABStruct для создания структуры.

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

Для хранения информации о типах данных в полях структуры используйте введенные выражения, чтобы задать значения полей, или используйте функцию Simulink.Bus.createMATLABStruct для создания структуры. Используйте эти методы для генерации эффективного кода путем исключения хранения с плавающей точкой и потенциально неэффективных явных typecasts.

Чтобы избежать ручного применения новых типов данных к полям структуры при изменении типов данных соответствующих элементов сигнала, рассмотрите использование Simulink.Bus объект для управления типами данных в структуре и шине одновременно.

Используйте Typed Expressions, чтобы задать значения полей.  Предположим, что вы создаете шину myBusSig с этими элементами, которые используют определенные типы данных.

  • signalElement1 (int32)

  • signalElement2 (boolean)

  • signalElement3 (single)

Создайте начальную структуру условия initStruct при помощи типизированных выражений установите значения полей. Сопоставьте типы данных полей с типами данных соответствующих сигнальных элементов.

initStruct.signalElement1 = int32(3);
initStruct.signalElement2 = false;
initStruct.signalElement3 = single(17.35);

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

Чтобы соответствовать типу данных с фиксированной точкой, установите значение поля с помощью fi (Fixed-Point Designer) объект.

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

initStruct.signalElement3(:) = 16.93;

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

initStruct.signalElement3 = single(16.93);

Если вы не используете ни один из этих методов, поле теряет информацию о типе данных.

initStruct.signalElement3 = 16.93; % Field data type is now 'double'.

Использовать Simulink.Bus.createMATLABStruct Создание структуры.  Вы можете использовать функцию Simulink.Bus.createMATLABStruct создать структуру, все поля которой имеют значения заземления, обычно 0. Если вы конфигурируете типы данных элементов сигнала перед использованием функции, для примера путем установки выхода типов данных блоков, которые генерируют элементы сигнала, каждое поле в структуру output использует совпадающий тип данных как соответствующий элемент сигнала. Поля хранят информацию о типе данных, как если бы вы использовали введенные выражения для установки значений.

Можно инициализировать некоторые сигнальные элементы со значением, отличным от заземления, передав частичную структуру в функцию. Когда вы создаете эту частичную структуру, сопоставьте тип данных каждого поля с типом данных соответствующего сигнального элемента с помощью типизированных выражений. Для получения дополнительной информации и примеров см. Simulink.Bus.createMATLABStruct.

Когда вы позже измените значение поля в структуре, выберите один из следующих методов, чтобы задать новое значение:

  • Нетипичное выражение. Значение поля больше не сохраняет информацию о типе данных.

  • Введенное выражение или назначение под индексом. Значение поля продолжает хранить информацию о типе данных.

Используйте объект шины как тип данных структуры начальных условий

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

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

Предположим, что для создания шины используется блок Bus Creator myBusSig с этими элементами:

  • signalElement1 (int32)

  • signalElement2 (boolean)

  • signalElement3 (single)

  1. Откройте Редактор шины.

    buseditor

  2. Создайте Bus объект, myBus, что соответствует шине.

  3. Создайте начальную структуру условия initStruct. Использование нетипичных выражений для задания значений полей. Для повышения читаемости полевых signalElement2, используйте логическое значение false вместо 0.

    initStruct.signalElement1 = 3;
    initStruct.signalElement2 = false;
    initStruct.signalElement3 = 17.35;
    

  4. Чтобы представлять структуру, создайте Simulink.Parameter объект.

    initStruct = Simulink.Parameter(initStruct);
    

  5. Используйте объект параметра, чтобы задать начальное условие для шины. Например, в диалоговом окне Unit Delay блока установите Initial condition равным initStruct.

  6. Используйте Bus объект, чтобы задать тип данных объекта параметра.

    initStruct.DataType = 'Bus: myBus';

  7. Используйте Bus объект, чтобы задать тип данных шины. Например, в диалоговом окне Bus Creator блока установите Output data type равным Bus: myBus.

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

Для получения основной информации о Bus объекты, см. «Задание свойств шины с Simulink типами данных объектов .Bus».

Сконфигурируйте типы данных для существующей структуры

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

Чтобы преобразовать структуру, которая использует doubles, в структуру, которая хранит информацию о типе данных, можно создать ссылочную структуру с помощью функции Simulink.Bus.createMATLABStruct. Затем можно записать пользовательскую функцию, чтобы привести значения полей к типам данных в ссылочной структуре. Используйте функцию , взятую в качестве примера, castStructFromDbl как шаблон.

Проверяйте несоответствующие типы данных с помощью Model Advisor

Чтобы обнаружить, когда типы данных полей структуры не согласуются со связанными элементами шины, используйте Model Advisor.

  1. На вкладке Modeling нажмите Model Advisor.

  2. Нажмите OK.

  3. В разделе By Task > Modeling Signals and Parameters using Buses выберите Check structure parameter usage with bus signals.

  4. Нажмите кнопку Run This Check.

Генерация кода для массивов шин

Когда вы генерируете код для модели, которая включает массив шин, typedef , который представляет базовый тип шины, появляется в *_types.h файл.

Генерация кода создает массив структур C, которые можно интегрировать с устаревшим кодом C, который использует массивы структур. При необходимости код для переменных шины (массивов) генерируется в следующих структурах:

  • Блок ввода-вывода

  • Государства

  • Внешние входы

  • Внешние выходы

Вот упрощенный пример некоторого сгенерированного кода для массива шин.

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

Похожие темы