主要内容

设计和创建一个自定义块

设置工作环境来设计和创建自定义块

此示例打开一个目录,其中包含本主题所需的以下文件。

  1. ex_customsat_lib.slx

  2. sldemo_customsat.slx

  3. msfuntmpl.m

  4. custom_sat.m

  5. custom_sat_final.m

  6. customsat_callback.m

  7. customsat_plotcallback.m

  8. custom_sat_plot.m

  9. plotsat.m

如何设计自定义块

一般来说,使用以下过程来设计自定义块:

假设您想要创建一个自定义的饱和块,该块根据块参数或输入信号的值来限制信号的上限和下限。在区块的第二个版本中,您希望在模拟完成后绘制饱和度限制的选项。下面的教程将引导您完成这些模块的设计。图书馆ex_customsat_lib包含两个版本的自定义饱和度块。

示例模型sldemo_customsat使用块的基本版本。

定义自定义块行为

首先定义自定义块的特性和限制。在这个例子中,块支持以下特性:金宝app

  • 打开和关闭上或下饱和限制。

  • 通过块参数设置上限和/或下限。

  • 使用输入信号设置上限和/或下限。

它也有以下限制:

  • 饱和状态下的输入信号必须是标量。

  • 输入信号和饱和限制都必须具有double数据类型。

  • 代码生成不是必需的。

决定自定义块类型

基于自定义块特性,实现需要支持以下内容:金宝app

  • 多个输入端口

  • 一个相对简单的算法

  • 没有连续或离散的系统状态

因此,本教程使用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-function对S-function模板的修改如下:

  • 设置函数根据饱和上限模式和饱和下限模式的输入值初始化输入端口数。如果通过输入信号设置限制,则该方法将输入端口添加到块中。的设置方法指出有四个s函数参数,并设置参数的可调性。最后,该方法注册了仿真过程中使用的s函数方法。

    函数设置(块)% Simulink引擎传递一个Simul金宝appink实例。MSFcnRunTimeBlock %类在输入参数“block”中设置方法。这被称为s函数块的运行时对象。%根据S-function %参数值注册原始输入端口数try %在try/catch中Wrap,如果没有输入S-function参数lowMode = block.DialogPrm(1).Data;upMode = block. dialog (3).Data;numInPorts = 1 + isequal(lowMode,3) + isequal(upMode,3);抓住numInPorts = 1;结束% try/catch块。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方法验证输入到二级MATLAB S-Function块中的值。

    function CheckPrms(block) lowMode = block. dialogprm (1).Data;low = block.DialogPrm(2).Data;upMode = block. dialog (3).Data;upVal = block.DialogPrm(4).Data;%第一个和第三个对话框参数的值必须为1-3,如果~any(upMode == [1 2 3]);错误('第一个对话框参数必须是1、2或3的值');end if ~any(lowMode == [1 2 3]);错误('第一个对话框参数必须是1、2或3的值');如果通过对话框指定了上限或下限,请确保有指定的上限。另外,检查值是否为double类型,如果isequal(upMode,2),如果isempty(upVal), error('输入饱和度上限的值'); 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

  • ProcessParametersPostPropagationSetup方法处理s函数参数调优。

    function ProcessPrms(block) %%更新运行时参数block. autoupdateruntimeprms;%end ProcessPrms function function DoPostPropSetup(block) %%注册所有可调参数为运行时参数。block.AutoRegRuntimePrms;%end DoPostPropSetup函数

  • 输出方法根据s函数参数设置和任何输入信号计算块的输出。

    function output (block) lowMode = block. dialogprm (1).Data;upMode = block. dialog (3).Data;sigVal = block.InputPort(1).Data;lowPortNum = 2;%初始化饱和下限的电位输入数%检查饱和上限是否等于(upMode,2), %通过块参数设置upVal = block. runtimeprm (2).Data;elseif isequal(upMode,3), %通过输入端口设置upVal = block.InputPort(2).Data;lowPortNum = 3;%移动下边界一个端口号,否则upVal = inf;如果不等于(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

在库中放置自定义块

库允许您与其他用户共享自定义块,轻松更新自定义块副本的功能,并将特定项目的块收集到单个位置。如果您的自定义块需要总线作为接口,则可以通过在数据字典中创建总线对象并将字典附加到库中,从而与库用户共享总线对象将数据字典附加到自定义库).

本例将自定义饱和度块放入库中。

  1. 在Simuli金宝appnk中®编辑,在模拟选项卡上,选择>图书馆

  2. 从用户定义函数库中,将2级MATLAB S-Function块拖到新库中。

  3. 用文件名保存库saturation_lib

  4. 双击该块打开其功能块参数对话框。

  5. 功能名称字段中,输入s函数的名称。例如,输入custom_sat.在参数字段输入2、1、2、1

  6. 点击好吧

    您已经创建了一个可以与其他用户共享的自定义饱和度块。

您可以通过添加自定义用户界面使块更易于使用。

向自定义块添加用户界面

