主要内容

本页采用了机器翻译。点击此处可查看英文原文。

blockDiscovered

类: ModelAdvisor.EdittimeCheck
命名空间: ModelAdvisor

指定用于识别违反编辑时检查的模块的算法

自 R2022a 起

语法

violation = blockDiscovered(obj,blk)

说明

violation = blockDiscovered(obj,blk) 用于指定一个算法,该算法检查违反编辑时检查 obj 的块 blk,然后返回违反检查 violation 的块。算法检查的块的范围取决于您对模型所做的更改的范围以及您为编辑时检查对象的 TraversalType 属性指定的值。

如果 TraversalType 属性的值为 edittimecheck.TraversalTypes.BLKITER,则对新建和编辑的块调用 blockDiscovered 方法。

如果 TraversalType 属性的值为 edittimecheck.TraversalTypes.ACTIVEGRAPH,则会对用户正在查看的模型或子系统同一级别的每个模块调用 blockDiscovered 方法。当 blockDiscovered 方法完成对模型或子系统某一层级内所有块的遍历时,也可以调用 finishedTraversal 方法。

输入参数

全部展开

编辑时间检查,指定为继承自 ModelAdvisor.Edittime 类的类的对象。

要检查编辑时检查违规情况的模块的数字句柄。

输出参量

全部展开

违反编辑时检查的块,以 ModelAdvisor.ResultDetail 对象或 ModelAdvisor.ResultDetail 对象数组的形式返回。

属性

Accessprotected

要了解有关方法属性的信息,请参阅方法属性

示例

全部展开

创建一个自定义的编辑时检查,检查 Inport 和 Outport 块是否根据其输出数据类型具有特定的颜色。

获取一个模型来测试模型顾问功能。

openExample('AdvisorCustomizationExample')

Model with edit-time check violations

将模型保存到您的工作文件夹中。关闭模型。

要注册自定义编辑时间检查,请创建 sl_customization 函数。 sl_customization 函数接受一个参量,即自定义管理器对象。要注册自定义检查,请使用 addModelAdvisorCheckFcn 方法。此方法的输入是检查定义函数的句柄。对于此示例,defineCheck 是检查定义函数。创建 sl_customization 函数并将其保存到工作文件夹中。

function sl_customization(cm)
cm.addModelAdvisorCheckFcn(@defineCheck);

创建检查定义函数。在函数内部,创建一个 ModelAdvisor.Check 对象,并将检查 ID 指定为输入参量。然后,指定 ModelAdvisor.Check TitleCallbackHandle 属性。CallbackHandle 属性是您为定义编辑时检查而创建的类的名称。对于此示例,MyEditTimeChecks 是包名称,PortColor 是类名。然后,将检查发布到模型顾问中的新文件夹。对于此示例,文件夹名称为 DEMO:编辑时间检查 。在这个示例中,创建一个名为 defineCheck 的函数,并将以下代码包含在其中。将 defineCheck 函数保存到工作文件夹中。

function defineCheck
rec = ModelAdvisor.Check("advisor.edittimecheck.PortColor");
rec.Title = 'Check color of Inport and Outport blocks';
rec.CallbackHandle = 'MyEditTimeChecks.PortColor'; 
mdladvRoot = ModelAdvisor.Root;
mdladvRoot.publish(rec,'DEMO: Edit-time Checks');

创建一个从 ModelAdvisor.EdittimeCheck 抽象基类派生的类。对于此示例,请创建一个名为 PortColor.m 的类文件。将以下代码复制到 PortColor.m 文件中。然后,创建一个名为 +MyEditTimeChecks 的文件夹,并将 PortColor.m 文件保存在该文件夹中。类必须位于与包名相同的文件夹中。

PortColor 类定义了三个方法:PortColorblockDiscoveredfixPortColor 方法设置 CheckIdTraversalType 属性。此检查的遍历类型为 edittimecheck.TraversalTypes.BLKITER,因为该检查必须检查新添加和编辑的块,但不必检查与编辑或新添加的块位于同一子系统或模型中的受影响块。blockDiscovered 方法包含一个算法,用于检查 Inport 和 Outport 块的颜色。fix 方法用于更新颜色不正确的方块。

