Используйте сигнал шины с S-Function Builder, чтобы создать S-функцию

В этой теме будет показано, как создать сигнал шины и подключить его к S-Function Builder. В конце вы будете использовать S-Function Builder, чтобы создать простую С MEX S-функцию.

Построитель S-функций является Simulink® блок, который интегрирует код C/C + +, чтобы создать S-функцию из спецификаций и кода С, которые вы поставляете. S-Function Builder также служит оберткой для сгенерированной S-функции в моделях, которые используют S-функцию. Дополнительные сведения о S-Function Builder см. в разделе Сборка S-функций автоматически с использованием S-Function Builder. Чтобы увидеть дополнительные примеры о том, как использовать S-Function Builder, введите sfundemos в MATLAB® Командное окно, затем перейдите к разделу C-file S-functions > S-function Builder.

  1. Начните создавать свою S-функцию, установив текущую папку в папку, в которой вы хотите создать S-функцию. Затем добавьте эту папку в путь MATLAB.

    mkdir newSfun
    addpath(fullfile(pwd,'newSfun'))
    cd('newSfun')

  2. Если вы хотите подключить сигнал шины к Входу или Выходу порту S-Function Builder, необходимо сначала создать объект шины. Можно создать объект шины в интерактивном режиме с помощью редактора шины Simulink (см. раздел «Создание и задание объектов Simulink.Bus»). Также можно использовать Simulink.Bus:

    1. В Командном Окне MATLAB введите:

      a = Simulink.Bus

      В результате этого HeaderFile для шины по умолчанию используется пустой символьный вектор:

      a =
       
      Simulink.Bus
          Description: ''
           HeaderFile: ''
             Elements: [0x1 double]
    2. Если вы хотите задать заголовочный файл для шины, то в Командном окне MATLAB введите следующее:

      a.Headerfile = 'Busdef.h'

      Если вы не задаете заголовочный файл, Simulink автоматически генерирует Sfunctionname_bus.h

    Для демонстрации того, как использовать S-Function Builder с шиной, введите следующую команду в Командном Окне MATLAB:

    open_system(fullfile(matlabroot,'/toolbox/simulink/simdemos/simfeatures/sfbuilder_bususage'))

  3. Создайте новую модель Simulink. Щелкните на холсте и введите S-Function Builder, чтобы создать образец S-Function Builder блока. Другой способ - перетащить блок S-Function Builder из библиотеки User-Defined Functions в браузере библиотек в новую модель.

  4. Щелкните на холсте и введите S-Function Builder или скопируйте образец блока S-Function Builder из библиотеки User-Defined Functions в новую модель.

  5. Дважды кликните, чтобы открыть редактор S-Function Builder.

  6. Используйте панели спецификации и записи кода в диалоговом окне S-Function Builder, чтобы ввести информацию и пользовательский исходный код, необходимые для адаптации сгенерированной S-функции к вашему приложению.

  7. Проверьте, находится ли сигнал шины между заданными верхним и нижним пределами насыщения. Для этого создайте два входных и два выходных порта и назначьте порты согласно таблице ниже:

  8. Заполните Outputs_wrapper функция с логикой вашего кода. См. код примера:

    void sfbuilder_bus_Outputs_wrapper(const SFB_COUNTERBUS *u0,
                                       const int32_T *u1,
                                       const SFB_COUNTERBUS *y0,
                                       int32_T *y1)
    {
    /* Output_BEGIN */
    int32_T limit;
      boolean_T inputGElower;
      
      /* limit is sum of SFB_SIGNALBUS.input and the second input(u1) */
      limit = u0->inputsignal.input + *u1;
      
      /* check if SFB_SIGNALBUS.limit is >= LIMITBUS.lower_saturation_limit */
      inputGElower = (limit >= u0->limits.lower_saturation_limit);
    
      if((u0->limits.upper_saturation_limit >= limit) && inputGElower) 
      {
          *y1 = limit;
      } 
      else 
      {
          if(inputGElower) 
          {
              limit = u0->limits.upper_saturation_limit;
          } else 
          {
              limit = u0->limits.lower_saturation_limit;
          }
          *y1 = limit;
      }
    
      y0->inputsignal.input = *y1;
      y0->limits = u0->limits;
    /* Output_END */
    }
  9. Щелкните стреле под Build и выберите Generate TLC wrapper, чтобы создать оболочку для S-функции для генерации кода.

  10. Нажмите Build на S-Function Builder, чтобы начать процесс сборки.

    S-Function Builder создает файл MEX, который реализует указанную S-функцию и сохраняет файл в текущей папке (см. «Как S-Function Builder создает S-функцию»).

  11. Сохраните модель, содержащую блок S-Function Builder.

Как S-Function Builder создает S-функцию

S-Function Builder создает S-функцию путем генерации следующих исходных файлов в текущей папке:

  • sfun.c - Этот файл содержит представление исходного кода C стандартных фрагментов сгенерированной S-функции.

  • sfun_wrapper.c - Этот файл содержит пользовательский код, введенный в диалоговом окне S-Function Builder.

  • sfun.tlc - Этот файл позволяет сгенерированной S-функции запускаться в Simulink Rapid Accelerator и позволяет встраивать S-функцию во время генерации кода. В сложение этот файл генерирует код для S-функции в Accelerator режим, который позволяет модели запускаться быстрее.

  • sfun_bus.h - Если вы задаете какие-либо Input port или Output port как шина в таблице Ports and Parameters, но не задавать файл заголовка, тогда S-Function Builder автоматически генерирует этот файл заголовка.

После генерации исходного кода S-функции, S-Function Builder использует mex команда, чтобы создать представление файла MEX S-функции из сгенерированного исходного кода и любого указанного внешнего пользовательского исходного кода и библиотек.

Развертывание сгенерированной S-функции

Чтобы использовать сгенерированную S-функцию в другой модели, сначала проверьте, чтобы убедиться, что папка, содержащая сгенерированную S-функцию, находится в пути MATLAB. Затем скопируйте блок S-Function Builder из модели, используемой для создания S-функции, в целевую модель. При необходимости установите параметры целевой модели равными значениям, требуемым целевой моделью.

Кроме того, можно развернуть сгенерированную S-функцию, не используя блок S-Function Builder или не раскрывая базовый исходный файл C.

  1. Откройте модель Simulink, которая будет включать S-функцию.

  2. Щелкните на холсте, чтобы создать образец блока s-function или скопируйте блок s-function из библиотеки User-Defined Functions в браузере библиотек в модель.

  3. Дважды кликните по блоку S-Function.

  4. В открывшихся Параметрах блоков окне в S-function name поле edit введите имя исполняемого файла, сгенерированного S-Function Builder.

  5. Введите любые параметры для S-функции в S-function parameters поле edit. Введите параметры в том порядке, в котором они появляются в диалоговом окне S-Function Builder.

  6. Нажмите OK в диалоговом окне Блок S-function Parameters.

Создав блок из сгенерированной S-функции, можно также создать маску для S-Function блока. Дополнительные сведения о том, как добавить маску для S-функции, см. в разделе «Создание маски блоков». Чтобы увидеть пример добавления маски блоков к S-функции, введите следующую команду в Командном окне MATLAB.

open_system(fullfile(matlabroot,'/toolbox/simulink/simdemos/simfeatures/sfcndemo_matadd'));

Можно использовать сгенерированный исполняемый файл в любом блоке S-Function в любой модели, пока исполняемый файл находится в пути MATLAB.

См. также

|

Похожие темы