В общем случае используйте следующий процесс, чтобы спроектировать пользовательский блок:
Предположим, что вы хотите создать индивидуально настраиваемый блок насыщения, который ограничивает верхние и нижние границы сигнала или на основе параметров блоков или на основе значения входного сигнала. Во второй версии блока вы хотите, чтобы опция построила пределы насыщения после того, как симуляция будет закончена. Выполняющие шаги примера вы посредством разработки этих блоков. Библиотека ex_customsat_lib
содержит две версии индивидуально настраиваемого блока насыщения.
Модель sldemo_customsat
в качестве примера использует базовую версию блока.
Начните путем определения функций и ограничений пользовательского блока. В этом примере блок поддерживает следующие функции:
Включение и выключение верхнего или более низкого предела насыщения.
Установка верхнего и/или нижних пределов через параметры блоков.
Установка верхнего использования и/или использования нижних пределов входной сигнал.
Это также имеет следующие ограничения:
Входной сигнал под насыщением должен быть скаляром.
Входной сигнал и пределы насыщения должны все иметь тип данных дважды.
Генерация кода не требуется.
На основе функций пользовательского блока реализация должна поддержать следующее:
Несколько входных портов
Относительно простой алгоритм
Никакие непрерывные или дискретные системные состояния
Поэтому этот пример реализует пользовательский блок с помощью Уровня 2 MATLAB® S-функция. S-функции MATLAB поддерживают несколько входных параметров и, потому что алгоритм прост, не имейте значительных издержек при обновлении схемы или симуляции модели. Смотрите Сравнение Функциональности пользовательских блоков для описания различной функциональности, обеспеченной S-функциями MATLAB по сравнению с другими типами пользовательских блоков.
Начните путем определения S-параметров-функции. Этот пример требует четырех параметров:
Первый параметр указывает, как верхний предел насыщения устанавливается. Предел может быть выключен, установить через параметры блоков или установить через входной сигнал.
Второй параметр является значением верхнего предела насыщения. Это значение используется, только если верхний предел насыщения устанавливается через параметры блоков. В конечном счете этот параметр используется, необходимо смочь изменить значение параметров во время симуляции, i.e., параметр является настраиваемым.
Третий параметр указывает, как более низкий предел насыщения устанавливается. Предел может быть выключен, установить через параметры блоков или установить через входной сигнал.
Четвертый параметр является значением более низкого предела насыщения. Это значение используется, только если более низкий предел насыщения устанавливается через параметры блоков. Как с верхним пределом насыщения, этот параметр является настраиваемым когда в использовании.
Первые и третьи S-параметры-функции представляют режимы, которые должны быть переведены в значения, которые может распознать S-функция. Поэтому задайте следующие значения для верхних и более низких предельных режимов насыщения:
1 указывает, что предел насыщения выключен.
2 указывает, что предел насыщения устанавливается через параметры блоков.
3 указывает, что предел насыщения устанавливается через входной сигнал.
После того, как вы зададите S-параметры-функции и функциональность, запишите S-функцию. Шаблон msfuntmpl.m
обеспечивает начальную точку для записи Уровня 2 S-функции MATLAB. Можно найти завершенную версию пользовательского блока насыщения в файле 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
метод проверяет, что значения ввели в блок Level-2 MATLAB S-function.
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
Библиотеки позволяют вам совместно использовать свои пользовательские блоки с другими пользователями, легко обновлять функциональность копий пользовательского блока и собирать блоки для конкретного проекта в одно местоположение. Если ваш пользовательский блок требует шины как интерфейса, можно совместно использовать объект шины с пользователями библиотеки путем создания объекта шины в словаре данных и присоединения словаря к библиотеке (См. Словарь Данных о Ссылке к Пользовательским Библиотекам).
Этот пример помещает пользовательский блок насыщения в библиотеку.
В Simulink® Редактор, во вкладке Simulation, выбирает New> Library.
От библиотеки User-Defined Functions перетащите блок Level-2 MATLAB S-function в свою новую библиотеку.
Сохраните свою библиотеку с именем файла saturation_lib
.
Дважды кликните блок, чтобы открыть его диалоговое окно Function Block Parameters.
В поле S-function name введите имя S-функции. Например, введите custom_sat
. В Parameters поле вводят 2,-1,2,1
.
Нажмите OK.
Вы создали пользовательский блок насыщения, который можно совместно использовать с другими пользователями.
Можно сделать блок легче использовать путем добавления индивидуально настраиваемого пользовательского интерфейса.
Можно создать диалоговое окно блока для пользовательского блока, использующего функции маскирования Simulink. Маскирование блока также позволяет вам добавлять метки порта, чтобы указать, какие порты соответствует входному сигналу и пределам насыщения.
Откройте библиотеку saturation_lib
это содержит пользовательский блок, который вы создали,
Щелкните правой кнопкой по блоку Level-2 MATLAB S-function и выберите Mask> Create Mask.
На панели Icon & Ports в поле Icons drawing commands введите port_label('input',1,'uSig')
, и затем нажмите Apply.
Эта команда помечает порт по умолчанию как входной сигнал под насыщением.
В панели Parameters & Dialog добавьте четыре параметра, соответствующие этим четырем S-параметрам-функции. Для каждого нового параметра перетащите раскрывающиеся или средства редактирования к разделу Dialog box, как показано в таблице. Перетащите каждый параметр в группу Параметров.
Ввод | Подсказка | Имя | Оценить | Настраиваемый | Раскрывающиеся опции | 'callback' |
---|---|---|---|---|---|---|
popup | Верхний контур: | upMode | ✓ | Никакой предел Введите предел как параметр Ограничьте входной сигнал использования | customsat_callback('upperbound_callback', gcb) | |
edit | Верхний предел: | upVal | ✓ | ✓ | N/A | customsat_callback('upperparam_callback', gcb) |
Ввод | Подсказка | Имя | Оценить | Настраиваемый | Раскрывающиеся опции | 'callback' |
---|---|---|---|---|---|---|
popup | Нижняя граница: | lowMode | ✓ | Никакой предел Введите предел как параметр Ограничьте входной сигнал использования | customsat_callback('lowerbound_callback', gcb) | |
edit | Нижний предел: | lowVal | ✓ | ✓ | N/A | customsat_callback('lowerparam_callback', gcb) |
Скрипт S-функции MATLAB custom_sat_final.m
содержит коллбэки параметра маски. Сохраните custom_sat_final.m
к вашей рабочей папке, чтобы задать коллбэки в этом примере. Этот скрипт MATLAB имеет два входных параметра. Первый входной параметр является вектором символов, указывающим, какой параметр маски вызвал коллбэк. Второй входной параметр является указателем на связанный блок Level-2 MATLAB S-function.
Рисунок показывает завершенную панель Parameters & Dialog в Редакторе Маски.
В панели Initialization установите флажок Allow library block to modify its contents. Эта установка позволяет S-функции изменять количество портов на блоке.
В панели Documentation:
В поле Mask type войти
Customized Saturation
В поле Mask description войти
Limit the input signal to an upper and lower saturation value set either through a block parameter or input signal.
Нажмите OK.
Чтобы сопоставить S-параметры-функции с параметрами маски, щелкните правой кнопкой по блоку Level-2 MATLAB S-function и выберите Mask> Look Under Mask.
Измените поле S-function name в custom_sat_final
и поле Parameters к lowMode,lowVal,upMode,upVal
.
Рисунок показывает диалоговое окно Function Block Parameters после изменений.
Нажмите OK. Сохраните и закройте библиотеку, чтобы выйти из режима редактирования.
Вновь откройте библиотеку и дважды кликните индивидуально настраиваемый блок насыщения, чтобы открыть диалоговое окно параметра маскированное.
Чтобы создать более сложный пользовательский интерфейс, поместите графический интерфейс пользователя MATLAB сверху маскированного блока. Блок OpenFcn
вызывает графический интерфейс пользователя MATLAB, который использует вызовы set_param
изменить параметры Блока s-function на основе настроек в пользовательском интерфейсе.
Функциональный 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
функция сохраняет количество портов на блоке Level-2 MATLAB S-function сопоставимым со значениями показанный в диалоговом окне параметра маски.
Модифицированная 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
Пользовательское Насыщение блоком Plotting в customsat_lib
использование блокирует коллбэки, чтобы добавить функциональность в исходный пользовательский блок насыщения. Этот блок предоставляет возможность строить пределы насыщения, когда симуляция заканчивается. Следующие шаги показывают, как изменить исходный пользовательский блок насыщения, чтобы создать этот новый блок.
Добавьте флажок в диалоговое окно параметра маски, чтобы переключить опцию графического вывода на и прочь.
Щелкните правой кнопкой по блоку Level-2 MATLAB S-function по saturation_lib
и выберите Mask + Create Mask.
На Редакторе Маски панель Parameters добавьте пятый параметр маски со следующими свойствами.
Подсказка | Имя | Ввод | Настраиваемый | Введите опции | 'callback' |
---|---|---|---|---|---|
Постройте пределы насыщения | plotcheck | checkbox | Нет | N/A | customsat_callback('plotsaturation',gcb) |
Нажмите OK.
Запишите коллбэк для нового флажка. Коллбэк инициализирует структуру, чтобы сохранить предельные значения насыщения в процессе моделирования в блоке Level-2 MATLAB S-function UserData
. customsat_plotcallback.m
скрипта MATLAB содержит этот новый коллбэк, а также измененные версии предыдущих коллбэков, чтобы обработать новый параметр маски. Если вы выполняете этот пример, открываете
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);
Обновите 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
Запишите функциональный plotsat.m
построить пределы насыщения. Эта функция берет указатель на блок Level-2 MATLAB S-function и использует этот указатель, чтобы получить 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
Щелкните правой кнопкой по блоку Level-2 MATLAB S-function и выберите Properties. Диалоговое окно Block Properties открывается. На панели Callbacks измените StopFcn
чтобы вызвать коллбэк графического вывода как показано в следующем рисунке, затем нажмите OK.