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

Когда пользоваться библиотеками блока 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 маскируется, вы не можете изменить содержимое блока с кодом инициализации маски. Опция The Allow library block to modify its contents в диалоговом окне Mask не поддержана для библиотек блоков MATLAB Function.

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

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

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

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

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

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

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

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

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

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

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

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

  1. В Simulink создайте модель библиотеки. На вкладке Simulation выберите 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.

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

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

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

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

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

    НаследоватьсяЧто задать
    РазмерВведите -1 в поле Size
    СложностьВыберите Inherited из меню Complexity
    ВводВыберите 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
      • Включите: проверенный

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

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

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

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

    10. Нажмите OK.

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

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

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

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

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

    3. Чтобы сгенерировать допускающую повторное использование функцию, выберите вкладку Code Generation и в поле 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, закройте Порты и Менеджер данных, и возвратитесь к Редактору блока 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 for Type

    • Выберите discrete (no continuous states) for Solver

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

    Data Import/ExportSave optionsStructure для Format

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

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

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

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

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

      • Установите флажок 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' */
    }
    

Примечание

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

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

Вы отлаживаете библиотечные блоки 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.

Похожие темы