exponenta event banner

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

Использование библиотек функциональных блоков MATLAB

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

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

Создание пользовательских библиотек функциональных блоков MATLAB

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

  1. Добавление полиморфного кода MATLAB в функциональные блоки MATLAB в модели Simulink.

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

  2. Настройте блоки для наследования специальных свойств.

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

  3. При необходимости настройте код библиотеки с помощью маскирования.

  4. Добавление экземпляров блоков библиотеки функций MATLAB в модель Simulink.

Примечание

Если библиотека функциональных блоков MATLAB маскирована, изменить содержимое блока с помощью кода инициализации маски невозможно. Параметр Разрешить блоку библиотеки изменять его содержимое в диалоговом окне Маска (Mask) не поддерживается для библиотек блоков функций MATLAB.

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

Чему вы научитесь

В этом простом примере рассматривается рабочий процесс, описанный в разделе Создание пользовательских библиотек функциональных блоков MATLAB, в котором показано, как:

  • Создание библиотеки алгоритмов фильтров обработки сигналов с использованием функциональных блоков MATLAB

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

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

Сведения о алгоритмах фильтрации

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

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

my_conv.  Свертывает два входных векторных сигнала. Выводит подраздел свертки с размером, заданным параметром маски. Shape.

my_sobel.  Свертывает входную матрицу 2D с фильтром обнаружения кромки Собеля.

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

  1. В Simulink создайте библиотечную модель. На вкладке «Моделирование» выберите «Создать» > «Библиотека»

  2. Перетащите три функциональных блока MATLAB в модель из раздела «Пользовательские функции» браузера библиотеки Simulink и присвойте им имя:

    • my_fft_filter

    • my_conv_filter

    • my_sobel_filter

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

  4. Откройте функциональный блок MATLAB с именем 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 входную матрицу с фильтром обнаружения ребер Собеля. Вызвав функцию, а не встраивая код непосредственно в блок 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.

Шаг 2: Настройка блоков для наследования свойств, которые необходимо специализировать

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

  1. Откройте функциональный блок MATLAB и выберите «Редактировать данные».

  2. На левой панели Диспетчера портов и данных выберите интересующие данные.

  3. На правой панели настройте данные для наследования свойств из Simulink:

    УнаследоватьЧто указать
    РазмерВойти -1 в поле «Размер»
    СложностьВ меню «Сложность» выберите пункт «Унаследовано»
    НапечататьВ меню «Тип» выберите «Наследовать: то же, что и Simulink»

Например, если открыть функциональный блок MATLAB my_fft_filter и просмотреть свойства ввода x в Диспетчере портов и данных этот размер, тип и сложность наследуются по умолчанию.

