В Simulink® можно создать собственные библиотеки блоков как способ снова использовать функциональность блоков или подсистем в одной или нескольких моделях. Если вы хотите снова использовать набор алгоритмов MATLAB® в моделях Simulink, можно инкапсулировать код MATLAB в библиотеке блока MATLAB function.
Как с другими библиотеками блока Simulink, можно специализировать каждый экземпляр блоков библиотеки MATLAB Function в модели, чтобы использовать различные типы данных, шаги расчета и другие свойства. Экземпляры библиотеки, которые наследовали те же свойства, могут снова использовать сгенерированный код
Вот основной рабочий процесс для создания библиотек авторского блока с блоками MATLAB function. Чтобы работать через эти шаги с примером, смотрите Пример: Создание Пользовательской Библиотеки блоков Фильтра Обработки сигналов.
Добавьте полиморфный код MATLAB в блоки MATLAB function в модели Simulink.
Полиморфный код является кодом, который может обработать данные с различными свойствами, такими как тип, размер и сложность.
Сконфигурируйте блоки, чтобы наследовать свойства, которые вы хотите специализировать.
Для списка свойств можно специализироваться, видеть Свойства, которые Можно Специализировать Через Экземпляры Блоков Библиотеки.
Опционально, настройте свое маскирование использования библиотеки кода.
Добавьте экземпляры блоков библиотеки MATLAB Function к модели Simulink.
Если ваша библиотека блока MATLAB function маскируется, вы не можете изменить содержимое блока с кодом инициализации маски. Опция The Allow library block to modify its contents в диалоговом окне Mask не поддержана для библиотек блока MATLAB function.
Шаг 1: добавьте алгоритмы фильтра в блоки библиотеки функции MATLAB
Шаг 2: сконфигурируйте блоки, чтобы наследовать свойства, которые вы хотите специализировать
Шаг 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
.
В этом примере данные в алгоритмах фильтра обработки сигналов должны наследовать размер, ввести, и сложность из модели Simulink. По умолчанию данные в блоках MATLAB function наследовали эти свойства. Явным образом сконфигурировать данные, чтобы наследовать свойства:
Откройте блок MATLAB function и выберите Edit Data.
На левой панели Портов и Менеджера данных, выберите данные интереса.
На правой панели сконфигурируйте данные, чтобы наследовать свойства от Simulink:
Наследоваться | Что задать |
---|---|
Размер | Введите -1 в поле Size |
Сложность | Выберите Inherited из меню Complexity |
Ввод | Выберите 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.
Диалоговое окно расширяется, чтобы отобразить новые поля.
Чтобы сгенерировать допускающую повторное использование функцию, выберите вкладку Code Generation и в поле 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, закройте Порты и Менеджер данных, и возвратитесь к Редактору блока 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
в модель.
Добавьте Постоянный, Выходной порт и блоки Отображения. Ваша модель должна выглядеть примерно так:
И экземпляры библиотеки совместно используют тот же размер, вводят, и сложность для входных параметров a
и b
соответственно.
Дважды кликните каждый экземпляр библиотеки.
Значения по умолчанию параметра 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 Block Parameters, установленном эти параметры:
Установите флажок 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' */ } |
Генерация кода С для этой модели требует лицензия Embedded Coder® или Simulink Coder™.
Вы отлаживаете блоки библиотеки MATLAB Function тем же путем, вы отлаживаете любой блок MATLAB function. Однако, когда вы добавляете точку останова в блоке библиотеки, точка останова совместно используется всеми экземплярами. Когда вы продолжаете выполнение, остановки отладчика в точке останова в каждом экземпляре.
Можно специализировать экземпляры блоков библиотеки MATLAB Function, позволив им наследовать любое из следующих свойств от Simulink:
Свойство | Наследовался по умолчанию? | Как задать наследование |
---|---|---|
Ввод | Да | Установите свойство типа данных на Inherit: Same as Simulink. |
Размер | Да | Установите свойство размера данных на-1. |
Сложность | Да | Установите свойство сложности данных на Inherited. |
Ограничьте область значений | Нет | Задайте минимальные и максимальные значения как параметры Simulink. Например, если минимальное значение = aParam и максимальное значение = aParam + 3, различные экземпляры блока библиотеки MATLAB Function могут решить к различным параметрам aParam , заданным в их родительских подсистемах маски. |
Режим Sampling (вводится) | Да | Входные порты блока MATLAB function всегда наследовали режим выборки |
Режим переопределения типа данных для данных фиксированной точки | Да | Установите свойство переопределения типа данных на Inherit. |
Шаг расчета (блок) | Да | Установите свойство шага расчета блока на-1. |