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

Если у вас есть Simulink® Coder™, используете ли вы виртуальную или невиртуальную шину, может иметь значительное значение в КПД, размере и удобочитаемости сгенерированного кода. Например, невиртуальная шина появляется как структура в сгенерированном коде, и только одна копия существует любого алгоритма, который использует шину. Использование структуры в сгенерированном коде может быть полезным при трассировке соответствия между моделью и кодом. Например, вот сгенерированный код для блока 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 объект, код может содержать устройство хранения данных с плавающей точкой и неэффективные явные преобразования типа и сдвиги разряда. Чтобы избежать этих проблем, рассмотрите соответствие с типами данных полей структуры с типами данных соответствующих элементов сигнала.

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

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

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

ЦельМетод

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

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

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

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

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

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

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

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

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

ЦельМетод

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

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

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

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

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

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

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

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

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

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

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

Предположим, что вы создаете шину 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 создать структуру. Используйте эти методы, чтобы сгенерировать эффективный код путем устранения устройства хранения данных с плавающей точкой и потенциально неэффективных явных преобразований типа.

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

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

  • signalElement1 (int32)

  • signalElement2 (boolean)

  • signalElement3 (single)

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

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

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

Чтобы совпадать с типом данных с фиксированной точкой, установите значение поля при помощи a 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 объекты, смотрите Specify Bus Properties с Типами данных Object Simulink.Bus.

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

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

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

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

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

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

  2. Нажмите OK.

  3. Под By Task> Modeling Signals and Parameters using Buses, выберите использование параметра структуры Check с сигналами шины.

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

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

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

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

  • Блокируйте IO

  • Состояния

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

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

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

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

Похожие темы