学习目的:

  • 使用simulink封装一个子系统,并将封装子系统放入到自定义的库中,可供建模时重复使用

功能:封装一个能够检测输入信号下降沿跳变的边沿检测模块,该模块可支持双击时修改内部参数。封装完成后,将封装好的模块添加到自定义的simulink库中,方便建模日常使用

Matlab版本:2018a

1、封装子系统的创建

1.1 功能模型的搭建

创建如上所示的模型,该模块实现了下降沿检测的逻辑功能,其中date store memory模块用于存储输入信号的上一次状态。当输入信号值为0,且保存的上一次的输入信号为1时,检测为下降沿,输出为1。由于需要先获取输入信号的上一次状态,所以应该先读取保存的上一次输入信号的状态,因此date store memroy模块的优先级必须设置为先读后写,也就是上面的读模块在执行时的优先级要比将当前状态保存到date store memory模块要高。

优先级的设置可以通过鼠标右击要修改的模块,选择弹出的选项栏的倒数第二行的Properties,弹出如下图所示的对话框,在Priority选项中进行设置,优先级值越小代表优先级最高。优先级的设置也可以通过后面讲述的方法进行设计。

(PS:模块的颜色可进行自定义设置,鼠标右击——》弹出栏的Format——》Background Color)

1.2 子系统创建Mask

创建Mask的好处有很多,比如在使用模块时可以通过鼠标双击封装的模块,在弹出的对话框中对内部的一些参数进行设置。就像现在要封装的下升沿检测模块,使用时我们想对里面的保存上一次输入信号状态的data store memory模块进行命名。此时,我们就可以在创建mask中新建一个输入栏,将这个输入栏获取的输入字符串和模块内部的date store memory名称联系到一起。在每次使用时,双击模块在弹出Mask窗口的输入栏中输入要给Data store memory起的名称,它会自动作用到子系统内部data store memory。

创建Mask前,须先将1.1中搭建的功能模型封装成子系统,通过Ctrl+G快捷键完成。创建子系统完成后,删除子系统外的输入输出端口,如下所示:

选中子系统,通过Ctrl+M快捷键创建Mask,弹出相应的mask设置对话框,下面对弹出对话框的内容进行设置

1)设置Icon&Ports选项

① Block frame:设置模块的边框是否可见

② Icon transparency:设置图标是否透明

③ Icon uinits:设置图标单位,这里选择的是归一化,即范围[0 1]

④ Icon画图命令设置,使用plot绘制了对话框左下角下降沿箭头图标。可支持绘制命令如下所示:

绘制命令 说明 语法示例
color 更改后续封装图标绘制命令的绘图颜色 color('red'); port_label('input',1,'In')
disp 在封装图标上显示文本 disp('Simulink')
dpoly 在封装图标上显示传递函数 dpoly([0 0 1], [1 2 1], 'z')
droots 在封装图标上显示传递函数 droots([-1], [-2 -3], 4)
fprinf 在封装图标上居中显示变量文本 fprintf('Sum = %d', 7)
image 在封装图标上显示 RGB 图像 image('xxx.jpg')
patch 在封装图标上绘制指定形状的彩色补片 patch([0 10 20 30 30 0], [10 30 20 25 10 10],[1 0 0])
plot 在封装图标上绘制由一系列点连接而成的图形 plot([10 20 30 40], [10 20 10 15])
port_label 在封装图标上绘制端口标签 port_label('output', 1, 'out')
text

在封装图标上的特定位置显示文本。

您必须在 Icon units 框中选择 Pixels

text(5,10, 'Simulink')
block_icon 将包含在子系统中的模块的图标提升到子系统封装

block_icon(BlockName)

2)设置Parameters & Dialog选项

① 在Mask对话框中添加Edit

② 设置Edit对话框的提示语

③ 创建Edit对话框变量,输入Edit对话框内容将保存在该变量中

④ Edit对话框变量的初始值

⑤ 不进行勾选

⑥ Tunable:设置仿真时参数不能进行修改

⑦ 设置Edit的回调函数,EF_DataStore_cbFn(gcb),gcb代表当前的block句柄

创建一个EF_DataStore_cbFn.m文件,Edit回调函数的内容如下:

function EF_DataStore_cbFn(currentBlock)

