Запустите симуляции и сгенерируйте код с подсистемами библиотеки маскированными, содержащими блоки MATLAB function

В этом примере показано, как использовать подсистему библиотеки маскированную, которая содержит блок MATLAB function, чтобы запустить симуляции и сгенерировать код С. Редактирования к функциональному коду, подсистеме или свойствам маски влияют на все экземпляры блока в модели, в то время как изменения в параметре маски влияют только на выбранный блок. Используйте замаскированные библиотечные блоки, если вам нужны дублирования пользовательских блоков, которые могут сгенерировать код. Для получения дополнительной информации смотрите, Создают Пользовательскую Библиотеку и Проект и Создают Пользовательский блок.

Переместитесь по модели

Подсистема маскированная содержит блок MATLAB function, который использует conv функция, чтобы вычислить свертку двух входных векторов. Форма параметра маски позволяет вам изменять вес нормализации в full, same, или valid. Блок вычисляет свертку с помощью этого кода MATLAB:

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

В этой модели параметр формы главного экземпляра блока устанавливается на full, средний экземпляр установлен в same, и нижний экземпляр установлен в valid. Запустите симуляцию, чтобы вычислить свертку векторов и отобразить их значения в блоках Отображения.

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

Сгенерируйте код С из модели

Если у вас есть лицензия на Embedded Coder или Simulink Coder, можно сгенерировать код из этого примера, не изменяя параметры или блоки. Однако блоки MATLAB function поддерживают генерацию кода только для ограниченного подмножества функций MATLAB. Для получения дополнительной информации смотрите Функции и Объекты, Поддержанные для Генерации кода C/C++ (MATLAB Coder).

Если параметры и входные параметры идентичны для нескольких экземпляров библиотечных блоков, можно сгенерировать код с допускающими повторное использование функциями, которые представляют каждый идентичный блок MATLAB function. Можно включить это поведение путем щелчка правой кнопкой по блоку MATLAB function, нажатия на Block Parameters (Subsystem), и затем открытия вкладки Code Generation. Упаковка Функции множества к Reusable function. Для получения дополнительной информации смотрите, Генерируют Повторно используемый код от Подсистем Библиотеки, Разделяемых Через Модели (Simulink Coder).

Сгенерируйте код путем открытия Embedded Coder или приложений Simulink Coder и нажатия на Generate Code. Эта модель генерирует уникальные функции C для каждого экземпляра блока. Чтобы произвести допускающие повторное использование функции, установите параметр формы на full для каждого экземпляра подсистемы библиотеки и генерируют код. Логика повторных использований сгенерированного кода для my_conv_filter и my_conv_filter1 экземпляры, потому что у них есть те же входные параметры блока и значение параметров маски.

   /*
    * Output and update for atomic system:
    *    '<S1>/MATLAB Function'
    *    '<S2>/MATLAB Function'
    */
   void MATLAB_custom_bl_MATLABFunction(const real_T rtu_a[2], const
   real_T rtu_b[5],
     real_T rty_c[6])
   {
     int32_T b_k; int32_T i; int32_T tmp; for (i = 0; i < 6; i++) {
       rty_c[i] = 0.0;
     }
     for (i = 0; i < 2; i++) {
       for (b_k = 0; b_k < 5; b_k++) {
         tmp = i + b_k; rty_c[tmp] += rtu_a[i] * rtu_b[b_k];
       }
     }
   }

my_conv_filter2 экземпляр использует различную функцию, потому что он использует различные входные параметры.

   /* Output and update for atomic system: '<S3>/MATLAB Function' */
   void MATLAB_custom__MATLABFunction_p(const real_T rtu_a[3], const
   real_T rtu_b[3],
     real_T rty_c[5])
   {
     int32_T i; for (i = 0; i < 5; i++) {
       rty_c[i] = 0.0;
     }
     for (i = 0; i < 3; i++) {
       rty_c[i] += rtu_b[i] * rtu_a[0]; rty_c[i + 1] += rtu_b[i] *
       rtu_a[1]; rty_c[i + 2] += rtu_b[i] * rtu_a[2];
     }
   }

Смотрите также

Похожие темы