定义自定义编辑时间检查以修复架构模型中的问题
本示例展示了如何创建自定义编辑时间检查,该检查可在使用 System Composer™ 创建的架构模型上运行。编辑时检查有助于在模型设计评审过程中更早地发现问题。本示例中的自定义编辑时间检查会在连接模块端口接口名称不匹配时发出警告。有关编写自定义检查过程的更多信息,请参阅 定义自定义模型顾问检查。
创建一个简单的架构模型
创建一个简单的架构模型,其中共享连接器的端口的数据接口名称不匹配。
创建临时工作目录。
在 MATLAB® 的主页选项卡上,点击 Simulink。
在 Simulink® 开始页面中,点击 System Composer 并选择架构模型。
添加三个 Component 块。
如图所示,将一个 Component 模块的输出端口连接到另外两个 Component 模块的输入端口。

在建模选项卡上,点击接口编辑器。
创建两个数据接口,名称分别为
interface0和interface1。打开属性检查器。
对于
Component,点击OutBus端口。在“属性检查器”的接口部分中,对于名称字段,选择 interface0。对于
Component1,点击InBus端口。在“属性检查器”的接口部分中,对于名称字段,选择 interface1。对于
Component2,点击InBus端口。在“属性检查器”的接口部分中,对于名称字段,选择 interface0。将模型保存到您的工作目录。在这个示例中,模型名称是
myModel.slx。
创建自定义编辑时间检查
创建一个检查,用于检测用户在编辑模型时,共享同一连接器的端口中数据接口名称不匹配的情况。
要注册自定义编辑时间检查,请创建
sl_customization函数。sl_customization函数接受一个参量,即自定义管理器对象。要注册自定义检查,请使用addModelAdvisorCheckFcn方法。此方法的输入是检查定义函数的句柄。对于此示例,defineCheck是检查定义函数。创建sl_customization函数并将其保存到工作文件夹中。function sl_customization(cm) cm.addModelAdvisorCheckFcn(@defineCheck);创建检查定义函数。在函数内部,创建一个
ModelAdvisor.Check对象,并将检查 ID 指定为输入参量。然后,指定ModelAdvisor.CheckTitle和CallbackHandle属性。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
创建一个从
ModelAdvisor.EdittimeCheck抽象基类派生的类。对于此示例,请创建一个名为PortMismatch的类文件。将以下代码复制到PortMismatch.m文件中。然后,创建一个名为+MyEditTimeChecks的文件夹,并将PortMismatch.m文件保存在该文件夹中。类必须位于与命名空间同名的文件夹中。PortMismatch类定义了两个方法:PortMismatch和blockDiscovered。PortMismatch方法设置CheckId和TraversalType属性。此检查的遍历类型为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 模型关联起来。
刷新模型顾问以使用路径上的新检查更新缓存。
Advisor.Manager.refresh_customizations
点击建模选项卡并选择 模型顾问 > 自定义编辑时检查,或在命令提示符下输入以下命令,即可打开模型顾问配置编辑器:
Simulink.ModelAdvisor.openConfigUI;
创建一个仅包含自定义编辑时间检查的自定义配置。选择产品 > System Composer Edit-time Checks 文件夹,然后删除其他文件夹。将配置保存为
sc_config.json。关闭模型顾问配置编辑器。点击建模选项卡并选择模型顾问 > 编辑时检查,将自定义配置设置为
sc_config.json文件。在打开的“配置参数”对话框中,在模型顾问配置文件参数中指定配置文件的路径。或者,在命令提示符下输入以下命令:ModelAdvisor.setModelConfiguration('myModel', 'sc_config.json');
选择模型顾问 > 编辑时配置参数,启用编辑时间检查。您也可以在命令提示符下输入以下命令:
edittime.setAdvisorChecking('myModel','on');
要查看编辑时间警告,点击黄色高亮显示的信号。

Component和Component1模块之间的连接器发出警告,因为每个端口中的数据接口名称不匹配。
另请参阅
ModelAdvisor.EdittimeCheck | ModelAdvisor.Check | ModelAdvisor.ResultDetail