Simulink仿真入门到精通(十四) Simulink自定义环境

摘要:
如果sl_ sustomization。m函数存在于MATLAB的搜索路径中。当Simulink启动时,它将读取该文件的内容以初始化Simulink的人机界面。Simulink本身提供此功能。每次修改后,用户必须重新启动Simulink或使用命令sl_refresh_Customizations使更改生效。简单地说,就是定制。将m中addCustomMenuFcn函数的第一个参数“Simulink:ToolMenu”更改为“Simulink:ContextMenu”。更改每个Simulink工具行的顺序:Simulink Library Browser中每个工具箱的顺序是内置的,由两个因素决定:优先级和名称。
14.1 Simulink环境自定义功能

sl_sustomization.m函数是Simulink提供给用户使用MATLAB语言自定义Simulink标准人机界面的函数机制。若sl_sustomization.m函数存在于MATLAB的搜索路径中,在当Simulink启动时就会读取此文件的内容进行Simulink的人机界面的初始化。Simulink本身就提供了这个函数,用户每次修改之后,必须重启Simulink或者使用命令sl_refresh_customizations使变更起作用。

参考:https://www.mathworks.com/help/simulink/ug/registering-customizations.html

Reading and Refreshing the Customization File

The sl_customization.m file is read when Simulink starts. If you change the sl_customization.m file, either restart Simulink or enter this command to see the changes:

sl_refresh_customizations

This command runs all sl_customization.m files on the MATLAB path and in the current folder. Some side-effects of running sl_refresh_customizations include:

  • Rebuilding the Simulink Toolstrip

  • Rebuilding all Simulink Editor menus

  • Rebuilding the Library Browser menus and toolbars

  • Clearing the Library Browser cache and refreshing the Library Browser

  • Reloading the Viewers and Generators Manager data

14.2 Simulink工具栏菜单自定义

可以在Simulink提供的现有菜单栏的基础上进行菜单项的添加。Simulink Model Editor中用于添加菜单项的位置有3个:顶层菜单的末尾、菜单栏和右键菜单的开始或结尾处。

添加的对象成为项目(item),为了添加项目,需要以下步骤:

  1. 创建一个定义项目的模式函数(schema function);
  2. 将这个定义菜单项目的函数注册在sl_customization.m中;
  3. 为这个菜单项目定义一个触发运行的回调函数。

例:增加一个显示当前所选模块属性列表的菜单项目。

首先创建一个定义此项的模式函数。

function schema = get_block_property(callbackInfo)
schema = sl_action_schema;    %使用sl_action_schema函数创建一个对象
schema.label = 'block property';
schema.userdata = 'Custom';
schema.callback = @custom_callback;
end

选中此菜单时触发回调函数 custom_callback,显示当前选中的模块的属性列表。

function custom_callback(callbackInfo)
inspect(gcbh);
disp('### The property of current block is displayed.');
end

接着将定义的函数注册到sl_customization.m中。

以下代码将Simulink菜单栏以及子层菜单的WidgetId显示出来。 

Simulink仿真入门到精通(十四) Simulink自定义环境第1张

使用addCustomMenuFcn方法可以注册一个自定义菜单项目函数。

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

在注册的cuntom_items函数中使用句柄函数方式,亦成为匿名函数。

%% Define the custom menu function.
function schemaFcns = custom_items(callbackInfo)
schemaFcns = {@get_block_property};
end

这样,就在Tools菜单最末一项得到所设定的菜单项。

Simulink仿真入门到精通(十四) Simulink自定义环境第2张

注:函数custom_items、get_block_property和custom_callback的参数callbackInfo并没有被使用,可使用~表示。

自定义Model Editor的菜单不仅可以是一级菜单,还可以是多级菜单。此时需要在sl_container_schema函数创建一个容器对象,并将刚才创建的菜单项目作为其成员添加进去。

%% Define the schema function for first menu item.
function schema = menu_control(callbackInfo)
schema = sl_container_schema;
schema.label = 'Customized';
schema.childrenFcns = {@get_block_property;}
end

