В Simulink®можно создать собственные библиотеки блоков как способ повторно использовать функциональность блоков или подсистем в одной или нескольких моделях. Если необходимо повторно использовать набор MATLAB® алгоритмы в моделях Simulink, можно инкапсулировать код MATLAB в MATLAB Function библиотеки блоков.
Как и в других библиотеках блоков Simulink, можно специализироваться на каждом образце MATLAB Function библиотечных блоков в модели, чтобы использовать различные типы данных, шаги расчета и другие свойства. Образцы библиотеки, которые наследуют одни и те же свойства, могут повторно использовать сгенерированный код
Вот базовый рабочий процесс создания пользовательских библиотек блоков с MATLAB Function блоками. Для работы с этими шагами с примером смотрите Пример: Создание Пользовательского Фильтра Обработки Сигналов Библиотеки блоков.
Добавьте полиморфный код MATLAB к MATLAB Function блокам в модели Simulink.
Полиморфный код является кодом, который может обрабатывать данные с различными свойствами, такими как тип, размер и сложность.
Сконфигурируйте блоки, чтобы наследовать свойства, которые вы хотите специализировать.
Список свойств, которые можно специализировать, см. в разделе Свойства, которые можно специализировать для всех образцов библиотечных блоков.
Вы можете настроить код библиотеки с помощью маскировки.
Добавьте образцов из MATLAB Function библиотечных блоков к модели Simulink.
Примечание
Если ваша < reservedrangesplaceholder2 > библиотека блоков замаскирована, вы не можете редактировать содержимое блока с кодом инициализации маски. Опция Allow library block to modify its contents в диалоговом окне «Маска» не поддерживается для MATLAB Function библиотек блоков.
Шаг 1: Добавьте Алгоритмы Фильтра, чтобы Функция MATLAB Библиотечных блоков
Шаг 2: Сконфигурируйте блоки, чтобы наследовать свойства, которые вы хотите специализировать
Шаг 4. Добавьте образцы библиотечных блоков MATLAB в модель Simulink
Этот простой пример рассмотрит рабочий процесс, описанный в How to Create Custom MATLAB Function Block Libraries, чтобы показать, как:
Создайте библиотеку алгоритмов фильтра обработки сигналов, используя блоки MATLAB Function
Настройте один из библиотечных блоков с помощью параметров маски
Преобразуйте один из алгоритмов фильтра в защищенный от источника P-код, который можно вызвать из MATLAB Function библиотечного блока
Алгоритмы фильтра MATLAB:
my_fft. Выполняет дискретное преобразование Фурье на входном сигнале. Вход может быть векторным, матричным или многомерным массивом, длина которого является степенью 2.
my_conv. Выполняет свертку двух входных векторных сигналов. Выводит часть свертки с размером, заданным параметром маски, Shape
.
my_sobel. Свертывает 2D входную матрицу с фильтром обнаружения ребер Собеля.
В Simulink создайте модель библиотеки. На вкладке Simulation выберите New > Library
Перетащите три блока MATLAB Function в модель из раздела User-Defined Functions браузера библиотеки Simulink Library Browser и назовите их:
my_fft_filter
my_conv_filter
my_sobel_filter
Сохраните модель библиотеки следующим my_filter_lib
.
Откройте MATLAB Function блок с именем my_fft_filter
, замените код шаблона следующим кодом и сохраните блок:
function y = my_fft(x) y = fft(x);
Замените код шаблона в my_conv_filter
заблокировать следующим кодом и сохранить блок:
function c = my_conv(a, b) c = conv(a, b);
Замените код шаблона в my_sobel_filter
заблокировать следующим кодом и сохранить блок:
function y = my_sobel(u) %% "my_sobel_filter" is a MATLAB function %% on the MATLAB path. y = my_sobel_filter(u);
The my_sobel
функция действует как оболочка, которая вызывает функцию MATLAB, my_sobel_filter
, на пути генерации кода. my_sobel_filter
реализует алгоритм, который свертывает матрицу 2D входа с фильтром обнаружения ребра Собеля. Вызывая функцию, а не встраивая код непосредственно в блок MATLAB Function, можно повторно использовать алгоритм как в качестве кода MATLAB, так и в модели Simulink. Вы создадите my_sobel_filter
далее.
В той же папке, где вы создали my_filter_lib
, создайте новую функцию MATLAB my_sobel_filter
со следующим кодом:
function y = my_sobel_filter(u) % Sobel edge detection filter h = [1 2 1;... 0 0 0;... -1 -2 -1]; y = abs(conv2(u, h));
Сохраните файл как my_sobel_filter.m
.
В этом примере данные в алгоритмах фильтра обработки сигналов должны наследовать размер, тип и сложность от модели Simulink. По умолчанию данные в MATLAB Function блоках наследуют эти свойства. Чтобы явным образом сконфигурировать данные для наследования свойств:
Откройте MATLAB Function блок и выберите Edit Data.
На левой панели Диспетчера портов и данных выберите интересующие вас данные.
На правой панели настройте данные для наследования свойств из Simulink:
Унаследовать | Что указать |
---|---|
Размер | Введите -1 в поле Size |
Сложность | Выберите Inherited из меню «Сложность» |
Напечатать | Выберите Inherit: Same as Simulink из меню Type |
Для примера, если открыть MATLAB Function блока my_fft_filter и посмотреть на свойства входа x
в Диспетчере портов и данных вы видите, что размер, тип и сложность наследуются по умолчанию.
Примечание
Если у вашего проекта есть определенные требования или ограничения, можно ввести значения для любого из этих свойств, а не наследовать их от Simulink. Например, если ваш алгоритм не должен работать со сложными входами, установите Complexity на Off.
В этом упражнении вы измените фильтр свертки my_conv
для использования пользовательского параметра shape
это задает, какие часть свертки должен быть выведен. Чтобы настроить этот алгоритм для вашей библиотеки, разместите my_conv_filter
блок под маскированной подсистемой и определить shape
как параметр маски.
Преобразуйте блок в маскированную подсистему:
Щелкните правой кнопкой мыши блок my_conv_filter и выберите Subsystem & Model Reference > Create Subsystem from Selection.
Блок my_conv_filter меняется на блок подсистемы.
Измените имя подсистемы на my_conv_filter.
Щелкните правой кнопкой мыши подсистему my_conv_filter и выберите из контекстного меню Mask > Create Mask.
Откроется Редактор масок с открытой вкладкой Icon & Ports.
Введите в Icon drawing commands текстовое поле:
disp('my_conv'); port_label('output', 1, 'c'); port_label('input', 1, 'a'); port_label('input', 2, 'b');
Выберите вкладку Parameters & Dialog.
Выделите Parameters линии элемента на панели Диалоговое окно.
Добавьте параметр типа всплывающего окна, щелкнув Popup под списком Parameter на панели Controls.
Новый параметр появится на панели Диалоговое окно.
На панели Property editor установите Properties:
Свойство | Значение |
---|---|
Name | shape |
Value | full |
Prompt | shape |
Type | popup |
Type options | Откройте Редактор опций типа и введите: full same valid |
Установите свойства Attributes, Dialog и Layout на панели Property editor:
Атрибуты, диалоговые окна и элементы размещения | Значение |
---|---|
Attributes |
|
Dialog |
|
Layout |
|
Нажмите OK.
Теперь ваша подсистема должна выглядеть следующим образом:
Установите свойства подсистемы для повторного использования кода:
Щелкните правой кнопкой мыши подсистему my_conv_filter и выберите Block Parameters (Subsystem) из контекстного меню.
В диалоговом окне параметров подсистемы установите флажок Treat as atomic unit.
Диалоговое окно развернется для отображения новых полей.
Чтобы сгенерировать переиспользуемую функцию, выберите вкладку Генерации кода и в поле Function packaging выберите Reusable function
из раскрывающегося меню.
Примечание
Это необязательный шаг, требуемый для этого примера. Если вы оставляете настройку по умолчанию Auto, программное обеспечение генерации кода использует внутреннее правило, чтобы определить, входить ли функцию в систему или нет.
Нажмите OK.
Определите shape
параметр в функции MATLAB my_conv
:
Щелкните правой кнопкой мыши подсистему my_conv_filter и выберите из контекстного меню Mask > Look Under Mask.
Откроется блок-схема под маскированной подсистемой, содержащая my_conv_filter блок:
Измените имена блоков портов так, чтобы они совпадали с именами данных следующим образом:
Изменение: | Кому: |
---|---|
In1 | a |
In2 | b |
Out1 | c |
Дважды кликните блок my_conv_filter, чтобы открыть Блок MATLAB function Редактора.
В редакторе блоков MATLAB function выберите Edit Data.
В Диспетчере портов и данных выберите Add > Data.
Появляется новый элемент данных, а также диалоговое окно его свойств.
Введите следующие свойства:
Свойство | Что задавать |
---|---|
Имя | Введите shape . |
Возможности | Выберите Parameter. |
Настраиваемый | Очистите ящик. |
Оставьте Size, Complexity и Type как унаследованные (значения по умолчанию), как описано в шаге 2: Настройка блоков для наследования свойств, которые вы хотите специализировать.
Нажмите Apply, закройте Ports and Данных Manager и вернитесь к Блоку MATLAB function Редактора.
Используйте shape
параметр для определения размера свертки для вывода:
В редакторе блоков MATLAB function измените my_conv
функцию для вызова conv
с правой формой:
function c = my_conv(a, b, shape) if shape == 1 c = conv(a, b, 'full'); elseif shape == 2 c = conv(a, b, 'same'); else c = conv(a, b, 'valid'); end
Сохраните изменения и закройте Блок MATLAB function Редактора.
В этом упражнении вы добавите специализированные образцы my_conv_filter библиотечного блока к простой экспериментальной модели.
Откройте новую модель Simulink.
В целях этого упражнения установите следующие параметры конфигурации для симуляции:
Панель | Раздел | Что указать |
---|---|---|
Solver | Solver selection |
|
Data Import/Export | Save options | Structure для Format |
Перетащите два образцов my_conv_filter блока из my_filter_lib
библиотека в модель.
Добавьте Constant, Outport и Display блоки. Ваша модель должна выглядеть примерно так:
Оба образцов библиотеки имеют одинаковый размер, тип и сложность для входов a
и b
соответственно.
Дважды кликните каждый образец библиотеки.
The shape
параметр по умолчанию full для обоих образцов.
Симулируйте модель.
Каждый образец библиотеки выводит один и тот же результат, полную 2D свертку:
Специализируйте второй образец, my_conv_filter1 путем установки значения его shape
параметр в same.
Теперь снова симулируйте модель.
На этот раз выходы имеют различные размеры: my_conv_filter3 выводит полную свертку 2D, в то время как my_conv_filter1 отображает центральную часть свертки как вектор 1 на 2, такого же размера, как a
:
Теперь добавьте третий образец путем копирования my_conv_filter1. Специализируйте новый образец, my_conv_filter2, так, чтобы он не унаследовал входы того же размера, что и первые два образцов:
Моделируйте модель еще раз.
На этот раз my_conv_filter1 и my_conv_filter2 каждый отображает центральную часть свертки, но выходные размеры различны, потому что каждый из них соответствует другому размеру входных a
.
Когда образцы из MATLAB Function библиотечных блоков наследуют те же свойства, они могут повторно использовать сгенерированный код, как проиллюстрировано примером, основанным на Шаге 4: Добавьте Образцов Библиотечных блоков MATLAB к Модели Simulink:
В этой модели образцы библиотеки my_conv_filter и my_conv_filter1 наследуют один и тот же размер, тип и сложность для каждого соответствующего входа. Для каждого образца введите a
является вектором 1 на 2 и входным b
является вектором 1 на 5. Для сравнения, входы my_conv_filter2 наследуют различные соответствующие размеры; оба являются векторами 1 на 3.
Кроме сложения, каждый образец библиотеки имеет параметр маски, называемый формой, который определяет, что часть свертки вывести. Предположим, что значение формы совпадает для каждого образца.
Чтобы сгенерировать код для этого примера, выполните следующие шаги:
Включите повторное использование кода для библиотечного блока:
В библиотеке щелкните правой кнопкой мыши по MATLAB Function my_conv_filter блока и выберите Block Parameters (Subsystem) из контекстного меню.
В диалоговом окне Function Параметры Блоков установите эти параметры:
Установите флажок Treat as atomic unit.
В Function packaging поле выберите Reusable function
из раскрывающегося меню.
Сконфигурируйте модель для генерации кода.
В целях этого упражнения установите следующие параметры конфигурации:
Панель | Раздел | Что указать |
---|---|---|
Code Generation | Target selection | Введите ert.tlc для System target file |
Code Generation> Report | Установите Create code generation report флажок. |
Создайте модель.
Если вы создаете эту модель, сгенерированный код C повторно использует логику для my_conv_filter
и my_conv_filter1
образцы библиотеки, поскольку они наследуют одинаковые входные свойства:
/* * Output and update for atomic system: * '<Root>/my_conv_filter' * '<Root>/my_conv_filter1' */ void sp_algorithm_tes_my_conv_filter(const real32_T rtu_a[2], const real32_T rtu_b[5], rtB_my_conv_filter_sp_algorithm *localB) { int32_T jA; int32_T jA_0; real32_T s; int32_T jC; /* MATLAB Function Block: '<S1>/my_conv_filter' */ /* MATLAB Function 'my_conv_filter/my_conv_filter': '<S4>:1' */ /* '<S4>:1:4' */ for (jC = 0; jC < 6; jC++) { if (5 < jC + 2) { jA = jC - 4; } else { jA = 0; } if (2 < jC + 1) { jA_0 = 2; } else { jA_0 = jC + 1; } s = 0.0F; while (jA + 1 <= jA_0) { s += rtu_b[jC - jA] * rtu_a[jA]; jA++; } localB->c[jC] = s; } /* end of MATLAB Function Block: '<S1>/my_conv_filter' */ } |
Однако для my_conv_filter2 сгенерирована отдельная функция:
/* Output and update for atomic system: '<Root>/my_conv_filter2' */ void sp_algorithm_te_my_conv_filter2(const real_T rtu_a[3], const real_T rtu_b[3], rtB_my_conv_filter_sp_algorit_h *localB) { int32_T jA; int32_T jA_0; real_T s; int32_T jC; /* MATLAB Function Block: '<S3>/my_conv_filter' */ /* MATLAB Function 'my_conv_filter/my_conv_filter': '<S6>:1' */ /* '<S6>:1:4' */ for (jC = 0; jC < 5; jC++) { if (3 < jC + 2) { jA = jC - 2; } else { jA = 0; } if (3 < jC + 1) { jA_0 = 3; } else { jA_0 = jC + 1; } s = 0.0; while (jA + 1 <= jA_0) { s += rtu_b[jC - jA] * rtu_a[jA]; jA++; } localB->c[jC] = s; } /* end of MATLAB Function Block: '<S3>/my_conv_filter' */ } |
Примечание
Для генерации кода С для этой модели требуется Simulink Coder™ или Embedded Coder® лицензия.
Вы отлаживаете MATLAB Function библиотечных блоков так же, как и любой MATLAB Function блок. Однако при добавлении точки по оси Х в библиотечный блок точка по оси Х разделяется всеми образцами. Когда вы продолжаете выполнение, отладчик останавливается в точке останова в каждом образце.
Можно специализироваться на образцах MATLAB Function библиотечных блоков, позволяя им наследовать любое из следующих свойств от Simulink:
Свойство | Наследовать по умолчанию? | Как задать наследование |
---|---|---|
Напечатать | Да | Установите данные свойства type равным Inherit: Same as Simulink. |
Размер | Да | Установите данные свойства size равным -1. |
Сложность | Да | Установите свойство сложности данных в Inherited. |
Предельная область значений | Нет | Задайте минимальное и максимальное значения как параметры Simulink. Для примера, если минимальное значение = aParam и максимальное значение = aParam + 3, различные образцы MATLAB Function, библиотечный блок могут разрешиться к разным aParam параметры, заданные в их родительских подсистемах маски. |
Режим дискретизации (вход) | Да | MATLAB Function входные порты блоков всегда наследуют режим дискретизации |
Режим переопределения типа данных для данных с фиксированной точкой | Да | Установите значение свойства переопределения типа данных на Inherit. |
Шаг расчета (блок) | Да | Установите свойство шага расчета блока равным -1. |