Блокируйте методы конечного файла

Блокируйте обзор функций

Каждый блок имеет конечный файл, который определяет, какой код должен быть сгенерирован для блока. Код может варьироваться в зависимости от точных параметров блока или типов связей с ним (например, широкий по сравнению со скалярным входом).

В каждом конечном файле блока block functions задает код, который будет выведен для блока в start модели или подсистемы функция, output функция, update функция, и так далее.

Функции, объявленные в каждом из конечных файлов блока, вызваны системными конечными файлами. В этих таблицах, block относится к имени блока Simulink® (например, gain для блока Gain) и system относится к подсистеме, в которой находится блок. Первая таблица приводит две функции, которые используются в предварительной обработке и настройке. Ни одна из этих функций выходной сгенерированный код.

Следующие функции генерируют исполняемый код, который генератор кода помещает соответственно:

В условиях объектно-ориентированного программирования эти функции являются полиморфными по своей природе, потому что каждый конечный файл блока содержит те же функции. Компилятор Выходного языка динамически определяет во времени выполнения, которые блокируют функцию, чтобы выполниться в зависимости от типа блока. Таким образом, системный файл только указывает что Outputs функция, например, должна быть выполнена. Конкретный Outputs функция определяется целевым Языковым компилятором в зависимости от типа блока.

Чтобы записать конечный файл блока, используйте эти полиморфные функции блока, объединенные с библиотечными функциями Компилятора Выходного языка. Для полного списка библиотечных функций Компилятора Выходного языка см. Справочное руководство по библиотеке Функции TLC на Компиляторе Выходного языка.

BlockInstanceSetup (блок, система)

BlockInstanceSetup функция выполняется для блоков, которые имеют эту функцию, определяемую в их конечных файлах в модели. Например, если модель включает 10 От блоков Рабочей области, то BlockInstanceSetup функция в fromwks.tlc выполняется 10 раз, однажды для каждого экземпляра блока From Workspace. Используйте BlockInstanceSetup сгенерировать код для каждого экземпляра данного типа блока.

См. Справочное руководство по библиотеке Функции TLC на Компиляторе Выходного языка для доступных сервисных функций обработки, чтобы вызвать из этой функции блока. Смотрите файл matlabroot/rtw/c/tlc/blocks/lookup2d.tlc для примера BlockInstanceSetup функция.

Синтаксис


	BlockInstanceSetup(block, system) void
    block = Reference to a Simulink block
    system = Reference to a nonvirtual Simulink subsystem

Этот пример использует BlockInstanceSetup:

%function BlockInstanceSetup(block, system) void
%if (block.InMask == "yes")
    %assign blockName = LibParentMaskBlockName(block)
  %else
    %assign blockName = LibGetFormattedBlockPath(block)
  %endif
  %if (CodeFormat == "Embedded-C")
    %if !(ParamSettings.ColZeroTechnique == "NormalInterp" && ...
          ParamSettings.RowZeroTechnique == "NormalInterp")
      %selectfile STDOUT

Note: Removing repeated zero values from the X and Y axes will 
produce more efficient code for block: %<blockName>.  To locate 
this block, type

open_system('%<blockName>')

at the MATLAB command prompt.

      %selectfile NULL_FILE
    %endif
  %endif
%endfunction

BlockTypeSetup (блок, система)

BlockTypeSetup выполняется однажды на тип блока, прежде чем генерация кода начнет. Таким образом, если 10 блоков Интерполяционной таблицы существуют в модели, BlockTypeSetup функция в look_up.tlc называется только в один раз. Используйте эту функцию, чтобы выполнить общую работу для нескольких блоков данного типа.

См. Справочное руководство по библиотеке Функции TLC на Компиляторе Выходного языка для списка соответствующих функций, чтобы вызвать из этой функции блока. Смотрите look_up.tlc для примера BlockTypeSetup функция.

Синтаксис


	BlockTypeSetup(block, system) void
    block = Reference to a Simulink block
    system = Reference to a nonvirtual Simulink subsystem

Как пример, учитывая S-функцию foo, который требует #define и два объявления функции в заголовочном файле, вы могли задать:

