Simulink ® PLC Coder™ inlines MATLAB ® функционирует в сгенерированном коде в соответствии со спецификациями. Чтобы указать, следует ли встроить функцию, выполните следующие действия.
Щелкните правой кнопкой мыши функцию MATLAB и выберите «Свойства».
Для параметра «Встроенная функция» выберите Inline если вы хотите, чтобы функция была встроена. Выбрать Function если вы не хотите, чтобы функция была встроена. Дополнительные сведения см. в разделе Задание свойств функций MATLAB (Stateflow).
Однако кодер Simulink PLC не соответствует вашим спецификациям в следующих случаях:
Если функция MATLAB обращается к локальным данным диаграммы, она встраивается в сгенерированный код, даже если указано, что функция не должна быть встроена.
Пояснение: Диаграмма преобразуется в функциональный блок в сгенерированном коде. Если функция MATLAB на диаграмме преобразована в функцию структурированного текста, она не может получить доступ к данным экземпляра функционального блока. Поэтому функция MATLAB не может быть преобразована в функцию структурированного текста в сгенерированном коде и встроена.
Если функция MATLAB имеет несколько выходов и вы указываете, что функция не должна быть встроена, она преобразуется в функциональный блок в сгенерированном коде.
Объяснение: функция структурированного текста не может иметь несколько выходов, поэтому функция MATLAB не может быть преобразована в функцию структурированного текста.
Следующий простой пример иллюстрирует различные случаи. Используемая здесь модель имеет диаграмму Stateflow ®, которая содержит четыре функции MATLABfcn1 кому fcn4.
Вот модель.

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

Функции fcn1 кому fcn4 определяются следующим образом.
| Функция | Спецификация встраивания | Сгенерированный код |
|---|---|---|
|
function y = fcn1(u) y = u+1; | Укажите, что функция должна быть встроена. |
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; |
|
function y = fcn2(u) y = u+2; | Укажите, что функция не должна быть встроена. |
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 |
|
function y = fcn3(u) % The function accesses % local data x of parent chart y = u+3+x; | Укажите, что функция не должна быть встроена. |
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; |
|
function [yy1,yy2] = fcn4(u) yy1 = u+4; yy2 = u+5; | Укажите, что функция не должна быть встроена. |
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 |