主要内容

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

定义自定义编辑时间检查以修复架构模型中的问题

本示例展示了如何创建自定义编辑时间检查,该检查可在使用 System Composer™ 创建的架构模型上运行。编辑时检查有助于在模型设计评审过程中更早地发现问题。本示例中的自定义编辑时间检查会在连接模块端口接口名称不匹配时发出警告。有关编写自定义检查过程的更多信息,请参阅 定义自定义模型顾问检查

创建一个简单的架构模型

创建一个简单的架构模型,其中共享连接器的端口的数据接口名称不匹配。

  1. 创建临时工作目录。

  2. 在 MATLAB®主页选项卡上,点击 Simulink

  3. 在 Simulink® 开始页面中,点击 System Composer 并选择架构模型

  4. 添加三个 Component 块。

  5. 如图所示,将一个 Component 模块的输出端口连接到另外两个 Component 模块的输入端口。

    Simple architecture model

  6. 建模选项卡上,点击接口编辑器

  7. 创建两个数据接口,名称分别为 interface0interface1

  8. 打开属性检查器。

  9. 对于 Component,点击 OutBus 端口。在“属性检查器”的接口部分中,对于名称字段,选择 interface0

  10. 对于 Component1,点击 InBus 端口。在“属性检查器”的接口部分中,对于名称字段,选择 interface1

  11. 对于 Component2,点击 InBus 端口。在“属性检查器”的接口部分中,对于名称字段,选择 interface0

  12. 将模型保存到您的工作目录。在这个示例中,模型名称是 myModel.slx

创建自定义编辑时间检查

创建一个检查,用于检测用户在编辑模型时,共享同一连接器的端口中数据接口名称不匹配的情况。

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

    function sl_customization(cm)
    cm.addModelAdvisorCheckFcn(@defineCheck);
  2. 创建检查定义函数。在函数内部,创建一个 ModelAdvisor.Check 对象,并将检查 ID 指定为输入参量。然后,指定 ModelAdvisor.Check TitleCallbackHandle 属性。CallbackHandle 属性是您为定义编辑时检查而创建的类的名称。在这个示例中,MyEditTimeChecks 是命名空间,PortMismatch 是类名。然后,将检查发布到模型顾问中的新文件夹。在这个示例中,文件夹名称是 System Composer Edit-time Check。在这个示例中,创建一个名为 defineCheck 的函数,并将以下代码包含在其中。将 defineCheck 函数保存到工作文件夹中。

    function defineCheck
    rec = ModelAdvisor.Check("advisor.edittimecheck.SystemComposerPortMismatch");
    rec.Title = 'Check port mismatch for system composer components';
    rec.CallbackHandle = 'MyEditTimeChecks.PortMismatch';
    mdladvRoot = ModelAdvisor.Root;
    mdladvRoot.publish(rec,'System Composer Edit-time Check');
    end
  3. 创建一个从 ModelAdvisor.EdittimeCheck 抽象基类派生的类。对于此示例,请创建一个名为 PortMismatch 的类文件。将以下代码复制到 PortMismatch.m 文件中。然后,创建一个名为 +MyEditTimeChecks 的文件夹,并将 PortMismatch.m 文件保存在该文件夹中。类必须位于与命名空间同名的文件夹中。

    PortMismatch 类定义了两个方法:PortMismatchblockDiscoveredPortMismatch 方法设置 CheckIdTraversalType 属性。此检查的遍历类型为 edittimecheck.TraversalTypes.ACTIVEGRAPH,因为该检查必须检查同一子系统或模型中新添加和编辑的块以及受影响的块。blockDiscovered 方法包含一个算法,用于检查端口接口名称是否匹配。

    classdef PortMismatch < ModelAdvisor.EdittimeCheck    
    
        methods
            function obj=PortMismatch(checkId)
                obj=obj@ModelAdvisor.EdittimeCheck(checkId);
                obj.traversalType = edittimecheck.TraversalTypes.ACTIVEGRAPH;            
            end
    
            function violationArray = blockDiscovered(obj,blk)
                violationArray = [];
                blkHdl = get_param(blk, 'Handle');
                archMdl = systemcomposer.arch.Model(bdroot(blk));
                comp = archMdl.lookup('SimulinkHandle',blkHdl);
                if isa(comp, 'systemcomposer.arch.Component')
                    for i = 1:length(comp.Ports)
                        compPort = comp.Ports(i);
                        if strcmp(compPort.Direction, 'Output')
                            srcInterfaceName = compPort.InterfaceName;
                            for j = 1:length(compPort.Connectors)
                                connector = compPort.Connectors(j);
                                destPort = connector.DestinationPort;
                                destInterfaceName = destPort.InterfaceName;   
                                if(~strcmpi(srcInterfaceName, destInterfaceName))
                                    hiliteHandle = destPort.SimulinkHandle;
                                    violation = ModelAdvisor.ResultDetail;
                                    ModelAdvisor.ResultDetail.setData(violation, 'Signal',hiliteHandle);
                                    violation.CheckID = obj.checkId;
                                    violation.Description = 'Connected port interface names should be the same.';
                                    violation.Title = 'Port Interface Mismatch';
                                    violation.ViolationType = 'warn';
                                    violationArray = [violationArray violation]; %#ok<AGROW> 
                                end
                            end
                        end
                    end
                else 
                    compPort = comp;
                    if strcmp(compPort.Direction, 'Output')
                        srcInterfaceName = compPort.InterfaceName;
                        for j = 1:length(compPort.Connectors)
                            connector = compPort.Connectors(j);
                            destPort = connector.DestinationPort;
                            destInterfaceName = destPort.InterfaceName;
                            if(~strcmpi(srcInterfaceName, destInterfaceName))
                                hiliteHandle = destPort.SimulinkHandle;
                                violation = ModelAdvisor.ResultDetail;
                                ModelAdvisor.ResultDetail.setData(violation,'Signal',hiliteHandle);
                                violation.CheckID = obj.checkId;
                                violation.Description = 'Connected port interface names should be the same.';
                                violation.Title = 'Port Interface Mismatch';
                                violation.ViolationType = 'warn';
                                violationArray = [violationArray violation]; %#ok<AGROW>
                            end
                        end
                    end
                end
            end
        end
    end

创建自定义编辑时间检查配置

创建包含编辑时间检查的自定义配置。将配置与 myModel.slx 模型关联起来。

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

    Advisor.Manager.refresh_customizations
  2. 点击建模选项卡并选择 模型顾问 > 自定义编辑时检查,或在命令提示符下输入以下命令,即可打开模型顾问配置编辑器:

    Simulink.ModelAdvisor.openConfigUI;
  3. 创建一个仅包含自定义编辑时间检查的自定义配置。选择产品 > System Composer Edit-time Checks 文件夹,然后删除其他文件夹。将配置保存为 sc_config.json。关闭模型顾问配置编辑器。

  4. 点击建模选项卡并选择模型顾问 > 编辑时检查,将自定义配置设置为 sc_config.json 文件。在打开的“配置参数”对话框中,在模型顾问配置文件参数中指定配置文件的路径。或者,在命令提示符下输入以下命令:

    ModelAdvisor.setModelConfiguration('myModel', 'sc_config.json');

  5. 选择模型顾问 > 编辑时配置参数,启用编辑时间检查。您也可以在命令提示符下输入以下命令:

    edittime.setAdvisorChecking('myModel','on');
    
  6. 要查看编​​辑时间警告,点击黄色高亮显示的信号。

    Architecture model with edit-time warning

    ComponentComponent1 模块之间的连接器发出警告,因为每个端口中的数据接口名称不匹配。

另请参阅

| |

主题