您可以使用Simulink的屏蔽特性为自定义块创建一个块对话框。金宝app屏蔽块还允许您添加端口标签,以指示哪些端口对应于输入信号和饱和限制。

  1. 打开图书馆saturation_lib包含您创建的自定义块,

  2. 右键单击Level-2 MATLAB S-Function块并选择面具>创建面具

  3. 图标和端口窗格图标绘制命令框中,输入port_label(“输入”,1,' uSig '),然后点击应用

    该命令将默认端口标记为饱和状态下的输入信号。

  4. 参数和对话框面板中,添加对应S-Function四个参数的四个参数。对于每个新参数,将弹出窗口或编辑控件拖到对话框节,如表所示。将每个参数拖到Parameters组中。

    类型 提示 名字 评估 可调 弹出选项 回调
    弹出 上边界: upMode

    没有限制

    输入限制作为参数

    限制使用输入信号

    customsat_callback (upperbound_callback, gcb)
    编辑 上限: upVal N/A customsat_callback (upperparam_callback, gcb)

    类型 提示 名字 评估 可调 弹出选项 回调
    弹出 下边界: lowMode

    没有限制

    输入限制作为参数

    限制使用输入信号

    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块的句柄。

    图中显示了完成的参数和对话框面板。

  5. 初始化窗格中,选择允许库块修改其内容复选框。此设置允许s功能更改块上的端口数量。

  6. 文档面板:

    • 掩码类型字段中,输入

      定制的饱和
    • 面具的描述字段中,输入

      将输入信号限制为通过块参数或输入信号设置的上、下饱和值。

  7. 点击好吧

  8. 要将s函数参数映射到掩码参数,请右键单击Level-2 MATLAB S-function块并选择面具>面具下看

  9. 改变功能名称字段custom_sat_final参数字段lowMode、lowVal upMode upVal

    如图所示为修改后的“功能块参数”对话框。

  10. 点击好吧.保存并关闭库以退出编辑模式。

  11. 重新打开库,双击自定义饱和度块,打开遮罩参数对话框。

要创建更复杂的用户界面,请将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属性来标记块的输入端口。

版权所有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调用设置函数中的s函数custom_sat.m.因此,设置函数可以修改为根据掩码参数值而不是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;%覆盖输入端口属性块。inputport (1)datattypeid = 0;%双块输入端口(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;case 'Enter limit as parameter' d(2) = 2;case 'Limit using input signal' ud(2) = 3;结束开关值{3}情况下'无限制' ud(1) = 1;case 'Enter limit as parameter' d(1) = 2;case 'Limit using input signal' ud(1) = 3;结束

使用块回调增加块功能

带有绘图块的用户定义饱和度ex_customsat_lib使用块回调来为原始的自定义饱和度块添加功能。这个模块提供了一个选项,可以在模拟结束时绘制饱和度限制。下面的步骤展示了如何修改原始的自定义饱和度块来创建这个新块。

  1. 在遮罩参数对话框中添加一个复选框,以切换绘图选项的开启和关闭。

    1. 右键单击中的Level-2 MATLAB S-Function块saturation_lib并选择面具+创建面具

    2. 关于面具编辑器参数窗格中,添加第五个具有以下属性的掩码参数。

      提示 名字 类型 可调 类型的选择 回调
      地块饱和极限 plotcheck 复选框 没有 NA customsat_callback (plotsaturation, gcb)

    3. 点击好吧

  2. 为新复选框编写一个回调。该回调初始化一个结构,以在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';end if strcmp(vals{3},'No limit'), d。lowBound = 'off';ud。lowBound = 'on';结束set_param (gcb、用户数据的ud);

  3. 更新MATLAB s函数输出方法来存储饱和极限,如果适用,在新的MATLAB s函数中完成custom_sat_plot.m.如果您正在遵循此示例,请复制输出方法custom_sat_plot.m在原来的上面输出方法custom_sat_final.m

    % %功能:输出  =================================================== 函数输出(块)lowMode = block.DialogPrm (1) . data;upMode = block. dialog (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

  4. 编写函数plotsat.m来绘制饱和极限。该函数获取二级MATLAB S-Function块的句柄,并使用该句柄检索块的句柄用户数据.如果您正在遵循本教程,请保存plotsat.m到您的工作文件夹。

    函数plotSat(block) % plotSat包含custom_sat_plot %的绘图例程,该例程由s函数块的StopFcn调用。ud = get_param(block,'UserData');无花果= [];if ~isempty(ud.time) if strcmp(ud.upBound,'on') fig = figure;情节(ud.time ud.upVal, ' r ');hold on end if strcmp(d. lowbound,'on') if isempty(fig), fig = fig;情节(ud.time ud.lowVal, ' b ');end if ~isempty(图)title(上界为红色)') end %重新初始化userdata ud.upVal=[];ud.lowVal = []; ud.time = []; set_param(block,'UserData',ud); end
  5. 右键单击Level-2 MATLAB S-Function块并选择属性.打开“块属性”对话框。在回调窗格中,修改StopFcn要调用绘图回调,如下图所示,然后单击好吧

相关的话题