classdef PortColor < ModelAdvisor.EdittimeCheck
    % Check that ports conform to software design standards for background color.
    %
    %   Background Color                Data Types
    %   orange                          Boolean
    %   green                           all floating-point
    %   cyan                            all integers
    %   Light Blue                      Enumerations and Bus Objects
    %   white                           auto
    %


    methods
        % Set the Check ID and traversal type.
        function obj=PortColor(checkId)
            obj=obj@ModelAdvisor.EdittimeCheck(checkId);
            obj.traversalType = edittimecheck.TraversalTypes.BLKITER;                       
        end
        % Specify the edit-time check algorithm using the blockDiscovered method.
        function violation = blockDiscovered(obj, blk)
            violation = []; 
            % To check when this check gets called, insert a breakpoint here. 
            if strcmp(get_param(blk,'BlockType'),'Inport') || strcmp(get_param(blk,'BlockType'),'Outport')
                
                dataType = get_param(blk,'OutDataTypeStr');
                currentBgColor = get_param(blk,'BackgroundColor');
                
                if strcmp(dataType,'boolean')
                        if ~strcmp(currentBgColor, 'orange')
                            % Create a violation object using the ModelAdvisor.ResultDetail class.
                            violation = ModelAdvisor.ResultDetail;
                            ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                            violation.CheckID = obj.checkId;
                            violation.Description = 'Inport/Outport blocks with Boolean outputs should be orange.';
                            violation.title = 'Port Block Color';
                            violation.ViolationType = 'Warning';
                        end
                elseif any(strcmp({'single','double'},dataType))
                        if ~strcmp(currentBgColor, 'green')
                            violation = ModelAdvisor.ResultDetail;
                            ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                            violation.CheckID = obj.checkId;
                            violation.Description = 'Inport/Outport blocks with floating-point outputs should be green.';
                            violation.title = 'Port Block Color';
                            violation.ViolationType = 'Warning';
                        end
                elseif any(strcmp({'uint8','uint16','uint32','int8','int16','int32'}, dataType))
                        if ~strcmp(currentBgColor, 'cyan')
                            violation = ModelAdvisor.ResultDetail;
                            ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                            violation.CheckID = obj.checkId;
                            violation.Description = 'Inport/Outport blocks with integer outputs should be cyan.';
                            violation.title = 'Port Block Color';
                            violation.ViolationType = 'Warning';
                        end
                elseif contains(dataType,'Bus:')
                    if ~strcmp(currentBgColor, 'lightBlue')
                        violation = ModelAdvisor.ResultDetail;
                        ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                        violation.CheckID = obj.checkId;
                        violation.Description = 'Inport/Outport blocks with bus outputs should be light blue.';
                        violation.title = 'Port Block Color';
                        violation.ViolationType = 'Warning';
                    end
                 elseif contains(dataType,'Enum:')
                    if ~strcmp(currentBgColor, 'lightBlue')
                        violation = ModelAdvisor.ResultDetail;
                        ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                        violation.CheckID = obj.checkId;
                        violation.Description = 'Inport/Outport blocks with enumeration outputs should be light blue.';
                        violation.title = 'Port Block Color';
                        violation.ViolationType = 'Warning';
                    end
                elseif contains(dataType, 'auto')
                    if ~strcmp(currentBgColor, 'white')
                        violation = ModelAdvisor.ResultDetail;
                        ModelAdvisor.ResultDetail.setData(violation,'SID',Simulink.ID.getSID(blk));
                        violation.CheckID = obj.checkId;
                        violation.Description = 'Inport/Outport blocks with auto outputs should be white.';
                        violation.title = 'Port Block Color';
                        violation.ViolationType = 'Warning';
                    end                    
                end
            end  
        end
        
              
        % Optionally, provide a fix  for the violation object.
        function success = fix(obj, violation)
            success = false;
            dataType = get_param(violation.Data,'OutDataTypeStr');
            if strcmp(dataType,'boolean')
                set_param(violation.Data,'BackgroundColor','orange');
            elseif any(strcmp({'single','double'},dataType))
                set_param(violation.Data,'BackgroundColor','green');
            elseif any(strcmp({'uint8','uint16','uint32','int8','int16','int32'}, dataType))
                set_param(violation.Data,'BackgroundColor','cyan');
            elseif contains(dataType,'Bus:')  || contains(dataType,'Enum:')
                set_param(violation.Data,'BackgroundColor','lightBlue');
            elseif contains(dataType,'auto')
                set_param(violation.Data,'BackgroundColor','white');
            end
            success = true;
        end
    end
end

刷新模型顾问以使用路径上的新检查更新缓存。

Advisor.Manager.refresh_customizations

打开 AdvisorCustomizationExample 模型。

点击建模选项卡并选择 模型顾问 > 配置编辑器,或在命令提示符下输入以下命令,即可打开模型顾问配置编辑器:

Simulink.ModelAdvisor.openConfigUI;

创建包含自定义编辑时间检查的自定义配置。将配置保存为 my_config.json。关闭模型顾问配置编辑器。将自定义配置设置到 my_config.json 文件中。

ModelAdvisor.setModelConfiguration('AdvisorCustomizationExample', 'my_config.json');

点击建模选项卡并选择模型顾问 > 编辑时检查,打开编辑时检查。“配置参数”对话框打开,您选择编辑时检查参数。您也可以在命令提示符下输入以下命令:

edittime.setAdvisorChecking('AdvisorCustomizationExample','on');

要查看编​​辑时间警告,点击黄色高亮显示的块。

在模型的顶层,两个 Inport 块的输出数据类型为 int32。它们会产生编辑时警告,因为它们应该是青色的。Outport 模块不会产生违规,因为它具有自动数据类型,并且是白块。

要修复编辑时间警告,请在编辑时间检查警告窗口中点击修复

版本历史记录

在 R2022a 中推出