Simulink、Stateflow添加自定义菜单项


本文介绍如何将一个菜单项添加到simulink或Stateflow菜单中;

1. 注册菜单自定义项

function sl_customization(cm)
  %% Register custom menu function.
  cm.addCustomMenuFcn('Simulink:ToolsMenu', @getMyItems);

使用 sl_customization.m 函数注册您的自定义项。将该函数放在MATLAB的路径上或当前路径下。

您可以有多个 sl_customization.m 文件。每个文件中的自定义项都会生效,如果出现冲突,则由相应的自定义项进行处理。例如,如果您在多个 sl_customization 文件中为库指定了优先级,则只有一个生效。如果您对同一个菜单项添加两次,它会出现两次。要确保自定义按预期加载,请刷新自定义,如读取和刷新自定义文件中所述。

1.1 读取和刷新自定义文件

Simulink 启动时会读取 sl_customization.m 文件。如果您更改了 sl_customization.m 文件,请重新启动 Simulink 或输入以下命令以查看更改:

sl_refresh_customizations

此命令运行 MATLAB 路径和当前文件夹中的所有 sl_customization.m 文件。运行 sl_refresh_customizations 的一些副作用包括:

(1)重新编译 Simulink 工具条

(2)重新编译所有 Simulink Editor 菜单

(3)重新编译 Library Browser 菜单和工具栏

(4)清除 Library Browser 缓存并刷新 Library Browser

(5)重新加载 Viewers and Generators Manager 数据

1.2 函数使用

对于要自定义的每个菜单,系统 sl_customization 函数必须调用自定义管理器 addCustomMenuFcn 方法。每次调用都应该传递要自定义的菜单的标记和自定义菜单函数,该函数指定要添加到菜单中的项目。例如,以下 sl_customization 函数将自定义项添加到 SimulinkTools 菜单。

function sl_customization(cm)
  %% Register custom menu function.
  cm.addCustomMenuFcn('Simulink:ToolsMenu', @getMyItems);

addCustomMenuFcn函数有两个输入参数,第一个是菜单标记,第二个输入参数是自定义菜单函数

1.3 菜单标记

Simulink菜单标记

标记添加的项目
Simulink菜单标记
Simulink:MenuBarSimulink Editor 菜单栏的菜单
Simulink:PreContextMenuSimulink Editor 上下文菜单开头的项目
Simulink:ContextMenuSimulink Editor 上下文菜单末尾的项目
Simulink:FileMenuSimulink Editor 的 File 菜单末尾的项目
Simulink:EditMenuSimulink Editor 的 Edit 菜单末尾的项目
Simulink:ViewMenuSimulink Editor 的 View 菜单末尾的项目
Simulink:DisplayMenuSimulink Editor 的 Display 菜单末尾的项目
Simulink:DiagramMenuSimulink Editor 的 Diagram 菜单末尾的项目
Simulink:SimulationMenuSimulink Editor 的 Simulation 菜单末尾的项目
Simulink:AnalysisMenuSimulink Editor 的 Analysis 菜单末尾的项目
Simulink:CodeMenuSimulink Editor 的 Code 菜单末尾的项目
Simulink:ToolsMenuSimulink Editor 的 Tools 菜单末尾的项目
Simulink:HelpMenuSimulink Editor 的 Help 菜单末尾的项目
State flow菜单标记
Stateflow:MenuBarStateflow Editor 菜单栏的菜单
Stateflow:PreContextMenuStateflow Editor 上下文菜单开头的项目
Stateflow:ContextMenuStateflow Editor 上下文菜单末尾的项目
Stateflow:FileMenuStateflow Editor 的 File 菜单末尾的项目
Stateflow:EditMenuStateflow Editor 的 Edit 菜单末尾的项目
Stateflow:ViewMenuStateflow Editor 的 View 菜单末尾的项目
Stateflow:DisplayMenuStateflow Editor 的 Display 菜单末尾的项目
Stateflow:ChartMenuStateflow Editor 的 Chart 菜单末尾的项目
Stateflow:SimulationMenuStateflow Editor 的 Simulation 菜单末尾的项目
Stateflow:AnalysisMenuStateflow Editor 的 Analysis 菜单末尾的项目
Stateflow:CodeMenuStateflow Editor 的 Code 菜单末尾的项目
Stateflow:ToolsMenuStateflow Editor 的 Tools 菜单末尾的项目
Stateflow:HelpMenuStateflow Editor 的 Help 菜单末尾的项目

例如:想要在simulink编辑界面,右键上下文菜单开头添加getMyItems自定义菜单函数:

function sl_customization(cm)
  %% Register custom menu function.
  cm.addCustomMenuFcn('Simulink:PreContextMenu', @getMyItems);

2. 自定义菜单函数

2.1 创建自定义菜单函数

自定义菜单函数返回架构函数的元胞数组,这些架构函数定义要在模型编辑器菜单上显示的自定义项。自定义菜单函数返回一个元胞数组,它类似于 generateFcn 函数返回的元胞数组。

您的自定义菜单函数应接受回调信息对象并返回列出架构函数的元胞数组。该元胞数组的每个元素可以是架构函数的句柄,也可以是二元素元胞数组,其第一个元素是某架构函数的句柄,第二个元素是要传递给该架构函数的用户定义的数据。例如,以下自定义菜单函数返回一个列出三个架构函数的元胞数组。

function schemas = getMyItems(callbackInfo)
  schemas = {@getItem1, ...
            @getItem2, ...
            @getItem3};
