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

Когда использовать блоки 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.

Примечание

Если ваша < reservedrangesplaceholder2 > библиотека блоков замаскирована, вы не можете редактировать содержимое блока с кодом инициализации маски. Опция Allow library block to modify its contents в диалоговом окне «Маска» не поддерживается для MATLAB Function библиотек блоков.

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

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

Этот простой пример рассмотрит рабочий процесс, описанный в How to Create Custom MATLAB Function Block Libraries, чтобы показать, как:

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

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

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

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

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

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

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

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

Шаг 1: Добавьте Алгоритмы Фильтра, чтобы Функция MATLAB Библиотечных блоков

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

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

    • 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);

    The 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 Function блоках наследуют эти свойства. Чтобы явным образом сконфигурировать данные для наследования свойств:

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

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

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

    УнаследоватьЧто указать
    РазмерВведите -1 в поле Size
    СложностьВыберите Inherited из меню «Сложность»
    НапечататьВыберите Inherit: Same as Simulink из меню Type

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

Примечание

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

Шаг 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. Введите в Icon drawing commands текстовое поле:

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

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

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

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

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

    8. На панели Property editor установите Properties:

      СвойствоЗначение
      Nameshape
      Valuefull
      Promptshape
      Typepopup
      Type options

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

      full
      same
      valid

    9. Установите свойства Attributes, Dialog и Layout на панели Property editor:

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

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

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

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

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

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

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

      • Коллбэк: нет записи

      Layout
      • Расположение элемента: Серый

      • Расположение приглашения: слева

    10. Нажмите OK.

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

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

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

    2. В диалоговом окне параметров подсистемы установите флажок Treat as atomic unit.

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

    3. Чтобы сгенерировать переиспользуемую функцию, выберите вкладку Генерации кода и в поле Function packaging выберите Reusable function из раскрывающегося меню.

      Примечание

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

    4. Нажмите OK.

  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. Оставьте Size, Complexity и Type как унаследованные (значения по умолчанию), как описано в шаге 2: Настройка блоков для наследования свойств, которые вы хотите специализировать.

    8. Нажмите Apply, закройте Ports and Данных Manager и вернитесь к Блоку 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.

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

    ПанельРазделЧто указать
    SolverSolver selection
    • Выберите Fixed-Step для Type

    • Выберите discrete (no continuous states) для Solver

    • Введите 1 для Fixed-step size

    Data Import/ExportSave optionsStructure для Format

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

  3. Добавьте Constant, Outport и Display блоки. Ваша модель должна выглядеть примерно так:

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

  4. Дважды кликните каждый образец библиотеки.

    The shape параметр по умолчанию full для обоих образцов.

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

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

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

  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 Параметры Блоков установите эти параметры:

      • Установите флажок Treat as atomic unit.

      • В Function packaging поле выберите Reusable function из раскрывающегося меню.

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

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

    ПанельРазделЧто указать
    Code GenerationTarget selectionВведите ert.tlc для System target file
    Code Generation> Report Установите Create code generation report флажок.
  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™ или Embedded Coder® лицензия.

Отладка функциональных Библиотечных блоков MATLAB

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

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

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

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

Похожие темы