exponenta event banner

Проектирование и создание пользовательского блока

Проектирование пользовательского блока

Как правило, для проектирования пользовательского блока используется следующий процесс:

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

Пример модели sldemo_customsat использует базовую версию блока.

Определение пользовательского поведения блока

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

  • Включение и отключение верхнего или нижнего предела насыщения.

  • Установка верхнего и/или нижнего пределов с помощью параметров блока.

  • Установка верхнего и/или нижнего пределов с использованием входного сигнала.

Он также имеет следующие ограничения:

  • Входной сигнал при насыщении должен быть скаляром.

  • Входной сигнал и пределы насыщения должны иметь двойной тип данных.

  • Создание кода не требуется.

Выбор пользовательского типа блока

На основе пользовательских функций блоков реализация должна поддерживать следующее:

  • Несколько входных портов

  • Относительно простой алгоритм

  • Нет непрерывных или дискретных состояний системы

Поэтому в данном учебном пособии пользовательский блок реализован с помощью функции Level-2 MATLAB ® S-function. S-функции MATLAB поддерживают несколько входов и, поскольку алгоритм прост, не имеют значительных накладных расходов при обновлении диаграммы или моделировании модели. Описание различных функциональных возможностей, предоставляемых S-функциями MATLAB, по сравнению с другими типами пользовательских блоков см. в разделе Сравнение функциональных возможностей пользовательских блоков.

Параметризация S-функции MATLAB

Начните с определения параметров S-функции. В этом примере требуется четыре параметра:

  • Первый параметр указывает, как устанавливается верхний предел насыщения. Предел может быть выключен, установлен через параметр блока или установлен через входной сигнал.

  • Второй параметр - это значение верхнего предела насыщения. Это значение используется только в том случае, если верхний предел насыщения устанавливается с помощью параметра блока. В случае использования этого параметра необходимо иметь возможность изменять значение параметра во время моделирования, т.е. параметр является настраиваемым.

  • Третий параметр указывает, как устанавливается нижний предел насыщения. Предел может быть выключен, установлен через параметр блока или установлен через входной сигнал.

  • Четвертый параметр - это значение нижнего предела насыщения. Это значение используется только в том случае, если нижний предел насыщения устанавливается с помощью параметра блока. Как и в случае верхнего предела насыщения, этот параметр настраивается при использовании.

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

  • 1 указывает, что предел насыщения выключен.

  • 2 указывает, что предел насыщения устанавливается с помощью параметра блока.

  • 3 указывает, что предел насыщения устанавливается посредством входного сигнала.

Запись S-функции MATLAB

После определения параметров и функциональных возможностей S-функции запишите S-функцию. Шаблон msfuntmpl.m предоставляет начальную точку для записи Level-2 MATLAB S-функции. В файле можно найти завершенную версию пользовательского блока насыщения custom_sat.m. Сохраните этот файл в рабочей папке перед продолжением работы с этим учебным пособием.

