Создайте пользовательские библиотеки блоков

Когда пользоваться библиотеками блока MATLAB function

В Simulink® можно создать собственные библиотеки блоков как способ снова использовать функциональность блоков или подсистем в одной или нескольких моделях. Если вы хотите снова использовать набор алгоритмов MATLAB® в моделях Simulink, можно инкапсулировать код MATLAB в библиотеке блока MATLAB function.

Как с другими библиотеками блока Simulink, можно специализировать каждый экземпляр блоков библиотеки MATLAB Function в модели, чтобы использовать различные типы данных, частоты дискретизации и другие свойства. Экземпляры библиотеки, которые наследовали те же свойства, могут снова использовать сгенерированный код

Как создать пользовательские библиотеки блока MATLAB function

Вот основной рабочий процесс для создания пользовательских библиотек блоков с блоками MATLAB function. Чтобы работать через эти шаги с примером, смотрите Пример: Создание Пользовательской Библиотеки блоков Фильтра Обработки сигналов.

  1. Добавьте полиморфный код MATLAB к блокам MATLAB function в модели Simulink.

    Полиморфный код является кодом, который может обработать данные с различными свойствами, такими как тип, размер и сложность.

  2. Сконфигурируйте блоки, чтобы наследовать свойства, которые вы хотите специализировать.

    Для списка свойств можно специализироваться, видеть Свойства, которые Можно Специализировать Через Экземпляры Блоков Библиотеки.

  3. Опционально, настройте свое маскирование использования библиотеки кода.

  4. Добавьте экземпляры блоков библиотеки MATLAB Function к модели Simulink.

Примечание

Если ваша библиотека блока MATLAB function маскируется, вы не можете изменить содержимое блока с кодом инициализации маски. Блок библиотеки Allow, чтобы изменить его опцию содержимого в диалоговом окне Mask не поддержан для библиотек блока MATLAB function.

Пример: Создание пользовательской библиотеки блоков фильтра обработки сигналов

Что вы изучите

Этот простой пример берет вас через рабочий процесс, описанный в том, Как Создать Пользовательские Библиотеки блока MATLAB function, чтобы показать вам как:

  • Создайте библиотеку алгоритмов фильтра обработки сигналов с помощью блоков MATLAB function

  • Настройте один из блоков библиотеки с помощью параметров маски

  • Преобразуйте один из алгоритмов фильтра к защищенному от источника Псевдокоду, который можно вызвать от блока библиотеки MATLAB Function

Об алгоритмах фильтра

Алгоритмы фильтра MATLAB:

my_fft.  Выполняет дискретное преобразование Фурье на входном сигнале. Входной параметр может быть вектором, матрицей или многомерным массивом, длина которого является степенью 2.

my_conv.  Применяет операцию свертки к двум сигналам входного вектора. Выводит часть свертки с размером, заданным параметром маски, Shape.

my_sobel.  Применяет операцию свертки к 2D входной матрице с граничным фильтром обнаружения Sobel.

Шаг 1: Добавьте алгоритмы фильтра к блокам библиотеки функции MATLAB

  1. В Simulink создайте модель библиотеки путем выбора File> New> Library

  2. Перетащите три блока MATLAB function в модель от раздела User-Defined Functions Браузера Библиотеки Simulink и назовите их:

    • my_fft_filter

    • my_conv_filter

    • my_sobel_filter

  3. Сохраните модель библиотеки как my_filter_lib.

  4. Откройте блок MATLAB function под названием my_fft_filter, замените шаблон кода на следующий код и сохраните блок:

    function y = my_fft(x)
    
    y = fft(x);
    

  5. Замените шаблон кода в блоке my_conv_filter со следующим кодом и сохраните блок:

    function c = my_conv(a, b)
    
    c = conv(a, b);

  6. Замените шаблон кода в блоке 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 затем.

  7. В той же папке, где вы создали 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.

Шаг 2: Сконфигурируйте блоки к Inherit Properties, которую вы хотите специализировать

В этом примере данные в алгоритмах фильтра обработки сигналов должны наследовать размер, ввести, и сложность от модели Simulink. По умолчанию данные в блоках MATLAB function наследовали эти свойства. Явным образом сконфигурировать данные, чтобы наследовать свойства:

  1. Откройте блок MATLAB function и выберите Edit Data.

  2. На левой панели Портов и Менеджера данных, выберите данные интереса.

  3. На правой панели сконфигурируйте данные, чтобы наследовать свойства от Simulink:

    НаследоватьсяЧто задать
    РазмерВведите -1 в поле Size
    СложностьВыберите Inherited из меню Complexity
    ВводВыберите Inherit: То же самое как Simulink из меню Type

