1. 课程导入与多学科模型接口全景

在复杂装备、汽车、航空、能源与机器人系统的研发中,单一学科模型已经很难独立回答系统级问题。结构强度工程师关心应力与疲劳,控制工程师关心带宽与稳定性,热管理工程师关心温度场与散热路径,软件工程师关心采样周期与通信时延。这些模型各自成立,却常常在联合仿真时出现"单跑都对、联跑就崩"的现象。本课程要解决的核心问题,正是让不同学科、不同工具、不同抽象层级的模型能够可靠地交换数据并协同计算。

学习目标与核心概念

学完本课程,你应当能够:识别一个多学科协同场景中的接口边界与数据流向;为模型选择合适的接口类型(如FMI/FMU、S-Function、共享内存、Socket、文件交换);定义变量映射、单位、方向与采样约定;判断耦合是弱耦合还是强耦合,并据此选择显式或隐式协同策略;定位并排除常见的接口故障,如单位不一致、代数环、时间步不同步、初始化顺序错误。

先厘清几个贯穿全课程的核心概念。模型是对真实系统某一侧面的数学或逻辑抽象,它有自己的输入、输出、状态与求解器。接口是两个模型之间约定的交互面,规定"谁在什么时刻、以什么单位、沿什么方向、传递什么量"。数据交换是接口上的具体行为,包括数据打包、传输、解包与时间对齐。耦合描述模型之间相互影响的程度:一个模型的输出直接影响另一个模型的输入,且反向也成立时,就构成反馈耦合。

接口的本质是"契约":变量名、单位、方向、数据类型、更新时刻、有效范围,任何一项缺失都会在联仿时变成隐性故障。

接口与数据交换的整体框架

从工程视角看,多学科模型接口可以分成四层。最上层是语义层,回答"这个信号代表什么物理量",例如电机转速、电池荷电状态、液压阀开度。第二层是变量层,把语义映射为具体变量名、单位、量纲、方向与取值范围。第三层是传输层,决定数据以何种机制流动,如函数调用、共享内存、TCP/UDP、文件或总线。最底层是时间层,规定采样周期、通信步长、同步点与插值/外推策略。四层中任何一层定义不清,都会在系统集成阶段暴露为难以复现的问题。

数据交换的典型模式有三种。单向传递最简单,A的输出直接作为B的输入,不存在反向依赖,适合传感器到控制器这类链路。双向耦合中两个模型互相提供输入,需要处理时间同步与稳定性。多对多交换常见于系统级联合仿真,多个FMU通过一个主仿真器协调,主仿真器负责推进时间、调用各模型、交换变量并检测收敛。

多学科模型接口四层框架与数据交换 语义层 物理量含义 · 信号定义 变量层 名称 · 单位 · 方向 · 范围 传输层 函数调用 · 共享内存 · 总线 时间层 步长 · 同步点 · 插值策略 三种典型数据交换模式 模型 A 输出 y 模型 B 输入 u 单向传递 模型 A y₁ / u₁ 模型 B y₂ / u₂ A→B B→A FMU 1 FMU 2 FMU 3 主仿真器 推进时间 · 交换变量 · 检测收敛 多对多交换:主仿真器统一协调各 FMU 的调用与数据同步 接口契约六要素 变量名 · 单位 · 方向 · 数据类型 更新时刻 · 有效范围

典型应用场景

场景一:整车能量管理联合仿真。电池模型输出荷电状态与端电压,电机模型输出转矩与电流需求,热管理模型输出冷却液温度,整车控制器模型根据驾驶需求分配功率。四个模型通过FMI接口接入主仿真器,步长通常取1 ms到10 ms。若电池模型步长为10 ms而电机模型为1 ms,主仿真器需要在每个1 ms时刻对电池输出做保持或插值,否则会出现能量不守恒的假象。

场景二:飞控与气动弹性耦合。气动模型计算气动力,结构模型计算弹性变形,飞控模型输出舵面偏转。三者构成闭环,且气动力与结构变形之间存在强耦合。此时显式协同可能发散,需要采用隐式耦合或子迭代,在每个通信步内反复交换数据直到残差小于阈值,例如力残差小于0.5 N、位移残差小于1e-4 m。

场景三:机器人机电联合调试。机械臂动力学模型与伺服驱动模型通过共享内存交换关节角度与力矩,控制周期为1 ms。若通信延迟超过控制周期的10%,即0.1 ms,相位裕度会明显下降,表现为关节抖动或跟踪误差增大。这类场景要求接口不仅定义数据,还要定义延迟预算。

判断耦合强弱的实用方法:把两个模型分别单独运行,记录各自输出;再联仿,若联仿结果与单独运行差异超过5%,说明耦合不可忽略,需要检查同步策略与步长匹配。

一个可执行的最小示例

下面给出一个用FMI 2.0 Co-Simulation封装两个模型的变量映射片段,用于说明接口契约如何落地。示例中电池模型输出soc(单位1,范围0~1),电机模型输入soc_in(单位1,范围0~1),两者通过主仿真器连接。

<ModelExchange modelIdentifier="Battery">
  <Outputs>
    <ScalarVariable name="soc" valueReference="1"
      causality="output" variability="continuous">
      <Real unit="1" min="0" max="1"/>
    </ScalarVariable>
  </Outputs>
</ModelExchange>

<ModelExchange modelIdentifier="Motor">
  <Inputs>
    <ScalarVariable name="soc_in" valueReference="2"
      causality="input" variability="continuous">
      <Real unit="1" min="0" max="1"/>
    </ScalarVariable>
  </Inputs>
</ModelExchange>

<!-- 主仿真器连接 -->
<Connection>
  <Source model="Battery" variable="soc"/>
  <Target model="Motor" variable="soc_in"/>
</Connection>

这段配置的关键信息是:变量名、单位、范围、因果方向、连接关系。若把soc的单位写成%而soc_in仍为1,联仿时电机模型会收到100倍偏大的输入,表现为SOC瞬间跳变。这类错误在接口定义阶段就能通过单位一致性检查发现,而不必等到仿真崩溃。

本课程的组织逻辑

后续章节将沿着"概念—接口类型—数据交换机制—协同策略—故障排查—工程案例"的路径展开。你会先掌握FMI/FMU、S-Function、共享内存、Socket等接口形式的适用边界,再学习变量映射、单位换算、时间同步、代数环处理等具体技术,最后通过整车、飞控、机器人等案例把接口设计、联仿配置与结果判读串起来。每一章都会给出可操作的参数、配置片段或判断依据,而不是停留在概念介绍。

开始之前,请先建立两个习惯:第一,任何接口定义都必须写清单位、方向、更新时刻和有效范围;第二,任何联仿结果都要与单模型结果做对比,差异超过阈值时优先怀疑接口而非模型本身。这两个习惯将贯穿整个课程,也是多学科协同能否从"能跑"走向"可信"的分水岭。