Примечание

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

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

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

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

    1. Щелкните правой кнопкой мыши блок my_conv_filter и выберите «Подсистема и ссылка на модель» > «Создать подсистему из выбора».

      Блок my_conv_filter изменяется на блок подсистемы.

    2. Измените имя подсистемы на my_conv_filter.

    3. Щелкните правой кнопкой мыши подсистему my_conv_filter и выберите в контекстном меню «Маска» > «Создать маску».

      Появится редактор масок с открытой вкладкой Icon & Ports.

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

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

    5. Перейдите на вкладку «Параметры и диалоговое окно».

    6. Выделите элемент строки Параметры на панели Диалоговое окно.

    7. Добавьте параметр всплывающего типа, щелкнув Всплывающее меню в списке Параметры (Parameter) на панели Элементы управления (Controls).

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

    8. На панели редактора свойств задайте свойства:

      СобственностьСтоимость
      Имяshape
      Стоимостьfull
      Быстрыйshape
      Напечататьpopup
      Параметры типа

      Откройте Редактор параметров типа и введите:

      full
      same
      valid

    9. Задайте свойства Атрибуты (Attributes), Диалоговое окно (Dialog) и Компоновка (Layout) на панели Редактор свойств (Property ed

      Атрибуты, диалоговое окно и элементы компоновкиСтоимость
      Признаки
      • Вычислить: проверено

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

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

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

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

      Диалог
      • Включить: Проверено

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

      • Обратный вызов: запись отсутствует

      Расположение
      • Расположение элемента: Недоступно серым цветом

      • Расположение запроса: Слева

    10. Нажмите кнопку ОК.

      Ваша подсистема теперь должна выглядеть следующим образом:

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

    1. Щелкните правой кнопкой мыши подсистему my_conv_filter и выберите в контекстном меню «Параметры блока (подсистема)».

    2. В диалоговом окне параметров подсистемы установите флажок Считать атомной единицей измерения (Treat as atomic unit).

      Диалоговое окно открывается для отображения новых полей.

    3. Для создания многократно используемой функции выберите закладку Создание кода, а в поле Упаковка функций выберите Reusable function из раскрывающегося меню.

      Примечание

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

    4. Нажмите кнопку ОК.

  3. Определите shape в функции MATLAB my_conv:

    1. Щелкните правой кнопкой мыши подсистему my_conv_filter и выберите в контекстном меню «Маска» > «Искать под маской».

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

    2. Измените имена блоков портов в соответствии с именами данных следующим образом:

      Изменение:Кому:
      In1a
      In2b
      Out1c
    3. Дважды щелкните по блоку my_conv_filter, чтобы открыть редактор функциональных блоков MATLAB.

    4. В редакторе функциональных блоков MATLAB выберите «Редактировать данные».

    5. В Диспетчере портов и данных выберите Добавить > Данные.

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

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

      СобственностьЧто указать
      ИмяВойти shape.
      ОбъемВыберите Параметр (Parameter).
      НастраиваемыйСнимите флажок.

    7. Оставьте унаследованными значения «Размер», «Сложность» и «Тип» (значения по умолчанию), как описано в шаге 2: Настройка блоков для наследования свойств, которые требуется специализировать.

    8. Нажмите Apply, закройте диспетчер портов и данных и вернитесь в редактор функциональных блоков MATLAB.

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

    1. В редакторе функциональных блоков MATLAB измените 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.

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

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

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

    В данном упражнении задайте следующие параметры конфигурации для моделирования:

    СтеклоРазделЧто указать
    Решающее устройствоВыбор решателя
    • Выбор фиксированного шага для типа

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

    • Введите 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 наследуют одни и те же свойства, они могут повторно использовать созданный код, как показано на примере, основанном на шаге 4: Добавление экземпляров блоков библиотеки MATLAB в модель Simulink:

В этой модели экземпляры библиотеки my_conv_filter и my_conv_filter1 наследуют одинаковый размер, тип и сложность для каждого соответствующего ввода. Для каждого экземпляра введите a является вектором 1 на 2 и входным b является вектором 1 на 5. Для сравнения, входы my_conv_filter2 наследуют различные соответствующие размеры; оба являются векторами 1 на 3.

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

Чтобы создать код для этого примера, выполните следующие действия.

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

    1. В библиотеке щелкните правой кнопкой мыши функциональный блок MATLAB my_conv_filter и в контекстном меню выберите «Параметры блока (подсистема)».

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

      • Установите флажок Считать атомной единицей измерения (Treat as atomic unit).

      • В поле Упаковка функций выберите Reusable function из раскрывающегося меню.

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

    Для выполнения этого упражнения задайте следующие параметры конфигурации:

    СтеклоРазделЧто указать
    Создание кодаЦелевой выборВведите ert.tlc для System target file
    Создание кода > Отчет Установите флажок Создать отчет о создании кода.
  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' */
    }
    

Примечание

Для создания кода C для этой модели требуется лицензия Simulink Coder™ или Embedded Coder ®.

Отладка блоков библиотеки функций MATLAB

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

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

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

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

Связанные темы