Например, если вы открываете блок MATLAB function my_fft_filter и смотрите на свойства входного параметра x в Портах и Менеджере данных, вы видите, что размер, введите, и сложность наследована по умолчанию.

Примечание

Если ваш дизайн имеет определенные требования или ограничения, можно ввести значения для любого из этих свойств, а не наследовать их от Simulink. Например, если ваш алгоритм, как предполагается, не работает с комплексными входными параметрами, установите Сложность на Прочь.

Шаг 3: Настройте свою библиотеку Используя маскирование

В этом осуществлении вы измените фильтр свертки my_conv, чтобы использовать пользовательский параметр shape, который задает что часть свертки вывести. Чтобы настроить этот алгоритм для вашей библиотеки, поместите блок my_conv_filter под подсистемой маскированной и задайте shape как параметр маски.

  1. Преобразуйте блок в подсистему маскированную:

    1. Щелкните правой кнопкой по блоку my_conv_filter и выберите Subsystem & Model Reference> Create Subsystem from Selection.

      my_conv_filter блокируют изменения в блоке подсистемы.

    2. Поменяйте имя подсистемы к my_conv_filter.

    3. Щелкните правой кнопкой по my_conv_filter подсистеме и выберите Mask> Create Mask из контекстного меню.

      Редактор Маски появляется с открытой вкладкой Icon & Ports.

    4. Войдите в текстовое поле команд рисования Значка:

      disp('my_conv');
      port_label('output', 1, 'c');
      port_label('input', 1, 'a');
      port_label('input', 2, 'b');

    5. Выберите вкладку Parameters & Dialog.

    6. Подсветите позицию Параметров в панели Диалогового окна.

    7. Добавьте параметр раскрывающегося типа путем нажатия на Popup в соответствии со Списком параметров в панели Средств управления.

      Новый параметр появится в панели Диалогового окна.

    8. В панели Редактора свойств, набор Свойства:

      СвойствоЗначение
      Имяshape
      Значениеполный
      Подсказкаshape
      Вводpopup
      Введите опцииОткройте Редактор Опций Типа и войдите:
      full
      same
      valid
    9. Установите Атрибуты, Диалоговое окно и Свойства макета в панели Редактора свойств:

      Атрибуты, диалоговое окно и элементы размещенияЗначение
      Атрибуты
      • Оцените: проверенный

      • Настраиваемый: очищенный

      • Только для чтения: Очищенный

      • Скрытый: Очищенный

      • Никогда не сохраняйте: Очищенный

      Диалоговое окно
      • Включите: проверенный

      • Видимый: проверенный

      • 'callback': никакая запись

      Размещение
      • Местоположение элемента: Grayed

      • Быстрое местоположение: Левый

    10. Нажать ОК.

      Ваша подсистема должна теперь выглядеть так:

  2. Установите свойства подсистемы для повторного использования кода:

    1. Щелкните правой кнопкой по my_conv_filter подсистеме и выберите Block Parameters (Subsystem) из контекстного меню.

    2. В диалоговом окне параметров подсистемы выберите Treat как атомарный модульный флажок.

      Диалоговое окно расширяется, чтобы отобразить новые поля.

    3. Чтобы сгенерировать допускающую повторное использование функцию, выберите вкладку Code Generation и в Функции упаковочное поле, выберите Reusable function из выпадающего меню.

      Примечание

      Это - дополнительный шаг, требуемый для этого примера. Если вы оставляете настройку по умолчанию Автоматических, программное обеспечение генерации кода использует внутреннее правило, чтобы определить, встроить ли функцию или нет.

    4. Нажать ОК.

  3. Задайте параметр shape в функции MATLAB my_conv:

    1. Щелкните правой кнопкой по my_conv_filter подсистеме и выберите Mask> Look Under Mask из контекстного меню.

      Блок-схема под подсистемой маскированной открывается, содержа блок my_conv_filter:

    2. Поменяйте имена блокировок порта, чтобы совпадать с именами данных можно следующим образом:

      Изменение:К:
      In1a
      In2b
      Out1c
    3. Дважды кликните блок my_conv_filter, чтобы открыть Редактор блока MATLAB function.

    4. В Редакторе блока MATLAB function выберите Edit Data.

    5. В Портах и Менеджере данных, выберите Add> Data.

      Новый элемент данных кажется выбранным, наряду с его диалоговым окном свойств.

    6. Введите следующие свойства:

      СвойствоЧто задать
      ИмяВведите shape.
      ОсциллографВыберите Parameter.
      НастраиваемыйОчистите поле.

    7. Оставьте Размер, Сложность и Тип столь наследованными (значения по умолчанию), как описанный на Шаге 2: Сконфигурируйте Блоки к Inherit Properties, которую Вы Хотите Специализировать.

    8. Нажмите Apply, закройте Порты и Менеджер данных, и возвратитесь к Редактору блока MATLAB function.

  4. Используйте параметр shape, чтобы определить размер свертки, чтобы вывести:

    1. В Редакторе блока 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
    2. Сохраните свои изменения и закройте Редактор блока MATLAB function.

