2. Simulink建模快速上手
Simulink 建模的本质,是把一个动态系统的数学关系翻译成“模块 + 信号线”的图形语言。要快速上手,先要建立三个基本认识:模块代表运算或状态,信号线代表随时间变化的量,求解器负责按时间推进这些量的数值解。本节以一个直流电机转速闭环为教学示例,从零搭出一个可运行的控制回路,并说明每一步在做什么、参数如何取、结果如何判断。示例参数均为教学假设值,不代表任何具体电机的实测数据。
一、常用模块库:先认识“积木”
打开 Simulink 起始页新建空白模型后,左侧 Library Browser 中最常用的是以下几类:
- Sources(信号源):Constant 提供常值给定,Step 提供阶跃给定,Signal Generator 提供正弦、方波等测试信号。转速闭环中常用 Step 模拟“从 0 跳到目标转速”的指令。
- Sinks(信号接收):Scope 观察时域波形,Display 显示当前数值,To Workspace 把数据导出到 MATLAB 工作区做定量分析。
- Continuous(连续系统):Integrator 实现 1/s,Transfer Fcn 实现传递函数,State-Space 实现状态空间模型。电机机械环节常用 Integrator 表示转速对转矩的积分。
- Math Operations(数学运算):Gain 做比例缩放,Sum 做加减,Product 做乘除,Saturation 做限幅。控制器中的比例增益、误差求和都来自这里。
- Signal Routing(信号路由):Mux 把多路信号合成向量,Demux 拆分向量,Bus Creator 组织总线。
- Discontinuities(不连续):Saturation、Dead Zone、Rate Limiter,用于模拟执行器限幅和死区。
建议把上述模块拖入模型后立即用有意义的名字重命名,例如把 Gain 改为 Kp,把 Sum 改为 误差求和。命名清晰是后续调试和生成代码的前提。
二、信号线:连接与属性
信号线不是装饰,它携带数值、维度、数据类型和采样时间。拖动模块端口之间的连线即可建立连接;按住 Ctrl 拖动可引出分支。几个关键操作:
- 信号命名:双击信号线输入名称,如
n_ref、e、u、n。命名后可在 Scope 图例和 To Workspace 中直接识别。 - 信号维度:细实线表示标量,粗线表示向量或矩阵。若把向量接到只接受标量的端口会报维度错误。
- 信号标签传播:在 Signal Properties 中勾选“Signal name must resolve to Simulink signal object”可强制信号名与数据字典一致,为后续 Stateflow 和代码生成打基础。
- 虚拟与非虚拟总线:Bus Creator 默认生成虚拟总线,仅用于组织显示;若需要作为原子接口传递,应使用非虚拟总线。
三、子系统:把复杂模型分层
当模型超过十几个模块时,应使用子系统划分层次。选中一组模块,右键选择 Create Subsystem from Selection,即可封装为一个 Subsystem 模块。子系统有两种典型用法:
- 普通子系统:仅做视觉封装,内部仍参与同一求解步。
- 原子子系统(Atomic Subsystem):勾选 Treat as atomic unit,使其在仿真和代码生成中作为一个执行单元,便于设定采样时间和优先级。
本示例把控制器部分封装为 Controller 子系统,把电机模型封装为 Motor 子系统,顶层只保留给定、误差求和、Scope 和两个子系统,结构一目了然。
四、求解器配置:决定数值解的质量
点击模型窗口的 Model Settings(或按 Ctrl+E),在 Solver 页配置:
- Start time / Stop time:示例设为 0 和 2 秒,足以观察阶跃响应上升段和稳态。
- Solver selection:Type 选 Variable-step,Solver 选
ode45(Dormand-Prince)。它适合大多数非刚性连续系统,能自动调整步长。 - Max step size:设为
1e-3,避免步长过大漏掉快速动态。 - Relative tolerance:默认
1e-3;若波形有毛刺可收紧到1e-4。 - Zero-crossing control:保持 Use local settings,便于准确捕捉饱和切换时刻。
若模型含刚性环节(如很小的电气时间常数),可改用 ode23t 或 ode15s。求解器选择不当的典型症状是:仿真极慢、波形振荡异常或报“步长过小”错误。
五、搭建一个转速闭环并仿真
示例对象:直流电机简化模型,输入为电枢电压 u(限幅 ±24 V),输出为转速 n(r/min)。控制器采用比例控制,比例增益 Kp = 0.8。给定 n_ref 在 t=0 时从 0 阶跃到 1000 r/min。
搭建步骤:
- 放置 Step 模块,Step time 设为 0,Initial value 为 0,Final value 为 1000,命名
n_ref。 - 放置 Sum 模块,符号设为
+-,上端接n_ref,下端接反馈转速n,输出命名e。 - 放置 Gain 模块,Gain 值填
0.8,命名Kp,输入接e,输出命名u_cmd。 - 放置 Saturation 模块,Upper limit 为 24,Lower limit 为 -24,输出命名
u,模拟电压限幅。 - 电机模型:用 Gain(
Km = 0.05)把电压转为转矩,再用 Integrator(初值 0)积分得到转速,反馈回 Sum 的负端。为简化,忽略电气动态,仅保留一阶机械惯性。 - 把控制器部分(Sum、Kp、Saturation)选中封装为
Controller子系统,电机部分封装为Motor子系统。 - 放置 Scope,接入
n_ref和n两路信号,运行仿真。
仿真结束后,Scope 中应看到转速从 0 平滑上升,约 0.3~0.5 秒后接近 1000 r/min。由于是纯比例控制且存在积分环节,稳态误差理论上趋于零,但上升时间与 Kp 相关:Kp 增大响应加快,但过大会引起超调甚至振荡。可把 Kp 改为 2.0 再运行一次,对比超调量,这是理解“参数—响应”关系最直接的方式。
六、结果判读与常见问题
运行后若波形不符合预期,可按以下顺序排查:
- 转速始终为 0:检查 Integrator 初值、Gain 是否误设为 0、Saturation 上下限是否写反。
- 转速发散:反馈极性接反,Sum 的符号应为
+-,反馈接负端。 - 波形有高频毛刺:Max step 过大或求解器不适合刚性系统,可减小步长或换
ode15s。 - 仿真报维度错误:检查 Mux/Demux 的端口数是否与信号维度一致。
Kp、Km、限幅值等参数提取为 MATLAB 变量(如 Kp = 0.8;),在 Gain 中直接填变量名。这样修改参数无需打开模块,也便于后续与 Stateflow 共享数据字典。至此,一个最小可用的转速闭环已经跑通。它的价值不在于模型多复杂,而在于把“给定—误差—控制—限幅—对象—反馈”这条信号链完整走了一遍。后续引入 Stateflow 时,控制器子系统中的连续运算部分将被状态机替代或补充,而信号线、子系统层次和求解器配置这些基础工作仍然沿用。