Если у вас есть Simulink® Coder™, используете ли вы виртуальную или невиртуальную шину, может иметь значительное значение в КПД, размере и удобочитаемости сгенерированного кода. Например, невиртуальная шина появляется как структура в сгенерированном коде, и только одна копия существует любого алгоритма, который использует шину. Использование структуры в сгенерированном коде может быть полезным при трассировке соответствия между моделью и кодом. Например, вот сгенерированный код для блока COUNTERBUSCreator в ex_bus_logging
модель.
Виртуальная шина не появляется как структура или любой другой когерентный модуль в сгенерированном коде. Отдельная копия любого алгоритма, который управляет шиной, существует для каждого элемента. В общем случае виртуальные шины не влияют на сгенерированный код.
К сигналам группы в структуры в сгенерированном коде используйте невиртуальные шины. Смотрите Организуют Данные в Структуры в Сгенерированном коде (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
.
Используйте таблицу, чтобы решить, как управлять типами данных полей в этих начальных структурах условия.
Цель | Метод | |
---|---|---|
Используйте невиртуальную шину. | Используйте нетипизированные выражения, чтобы установить значения полей. | |
Используйте виртуальную шину. | Постарайтесь не вручную совпадать с полевыми типами данных тем из элементов сигнала. | Используйте нетипизированные выражения, чтобы установить значения полей. |
Сгенерируйте более эффективный код и избегайте устройства хранения данных с плавающей точкой. | Совпадайте с полевыми типами данных структуры типам элемента сигнала. Храните информацию типа данных в |
Предположим, что вы храните начальную структуру условия в переменной или Simulink.Parameter
возразите, что вы создаете в базовом рабочем пространстве или словаре данных. Например, вы используете этот метод, чтобы совместно использовать структуру между несколькими блоками или сгенерировать настраиваемую структуру, когда вы устанавливаете Default parameter behavior на Inlined
. В этом случае используйте таблицу, чтобы решить, как управлять типами данных полей в начальной структуре условия.
Цель | Метод | |
---|---|---|
Постарайтесь не вручную совпадать с полевыми типами данных тем из элементов сигнала. | Используйте нетипизированные выражения, чтобы установить значения полей. В сгенерированном коде поля структуры используют тип данных | |
Сгенерируйте более эффективный код и избегайте устройства хранения данных с плавающей точкой. | Совпадайте с полевыми типами данных структуры типам элемента сигнала. Храните информацию типа данных в полях структуры или используйте Чтобы использовать Model Advisor, чтобы проверять вашу модель на потенциально дорогие неверные типы данных, смотрите использование параметра структуры Проверки с сигналами шины. | |
Инициализируйте массив шин в модели, на которую ссылаются, при помощи массива структур. Передайте массив структур к модели, на которую ссылаются, как значение аргумента модели в блоке Model. | Совпадайте с полевыми типами данных структуры типам элемента сигнала. Храните информацию типа данных в полях структуры или используйте Если вы не передаете структуру модели, на которую ссылаются, в качестве аргумента модели, следуете другим инструкциям для невиртуальных шин, чтобы решить, как управлять типами данных. |
Можно использовать нетипизированные выражения, чтобы установить значения полей структуры. Поля неявно используют тип данных 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)
Откройте редактор шины.
buseditor
Создайте Bus
объект, myBus
, это соответствует шине.
Создайте начальную структуру условия initStruct
. Используемые нетипизированные выражения, чтобы установить значения полей. Улучшать удобочитаемость поля signalElement2
, используйте булево значение false
вместо 0
.
initStruct.signalElement1 = 3; initStruct.signalElement2 = false; initStruct.signalElement3 = 17.35;
Чтобы представлять структуру, создайте Simulink.Parameter
объект.
initStruct = Simulink.Parameter(initStruct);
Используйте объект параметра, чтобы задать начальное условие для шины. Например, в диалоговом окне блока Unit Delay, устанавливает Initial condition на initStruct
.
Используйте Bus
объект задать тип данных объекта параметра.
initStruct.DataType = 'Bus: myBus';
Используйте 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.
На вкладке Modeling нажмите Model Advisor.
Нажмите OK.
Под By Task> Modeling Signals and Parameters using Buses, выберите использование параметра структуры Check с сигналами шины.
Нажмите кнопку Run This Check.
Когда вы генерируете код для модели, которая включает массив шин, typedef
это представляет базовый тип шины, появляется в *_types.h
файл.
Генерация кода производит массив структур C, которые можно интегрировать с устаревшим кодом С, который использует массивы структур. По мере необходимости код для переменных шины (массивы) сгенерирован в следующих структурах:
Блокируйте IO
Состояния
Внешние входные параметры
Внешние выходные параметры
Вот упрощенный пример некоторого сгенерированного кода для массива шин.
Для основной информации о генерации кода для невиртуальных шин, которые появляются в коде как структуры, видят, Организуют Данные в Структуры в Сгенерированном коде (Simulink Coder).