设计和创建一个自定义块
如何设计一个自定义块
通常,使用以下过程来设计一个自定义块:
假设您想要创建一个自定义的饱和块,根据块参数或输入信号的值限制信号的上界和下界。在该块的第二个版本中,您希望在模拟完成后绘制饱和度限制的选项。下面的教程将逐步引导您设计这些模块。图书馆ex_customsat_lib
包含自定义饱和块的两个版本。
示例模型sldemo_customsat
使用块的基本版本。
定义自定义块行为
首先定义自定义块的特性和限制。在本例中,block支持以下特性:金宝app
打开和关闭饱和度上限或下限。
通过块参数设置上限和/或下限。
使用输入信号设置上限和/或下限。
它也有以下限制:
饱和状态下的输入信号必须是标量。
输入信号和饱和限制都必须具有double数据类型。
不需要代码生成。
决定自定义块类型
基于自定义块特性,实现需要支持以下功能:金宝app
多输入接口
一个相对简单的算法
没有连续或离散的系统状态
因此,本教程使用Level-2 MATLAB实现自定义块®s函数。MATLAB s函数支持多输入,由于算金宝app法简单,在更新图表或模拟模型时没有显著的开销。看到自定义块功能的比较与其他类型的自定义块相比,MATLAB s函数提供的不同功能的描述。
参数化的MATLAB功能
首先定义s函数参数。这个例子需要四个参数:
第一个参数表示如何设置饱和度上限。限制可以关闭,通过块参数设置,或通过输入信号设置。
第二个参数是饱和度上限的值。此值仅在通过块参数设置最高饱和度限制时使用。在使用此参数的情况下,您应该能够在模拟期间更改参数值,即参数是可调的。
第三个参数表示如何设置饱和度下限。限制可以关闭,通过块参数设置,或通过输入信号设置。
第四个参数是饱和度下限的值。此值仅在通过块参数设置饱和度下限时使用。与饱和度上限一样,该参数在使用时是可调的。
第一个和第三个s函数参数表示必须转换为s函数可以识别的值的模式。因此,为上、下饱和度极限模式定义如下值:
1
饱和限制关闭。2
指示通过块参数设置饱和度限制。3.
指示通过输入信号设置饱和度限制。
写MATLAB功能
在定义了s函数参数和函数之后,编写s函数。模板msfuntmpl.m
提供了一个编写二级MATLAB s函数的起点。您可以在文件中找到自定义饱和块的完整版本custom_sat.m
.在继续本教程之前,将此文件保存到您的工作文件夹中。
这个s函数对s函数模板的修改如下:
的
设置
函数根据为上、下饱和限制模式输入的值初始化输入端口数。如果通过输入信号设置限制,则该方法将输入端口添加到块中。的设置
方法表示有四个s函数参数,并设置参数的可调性。最后,对仿真过程中使用的s函数方法进行了注册。函数设置(block) % Simulink引擎传递一个金宝appSimulink实例。MSFcnRunTimeBlock %类在输入参数“block”中设置方法。这被称为s -函数块的运行时对象。根据S-function %参数值注册原始输入端口数try %在try/catch中封装,如果没有输入S-function参数lowMode = block.DialogPrm(1).Data;upMode = block.DialogPrm(3).Data;numInPorts = 1 + isequal(lowMode,3) + isequal(upMode,3);抓住numInPorts = 1;结束%尝试/捕获块。NumInputPorts = numInPorts;块。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;如果~any(upMode ==[1 2 3]),第一个和第三个对话框参数的值必须为1-3;error('第一个对话框参数必须是1、2或3');end if ~any(lowMode == [1 2 3]);error('第一个对话框参数必须是1、2或3');如果通过对话框指定了上限或下限,请确保%是指定的上限。此外,如果isequal(upMode,2),检查值类型为double,如果为空(upVal),错误('输入一个值为最高饱和极限。'); 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函数参数调优。block. autoupdateruntimeprms;将所有可调参数注册为运行时参数。block.AutoRegRuntimePrms;%end DoPostPropSetup函数
的
输出
方法根据s函数参数设置和任何输入信号计算块的输出。函数输出(block) lowMode = block. dialogprm (1).Data;upMode = block.DialogPrm(3).Data;sigVal = block.InputPort(1).Data;lowPortNum = 2;如果isequal(upMode,2),则检查饱和度上限,%通过块参数设置upVal = block. runtimeprm (2).Data;elseif isequal(upMode,3), %通过输入端口设置upVal = block.InputPort(2).Data;lowPortNum = 3;将下边界向下移动一个端口号,否则upVal = inf;如果isequal(lowMode,2), %通过块参数lowVal = block. runtimeprm (1).Data;elseif isequal(lowMode,3), %通过输入端口设置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
在库中放置自定义块
库允许您与其他用户共享自定义块,轻松更新自定义块副本的功能,并将特定项目的块收集到单个位置。如果您的自定义块需要总线作为接口,您可以通过在数据字典中创建总线对象并将该字典附加到库中来与库用户共享总线对象(请参阅链接数据字典到自定义库).
本例将自定义饱和块放入库中。
在Simuli金宝appnk中®编辑,在模拟选项卡上,选择新>图书馆.
从用户定义函数库中,将Level-2 MATLAB S-Function块拖到新库中。
用文件名保存你的库
saturation_lib
.双击该块打开其功能块参数对话框。
在功能名称字段,输入s函数的名称。例如,输入
custom_sat
.在参数字段输入2、1、2、1
.点击好吧.
您已经创建了可与其他用户共享的自定义饱和块。
通过添加定制的用户界面,可以使该块更易于使用。
向自定义块添加用户界面
您可以使用Simulink的屏蔽特性为自定义块创建块对话框。金宝app屏蔽块还允许您添加端口标签,以指示哪些端口对应于输入信号和饱和限制。
打开图书馆
saturation_lib
包含您创建的自定义块,右键单击Level-2 MATLAB S-Function块并选择面具>创建面具.
在图标和端口窗格中的图标绘制命令框中,输入
port_label(“输入”,1,' uSig ')
,然后按应用.该命令将默认端口标记为饱和状态下的输入信号。
在参数&对话框窗格中,添加对应于4个S-Function参数的4个参数。对于每个新参数,将弹出式或编辑控件拖到对话框节,如表所示。将每个参数拖到Parameters组中。
类型 提示 的名字 评估 可调 弹出选项 回调 弹出
上边界: upMode
✓ 没有限制
输入limit作为参数
使用输入信号的限制
customsat_callback (upperbound_callback, gcb)
编辑
上限: upVal
✓ ✓ N/A customsat_callback (upperparam_callback, gcb)
类型 提示 的名字 评估 可调 弹出选项 回调 弹出
下边界: lowMode
✓ 没有限制
输入limit作为参数
使用输入信号的限制
customsat_callback (lowerbound_callback, gcb)
编辑
下限: lowVal
✓ ✓ N/A customsat_callback (lowerparam_callback, gcb)
MATLAB S-Function脚本
custom_sat_final.m
包含掩码参数回调。保存custom_sat_final.m
到您的工作文件夹中定义本例中的回调。这个MATLAB脚本有两个输入参数。第一个输入参数是一个字符向量,表示哪个掩码参数调用了回调。第二个输入参数是相关Level-2 MATLAB S-Function块的句柄。图中显示了已完成的参数&对话框窗格中的蒙版编辑器。
在初始化窗格中,选择允许库块修改其内容复选框。该设置允许s函数改变块上的端口数量。
在文档面板:
在掩码类型字段中,输入
定制的饱和
在面具的描述字段中,输入
将输入信号限制为通过块参数或输入信号设置的上饱和度和下饱和度。
点击好吧.
要将s函数参数映射到掩码参数,右键单击Level-2 MATLAB S-function块并选择面具>面具下的样子.
改变功能名称字段
custom_sat_final
和参数字段lowMode、lowVal upMode upVal
.修改完成后的“功能块参数”对话框如图所示。
点击好吧.保存并关闭库以退出编辑模式。
重新打开库,双击定制的饱和块,打开屏蔽参数对话框。
要创建更复杂的用户界面,请将MATLAB图形用户界面置于掩码块的顶部。块OpenFcn
调用MATLAB图形用户界面,该界面使用调用set_param
,根据界面设置,修改s功能块参数。
编写掩码回调
这个函数customsat_callback.m
包含自定义饱和块掩码参数对话框的掩码回调代码。此函数调用与每个掩码参数对应的本地函数函数宏指令
.
下面的局部函数根据上饱和度极限模式的选择来控制上饱和度极限场的可见性。回调首先使用调用来获取所有掩码参数的值get_param
属性名MaskValues
.如果回调只需要一个掩码参数的值,它可以调用get_param
使用特定的掩码参数名,例如,get_param(块,“upMode”)
.因为这个示例需要两个掩码参数值,所以它使用MaskValues
属性将调用减少到get_param
.
回调然后使用调用来获取掩码参数的可见性get_param
属性名MaskVisbilities
.这个调用返回一个由字符向量组成的单元格数组,表示每个掩码参数的可见性。回调函数根据饱和度上限模式的选择更改掩码可见度的值,然后更新端口标签文本。
回调函数最后使用set_param
命令更新块的MaskDisplay
属性标记块的输入端口。
function customsat_callback(action,block) % customsat_callback包含自定义饱和块的回调%版权所有2003-2007 The MathWorks, Inc. %%使用函数句柄调用适当的回调feval(action,block) %%上限回调函数upperbound_callback(block) vals = get_param(block,'MaskValues');vis = get_param(block,' maskvisibility ');portStr = {'port_label(" input ",1, " uSig ")'};set_param(block,' maskvisibility ',[vis(1);{'off'};vis(3:4)]);set_param(block,' maskvisibility ',[vis(1);{'on'};vis(3:4)]);set_param(block,' maskvisibility ',[vis(1);{'off'};vis(3:4)]);portStr = [portStr; {port_label(“输入”、“向上”)"});end if strcmp(vals{3},'限制使用输入信号'),portStr = [portStr;{['port_label(" input ",',num2str(length(portStr)+1),…”、“低”)”)});结束set_param(块,MaskDisplay, char (portStr));
最后的召唤set_param
调用设置
函数在MATLAB中的s函数custom_sat.m
.因此,设置
函数可以修改为根据mask参数值来设置输入端口数,而不是根据S-function参数值。这是对设置
函数保持Level-2 MATLAB S-Function块上的端口数量与掩码参数对话框中显示的值一致。
修改后的MATLAB s函数custom_sat_final.m
包含以下新设置
函数。如果您正在逐步学习本教程,请打开该文件并将其保存到工作文件夹中。
% %功能:设置 =================================================== 函数设置(块)%原始数量的端口寄存器基于掩码对话框中设置ud = getPortVisibility(块);numInPorts = 1 + isequal(ud(1),3) + isequal(ud(2),3);块。NumInputPorts = numInPorts;块。NumOutputPorts = 1;%设置端口属性被继承或动态块。block.SetPreCompOutPortInfoToDynamic;覆盖输入端口属性block.InputPort(1)。DatatypeID = 0;% double block.InputPort(1)。复杂性=“真实”; % 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
控件使用饱和限制模式构造传递回设置
函数。的设置
函数使用此标志来确定所需的输入端口数量。% %函数:获取端口可见性 ======================================= 函数ud = getPortVisibility(块)ud = [0 0];vals = get_param(block.BlockHandle,'MaskValues');开关{1}情况'无限制' ud(2) = 1;输入限制作为参数' ud(2) = 2;case '使用输入信号的极限' ud(2) = 3;end switch vals{3} case 'No limit' ud(1) = 1;ud(1) = 2;case '使用输入信号的极限' ud(1) = 3;结束
使用块回调添加块功能
中“用户定义的饱和度与绘图”块customsat_lib
使用块回调向原始自定义饱和块添加功能。此块提供了在模拟结束时绘制饱和度限制的选项。下面的步骤展示了如何修改原始的自定义饱和块来创建这个新块。
在掩码参数对话框中添加一个复选框,以切换绘图选项。
中,右键单击Level-2 MATLAB S-Function块
saturation_lib
并选择面具+创建面具.关于蒙版编辑器参数窗格中,使用以下属性添加第五个掩码参数。
提示 的名字 类型 可调 类型的选择 回调 地块饱和度限制 plotcheck
复选框
没有 NA customsat_callback (plotsaturation, gcb)
点击好吧.
为新复选框编写回调函数。回调在Level-2 MATLAB S-Function块中初始化一个结构来存储模拟期间的饱和限值
用户数据
.MATLAB脚本customsat_plotcallback.m
包含这个新的回调,以及以前回调的修改版本,以处理新的掩码参数。如果您正在执行这个示例,请打开customsat_plotcallback.m
并将它的局部函数复制到之前的局部函数上customsat_callback.m
.绘制复选框回调函数plotsaturation(block) %重新初始化块的userdata vals = get_param(block,'MaskValues');ud =结构(“时间”,[],“上水的”,[],“upVal”,[],“lowBound”,[],“lowVal”,[]);如果strcmp(vals{1},'No limit'),则不限制。upBound = 'off';ud。upBound = 'on';如果strcmp(vals{3},'No limit'),则结束。lowBound = 'off';ud。lowBound = 'on';结束set_param (gcb、用户数据的ud);
更新MATLAB s函数
输出
方法来存储饱和极限,如果适用,在新的MATLAB s函数中完成custom_sat_plot.m
.如果您正在执行此示例,请复制输出
方法custom_sat_plot.m
在原来的基础上输出
方法custom_sat_final.m
% %功能:输出 =================================================== 函数输出(块)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;%如果isequal(upMode,2) upVal = block.RuntimePrm(2).Data;elseif isequal(upMode,3) upVal = block.InputPort(2).Data;lowPortNum = 3;将下边界向下移动一个端口号,否则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块,并使用此句柄检索块的用户数据
.如果您正在学习本教程,请保存plotsat.m
到您的工作文件夹。plotSat包含custom_sat_plot %的绘图例程,该例程由S-function块的StopFcn调用。ud = get_param(block,'UserData');无花果= [];if ~isempty(ud.time) if strcmp(ud.upBound,'on') fig = figure;情节(ud.time ud.upVal, ' r ');如果strcmp(ud.lowBound,'on')为空(fig),则保持结束;情节(ud.time ud.lowVal, ' b ');end if ~isempty(图)') end %重新初始化用户数据ud.upVal=[];ud.lowVal = []; ud.time = []; set_param(block,'UserData',ud); end
右键单击Level-2 MATLAB S-Function块并选择属性.打开“块属性”对话框。在回调窗格中,修改
StopFcn
如需调用如下图所示的绘图回调,请单击好吧.