Шаг 4: Добавьте экземпляры блоков библиотеки MATLAB к модели Simulink

В этом осуществлении вы добавите специализированные экземпляры my_conv_filter блока библиотеки к простой экспериментальной модели.

  1. Откройте новую модель Simulink.

    В целях этого осуществления, набор следующие параметры конфигурации для моделирования:

    ПанельРазделЧто задать
    РешательВыбор решателя
    • Выберите Fixed-Step for Type

    • Выберите дискретный (никакие непрерывные состояния) для Решателя

    • Войдите 1 для размера Фиксированного шага

    Импорт/Экспорт данныхСохраните опцииСтруктура для формата

  2. Перетащите два экземпляра блока my_conv_filter из библиотеки my_filter_lib в модель.

  3. Добавьте Постоянный, Выходной порт и блоки Отображения. Ваша модель должна выглядеть примерно так:

    И экземпляры библиотеки совместно используют тот же размер, вводят, и сложность для входных параметров a и b соответственно.

  4. Дважды кликните каждый экземпляр библиотеки.

    Значения по умолчанию параметра shape к полному для обоих экземпляров.

  5. Моделируйте модель.

    Каждый экземпляр библиотеки выводит тот же результат, полную 2D свертку:

  6. Специализируйте второй экземпляр, my_conv_filter1 путем устанавливания значения его параметра shape к тому же самому.

  7. Теперь моделируйте модель снова.

    На этот раз выходные параметры имеют различные размеры: my_conv_filter3 выводит полную 2D свертку, в то время как my_conv_filter1 отображает центральную часть свертки как 1 2 вектор, тот же размер как a:

  8. Теперь, добавьте третий экземпляр путем копирования my_conv_filter1. Специализируйте новый экземпляр, my_conv_filter2, так, чтобы он не наследовал те же входные параметры размера как первые два экземпляра:

  9. Моделируйте модель снова.

    На этот раз 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 векторы.

Кроме того, каждый экземпляр библиотеки имеет названную форму параметра маски, которая определяет что часть свертки вывести. Примите, что значение формы является тем же самым для каждого экземпляра.

Чтобы сгенерировать код для этого примера, выполните эти шаги:

  1. Включите повторное использование кода для блока библиотеки:

    1. В библиотеке щелкните правой кнопкой по блоку MATLAB function my_conv_filter и выберите Block Parameters (Subsystem) из контекстного меню.

    2. В диалоговом окне Function Block Parameters, установленном эти параметры:

      • Выберите Treat как атомарный модульный флажок.

      • В Функции упаковочное поле выберите Reusable function из выпадающего меню.

  2. Сконфигурируйте модель для генерации кода.

    В целях этого осуществления, набор следующие параметры конфигурации:

    ПанельРазделЧто задать
    Генерация кодаЦелевой выборВведите ert.tlc для System target file
    Генерация кода> Отчет Установите флажок отчета генерации кода Create.
  3. Создайте модель.

    Если вы создаете эту модель, логику повторных использований сгенерированного кода 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

Вы отлаживаете блоки библиотеки MATLAB Function тем же путем, вы отлаживаете любой блок MATLAB function. Однако, когда вы добавляете точку останова в блоке библиотеки, точка останова совместно используется всеми экземплярами. Когда вы продолжаете выполнение, остановки отладчика в точке останова в каждом экземпляре.

Свойства можно специализироваться через экземпляры блоков библиотеки

Можно специализировать экземпляры блоков библиотеки MATLAB Function, позволив им наследовать любое из следующих свойств от Simulink:

СвойствоНаследовался по умолчанию?Как задать наследование
ВводДаУстановите свойство типа данных Наследоваться: То же самое как Simulink.
РазмерДаУстановите свойство размера данных на-1.
СложностьДаУстановите свойство сложности данных на Наследованный.
Ограничьте область значенийНетЗадайте минимальные и максимальные значения как параметры Simulink.
Например, если минимальное значение = aParam и максимальное значение = aParam + 3, различные экземпляры блока библиотеки MATLAB Function могут решить к различным параметрам aParam, заданным в их родительских подсистемах маски.
Режим Sampling (вводится)ДаВходные порты блока MATLAB function всегда наследовали режим выборки
Режим переопределения типа данных для данных фиксированной точкиДаУстановите свойство переопределения типа данных Наследоваться.
Частота дискретизации (блок)ДаУстановите блочное свойство частоты дискретизации на-1.

Связанные примеры

Больше о

Была ли эта тема полезной?