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

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

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

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

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

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

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

  • Если функция 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 inlined в сгенерированный код, потому что он обращается к локальным данным из диаграммы 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