end

2.2 定义菜单项

可以通过创建一个返回架构对象的函数来定义菜单项,该对象指定创建该菜单项所需的信息。

function schema = getItem1(~)
    schema = sl_action_schema;
    schema.label = 'PortAlignment';  
    % schema.userdata = 'item one';
    schema.callback = @PortAlignment;
end

操作架构对象. 此对象指定有关触发您定义的命令的菜单项的信息,包括菜单项上显示的标签以及用户选择该菜单项时要调用的函数。使用函数 sl_action_schema 在架构函数中创建此对象的实例。其属性包括:

属性描述
tag可选字符向量,用于标识此操作以便筛选器函数可以引用它
label字符向量,用于指定触发此操作的菜单项上显示的标签
state用于指定此操作的状态的属性。有效值为 ‘Enabled’(默认值)、‘Disabled’ 和 ‘Hidden’
statustip字符向量,指定当用户选择触发此操作的菜单项时在编辑器状态栏中要显示的文本
userdata指定的数据。可以是任何类型
accelerator字符向量,指定用于触发此操作的 Ctrl 组合键。您只能为菜单栏菜单上显示的自定义菜单项添加一个键盘快捷方式,并且不能重新定义 Simulink Editor 自带的快捷键。例如,Ctrl+D 是 Simulink Editor 中 Update Diagram 的快捷键,因此您不能重新定义它。要指定此值,请使用 ‘Ctrl+K’ 形式,其中 K 是快捷键。例如,对于通过按住 Ctrl 和 Alt 并按 T 调用的快捷键,使用 ‘Ctrl+Alt+T’
callback字符向量,指定当用户选择触发此操作的菜单项时要计算的 MATLAB 表达式或要调用的函数的句柄。此函数必须接受一个参数:回调信息对象
autoDisableWhen控制何时自动禁用菜单项的属性

这里需要着重关注的有两项,labelcallback
label是添加自定义菜单后,自定义菜单显示的名字;
callback是自定义菜单添加后,当触发此操作后,MATLAB索要运行的函数名;

注意:callback函数需要再MATLAB的编译路径下,否则因为无法找到报错;

3.如何使用

该脚本编写完成后,不能直接运行该m文件,该文件是当 Simulink 启动时会读取 sl_customization.m 文件。如果您更改了 sl_customization.m 文件,请重新启动 Simulink 或输入以下命令以查看更改:

sl_refresh_customizations

源码

以下源码是将前面两篇文章里介绍的端口对齐数据字典自动生成功能,添加到了simulin和stateflow的右键菜单中,使用相应的功能时仅需要右键点击菜单,则自动运行相应的m文件;

%% 自定义Simulink菜单栏
% 
% Author: LL

%% File Content
% 使用cm对象的addCustomMenuFcn函数,添加自定义菜单
function sl_customization(cm)
    cm.addCustomMenuFcn('Simulink:PreContextMenu',@getMyItems);%simulink右键菜单
    cm.addCustomMenuFcn('Stateflow:PreContextMenu',@getMyItems);%state右键菜单
end

% 自定义菜单创建函数
function schemaFcns = getMyItems(~)
    schemaFcns = {@getItem1,@getItem2};    
end

%% 为菜单项定义模式函数
function schema = getItem1(~)
    schema = sl_action_schema;
    schema.label = 'PortAlignment';  
    % schema.userdata = 'item one';
    schema.callback = @PortAlignment;
end

function schema = getItem2(~)
    schema = sl_action_schema;
    schema.label = 'CreateSldd';
    % schema.userdata = 'item one';
    schema.callback = @CreateSldd;
end
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Simulink Stateflow是一种基于模型的设计和仿真工具,可以在Matlab/Simulink环境下进行系统级建模和仿真。它可以帮助工程师通过图形化编程方式来实现各种控制逻辑,例如状态机、事件驱动等。 Stateflow在许多应用领域中广泛应用,例如自动化、控制和通信系统。下面我来举一个简单的Stateflow案例来说明其应用。 假设我们要设计一个自动贩卖机系统,其中包含以下几个状态:待机、选择商品、等待付款和出货状态。我们可以使用Stateflow来描述这些状态之间的转换和行为。 在Stateflow中,每个状态都可以用一个矩形表示,并且可以定义进入状态时的初始化动作和在状态内发生的事件。我们可以使用转换条件来定义状态之间的转换条件,例如当用户按下购买按钮时,系统从选择商品状态转换到等待付款状态。 在每个状态中,我们可以定义相关的操作和行为。例如,在待机状态下,系统可以定时检测是否有用户按下按钮,如果有,则进入选择商品状态。在等待付款状态下,系统可以接收付款信息,并根据付款结果来决定是否进入出货状态。 在Stateflow中,我们还可以定义事件和条件之间的层级关系。例如,在等待付款状态中可以定义一个超时事件,如果在规定时间内没有收到付款信息,系统将自动转换到选择商品状态,并重新开始流程。 通过使用Simulink Stateflow,我们可以在一个集成的开发环境中对自动贩卖机系统进行建模和仿真。这样可以大大简化系统设计和调试过程,并提高系统的可靠性和性能。 总之,Simulink Stateflow是一个强大的建模和仿真工具,可以在各种应用领域中实现复杂的控制逻辑。通过它,工程师可以图形化地描述系统的状态转换和行为,并进行细粒度的调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SissonLi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值