maskDSName = get_param(currentBlock,'dsName');
set_param([currentBlock '/Data Store Read'], 'DataStoreName',maskDSName);
set_param([currentBlock '/Data Store Read'], 'Priority','1');
set_param([currentBlock '/Data Store Write'],'DataStoreName',maskDSName);
set_param([currentBlock '/Data Store Write'],'Priority','2'); end

回调函数在对话框中的参数改变时被调用,在回调函数中获取Edit输入的名称,将该名称赋值给Data Store memory的读写模块,并设置了读写优先级,如在前面手动设置优先级后,此次没必要再进行设置。

⑧ Edit提示语的位置,选择在Edit的上面

3)设置Documentation选项

Documentation选项中是对封装模块功能的一些描述,当双击封装模块,填充的mask对话框中会显示这些描述信息内容。help中的编辑内容只在查看封装模块的help选项时,才能被看到

4)创建Mask完成后效果

2、将封装模块添加到自定义库中

1)新建一个simulink Lib,将封装的模块拷贝到新建库里2)重新修改mask参数

勾选Mask的Initialization选项中的allow library block to modify its contents

勾选上该选项后,建模时使用到该库中的这个模块时,可以通过Mask中创建的Edit给下降沿里保存信号的Data Store memory重新命名

注:如果是在simulink库中直接创建封装模块,而不是用上述的先在model里创建模块,然后再拷贝封装模块到库里,这时可以创建mask时可直接勾选上该项

3)修改封装模块显示名称

建模时,模型中可能会使用多个下降沿检测模块,为便于观察是否有不同的下降沿检测模块使用相同名的Data Store Memory,从而造成不必要的错误。可以设置使用Edit输入名称作为模块显示名称,通过以下两步进行设置:

3)-1 鼠标右击封装模块,选择Format——》Show Block Name——》off

3)-2 鼠标右击封装模块,选择Properties——》Block Annotation——》%dSName

修改后的显示如下图所示:

3)添加自定义库到Simulink Library

创建slblocks.m文件

function blkStruct = slblocks

 blkStruct.Browser(1).Library = 'LogicLib';------------------>①
blkStruct.Browser(1).Name = 'ucLogicLib';---------------->② end

Matlab搜索添加目录下名为slblocks的m文件,利用该文件中的信息在Simulink Library Browser面板中添加自定义库

① 代码自定义库文件的名称

② 自定义库在Simulink Library Browser面板中显示名称

4)自定义库文件内容存放形式

为了更好的管理自定义的库,我们一般将自定义库存放到一个特点文件夹中,可将上述内容按照这种结构进行存放

MyLib
|------slblocks.m
|------Lib
|------LogicLib.slx
|------mask
|------EF_DataStore_cbFn.m

注意,一定要将上述路径添加到Matlab的Path路径中,否则将出现找不到路径情况

4)添加完成效果

① Simulink Library Browser中出现了自定义库名称

② 自定义库包含我们创建的Edge_Fall模块

3、使用库,建模生成代码验证

使用自定义库,搭建一个简单模型,用于验证库封装的准确性

3.1 简单模型搭建

模拟按键按下过程检测:当按键按下,连接按键的GPIO从高电平被拉为低电平,产生下降沿,检测到这种状态代表按键按下。

2)代码生成

经代码生成配置后,生成如下代码:

经检验生成代码逻辑正确,封装的子系统符合我们所要实现的逻辑功能,达到了可重复利用封装子功能的目的

关于代码生成配置,可参考前面两篇介绍代码自动生成文章:

  Simulink代码自动生成(一)

  Simulink代码自动生成(二)