Эта S-функция изменяет шаблон S-функции следующим образом:

  • setup инициализирует количество входных портов на основе значений, введенных для верхнего и нижнего режимов ограничения насыщения. Если пределы устанавливаются посредством входных сигналов, способ добавляет входные порты к блоку. setup Затем метод указывает на наличие четырех параметров S-функции и устанавливает возможность настройки параметра. Наконец, метод регистрирует методы S-функций, используемые во время моделирования.

    function setup(block)
    
    % The Simulink engine passes an instance of the Simulink.MSFcnRunTimeBlock
    % class to the setup method in the input argument "block". This is known as
    % the S-function block's run-time object.
    
    % Register original number of input ports based on the S-function
    % parameter values
    
    try % Wrap in a try/catch, in case no S-function parameters are entered
        lowMode    = block.DialogPrm(1).Data;
        upMode     = block.DialogPrm(3).Data;
        numInPorts = 1 + isequal(lowMode,3) + isequal(upMode,3);
    catch
        numInPorts=1;
    end % try/catch
    block.NumInputPorts = numInPorts;
    block.NumOutputPorts = 1;
    
    % Setup port properties to be inherited or dynamic
    block.SetPreCompInpPortInfoToDynamic;
    block.SetPreCompOutPortInfoToDynamic;
    
    % Override input port properties
    block.InputPort(1).DatatypeID  = 0;  % double
    block.InputPort(1).Complexity  = 'Real';
    
    % Override output port properties
    block.OutputPort(1).DatatypeID  = 0; % double
    block.OutputPort(1).Complexity  = 'Real';
    
    % Register parameters. In order:
    % -- If the upper bound is off (1) or on and set via a block parameter (2)
    %    or input signal (3)
    % -- The upper limit value. Should be empty if the upper limit is off or
    %    set via an input signal
    % -- If the lower bound is off (1) or on and set via a block parameter (2)
    %    or input signal (3)
    % -- The lower limit value. Should be empty if the lower limit is off or
    %    set via an input signal
    block.NumDialogPrms     = 4;
    block.DialogPrmsTunable = {'Nontunable','Tunable','Nontunable', ...
        'Tunable'};
    
    % Register continuous sample times [0 offset]
    block.SampleTimes = [0 0];
    
    %% -----------------------------------------------------------------
    %% Options
    %% -----------------------------------------------------------------
    % Specify if Accelerator should use TLC or call back into
    % MATLAB script
    block.SetAccelRunOnTLC(false);
    
    %% -----------------------------------------------------------------
    %% Register methods called during update diagram/compilation
    %% -----------------------------------------------------------------
    
    block.RegBlockMethod('CheckParameters',      @CheckPrms);
    block.RegBlockMethod('ProcessParameters',    @ProcessPrms);
    block.RegBlockMethod('PostPropagationSetup', @DoPostPropSetup);
    block.RegBlockMethod('Outputs',              @Outputs);
    block.RegBlockMethod('Terminate',            @Terminate);
    %end setup function
    

  • CheckParameters метод проверяет значения, введенные в блок S-Function Level-2 MATLAB.

    function CheckPrms(block)
    
    lowMode = block.DialogPrm(1).Data;
    lowVal  = block.DialogPrm(2).Data;
    upMode  = block.DialogPrm(3).Data;
    upVal   = block.DialogPrm(4).Data;
    
    % The first and third dialog parameters must have values of 1-3
    if ~any(upMode == [1 2 3]);
        error('The first dialog parameter must be a value of 1, 2, or 3');
    end
    
    if ~any(lowMode == [1 2 3]);
        error('The first dialog parameter must be a value of 1, 2, or 3');
    end
    
    % If the upper or lower bound is specified via a dialog, make sure there
    % is a specified bound. Also, check that the value is of type double
    if isequal(upMode,2),
        if isempty(upVal),
            error('Enter a value for the upper saturation limit.');
        end
        if ~strcmp(class(upVal), 'double')
            error('The upper saturation limit must be of type double.');
        end
    end
    
    if isequal(lowMode,2),
        if isempty(lowVal),
            error('Enter a value for the lower saturation limit.');
        end
        if ~strcmp(class(lowVal), 'double')
            error('The lower saturation limit must be of type double.');
        end
    end
    
    % If a lower and upper limit are specified, make sure the specified
    % limits are compatible.
    if isequal(upMode,2) && isequal(lowMode,2),
        if lowVal >= upVal,
            error('The lower bound must be less than the upper bound.');
        end
    end
    
    %end CheckPrms function
    

  • ProcessParameters и PostPropagationSetup методы обрабатывают настройку параметров S-функции.

    function ProcessPrms(block)
    
    %% Update run time parameters
    block.AutoUpdateRuntimePrms;
    
    %end ProcessPrms function
    
    
    function DoPostPropSetup(block)
    
    %% Register all tunable parameters as runtime parameters.
    block.AutoRegRuntimePrms;
    
    %end DoPostPropSetup function

  • Outputs способ вычисляет выходной сигнал блока на основе настроек параметра S-функции и любых входных сигналов.

    function Outputs(block)
    
    lowMode    = block.DialogPrm(1).Data;
    upMode     = block.DialogPrm(3).Data;
    sigVal     = block.InputPort(1).Data;
    lowPortNum = 2; % Initialize potential input number for lower saturation limit
    
    % Check upper saturation limit
    if isequal(upMode,2), % Set via a block parameter
        upVal = block.RuntimePrm(2).Data;
    elseif isequal(upMode,3), % Set via an input port
        upVal = block.InputPort(2).Data;
        lowPortNum = 3; % Move lower boundary down one port number
    else
        upVal = inf;
    end
    
    % Check lower saturation limit
    if isequal(lowMode,2), % Set via a block parameter
        lowVal = block.RuntimePrm(1).Data;
    elseif isequal(lowMode,3), % Set via an input port
        lowVal = block.InputPort(lowPortNum).Data;
    else
        lowVal = -inf;
    end
    
    % Assign new value to signal
    if sigVal > upVal,
        sigVal = upVal;
    elseif sigVal < lowVal,
        sigVal=lowVal;
    end
    
    block.OutputPort(1).Data = sigVal;
    
    %end Outputs function