在sl_costomization.m中注册菜单项目模式函数时将最上层的模式容器对象注册进去。即将@get_block_property改为@menu_control。

Simulink仿真入门到精通(十四) Simulink自定义环境第3张

自定义菜单项也可以添加到右键菜单中。只需将sl_customization.m中addCustomMenuFcn函数的首个参数'Simulink:ToolMenu'改为'Simulink:ContextMenu'即可。

14.3 Simulink Library Browser菜单栏自定义

可参考:https://www.mathworks.com/help/simulink/ug/customizing-the-library-browser.html

Simulink Library Browser菜单栏也可以添加用户自定义的菜单,方法同前。

更改各个Simulink工具线的顺序:Simulink Library Browser中各个工具箱的排列顺序是内置的,由优先级和名称2个因素决定。优先级数字越小工具箱排位越靠前;对于同一优先级的工具箱按照字母顺序排列。默认情况下Simulink库优先级为-1,其他工具箱优先级为0。

cm.LibraryBrowserCustomizer.applyOrder({'Embedder Coder',-2});

该命令将Embedded Coder工具箱显示在首位。

cm.LibraryBrowserCustomizer.applyFilter({'Embedded Coder','Hidden'});
cm.LibraryBrowserCustomizer.applyFilter({'Simulink','Disabled'});
sl_refresh_customizations

以上代码将Embedded Coder工具箱隐藏,将Simulink工具箱设置为不可用。

14.4 Simulink目标硬件自定义

在Configuration Parameter对话框中的Hardware Implementation子页面可以选择各个厂家提供的各种目标硬件芯片类型,设置其大小端方式、所支持的各种数据类型的位数等。

Simulink仿真入门到精通(十四) Simulink自定义环境第4张

在sl_customization.m中使用loc_register_device注册一个函数,在这个函数中对硬件的属性进行描述即可。描述目标硬件的结构体对象需要使用RTW.HWDeviceRegistry创建并配置。需要配置的成员信息有:

配置成员名说明
Vendor芯片生产商
Type芯片系列号或类型名
Alias芯片别名,不使用时不用设置,为空
PlatformProduction hardware以及Test hardware两个组别中是否都显示控件清单,二者组别名分别以字符串'prod','test'表示
setWordSizes设置各种数据类型的位数,按照长度顺序char≤short≤int≤long,long以外类型位数必须为8的整数倍,最大为32位,long型位数不能少于32位
LargestAtomicInteger最大原子整数,生成代码中存在数据拷贝时使用,若对位数大于此选项设置的数据进行整数数据拷贝,则检测数据拷贝完整性体现在代码生成中
LargestAtomicFloat最大原子浮点数,生成代码中存在数据拷贝时使用,若对位数大于此选项设置的数据进行浮点数数据拷贝,则检测数据拷贝完整性体现在代码生成中
Endianess字节次序设定,打断big或小端little
IntDivRoundTo有符号整数进行除法时的四舍五入方法选择,'zero','floor'或'undefined'
ShiftRightIntArithtrue/false,设置是否将有符号整数的右移操作作为算数右移
setEnabled选择此目标硬件时哪些GUI控件是可选的

例:描述一个虚拟目标硬件商Custom提供的SimulinkType系列芯片。

function sl_customization(cm)
cm.registerTargetInfo(@loc_register_device);

end

% loc_register_devie resigters self defined device into Simulink Parameter
% cofiguration
function thisprod = loc_register_device
  thisprod = RTW.HWDeviceRegistry;
  thisprod.Vendor = 'Custom';
  thisprod.Type = 'Simulink Type';
  thisprod.Alias = {};
  thisprod.Platform = {'Prod','Test'};
  thisprod.setWordSizes([8 16 16 32 32]);
  thisprod.LargestAtomicInteger = 'Char';
  thisprod.LargestAtomicFloat = 'Float';
  thisprod.Endianess = 'Big';
  thisprod.IntDivRoundTo = 'floor';
  thisprod.ShiftRightIntArith = true;
  thisprod.setEnabled({'BitPerPointer'});
