4. 基础建模与信号流设计

在 V 模型开发流程中,Simulink 模型既是需求的可执行表达,也是后续自动代码生成、SIL/PIL 测试与覆盖率分析的唯一源头。因此,基础建模阶段的核心任务不是"把图连起来",而是建立一套信号语义清晰、层级划分合理、接口可追溯的模型结构。本节围绕常用模块库、信号线、总线、子系统(虚拟与非虚拟)、信号标签与传播机制展开,并以一个开环控制模型为例,完整走通从模块选取到信号流验证的过程。

一、常用模块库与选型原则

Simulink 的 Library Browser 中模块数量庞大,但工程建模中高频使用的集中在几个库:Sources(Step、Constant、Signal Generator、From Workspace)、Sinks(Scope、To Workspace、Display)、Continuous(Integrator、Transfer Fcn、State-Space)、Discrete(Unit Delay、Discrete Transfer Fcn、Zero-Order Hold)、Math Operations(Gain、Sum、Product、Saturation)、Signal Routing(Mux、Bus Creator、Bus Selector、Switch)、Signal Attributes(Data Type Conversion、Signal Conversion)以及 Subsystems(Subsystem、Atomic Subsystem、Model Reference)。

选型时优先考虑三点:一是求解器友好性,连续系统用 Integrator/Transfer Fcn,离散系统用 Unit Delay 并显式设置采样时间;二是数据类型确定性,避免默认 double 在嵌入式目标上造成资源浪费,必要时用 Data Type Conversion 显式转换;三是可测性,关键中间信号应引出到 Scope 或 To Workspace,便于后续与需求比对。

二、信号线与信号标签

信号线(Signal Line)承载的是带时间戳的数据序列,而非"电流"。Simulink 中信号线有实线(标量/向量)与粗线(总线)之分,虚线表示虚拟总线或未解析信号。信号标签(Signal Label)是给信号线命名的机制,命名后该名称会随信号传播到下游模块端口,并在代码生成时成为变量名的一部分。

信号标签的传播遵循两条规则:同名传播——若下游模块输入端口未显式命名,则继承上游标签;显式覆盖——若下游端口重新命名,则以新名称为准,但会触发"信号名称冲突"提示。工程实践中建议对跨越子系统边界的信号一律显式命名,避免依赖隐式传播导致代码变量名不可控。

信号标签命名建议采用"来源_物理量_单位"格式,例如 Ref_Speed_rpm、FB_Current_A,既便于阅读,也便于在代码生成后与标定文档对应。

三、总线:把相关信号打包

当信号数量增多时,逐根连线会导致模型"蜘蛛网化"。总线(Bus)通过 Bus Creator 将多根信号合并为一个总线信号,再用 Bus Selector 在需要处拆解。总线分为虚拟总线与非虚拟总线:虚拟总线在代码生成时被"打平"为独立变量,不产生结构体;非虚拟总线(通过 Simulink.Bus 对象定义)在代码中生成结构体类型,适合作为子系统或模型引用的接口。

使用非虚拟总线的关键步骤是:在 MATLAB 基础工作区或数据字典中定义 Simulink.Bus 对象,指定每个元素的名称、数据类型、维度与采样时间;然后在 Bus Creator 的 OutDataTypeStr 中绑定该 Bus 对象。这样,总线在模型编译阶段即完成类型检查,避免运行期才发现维度不匹配。

四、子系统:虚拟与非虚拟

子系统用于封装逻辑、控制模型复杂度。虚拟子系统(Virtual Subsystem)仅提供视觉分组,编译时被展开,不产生额外函数;非虚拟子系统(Atomic Subsystem)在仿真和代码生成时被视为一个原子单元,拥有独立的执行顺序和采样时间,可生成独立函数。若需要跨模型复用,则使用 Model Reference,将子系统保存为独立 .slx 文件。

选择依据:若只是为了让模型图更整洁,用虚拟子系统;若该部分需要独立测试、独立代码生成或作为多速率系统中的独立速率节点,用原子子系统;若需要团队并行开发或版本独立管理,用模型引用。

五、开环控制模型搭建示例

下面以一个直流电机开环转速控制为例,说明信号流设计。模型输入为阶跃参考电压 V_ref(0→12 V,t=1 s 跳变),经增益 K=0.5 得到电枢电压指令,再通过一阶传递函数 G(s)=1/(0.1s+1) 模拟电机电气动态,输出转速信号 n_rpm,最后用 Scope 与 To Workspace 记录。

搭建步骤:从 Sources 拖入 Step,设置 Step time=1、Initial value=0、Final value=12;从 Math Operations 拖入 Gain,设置 Gain=0.5;从 Continuous 拖入 Transfer Fcn,设置 Numerator=[1]、Denominator=[0.1 1];从 Sinks 拖入 Scope 与 To Workspace,To Workspace 变量名设为 n_rpm,保存格式选 Structure With Time。连线后,将 Step 输出命名为 V_ref,Gain 输出命名为 V_arm,Transfer Fcn 输出命名为 n_rpm。

为验证信号流,将仿真时间设为 5 s,求解器选 ode45,最大步长 0.01。运行后 Scope 应显示:t=0~1 s 输出为 0;t=1 s 后按一阶指数上升,稳态值约为 0.5×12=6(若传递函数直流增益为 1)。若稳态值与预期不符,优先检查 Gain 是否误设为 0.5 以外的值,以及 Transfer Fcn 分母常数项是否为 1。

开环控制模型信号流与总线/子系统结构 Step V_ref: 0→12V Gain K = 0.5 Transfer Fcn 1 / (0.1s + 1) Scope n_rpm 波形 To Workspace n_rpm V_ref V_arm n_rpm 总线与子系统封装示意 Bus Creator V_ref, V_arm, n_rpm Bus Atomic Subsystem 独立采样时间 / 独立函数 可独立代码生成 Bus Selector 拆解为独立信号 虚拟子系统 仅视觉分组,编译展开 信号源/运算模块 被控对象动态 观测/记录 总线操作 原子子系统

六、信号流验证与常见问题

模型搭建完成后,不要急于接控制器。先做三件事:第一,用 Display 模块或信号标签右键"Show Value Label"检查关键节点数值;第二,在 Model Configuration Parameters 中开启 Signal resolution 为"Explicit only",强制所有信号显式命名,避免隐式匹配;第三,用 Simulink.Bus 编辑器检查总线元素的数据类型与维度是否与下游 Bus Selector 一致。

常见问题包括:信号线出现红色虚线,通常表示维度不匹配或未定义采样时间;总线报"Bus element not found",多因 Bus Selector 中元素名与 Bus Creator 不一致;原子子系统报"Sample time mismatch",需检查内部模块采样时间是否统一。排查时优先使用 Debug → Information Overlays → Signal Dimensions 与 Sample Time Colors 两个视图,能快速定位问题节点。

开环模型仅用于验证信号流与模块参数,不具备抗扰动能力。在进入闭环设计前,务必确认开环稳态输出与理论计算一致,否则后续控制器设计将建立在错误对象模型上。

完成本节后,你应当能够独立完成:从库中选取合适模块、用信号标签明确接口语义、用总线打包相关信号、用原子子系统划分可独立测试的单元,并搭建一个可运行、可观测、可追溯的开环控制模型。这套基础结构将直接决定后续闭环设计、代码生成与测试用例的可维护性。