Разделы кода системы управления для функций MATLAB в диаграммах Stateflow

Simulink® PLC Coder™ встраивает функции MATLAB® в сгенерированном коде на основе ваших спецификаций встраивания. Чтобы задать, встроить ли функцию:

  1. Щелкните правой кнопкой по функции MATLAB и выберите Properties.

  2. Для Function Inline Option выберите Inline если вы хотите, чтобы функция была встроена. Выберите Function если вы не хотите, чтобы функция была встроена. Для получения дополнительной информации смотрите Specify MATLAB Function Properties в Графике (Stateflow).

Однако Simulink PLC Coder не следует за вашими спецификациями встраивания точно в следующих случаях:

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

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

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

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

Следующий простой пример иллюстрирует различные случаи. Модель, используемая здесь, имеет график Stateflow®, который содержит четыре функции MATLAB fcn1 к fcn4.

Вот модель.

Вот диаграмма Stateflow.

Функции fcn1 к fcn4 определяются следующим образом.

ФункцияВстраивание спецификацииСгенерированный код

fcn1:

function y = fcn1(u)
y = u+1;
Укажите, что функция должна быть встроена.

fcn1 встраивается в сгенерированном коде.

is_c3_Chart := Chart_IN_A;
(* Outport: '<Root>/y1' incorporates:
 *  Inport: '<Root>/u1' *)
(* Entry 'A': '<S1>:10' *)
(* MATLAB Function 'fcn1': '<S1>:1' *)
(* '<S1>:1:3' *)
y1 := u1 + 1.0;

fcn2:

function y = fcn2(u)
y = u+2;
Укажите, что функция не должна быть встроена.

fcn2 не встраивается в сгенерированном коде.

is_c3_Chart := Chart_IN_B;
(* Outport: '<Root>/y2' incorporates:
 *  Inport: '<Root>/u2' *)
(* Entry 'B': '<S1>:11' *)
 y2 := fcn2(u := u2);
.
.
.
FUNCTION fcn2: LREAL
VAR_INPUT
    u: LREAL;
END_VAR
VAR_TEMP
END_VAR
(* MATLAB Function 'fcn2': '<S1>:4' *)
(* '<S1>:4:3' *)
fcn2 := u + 2.0;
END_FUNCTION

fcn3:

function y = fcn3(u)
% The function accesses 
% local data x of parent chart
y = u+3+x;
Укажите, что функция не должна быть встроена.

fcn3 встраивается в сгенерированном коде, потому что он получает доступ к локальным данным из диаграммы Stateflow.

is_c3_Chart := Chart_IN_C;
(* Outport: '<Root>/y3' incorporates:
 *  Inport: '<Root>/u3' *)
(* Entry 'C': '<S1>:15' *)
(* MATLAB Function 'fcn3': '<S1>:9' *)
(* The function accesses local data x of parent chart *)
(* '<S1>:9:4' *)
y3 := (u3 + 3.0) + x;

fcn4:

function [yy1,yy2] = fcn4(u)
yy1 = u+4;
yy2 = u+5;
Укажите, что функция не должна быть встроена.

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

is_c3_Chart := Chart_IN_D;
(* Entry 'D': '<S1>:28' *)
i0_fcn4(u := u4);
b_y4 := i0_fcn4.yy1;
b_y5 := i0_fcn4.yy2;
(* Outport: '<Root>/y4' incorporates:
 *  Inport: '<Root>/u4' *)
y4 := b_y4;
(* Outport: '<Root>/y5' *)
y5 := b_y5;
.
.
.
FUNCTION_BLOCK fcn4
VAR_INPUT
    u: LREAL;
END_VAR
VAR_OUTPUT
    yy1: LREAL;
    yy2: LREAL;
END_VAR
VAR
END_VAR
VAR_TEMP
END_VAR
(* MATLAB Function 'fcn4': '<S1>:26' *)
(* '<S1>:26:3' *)
yy1 := u + 4.0;
(* '<S1>:26:4' *)
yy2 := u + 5.0;
END_FUNCTION_BLOCK