%function BlockTypeSetup(block, system) void

  %% Place a #define in the model's header file

  %openfile buffer
    #define A2D_CHANNEL 0
  %closefile buffer
           
  %<LibCacheDefine(buffer)>

  %% Place function prototypes in the model's header file

  %openfile buffer
    void start_a2d(void);
    void reset_a2d(void);
  %closefile buffer
           
  %<LibCacheFunctionPrototype(buffer)>
%endfunction

Функции оставшегося блока выполняются однажды для каждого блока в модели.

Включите (блок, система)

Генератор кода создает Enable функции для невиртуальной подсистемы каждый раз, когда Подсистема Simulink содержит блок с Enable функция. Включая Enable функция в конечном файле блока помещает, конкретный блок включают код в этой подсистеме Enable функция. Например:

%% Function: Enable ============================================
%% Abstract:
%% Subsystem Enable code is required only for the discrete form
%% of the Sine Block. Setting the Boolean to TRUE causes the
%% Output function to resync its last values of cos(wt) and
%% sin(wt).
%%
%function Enable(block, system) Output
  %if LibIsDiscrete(TID)
    /* %<Type> Block: %<Name> */
    %<LibBlockIWork(SystemEnable, "", "", 0)> = (int_T) TRUE;
 
  %endif
%endfunction

Отключите (блок, система)

Невиртуальная подсистема Disable функции создаются каждый раз, когда Подсистема Simulink содержит блок с Disable функция. Включая Disable функция в конечном файле блока помещает, конкретный блок отключают код в эту подсистему Disable функция.

Запустите (блок, система)

Включайте Start функционируйте, чтобы поместить код в Start функция. Код в Start функция выполняется однажды и только однажды. Как правило, вы включаете Start функция, чтобы выполнить код однажды в начале симуляции (например, инициализируйте значения в векторах работы), или код, который не должен быть повторно выполнен, когда подсистема, в которой это находится, включена. Смотрите constant.tlc для примера Start функция.

%% Function: Start ============================================
%% Abstract:
%% Set the output to the constant parameter value if the block
%% output is visible in the model's start function scope, i.e.,
%% it is in the global rtB structure.
%%
%function Start(block, system) Output
  %if  LibBlockOutputSignalIsInBlockIO(0)
    /* %<Type> Block: %<Name> */
    %assign rollVars = ["Y", "P"]
    %roll idx = RollRegions, lcv = RollThreshold, block, ...
      "Roller", rollVars
      %assign yr = LibBlockOutputSignal(0,"", lcv, ...
        "%<tRealPart>%<idx>")
      %assign pr = LibBlockParameter(Value, "", lcv, ...
        "%<tRealPart>%<idx>")
      %<yr> = %<pr>;
      %if LibBlockOutputSignalIsComplex(0)
        %assign yi = LibBlockOutputSignal(0, "", lcv, ...
          "%<tImagPart>%<idx>")
        %assign pi = LibBlockParameter(Value, "", lcv, ...
          "%<tImagPart>%<idx>")
        %<yi> = %<pi>;
      %endif
    %endroll  
  %endif
%endfunction %% Start

InitializeConditions (блок, система)

Код TLC, который сгенерирован от InitializeConditions блока функция появляется в одном из двух мест. Невиртуальная подсистема содержит Initialize функционируйте, когда это сконфигурировано, чтобы сбросить состояния на, включают. В этом случае код TLC, сгенерированный этой функцией блока, помещается в подсистему Initialize функция и start вызовы функции эта подсистема Initialize функция. Если, однако, блок Simulink находится в корневой системе или в невиртуальной подсистеме, которая не требует Initialize функция, код, сгенерированный от этой функции блока, помещается непосредственно (встроенная) в start функция.

Существует тонкое различие между функциями блока Start и InitializeConditions. Как правило, вы включаете Start функция, чтобы выполнить код, который не должен повторно выполняться, когда подсистема, в которой это находится, включена. Вы включаете InitializeConditions функция, чтобы выполнить код, который должен повторно выполниться, когда подсистема, в которой это находится, включена. Например:

%% Function: InitializeConditions =============================
%%
%% Abstract: Invalidate the stored output and input in 
%% rwork[1 2*blockWidth] by setting the time stamp stored 
%% in rwork[0]) to rtInf.
%%
%function InitializeConditions(block, system) Output
  /* %<Type> Block: %<Name> */
  %<LibBlockRWork(PrevT, "", "", 0)> = %<LibRealNonFinite(inf)>;
