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