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。

搭建步骤:

  1. 放置 Step 模块,Step time 设为 0,Initial value 为 0,Final value 为 1000,命名 n_ref。
  2. 放置 Sum 模块,符号设为 +-,上端接 n_ref,下端接反馈转速 n,输出命名 e。
  3. 放置 Gain 模块,Gain 值填 0.8,命名 Kp,输入接 e,输出命名 u_cmd。
  4. 放置 Saturation 模块,Upper limit 为 24,Lower limit 为 -24,输出命名 u,模拟电压限幅。
  5. 电机模型:用 Gain(Km = 0.05)把电压转为转矩,再用 Integrator(初值 0)积分得到转速,反馈回 Sum 的负端。为简化,忽略电气动态,仅保留一阶机械惯性。
  6. 把控制器部分(Sum、Kp、Saturation)选中封装为 Controller 子系统,电机部分封装为 Motor 子系统。
  7. 放置 Scope,接入 n_ref 和 n 两路信号,运行仿真。

仿真结束后,Scope 中应看到转速从 0 平滑上升,约 0.3~0.5 秒后接近 1000 r/min。由于是纯比例控制且存在积分环节,稳态误差理论上趋于零,但上升时间与 Kp 相关:Kp 增大响应加快,但过大会引起超调甚至振荡。可把 Kp 改为 2.0 再运行一次,对比超调量,这是理解“参数—响应”关系最直接的方式。

直流电机转速闭环 Simulink 顶层结构 Step n_ref 阶跃 + − Controller 子系统 Kp=0.8 → Saturation ±24V 比例控制 + 限幅 Motor 子系统 Km=0.05 → Integrator 电压→转矩→转速 Scope n_ref / n n_ref e u n 反馈 n(转速) 求解器配置(Model Settings → Solver) Stop time = 2 s | Solver = ode45(Variable-step) | Max step = 1e-3 Relative tolerance = 1e-3 | Zero-crossing = Use local settings 提示:Kp 增大响应加快,但过大将引起超调与振荡

六、结果判读与常见问题

运行后若波形不符合预期,可按以下顺序排查:

  • 转速始终为 0:检查 Integrator 初值、Gain 是否误设为 0、Saturation 上下限是否写反。
  • 转速发散:反馈极性接反,Sum 的符号应为 +-,反馈接负端。
  • 波形有高频毛刺:Max step 过大或求解器不适合刚性系统,可减小步长或换 ode15s。
  • 仿真报维度错误:检查 Mux/Demux 的端口数是否与信号维度一致。
建议把 Kp、Km、限幅值等参数提取为 MATLAB 变量(如 Kp = 0.8;),在 Gain 中直接填变量名。这样修改参数无需打开模块,也便于后续与 Stateflow 共享数据字典。

至此,一个最小可用的转速闭环已经跑通。它的价值不在于模型多复杂,而在于把“给定—误差—控制—限幅—对象—反馈”这条信号链完整走了一遍。后续引入 Stateflow 时,控制器子系统中的连续运算部分将被状态机替代或补充,而信号线、子系统层次和求解器配置这些基础工作仍然沿用。