Размещение пользовательских блоков в библиотеке

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

В этом примере пользовательский блок насыщения помещается в библиотеку.

  1. В редакторе Simulink ® на вкладке «Моделирование» выберите «Создать» > «Библиотека».

  2. Из Определенной Пользователями библиотеки Функций тяните Уровень 2 MATLAB S-Function block в свою новую библиотеку.

  3. Сохранить библиотеку с именем файла saturation_lib.

  4. Дважды щелкните блок, чтобы открыть его диалоговое окно «Параметры функционального блока».

  5. В поле Имя S-функции введите имя S-функции. Например, введите custom_sat. В поле Параметры введите 2,-1,2,1.

  6. Нажмите кнопку ОК.

    Создан пользовательский блок насыщения, который можно использовать совместно с другими пользователями.

Блок можно упростить, добавив пользовательский интерфейс.

Добавление пользовательского интерфейса к пользовательскому блоку

Диалоговое окно блока можно создать для пользовательского блока с помощью маскирующих функций Simulink. Маскирование блока также позволяет добавлять метки портов для указания того, какие порты соответствуют входному сигналу и пределам насыщения.

  1. Открыть библиотеку saturation_lib который содержит созданный вами пользовательский блок,

  2. Щелкните правой кнопкой мыши по Level 2 MATLAB S-Function block и выберите Маску>, Создают Маску.

  3. На панели «Значки и порты» в поле команд чертежа «Значки» введите port_label('input',1,'uSig')и нажмите кнопку «Применить».

    Эта команда помечает порт по умолчанию в качестве входного сигнала при насыщении.

  4. На панели «Параметры и диалоговое окно» добавьте четыре параметра, соответствующие четырем параметрам S-функции. Для каждого нового параметра перетащите всплывающее окно или элемент управления редактирования в раздел «Диалоговое окно», как показано в таблице. Перетащите каждый параметр в группу Параметры (Parameters).

    НапечататьБыстрыйИмяОценитьНастраиваемыйВсплывающие параметрыОтзыв
    popupВерхняя граница:upMode 

    Без лимита

    Введите предел в качестве параметра

    Предел по входному сигналу

    customsat_callback('upperbound_callback', gcb)
    editВерхний предел:upValН/Дcustomsat_callback('upperparam_callback', gcb)

    НапечататьБыстрыйИмяОценитьНастраиваемыйВсплывающие параметрыОтзыв
    popupНижняя граница:lowMode 

    Без лимита

    Введите предел в качестве параметра

    Предел по входному сигналу

    customsat_callback('lowerbound_callback', gcb)
    editНижний предел:lowValН/Дcustomsat_callback('lowerparam_callback', gcb)

    Сценарий S-функции MATLAB custom_sat_final.m содержит обратные вызовы параметра маски. Сохранить custom_sat_final.m в рабочую папку для определения обратных вызовов в этом примере. Этот сценарий MATLAB имеет два входных аргумента. Первый входной аргумент представляет собой символьный вектор, указывающий, какой параметр маски вызвал обратный вызов. Вторым входным аргументом является дескриптор связанного блока Level-2 MATLAB S-Function.

    На рисунке показана завершенная панель «Параметры и диалоговое окно» в редакторе масок.

  5. На панели «Инициализация» установите флажок Разрешить изменение содержимого блока библиотеки. Этот параметр позволяет S-функции изменять количество портов в блоке.

  6. На панели «Документация»:

    • В поле Тип маски введите

      Customized Saturation
    • В поле Описание маски введите

      Limit the input signal to an upper and lower saturation value
      set either through a block parameter or input signal.

  7. Нажмите кнопку ОК.

  8. Чтобы нанести на карту параметры S-функции к параметрам маски, щелкните правой кнопкой мыши по Level 2 MATLAB S-Function block и выберите Маску> Взгляд Под Маской.

  9. Измените поле имени S-функции на custom_sat_final и поле Parameters для lowMode,lowVal,upMode,upVal.

    На рисунке показано диалоговое окно Function Block Parameters после изменений.

  10. Нажмите кнопку ОК. Сохраните и закройте библиотеку, чтобы выйти из режима редактирования.

  11. Снова откройте библиотеку и дважды щелкните настраиваемый блок насыщения, чтобы открыть диалоговое окно маскированных параметров.