Simulink中封装子系统的更多相关文章

  1. JAVA中封装JSONUtils工具类及使用

    在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...

  2. 在DLL动态链接库中封装VCL的MDI子窗体

    在DLL动态链接库中封装VCL的MDI子窗体不多说了,看代码就应该明白了,曾经我遇到的问题,现在放出来大家共享! 这里是工程文件的部分: 在DLL中封装MDI子窗体需要重写DLL入口函数,具体代码如下 ...

  3. 在DLL中封装的VCL窗体Tab键响应的问题

    在DLL中的子窗体不会响应Tab按键的,这个时候就需要手动去指定Tab键的操作,但是前提是主窗体要向这个窗体发送一个消息,一个Tab键按下的消息.基本顺序是这样的: 1. 主窗体用Hook技术捕获Ta ...

  4. JS组件系列——在ABP中封装BootstrapTable

    前言:关于ABP框架,博主关注差不多有两年了吧,一直迟迟没有尝试.一方面博主觉得像这种复杂的开发框架肯定有它的过人之处,系统的稳定性和健壮性比一般的开源框架肯定强很多,可是另一方面每每想到它繁琐的封装 ...

  5. main.js中封装全局登录函数

    1. 在 main.js 中封装全局登录函数 通过 vue 对象的原型扩展,可以扩展一个函数,这样这个函数就可以在每一个界面通过类似指向对象的方式,去访问这个函数. 如下是 main.js 扩展的函数 ...

  6. 关于让simulink中display组件显示二进制的方法

    关于让simulink中display组件显示二进制的方法 1.首先需要配置gateway out模块,勾选propagate data type to output 2.配置display模块 fo ...

  7. Delphi中封装ADO之我重学习记录

    delphi adodataset ctstatic 数据是缓存在服务器端还是客户端 答:客户端,开启本地缓存功能后,就能数据在本地批量修改后,再批量提交,减少了网络传送   原创,专业,图文 Del ...

  8. 4.3.6 对象的界定通过编写接口来访问带这类命名结构的表会出问题。如前所述,SQL Server的灵活性不应用作编写错误代码或创建问题对象的借口。 注意在使用Management Studio的脚本工具时,SQL Server会界定所有的对象。这不是因为这么做是必须的,也不是编写代码的最佳方式,而是因为在界定符中封装所有的对象,比编写脚本引擎来查找需要界定的对象更容易。

    如前所述,在创建对象时,最好避免使用内嵌的空格或保留字作为对象名,但设计人员可能并没有遵守这个最佳实践原则.例如,我当前使用的数据库中有一个审核表名为Transaction,但是Transaction ...

  9. delphi 中封装的VCl窗体Tab键响应问题

    在DLL中的子窗体不会响应Tab按键的,这个时候就需要手动去指定Tab键的操作,但是前提是主窗体要向这个窗体发送一个消息,一个Tab键按下的消息.基本顺序是这样的: 1. 主窗体用Hook技术捕获Ta ...

随机推荐

  1. vue实现语音播报功能

    1,创建一个js文件 (voicePrompt.js) function voicePrompt (text){ new Audio('http://tts.baidu.com/text2audio? ...

  2. 彻底理解红黑树及JavaJDK1.8TreeMap源码分析

    1. 定义 红黑树也是二叉查找树,我们知道,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态.红黑树 ...

  3. Golang是如何操作excel的?

    关键术语介绍 为了方便开源库的快速上手,我们先来了解 excel 中的几个关键术语,如下图所示,①为sheet,也就是表格中的页签:②为row,代表 excel 中的一行:③为cell,代表 exce ...

  4. angular http 跨域访问

    1.在跟目录中创建配置文件:proxy.config.json ,文件内容如下: { "/api": { "target": "http://192. ...

  5. Mock测试你的Spring MVC接口

    1. 前言 在Java开发中接触的开发者大多数不太注重对接口的测试,结果在联调对接中出现各种问题.也有的使用Postman等工具进行测试,虽然在使用上没有什么问题,如果接口增加了权限测试起来就比较恶心 ...

  6. day02 Pyhton学习

    1.昨日内容回顾 1.python是一门解释型,弱类型的高级编程语言 优点: 1.优雅简单明确 2.短小快,代码短,代码量小,开发效率高 缺点: 1.运行效率低(相对) 2.python解释器 Cpy ...

  7. Verilog基础入门——简单的语句块编写(二)

    [题干] [代码] module top_module( input a, input b, output out ); assign out = a&b; endmodule [与或非门等] ...

  8. Jmeter之参数化函数助手__randomstring

    1.Tools->函数助手对话框,选择__Random String,2表示随机生成的字符长度:3表示从哪些字符中随机生成:然后点击生成,得到对应的变量: 5中372表示该函数随机生成的字符串, ...

  9. 【服务总线 Azure Service Bus】ServiceBus 队列中死信(DLQ - Dead Letter Queue)问题

    Azure Service Bus 死信队列产生的原因 服务总线中有几个活动会导致从消息引擎本身将消息推送到 DLQ. 如 超过 MaxDeliveryCount 超过 TimeToLive 处理订阅 ...

  10. Nacos快速入门

    什么是 Nacos Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供 ...