В Simulink® можно создать собственные библиотеки блоков как способ снова использовать функциональность блоков или подсистем в одной или нескольких моделях. Если вы хотите снова использовать набор алгоритмов MATLAB® в моделях Simulink, можно инкапсулировать код MATLAB в библиотеке блока MATLAB function.
Как с другими библиотеками блока Simulink, можно специализировать каждый экземпляр блоков библиотеки MATLAB Function в модели, чтобы использовать различные типы данных, частоты дискретизации и другие свойства. Экземпляры библиотеки, которые наследовали те же свойства, могут снова использовать сгенерированный код
Вот основной рабочий процесс для создания пользовательских библиотек блоков с блоками MATLAB function. Чтобы работать через эти шаги с примером, смотрите Пример: Создание Пользовательской Библиотеки блоков Фильтра Обработки сигналов.
Добавьте полиморфный код MATLAB к блокам MATLAB function в модели Simulink.
Полиморфный код является кодом, который может обработать данные с различными свойствами, такими как тип, размер и сложность.
Сконфигурируйте блоки, чтобы наследовать свойства, которые вы хотите специализировать.
Для списка свойств можно специализироваться, видеть Свойства, которые Можно Специализировать Через Экземпляры Блоков Библиотеки.
Опционально, настройте свое маскирование использования библиотеки кода.
Добавьте экземпляры блоков библиотеки MATLAB Function к модели Simulink.
Если ваша библиотека блока MATLAB function маскируется, вы не можете изменить содержимое блока с кодом инициализации маски. Блок библиотеки Allow, чтобы изменить его опцию содержимого в диалоговом окне Mask не поддержан для библиотек блока MATLAB function.
Шаг 1: Добавьте алгоритмы фильтра к блокам библиотеки функции MATLAB
Шаг 2: Сконфигурируйте блоки к Inherit Properties, которую вы хотите специализировать
Шаг 4: Добавьте экземпляры блоков библиотеки MATLAB к модели Simulink
Этот простой пример берет вас через рабочий процесс, описанный в том, Как Создать Пользовательские Библиотеки блока MATLAB function, чтобы показать вам как:
Создайте библиотеку алгоритмов фильтра обработки сигналов с помощью блоков MATLAB function
Настройте один из блоков библиотеки с помощью параметров маски
Преобразуйте один из алгоритмов фильтра к защищенному от источника Псевдокоду, который можно вызвать от блока библиотеки MATLAB Function
Алгоритмы фильтра MATLAB:
my_fft. Выполняет дискретное преобразование Фурье на входном сигнале. Входной параметр может быть вектором, матрицей или многомерным массивом, длина которого является степенью 2.
my_conv. Применяет операцию свертки к двум сигналам входного вектора. Выводит часть свертки с размером, заданным параметром маски, Shape
.
my_sobel. Применяет операцию свертки к 2D входной матрице с граничным фильтром обнаружения Sobel.
В Simulink создайте модель библиотеки путем выбора File> New> Library
Перетащите три блока MATLAB function в модель от раздела User-Defined Functions Браузера Библиотеки Simulink и назовите их:
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);
Функция my_sobel
действует как обертка, которая вызывает функцию MATLAB, my_sobel_filter
, на пути генерации кода. my_sobel_filter
реализует алгоритм, который применяет операцию свертки к 2D входной матрице с граничным фильтром обнаружения Sobel. Путем вызывания функции вместо того, чтобы встроить код непосредственно в блоке 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
m.
В этом примере данные в алгоритмах фильтра обработки сигналов должны наследовать размер, ввести, и сложность от модели Simulink. По умолчанию данные в блоках MATLAB function наследовали эти свойства. Явным образом сконфигурировать данные, чтобы наследовать свойства:
Откройте блок MATLAB function и выберите Edit Data.
На левой панели Портов и Менеджера данных, выберите данные интереса.
На правой панели сконфигурируйте данные, чтобы наследовать свойства от Simulink:
Наследоваться | Что задать |
---|---|
Размер | Введите -1 в поле Size |
Сложность | Выберите Inherited из меню Complexity |
Ввод | Выберите Inherit: То же самое как Simulink из меню Type |
Например, если вы открываете блок MATLAB function my_fft_filter и смотрите на свойства входного параметра x
в Портах и Менеджере данных, вы видите, что размер, введите, и сложность наследована по умолчанию.
Если ваш дизайн имеет определенные требования или ограничения, можно ввести значения для любого из этих свойств, а не наследовать их от Simulink. Например, если ваш алгоритм, как предполагается, не работает с комплексными входными параметрами, установите Сложность на Прочь.
В этом осуществлении вы измените фильтр свертки 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.
Войдите в текстовое поле команд рисования Значка:
disp('my_conv'); port_label('output', 1, 'c'); port_label('input', 1, 'a'); port_label('input', 2, 'b');
Выберите вкладку Parameters & Dialog.
Подсветите позицию Параметров в панели Диалогового окна.
Добавьте параметр раскрывающегося типа путем нажатия на Popup в соответствии со Списком параметров в панели Средств управления.
Новый параметр появится в панели Диалогового окна.
В панели Редактора свойств, набор Свойства:
Свойство | Значение |
---|---|
Имя | shape |
Значение | полный |
Подсказка | shape |
Ввод | popup |
Введите опции | Откройте Редактор Опций Типа и войдите:full same valid |
Установите Атрибуты, Диалоговое окно и Свойства макета в панели Редактора свойств:
Атрибуты, диалоговое окно и элементы размещения | Значение |
---|---|
Атрибуты |
|
Диалоговое окно |
|
Размещение |
|
Нажать ОК.
Ваша подсистема должна теперь выглядеть так:
Установите свойства подсистемы для повторного использования кода:
Щелкните правой кнопкой по my_conv_filter подсистеме и выберите Block Parameters (Subsystem) из контекстного меню.
В диалоговом окне параметров подсистемы выберите Treat как атомарный модульный флажок.
Диалоговое окно расширяется, чтобы отобразить новые поля.
Чтобы сгенерировать допускающую повторное использование функцию, выберите вкладку Code Generation и в Функции упаковочное поле, выберите Reusable function
из выпадающего меню.
Это - дополнительный шаг, требуемый для этого примера. Если вы оставляете настройку по умолчанию Автоматических, программное обеспечение генерации кода использует внутреннее правило, чтобы определить, встроить ли функцию или нет.
Нажать ОК.
Задайте параметр 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. |
Настраиваемый | Очистите поле. |
Оставьте Размер, Сложность и Тип столь наследованными (значения по умолчанию), как описанный на Шаге 2: Сконфигурируйте Блоки к Inherit Properties, которую Вы Хотите Специализировать.
Нажмите Apply, закройте Порты и Менеджер данных, и возвратитесь к Редактору блока 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.
В целях этого осуществления, набор следующие параметры конфигурации для моделирования:
Панель | Раздел | Что задать |
---|---|---|
Решатель | Выбор решателя |
|
Импорт/Экспорт данных | Сохраните опции | Структура для формата |
Перетащите два экземпляра блока my_conv_filter из библиотеки my_filter_lib
в модель.
Добавьте Постоянный, Выходной порт и блоки Отображения. Ваша модель должна выглядеть примерно так:
И экземпляры библиотеки совместно используют тот же размер, вводят, и сложность для входных параметров a
и b
соответственно.
Дважды кликните каждый экземпляр библиотеки.
Значения по умолчанию параметра shape
к полному для обоих экземпляров.
Моделируйте модель.
Каждый экземпляр библиотеки выводит тот же результат, полную 2D свертку:
Специализируйте второй экземпляр, my_conv_filter1 путем устанавливания значения его параметра shape
к тому же самому.
Теперь моделируйте модель снова.
На этот раз выходные параметры имеют различные размеры: 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 Block Parameters, установленном эти параметры:
Выберите Treat как атомарный модульный флажок.
В Функции упаковочное поле выберите Reusable function
из выпадающего меню.
Сконфигурируйте модель для генерации кода.
В целях этого осуществления, набор следующие параметры конфигурации:
Панель | Раздел | Что задать |
---|---|---|
Генерация кода | Целевой выбор | Введите ert.tlc для System target file |
Генерация кода> Отчет | Установите флажок отчета генерации кода Create. |
Создайте модель.
Если вы создаете эту модель, логику повторных использований сгенерированного кода 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™ или Встроенной лицензии Coder®.
Вы отлаживаете блоки библиотеки MATLAB Function тем же путем, вы отлаживаете любой блок MATLAB function. Однако, когда вы добавляете точку останова в блоке библиотеки, точка останова совместно используется всеми экземплярами. Когда вы продолжаете выполнение, остановки отладчика в точке останова в каждом экземпляре.
Можно специализировать экземпляры блоков библиотеки MATLAB Function, позволив им наследовать любое из следующих свойств от Simulink:
Свойство | Наследовался по умолчанию? | Как задать наследование |
---|---|---|
Ввод | Да | Установите свойство типа данных Наследоваться: То же самое как Simulink. |
Размер | Да | Установите свойство размера данных на-1. |
Сложность | Да | Установите свойство сложности данных на Наследованный. |
Ограничьте область значений | Нет | Задайте минимальные и максимальные значения как параметры Simulink. Например, если минимальное значение = aParam и максимальное значение = aParam + 3, различные экземпляры блока библиотеки MATLAB Function могут решить к различным параметрам aParam , заданным в их родительских подсистемах маски. |
Режим Sampling (вводится) | Да | Входные порты блока MATLAB function всегда наследовали режим выборки |
Режим переопределения типа данных для данных фиксированной точки | Да | Установите свойство переопределения типа данных Наследоваться. |
Частота дискретизации (блок) | Да | Установите блочное свойство частоты дискретизации на-1. |