Чтобы создать более сложный пользовательский интерфейс, поместите графический интерфейс MATLAB поверх маскированного блока. Блок OpenFcn вызывает графический интерфейс пользователя MATLAB, который использует вызовы set_param для изменения параметров S-функционального блока на основе настроек в пользовательском интерфейсе.

Запись обратного вызова маски

Функция customsat_callback.m содержит код обратного вызова маски для диалогового окна пользовательского параметра маски блока насыщения. Эта функция вызывает локальные функции, соответствующие каждому параметру маски, посредством вызова feval.

Следующая локальная функция управляет видимостью поля верхнего предела насыщения на основе выбора режима верхнего предела насыщения. Обратный вызов начинается с получения значений для всех параметров маски с помощью вызова get_param с именем свойства MaskValues. Если обратный вызов требует значения только одного параметра маски, он может вызвать get_param с определенным именем параметра маски, например, get_param(block,'upMode'). Поскольку в этом примере требуется два значения параметров маски, в нем используется MaskValues свойство для уменьшения вызовов get_param.

Обратный вызов затем получает видимость параметров маски, используя вызов get_param с именем свойства MaskVisbilities. Этот вызов возвращает массив ячеек символьных векторов, указывающих видимость каждого параметра маски. Обратный вызов изменяет значения видимости маски на основе выбора режима верхнего предела насыщения, а затем обновляет текст метки порта.

Обратный вызов, наконец, использует set_param для обновления блоков MaskDisplay для маркировки входных портов блока.

function customsat_callback(action,block)
% CUSTOMSAT_CALLBACK contains callbacks for custom saturation block

%   Copyright 2003-2007 The MathWorks, Inc.

%% Use function handle to call appropriate callback
feval(action,block)

%% Upper bound callback
function upperbound_callback(block)

vals = get_param(block,'MaskValues');
vis = get_param(block,'MaskVisibilities');
portStr = {'port_label(''input'',1,''uSig'')'};
switch vals{1}
    case 'No limit'
        set_param(block,'MaskVisibilities',[vis(1);{'off'};vis(3:4)]);
    case 'Enter limit as parameter'
        set_param(block,'MaskVisibilities',[vis(1);{'on'};vis(3:4)]);
    case 'Limit using input signal'
        set_param(block,'MaskVisibilities',[vis(1);{'off'};vis(3:4)]);
        portStr = [portStr;{'port_label(''input'',2,''up'')'}];
end
if strcmp(vals{3},'Limit using input signal'),
    portStr = [portStr;{['port_label(''input'',',num2str(length(portStr)+1), ...
        ',''low'')']}];
end
set_param(block,'MaskDisplay',char(portStr));

Последний вызов set_param вызывает setup функция в S-функции MATLAB custom_sat.m. Следовательно, setup может быть изменена для установки количества входных портов на основе значений параметров маски вместо значений параметров S-функции. Это изменение в setup функция сохраняет количество портов на Уровне 2 MATLAB S-Function block согласовывающимся с ценностями показанный в диалоговом окне параметра маски.