end

刷新后可以看到vendor中新增了Custom选项,上述配置已添加进去。

Simulink仿真入门到精通(十四) Simulink自定义环境第5张

14.5 Simulink参数对话框控制

Simulink环境下的对话框也可以通过属性设置的方法进行一定的自定义。

实现步骤是首先在sl_customization.m中使用addDlgPreOpenFcn方法注册一个回调函数,回调函数绑定在目标控件的父对象上。再在回调函数中编写设置目标控件属性的M语句。对一个控件的回调函数需要注册到其父对象的ConfigSet中,本质就是在其父控件被打开之前调用这个自定义的回调函数实现某控件的使能及可见性设置。

例:将SolverType隐藏,将仿真StartTime变为不可编辑。

function sl_customization(cm)
cm.addDlgPreOpenFcn('Simulink.SolverCC',@disable_solver_type);

end

function disable_solver_type(dialogH)
dialogH.hideWidgets({'Simulink.SolverCC.SolverType'});
dialogH.disableWidgets({'Simulink.SolverCC.StartTime'});
end

免责声明:文章转载自《Simulink仿真入门到精通(十四) Simulink自定义环境》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇endnote X7使用方法sqlserver存储过程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python网络编程 day35 网络编程——进程池,线程池、协程、回调函数、gevent模块、asyncio模块

一、内容回顾 面试题: 请聊聊进程队列的特点和实现原理 进程之间可以互相通信 IPC 数据安全 先进先出 实现原理 管道+锁 管道是基于文件级别的socket+pickle实现的 你了解生产者消费者模型吗? 了解 为什么了解? 工作经历: 采集图片,爬取音乐,主要是爬取大量数据,想提高爬虫效率,有用过一个生产者消费者模型,这个模型...

Win32编程

    Win32编程 此资料为ITjob软件开发教程网提供,特此分享,互相学习! C/C++/VC/MFC技术交流群:95453496 一、Win32编程基本概念 1、消息驱动 在介绍Windows消息驱动概念之前,我们首先来回顾面向过程的程序结构:main()程序有明显的开始、中间过程和结束点,程序是围绕这个过程编写好相关的子过程,再把这些子过程串联...

C#细说多线程(下)

本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发。 其中委托的BeginInvoke方法以及回调函数最为常用。而 I/O线程可能容易遭到大家的忽略,其实在开发多线程系统,更应该多留意I/O线程的操作。特别是在ASP.NET开发当中,可能更多人只会留意在客户端使用Ajax或者在服务器端使用U...

spring实现定时任务的两种方式

本文为博主原创,未经允许不得转载        项目中要经常事项定时功能,在网上学习了下用spring的定时功能,基本有两种方式,在这里进行简单的总结, 以供后续参考,此篇只做简单的应用。        1.在spring-servlet.xml文件中加入task的命名空间: xmlns:task="http://www.springframework.o...

fastapi之根据model生成schema和router

概述 fastapi没有对应的admin,所以在需要配置后端的时候,会比较麻烦,每个接口都需要自己手动写。 但是很多时候我们可能需要一个比较标准的东西,比如…一个装饰器 通过装饰器装饰model就可以自动注册路由,自动生成对应的标准方法,再根据更多的一些自定义配置,甚至不需要自己手动写schema,然后不需要自己单独写路由相关的东西。(相当于给sqlalc...

mnesia数据库学习笔记二

  mnesia数据库学习笔记二 创建一个mnesia数据库 定义方案 数据模型 启动Mnesia 创建新表 1、定义方案(schema) Mnesia 系统配置是在Schema中描述的。Schema数据表中的数据只能通过其相关函数进行访问和修改。Mnesia允许动态配置其内容。 方案函数 mnesia:create_schema(NodeList)该...