exponenta event banner

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

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

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

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

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

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

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

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

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

Следующий простой пример иллюстрирует различные случаи. Используемая здесь модель имеет диаграмму Stateflow ®, которая содержит четыре функции MATLABfcn1 кому 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