Модифицированная S-функция MATLAB custom_sat_final.m содержит следующие новые setup функция. Если вы переходите к этому учебнику, откройте файл и сохраните его в рабочей папке.

%% Function: setup ===================================================
function setup(block)

% Register original number of ports based on settings in Mask Dialog
ud = getPortVisibility(block);
numInPorts = 1 + isequal(ud(1),3) + isequal(ud(2),3);

block.NumInputPorts = numInPorts;
block.NumOutputPorts = 1;

% Setup port properties to be inherited or dynamic
block.SetPreCompInpPortInfoToDynamic;
block.SetPreCompOutPortInfoToDynamic;

% Override input port properties
block.InputPort(1).DatatypeID  = 0;  % double
block.InputPort(1).Complexity  = 'Real';

% Override output port properties
block.OutputPort(1).DatatypeID  = 0; % double
block.OutputPort(1).Complexity  = 'Real';

% Register parameters. In order:
% -- If the upper bound is off (1) or on and set via a block parameter (2)
%    or input signal (3)
% -- The upper limit value. Should be empty if the upper limit is off or
%    set via an input signal
% -- If the lower bound is off (1) or on and set via a block parameter (2)
%    or input signal (3)
% -- The lower limit value. Should be empty if the lower limit is off or
%    set via an input signal
block.NumDialogPrms     = 4;
block.DialogPrmsTunable = {'Nontunable','Tunable','Nontunable','Tunable'};

% Register continuous sample times [0 offset]
block.SampleTimes = [0 0];

%% -----------------------------------------------------------------
%% Options
%% -----------------------------------------------------------------
% Specify if Accelerator should use TLC or call back into
% MATLAB script
block.SetAccelRunOnTLC(false);

%% -----------------------------------------------------------------
%% Register methods called during update diagram/compilation
%% -----------------------------------------------------------------

block.RegBlockMethod('CheckParameters',      @CheckPrms);
block.RegBlockMethod('ProcessParameters',    @ProcessPrms);
block.RegBlockMethod('PostPropagationSetup', @DoPostPropSetup);
block.RegBlockMethod('Outputs',              @Outputs);
block.RegBlockMethod('Terminate',            @Terminate);
%endfunction
getPortVisibility локальная функция в custom_sat_final.m использует режимы ограничения насыщения для построения флага, который передается обратно в setup функция. setup функция использует этот флаг для определения необходимого количества входных портов.
%% Function: Get Port Visibilities =======================================
function ud = getPortVisibility(block)

ud = [0 0];

vals = get_param(block.BlockHandle,'MaskValues');
switch vals{1}
    case 'No limit'
        ud(2) = 1;
    case 'Enter limit as parameter'
        ud(2) = 2;
    case 'Limit using input signal'
        ud(2) = 3;
end

switch vals{3}
    case 'No limit'
        ud(1) = 1;
    case 'Enter limit as parameter'
        ud(1) = 2;
    case 'Limit using input signal'
        ud(1) = 3;
end

Добавление функциональных возможностей блоков с использованием обратных вызовов блоков