%endfunction

Выходные параметры (блок, система)

Блок должен обычно включать Outputs функция. Код TLC сгенерирован Outputs блока функция помещается в одно из двух мест. Код помещается непосредственно в Outputs модели функционируйте, если блок не находится в невиртуальной подсистеме, и в Outputs подсистемы функционируйте, если блок находится в невиртуальной подсистеме. Например:

%% Function: Outputs ==========================================
%% Abstract:
%%      Y[i] = fabs(U[i]) if U[i] is real or
%%      Y[i] = sqrt(U[i].re^2 + U[i].im^2) if U[i] is complex.
%%
%function Outputs(block, system) Output
  /* %<Type> Block: %<Name> */
  %%
  %assign inputIsComplex = LibBlockInputSignalIsComplex(0)
  %assign RT_SQUARE = "RT_SQUARE"
  %%
  %assign rollVars = ["U", "Y"]
  %if inputIsComplex
    %roll sigIdx = RollRegions, lcv = RollThreshold, ...
      block, "Roller", rollVars
      %%
      %assign ur = LibBlockInputSignal( 0, "", lcv, ...
        "%<tRealPart>%<sigIdx>")
      %assign ui = LibBlockInputSignal( 0, "", lcv, ...
        "%<tImagPart>%<sigIdx>")
      %%
      %assign y = LibBlockOutputSignal(0, "", lcv, sigIdx)
      %<y> = sqrt( %<RT_SQUARE>( %<ur> ) + %<RT_SQUARE>( %<ui> ) );
    %endroll
  %else
    %roll sigIdx = RollRegions, lcv = RollThreshold, ...
      block, "Roller", rollVars
      %assign u = LibBlockInputSignal (0, "", lcv, sigIdx)
      %assign y = LibBlockOutputSignal(0, "", lcv, sigIdx)
      %<y> = fabs(%<u>);
    %endroll
  %endif
  %endfunction

Примечание

Код сброса пересечения нулем помещается в Outputs функция.

Если вы пишете код TLC, чтобы сгенерировать встроенный код от S-функции, и если код TLC содержит Outputs функция, необходимо изменить код TLC, если все эти условия верны:

  • Выходной порт использует или наследовал постоянный шаг расчета. Выходной порт имеет постоянное значение.

  • S-функция является многоскоростной S-функцией или использует основанные на порте шаги расчета.

В этом случае код TLC должен сгенерировать код для выходного порта с постоянным знаком при помощи функционального OutputsForTID вместо функционального Outputs. Для получения дополнительной информации смотрите Задающий Постоянный Шаг расчета (Inf) для Порта (Simulink).

Обновление (блок, система)

Включайте Update функционируйте, если блок имеет код, который должен быть обновлен на каждом главном временном шаге. Код, сгенерированный от этой функции, помещается или в модель или в Update подсистемы функция, в зависимости от того, находится ли блок в невиртуальной подсистеме. Например:

%% Function: Update ============================================
%% Abstract:
%%      X[i] = U[i]
%%
%function Update(block, system) Output
  /* %<Type> Block: %<Name> */
  %assign rollVars = ["U", "Xd"] 
  %roll idx = RollRegions, lcv = RollThreshold, block, ... 
    "Roller", rollVars 
    %assign u = LibBlockInputSignal(0, "", lcv, idx) 
    %assign x = LibBlockDiscreteState("", lcv, idx) 
    %<x> = %<u>;
  %endroll
%endfunction %% Update

Производные (блок, система)

Включайте Derivatives функционируйте при генерации кода, чтобы вычислить непрерывные состояния блока. Код, сгенерированный от этой функции, помещается или в модель или в Derivatives подсистемы функция, в зависимости от того, находится ли блок в невиртуальной подсистеме. Смотрите integrat.tlc для примера Derivatives функция.

Оконечный (блок, система)

Включайте Terminate функционируйте, чтобы поместить код в MdlTerminate. Пользовательские конечные файлы S-функции могут использовать эту функцию, чтобы сохранить данные, свободную память, оборудование сброса на цели, и так далее. Смотрите tofile.tlc для примера Terminate функция.

Похожие темы