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 |