Пользовательское насыщение блоком печати в customsat_lib использует обратные вызовы блоков для добавления функциональных возможностей к исходному пользовательскому блоку насыщения. Этот блок обеспечивает возможность печати пределов насыщения по окончании моделирования. Следующие шаги показывают, как изменить исходный пользовательский блок насыщения для создания этого нового блока.

  1. Добавьте флажок в диалоговое окно параметров маски, чтобы включить и выключить опцию печати.

    1. Щелкните правой кнопкой мыши по Level 2 MATLAB S-Function block в saturation_lib и выберите «Маска» + «Создать маску».

    2. На панели «Параметры редактора масок» добавьте пятый параметр маски со следующими свойствами.

      БыстрыйИмяНапечататьНастраиваемыйПараметры типаОтзыв
      Пределы насыщенности графикаplotcheckcheckboxНетНАcustomsat_callback('plotsaturation',gcb)

    3. Нажмите кнопку ОК.

  2. Запишите обратный вызов для нового флажка. Обратный вызов инициализирует структуру для хранения предельных значений насыщения во время моделирования в блоке Level-2 MATLAB S-Function UserData. Сценарий MATLAB customsat_plotcallback.m содержит этот новый обратный вызов, а также измененные версии предыдущих обратных вызовов для обработки нового параметра маски. При выполнении этого примера откройте customsat_plotcallback.m и скопировать его локальные функции над предыдущими локальными функциями в customsat_callback.m.

    %% Plotting checkbox callback
    function plotsaturation(block)
    
    % Reinitialize the block's userdata
    vals = get_param(block,'MaskValues');
    ud = struct('time',[],'upBound',[],'upVal',[],'lowBound',[],'lowVal',[]);
    
    if strcmp(vals{1},'No limit'),
        ud.upBound = 'off';
    else
        ud.upBound = 'on';
    end
    
    if strcmp(vals{3},'No limit'),
        ud.lowBound = 'off';
    else
        ud.lowBound = 'on';
    end
    
    set_param(gcb,'UserData',ud);

  3. Обновление S-функции MATLAB Outputs метод сохранения пределов насыщения, если применимо, как это сделано в новой S-функции MATLAB custom_sat_plot.m. При выполнении этого примера скопируйте Outputs метод в custom_sat_plot.m поверх оригинала Outputs метод в custom_sat_final.m

    %% Function: Outputs ===================================================
    function Outputs(block)
    
    lowMode    = block.DialogPrm(1).Data;
    upMode     = block.DialogPrm(3).Data;
    sigVal     = block.InputPort(1).Data;
    vals = get_param(block.BlockHandle,'MaskValues');
    plotFlag = vals{5};
    lowPortNum = 2;
    
    % Check upper saturation limit
    if isequal(upMode,2)
        upVal = block.RuntimePrm(2).Data;
    elseif isequal(upMode,3)
        upVal = block.InputPort(2).Data;
        lowPortNum = 3; % Move lower boundary down one port number
    else
        upVal = inf;
    end
    
    % Check lower saturation limit
    if isequal(lowMode,2),
        lowVal = block.RuntimePrm(1).Data;
    elseif isequal(lowMode,3)
        lowVal = block.InputPort(lowPortNum).Data;
    else
        lowVal = -inf;
    end
    
    % Use userdata to store limits, if plotFlag is on
    if strcmp(plotFlag,'on');    
        ud = get_param(block.BlockHandle,'UserData');
        ud.lowVal = [ud.lowVal;lowVal];
        ud.upVal = [ud.upVal;upVal];
        ud.time = [ud.time;block.CurrentTime];
        set_param(block.BlockHandle,'UserData',ud)
    end
    
    % Assign new value to signal
    if sigVal > upVal,
        sigVal = upVal;
    elseif sigVal < lowVal,
        sigVal=lowVal;
    end
    
    block.OutputPort(1).Data = sigVal;
    
    %endfunction

  4. Запишите функцию plotsat.m для построения графика пределов насыщения. Эта функция берет ручку к Уровню 2 MATLAB S-Function block и использует эту ручку, чтобы восстановить блок UserData. При прохождении этого учебного пособия сохраните plotsat.m в рабочую папку.

    function plotSat(block)
    
    % PLOTSAT contains the plotting routine for custom_sat_plot
    %   This routine is called by the S-function block's StopFcn.
    
    ud = get_param(block,'UserData');
    fig=[];
    if ~isempty(ud.time)
        if strcmp(ud.upBound,'on')
            fig = figure;
            plot(ud.time,ud.upVal,'r');
            hold on
        end
        if strcmp(ud.lowBound,'on')
            if isempty(fig),
                fig = figure;
            end
            plot(ud.time,ud.lowVal,'b');
        end
        if ~isempty(fig)
            title('Upper bound in red. Lower bound in blue.')
        end
        
        % Reinitialize userdata
        ud.upVal=[];
        ud.lowVal=[];
        ud.time = [];
        set_param(block,'UserData',ud);
    end
  5. Щелкните правой кнопкой мыши по Level 2 MATLAB S-Function block и выберите Свойства. Откроется диалоговое окно Свойства блока (Block Properties). На панели «Обратные вызовы» измените StopFcn для вызова обратного вызова печати, как показано на следующем рисунке, нажмите кнопку «ОК».

Связанные темы