第三章:子系统与封装
说实话,我刚接触Simulink那会儿,最头疼的就是模型越画越大,满屏幕的连线跟蜘蛛网似的。后来带我的老工程师跟我说了一句话,我记到现在——「模型做得好不好,就看你会不会用子系统」。今天咱们就来聊聊这个核心技能。
3.1 子系统创建
子系统是什么?说白了就是把一堆功能模块打包成一个「黑盒子」。你不需要关心里面怎么实现的,只看输入输出就行。
创建子系统有几种方式,我常用的就两种:
- 直接拖拽:从库浏览器里把Subsystem模块拖到模型里,双击进去编辑
- 选中打包:选中多个模块,右键→Create Subsystem,一键搞定
我个人习惯用第二种。有一次做电机控制模型,光PID调节器就画了十几个模块,选中一打包,整个模型瞬间清爽了。你想想看,别人看你的模型,第一眼就能看出架构,多好。
3.2 子系统封装
创建子系统只是第一步。真正让子系统变得好用,靠的是封装(Masking)。
封装是什么意思?就是给子系统穿上「外衣」,让它看起来像一个独立的模块。你可以自定义参数对话框、图标、说明文档。
操作路径很简单:右键子系统 → Mask → Create Mask。进去之后你会看到几个标签页:
| 标签页 | 作用 |
|---|---|
| Icon & Ports | 自定义图标和端口显示 |
| Parameters | 定义用户可设置的参数 |
| Initialization | 参数初始化脚本 |
| Documentation | 写帮助文档的地方 |
嗯,这里要注意:封装不是必须的,但如果你想让别人(或者三个月后的自己)能快速上手,封装绝对值得花时间做。
3.3 封装参数与图标
这部分我重点说说。封装参数和图标,是让子系统「活起来」的关键。
参数设计
在Parameters标签页里,你可以添加各种参数类型:编辑框、下拉菜单、复选框等等。我一般这样设计:
- 关键参数:用编辑框,让用户直接输入数值
- 模式选择:用下拉菜单,限制用户只能选预设值
- 开关选项:用复选框,简单明了
举个例子,我之前做过一个滤波器子系统,封装了三个参数:
参数1:滤波器类型(下拉菜单:低通/高通/带通)
参数2:截止频率(编辑框,单位Hz)
参数3:阶数(编辑框,整数)
用户双击模块,弹出来的对话框就这三个选项,清晰得很。
图标绘制
图标这块,我建议别太花哨。Simulink支持用MATLAB命令画图,常用的就几个:
disp('text'):显示文字image(imread('file.png')):显示图片plot([0 1],[0 1]):画线条color('red'):设置颜色
我个人习惯用disp显示模块名称,再加个简单的图形标识。比如PID控制器,我就画个P-I-D三个字母,一目了然。
3.4 条件执行子系统
这部分是子系统的进阶用法。条件执行子系统,说白了就是「满足条件才干活」的子系统。
Simulink提供了几种条件执行子系统:
- Enabled Subsystem:使能子系统,使能信号为高时才执行
- Triggered Subsystem:触发子系统,检测到边沿信号时执行一次
- Function-Call Subsystem:函数调用子系统,由外部函数调用触发
- If Action Subsystem:条件动作子系统,类似if-else逻辑
我重点说说前两种,因为项目里用得最多。
使能子系统
使能子系统有个使能端口,输入0或1。为1时正常执行,为0时输出保持或归零(可以设置)。
我在做电池管理系统时用过这个。当电池温度超过阈值时,使能信号变高,冷却子系统开始工作。温度降下来后,使能信号变低,子系统停止。简单又可靠。
触发子系统
触发子系统更灵活。它检测触发信号的上升沿、下降沿或者双边沿。检测到边沿时,子系统执行一次,然后继续等待。
你想想看,这种机制特别适合做「事件驱动」的逻辑。比如按键检测、过零检测、故障捕获等等。
知识体系总览
下面这张图是我自己画的,把本章的核心逻辑串起来了:
这张图把三个核心知识点串起来了。子系统创建是基础,封装是进阶,条件执行是实战利器。三者层层递进,缺一不可。
好了,这一章的内容就到这儿。记住一句话:好的模型不是功能多,而是结构清晰。子系统就是你手里的积木,怎么搭,看你的本事了。