Simulink® PLC Coder™ встраивает функции MATLAB® в сгенерированном коде на основе ваших спецификаций встраивания. Чтобы задать, встроить ли функцию:
Щелкните правой кнопкой по функции MATLAB и выберите Properties.
Для 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
определяются следующим образом.
Функция | Встраивание спецификации | Сгенерированный код |
---|---|---|
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 |