В 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 создайте модель библиотеки. На вкладке Simulation выберите 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
библиотека в модель.
Добавьте Constant, Outport и блоки Display. Ваша модель должна выглядеть примерно так:
И экземпляры библиотеки совместно используют тот же размер, вводят, и сложность для входных параметров 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. |