十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

汽车电子Simulink国产替代:MIL/SIL/HIL链路迁移与验证流程

汽车电子Simulink国产替代:MIL/SIL/HIL链路迁移与验证流程 上一篇聊汽车行业为什么离不开 Simulink发出去之后后台收到的问题比我想的多得多其中被问得最密集的一条是那到底能不能换国产替代这事儿在汽车行业到底有没有可能性说实话这个问题我在项目上也跟人争过好几轮从一开始拍桌子说换个软件而已到后来老老实实坐下来做迁移评估中间踩的坑足够写一整本笔记。这篇文章就把我这几年在模型在环、软件在环、硬件在环这条链上折腾的经验摊开讲一遍Simulink 在汽车行业的粘性究竟长在哪几个环节哪些环节是真难替代哪些只是看起来难国产工具现在比较现实的切入路径有哪几条以及你自己动手就能做的一套替代性验证流程该怎么跑。不管你是刚入行的控制算法工程师、做电驱或电源的仿真工程师还是负责工具链规划的技术管理者只要你在汽车电子这条线上干活这些内容应该都能直接拿去用。1. 先别急着说替代软件它替代的其实是一条链很多人讨论国产替代的时候脑子里想的画面是把电脑上的图标换一个。这个认知偏差是后面所有争论的根源。汽车行业用的从来不是 Simulink 这一个软件而是一条从需求描述一直延伸到量产维护的链条Simulink 只是这条链上最容易被人看见的那一环。1.1 一个车型的开发链上Simulink 到底占了几环拿一个典型的电驱控制器开发流程来说链路大概是这样系统需求 → 架构设计 → 控制算法建模 → 被控对象建模 → 模型在环MIL→ 软件在环SIL→ 处理器在环PIL→ 自动代码生成 → 集成编译 → 硬件在环HIL→ 台架标定 → 实车验证 → 量产维护与版本迭代。这条链上Simulink 加上 Stateflow、Simulink Coder、Embedded Coder、Fixed-Point Designer、Simulink Test、Requirements Toolbox 这一整套基本上覆盖了从算法长什么样到生成的 C 代码长什么样的全部中间环节。关键在于这些环节不是松散拼接的而是同一份模型往下逐级传递。算法工程师在 Simulink 里搭的电流环直接决定了后面生成的代码结构、标定量的地址布局、HIL 台架上的接口定义。你换掉其中任何一环上下游都得跟着动。这也是为什么很多团队调研完一圈之后结论都是换不动不是不想换是这条链上每个节点都跟邻节点咬死了。我见过一个比较典型的例子某个项目中控算法团队想试试换掉建模工具模型本身倒是重新搭出来了结果到了 HIL 那一步发现台架的实时工程是从原模型自动生成的工程文件接口映射、任务周期、标定参数全是自动产出的。要换就得手写这套映射工作量比重新搭算法还大。链路环节常见做法替代难度主要卡点控制算法建模图形化建模加状态机中建模习惯与库资产被控对象建模物理建模或多领域建模中求解器与模型库覆盖度代码生成模型直接生成 C 代码高代码结构、标定性、可追溯静态检查规则集扫描加人工评审中规则集与流程适配实时工程模型自动转实时工程高与板卡厂商的驱动适配联合仿真多工具接口对接中低接口标准支持完整度标定与测试参数管理与自动化测试中低数据格式与工具链打通1.2 真正让人不敢换的是模型资产和流程债我在做迁移评估的时候问的第一个问题从来不是新工具功能够不够而是你们现在有多少份模型文件。这个问题经常把对方问愣因为大多数团队自己也没数。一个量产车型项目控制相关的模型文件数量通常在几千到几万份这个量级再往上是平台化的企业级模型库。这些模型里包含大量隐性资产自定义库自定义模块封装、掩码参数、S-Function 封装的外部代码、回调脚本初始化回调、加载回调、停止回调、数据字典文件、配置集和变体配置、以及一堆只有原作者知道为什么要那么写的注释。这些东西的价值不在代码本身而在它已经验证过了。一份跑过 MIL、SIL、HIL 和实车的模型背后躺着几百上千条测试用例和历史问题单。迁移意味着这些验证证据要重新走一遍而重新走一遍的成本往往比买新工具的钱高一个数量级。所以你会发现很多团队最后选的不是最优工具而是迁移代价最小的方案。1.3 拿电驱控制举例从模型到台架的完整链路为了说得更具体我拿永磁同步电机磁场定向控制这条最常见的链路走一遍。算法侧一般是这么切的速度外环给出转矩指令转矩指令转成 dq 轴电流指令弱磁环节在高速区调整 d 轴电流分量电流环两个 PI 分别控 d 轴和 q 轴输出经过反 Park 变换和空间矢量脉宽调制最后驱动逆变桥。这里有两个细节特别能体现工具链的粘性。第一是弱磁环节常用的电压外环法需要根据母线电压和电流反馈实时调整弱磁深度中间涉及查表和积分限幅模型里一个查表模块的断点数据、外插策略、索引算法换个工具就可能语义不同出来的电流轨迹会差几个百分点。第二是逆变器和电机的被控对象模型开关频率、死区、母线电压波动这些细节会直接影响电流环的整定结果换建模工具后如果电机模型参数化方式变了之前整定的 PI 参数就得重来。再往后走模型生成代码烧进控制器标定工程师在台架上调 PI 和弱磁参数。标定量在代码里是带标定地址的全局变量这套地址信息是通过特定格式的描述文件交给标定工具的。也就是说代码生成这一环的产物直接决定了标定工具能不能正常读取。这一串串下来你会发现每一环都有别的环节在等着它的输出单独替换某一环几乎不可行。2. 拆开看技术壁垒哪些是真难哪些只是看着吓人做迁移评估最容易犯的错是把我不熟当成做不到。我按自己的经验把壁垒分了几个层次越往下越硬。2.1 求解器这关为什么能跑和跑得对是两码事很多人评价一个仿真工具标准是模型能不能跑起来。这个标准太低了。真正要看的是同样的模型同样的输入两个工具给出的结果能不能对得上误差在不在可接受范围内。变步长求解器处理的是刚性问题、事件触发、离散连续混合系统。汽车上的典型场景包括逆变器开关动作带来的高频事件、离合器接合的瞬态、电池模型的强非线性、热管理系统的多时间尺度耦合。这类系统对求解器的零交叉检测精度、代数环处理策略、误差控制算法要求很高。国产的物理建模类工具大多走的是 Modelica 路线底层用的是微分代数方程求解器。Modelica 的好处是建模时不用手工推导状态方程多领域耦合写起来自然代价是求解器面对大规模刚性系统时性能和收敛性表现需要实测验证尤其是带大量事件和不连续点的场景。我自己的经验是小规模闭环比如单个电机加逆变器跑起来差异不大一旦系统级模型堆到几百上千个状态变量、又叠加了开关事件差异就开始显现有时候是精度差异有时候是仿真速度差异最难受的是偶发的收敛失败——同一组参数跑十次有一次不收敛这种问题排查起来非常耗人。提示做工具对比时别只看能不能跑通一定要准备一组带事件触发的测试模型跑参数扫描并统计收敛失败率和误差分布这才是能写进评估报告的数据。2.2 代码生成才是真正的分水岭如果说建模是面子代码生成就是里子而且这个里子特别厚。模型自动生成 C 代码这件事表面上看起来是把图形翻译成代码实际上要处理的问题包括数据类型的确定与定标、查表的内插算法选择、除法和开方的定点实现、饱和与溢出保护、函数的分层与复用、生成代码的命名规则、标定量的结构体布局、测量量的采集点、以及最重要的——代码可读性和可追溯性。可追溯性的意思是审核人员拿到生成的代码要能一眼看出某一行对应模型里的哪个模块。这在功能安全审核里是硬要求。生成的代码还得能过静态检查函数圈复杂度不能超标不能有不可达分支不能有未初始化变量。做到这些的难度比把模型跑起来高得多。另外一个容易被忽略的点是定点化。很多低成本控制器没有浮点单元算法必须定点实现。定点化过程中要做量化误差分析、定标选择、溢出保护这套工具链如果缺失就只能靠手工试效率极低。这一块目前是国产工具普遍比较薄弱的环节也是我认为短期内最难补齐的一块。2.3 静态检查与工具置信度量产审核问得最细的地方静态代码检查这一环很多做算法的人不太关心但做流程和质量的同事非常关心。汽车行业的代码检查通常要求满足一套编码规范同时要有一套完整的检查记录什么版本、什么规则集、什么时间跑的、违例怎么处理、豁免怎么审批。自动化代码生成工具在这里有个特殊身份——它属于开发工具链的一部分需要通过工具置信度的评估。评估逻辑大致是根据工具失效可能带来的影响程度以及工具错误被发现的难易程度确定一个置信度等级高于某个等级就需要做工具鉴定鉴定方式包括工具开发过程评估和工具使用过程验证。这部分工作量大、文档多是量产项目绕不过去的坎。所以国产工具要进入量产项目不只是要功能对得上还要能提供一套让审核方接受的工具鉴定材料。这个门槛比技术门槛更隐性也更难跨。2.4 实时工程与 HILdSPACE 这类链路不是软件单方面能决定的硬件在环测试是目前验证环节的主力。做法是把控制器代码跑在真实控制器上被控对象模型跑在实时仿真机上两者通过真实的电气接口连起来。实时仿真机上跑的被控对象模型通常也是从建模工具里自动转换成实时工程的。这个环节的壁垒不在软件本身而在生态实时仿真机的板卡驱动、IO 映射、任务调度、参数在线调整接口都需要建模工具厂商和硬件厂商长期配合。国外几家实时仿真平台和主流建模工具的对接已经做了很多年形成了自动化的工程生成流程。国产建模工具要接进这套体系通常有两条路一是通过标准接口比如 ASAM XIL 这类测试自动化接口标准做适配二是直接和实时仿真机厂商做联合开发。前者上手快但功能受限于标准覆盖范围后者效果好但周期长。我见过的成功案例基本都是第二种而且都有一方愿意投入人力长期陪跑。2.5 联合仿真与 FMU最现实的接口层如果真要找一个最容易突破的点我觉得是联合仿真接口。现在行业里跨工具协作的主流桥梁是 FMI 标准模型可以打包成 FMU 文件在不同工具之间互相调用。整车级的场景里动力学仿真工具、液压气动仿真工具、控制建模工具各干各的靠 FMU 或者专用的 S-Function 接口拼起来。国产工具只要把 FMI 支持做扎实就能以被集成的方式进入现有流程不需要用户立刻放弃原来的工作方式。这一步的意义在于它让替换变成了渐进的。用户可以先把系统级集成挪到新平台上控制算法继续留在老工具里通过 FMU 互通。等到新平台的算法能力攒够了再一块一块把控制器搬过去。这种温水式迁移比一刀切要现实得多。3. 国产替代的四条现实路径从难到易排一遍讲完壁垒说路径。我把见过的做法归成四类按落地难度从高到低排。3.1 路线一多领域物理建模正面突破这条路线最正统用基于方程的多领域建模工具直接对标被控对象建模和系统级仿真。优势是建模表达能力强热、电、液、机可以统一描述仿真时不用手工推导状态方程模型可读性和复用性都不错。难点有两个。一是控制逻辑建模不如图形化状态机顺手尤其是带大量状态跳转、并行状态、事件响应的逻辑用方程描述很别扭。二是代码生成能力普遍还在爬坡尤其是定点化和标定量管理这两块。所以这条路线目前比较适合的场景是系统级仿真、能量管理、热管理这类不需要直接生成量产代码的环节先在被控对象侧站稳再往算法侧扩。3.2 路线二用 FMU 当翻译层先换集成再换控制器这条路线我比较推荐给中大型团队。做法是把已有的控制模型导出成 FMU然后在一个新的系统集成平台上做整车级或者系统级仿真控制器暂时不动。这样做的收益是系统集成的部分可以逐步换掉同时新平台在集成过程中积累了用户使用习惯和案例。风险在于 FMU 的接口约定必须严格输入输出端口要显式采样时间要明确参数要能对外暴露内部状态最好不要有隐藏依赖。我见过不少导出失败或者行为不一致的案例根因都是原模型里有隐含的全局变量或者跨模块的数据传递导出后语义变了。3.3 路线三从工具链边缘往里切如果团队对主力建模工具完全没有替换意愿最现实的切入点是工具链的边缘环节测试管理、自动化测试执行、数据回灌、需求追溯、模型质量检查、参数管理。这些环节对核心建模工具的依赖是接口级的改起来相对容易而且见效快能快速建立内部信任。我的经验是这类项目ROI最好算以前跑一轮回归测试要人工点两个小时换成自动化脚本跑二十分钟这种收益没人会反对。做出几个这样的案例之后再谈核心工具的替换阻力会小很多。3.4 路线四挑垂直场景先落地最后一条是把范围缩小到具体场景电驱控制、电池管理、热管理、车载电源、变频驱动。这些场景的模型规模可控、闭环明确、验证标准清晰适合做验证性项目。比如做电源的团队一套 LLC 半桥的仿真模型状态变量不多开关事件规律仿真结果和实测波形容易对齐非常适合作为工具对比的试验田。做电驱的团队永磁同步电机加逆变器加电流环也是经典场景文献和公开案例多对错容易判断。路线落地难度见效周期适合团队主要风险多领域物理建模正面替换高长有专职工具链团队代码生成与定点化不足FMU 翻译层渐进替换中中系统集成团队接口语义不一致从测试与质量环节切入低短质量与测试团队收益天花板较低垂直场景先落地中低中具体产品团队经验难横向复用4. 一套你自己就能跑的替代性验证流程说了这么多判断不如给一套能动手的流程。这套流程我在两个项目上跑过大概两周能出结论。4.1 第一步选一个能自证的最小闭环别一上来就搞整车模型那是不可能得出结论的。选一个你非常熟悉、结果对错一眼能看出来的闭环。我推荐两个候选。第一个是永磁同步电机的磁场定向控制包含电流环 PI、反 Park 变换、空间矢量脉宽调制、以及电压外环弱磁。第二个是 LLC 半桥变换器含谐振腔、开关管驱动、输出电压闭环。这两个场景的共同点是物理机理清晰有大量可参考的公开资料实测波形容易获取而且模型规模适中跑一次仿真几分钟就能出结果。选定之后把原工具里的模型导出成 FMU。导出的时候有几个必须注意的点把所有需要外部输入的信号提到顶层输入端口把所有需要观测的信号提到顶层输出端口明确指定通信步长参数尽量通过接口暴露而不是写死在模型里。4.2 第二步用脚本加载 FMU 做交叉验证导出的 FMU 可以用脚本方式加载先确认它在原工具之外能跑起来行为是否一致。这部分用 Python 就能做装一个 FMU 仿真库即可。pip install fmpyfrom fmpy import read_model_description, extract, simulate fmu_path pmsm_foc.fmu unzipdir extract(fmu_path) md read_model_description(fmu_path) print(FMI version:, md.fmiVersion) for v in md.modelVariables: print(f{v.name:30s} causality{v.causality:12s} variability{v.variability})先看变量列表确认输入输出是不是你预期的那些。这一步最常暴露的问题就是有信号没暴露出来或者暴露出来的方向和你想的相反。result simulate( filenamefmu_path, stop_time2.0, step_size1e-4, output[Id, Iq, Speed, Udc] ) import matplotlib.pyplot as plt plt.plot(result[time], result[Speed], labelspeed) plt.plot(result[time], result[Iq], labelIq) plt.legend() plt.grid(True) plt.show()把这条曲线和原工具里跑出来的曲线叠在一起看。重点看三处启动瞬态、稳态波形、以及在弱磁切换点附近的行为。误差如果在工程可接受范围内说明 FMU 导出是可信的可以进入下一步。注意如果 FMU 是非通信模式模型交换模式内部求解器由模型自带外部只需要按时间推进如果是通信模式外部求解器负责推进此时步长选得太大容易出现事件丢失。两个模式都要试一遍比较结果差异。4.3 第三步代码生成结果对比与静态检查这一步是把模型生成代码然后做横向对比。准备同一份算法逻辑在两个工具里各自生成一份 C 代码然后看几个指标。第一个是功能正确性两边代码在同一个测试用例下的输出是否一致。第二个是代码质量函数平均长度、最大圈复杂度、静态检查违例数量、是否有不可达代码。第三个是资源占用栈深度、代码体积、在目标处理器上的执行时间。第四个是可标定性标定量能不能正确生成描述文件并被标定工具读取。我自己的经验是功能正确性通常两边都能过差距主要在后面三项。尤其是圈复杂度和代码体积不同工具的优化策略差别挺大有些工具生成的代码函数切得很碎调用层次深跑在资源紧张的控制器上就会吃紧。这一步做完基本就能判断这个工具能不能支持量产交付。4.4 第四步联合仿真的接口验收标准如果新工具要和老工具共存联合仿真这关必须过。我一般会定四条验收标准。一是接口对齐两边模型的输入输出信号命名、单位、量纲、方向全部一致不能靠人工对照表维持。二是步长耦合两个模型的通信步长要明确谁主谁从要定清楚耦合步长变化时结果不能出现明显跳变。三是事件一致性开关事件、状态跳转这类离散事件发生时两边的时间戳要对得上不能出现一边已经跳了另一边还没收到的情况。四是可复现同样的输入重复运行多次结果一致随机性来源要可控。5. 常见问题与排查技巧实录这一节是我这几年真正花时间最多的地方每个问题背后都有具体的故事。5.1 仿真跑不动、代数环、步长爆炸模型刚搭完跑不动绝大多数情况是三类原因。第一类是代数环就是某个模块的输出直接或间接地依赖自己的输入求解器没法在一步内解出来。处理办法通常是插入单位延迟打破环或者用代数约束求解模块重写方程。插入延迟会引入一步延时对慢速回路影响不大对电流环这种快速回路要小心可能影响相位裕度。第二类是刚性过强一个系统里同时存在微秒级和秒级的时间常数变步长求解器为了跟上快速动态把步长压到极小仿真就卡死了。处理办法是检查有没有可以合理忽略的快速动态或者换用适合刚性系统的求解器。第三类是离散模块的采样时间和求解器步长不匹配出现某一步解不出来。这类问题最好从一开始就规划好连续部分用什么求解器离散部分用什么采样周期哪些模块必须放在同一个任务周期里。5.2 三相断路器点了没反应这类元件级坑电路仿真里最常见的一类困惑是搭好了逆变桥加了三相断路器跑起来发现断路器动作了但电流没变化或者干脆没动作。这类问题我总结了几个高频原因。一是断路器的初始状态设成了闭合仿真一开始就导通你看到的没动作其实是它一直在闭合状态。二是导通电阻设得太大在低压小电流回路里压降可观看起来像没接通。三是缓冲电路参数不合适在高频开关场景下开关过程被缓冲电路主导。四是求解器类型不匹配连续求解器跑带开关的电路会很吃力需要换成适合离散事件的求解器同时设置合理的最大步长。五是功率开关的驱动信号本身没接对比如脉冲发生器周期设错或者驱动极性和开关管类型不匹配。排查顺序建议是先看驱动信号波形再看开关管状态最后看回路电流。从前往后一层层卡比盲目改参数快得多。5.3 Chart 模块与状态机移植状态机建模是控制逻辑里用得很多的一块也是移植时最容易出问题的一块。状态机的语义细节很多默认转移怎么选、并行状态怎么同步、进入动作和退出动作的执行顺序、条件动作的求值时机、历史节点怎么记录。不同工具对这些细节的处理可能不完全一致。比如某个转移条件在两个状态同时满足时优先走哪条不同工具可能给出不同答案。这类差异在小模型上不容易发现在大状态机上可能表现为偶发的逻辑跳转异常。我的做法是移植前把状态机画成状态转移表把每条转移的条件和动作列清楚然后用覆盖测试跑一遍所有转移路径看两边是否一致。这个工作看着笨但比事后排查要省时间。5.4 数组读、矩阵运算与性能数组和矩阵操作是另一个高频坑区。常见问题有从工作区读入的数组维度对不上导致广播扩展出意料之外的结果索引基准不同一边从零开始一边从一开始跑出来的第一条数据总是错的矩阵运算在大维度下性能急剧下降因为每次仿真步都要重新构造矩阵。性能这块我的经验是尽量把参与运算的矩阵提前算好放进常量或者只算一次的初始化环节不要放在每个仿真步都执行的路径上。另外要注意某些模块内部的隐式数据拷贝模型规模一大拷贝开销会很明显。现象常见根因处理思路仿真卡死或极慢刚性系统步长被压小检查参数数量级换求解器报代数环错误输出直接依赖输入插单位延迟或重写方程开关动作无效初始状态或驱动信号问题先查驱动波形再查状态电流电压量级异常单位或量纲不一致统一单位制检查增益数组维度报错维度不匹配或扩展方向错误打印维度逐层核对状态机跳转异常转移优先级语义差异列转移表做覆盖测试生成代码编译失败类型不匹配或缺少头文件检查数据类型定义与包含路径标定值不生效标定地址或格式不符核对描述文件生成配置6. 到底该不该换我的判断逻辑和几个实操建议前面讲的都是技术最后聊点判断层面的东西。因为技术可行和项目该不该做是两件事。6.1 什么项目可以试什么项目别碰我的判断标准很简单看这个项目的失败代价有多大。适合试的场景预研项目、新平台的技术预研、非量产的对标分析、内部工具链优化、教学和培训。这些场景的特点是错了可以重来时间成本可控没有交付压力。不建议碰的场景临近量产节点的项目、功能安全等级高的核心控制器、已经有大量模型资产且没有专职工具链团队的项目。这些场景换工具带来的风险远大于收益硬上大概率是两败俱伤。中间地带是新车型的某个新增子系统、平台化项目里新增的功能模块。这类场景可以双轨跑新模块用新工具老模块维持原状通过接口对接。这是我认为性价比最高的做法。6.2 算清学习成本这笔账很多技术评估报告里会算工具采购成本却很少认真算学习成本这是最容易低估的一块。一个熟练的算法工程师换一套建模工具要重新学的不只是界面还有建模习惯、调试方法、库函数的语义、报错的含义、以及一整套这个功能该怎么做的直觉。这个适应期我观察下来简单的控制逻辑大概一到两个月能上手复杂系统级的模型半年到一年是常态。这段时间里团队的产出效率会明显下降而且会集中出现一批只有老手才能快速定位的问题。所以评估的时候我建议把人力成本按人月折算出来加到总成本里。很多时候你会发现工具本身的采购费用在整个迁移成本里占比很小。6.3 资产迁移的现实做法双轨跑一年如果确定要迁我建议的做法是双轨跑时间至少一年。第一到三个月选一个最小的闭环两边同时建模跑同一组测试用例输出对比报告。这一阶段不追求效率只追求搞清楚差异在哪。第四到六个月把对比范围扩大到系统级引入联合仿真验证接口层面的兼容性。同时开始积累新平台的使用文档和内部培训材料。第七到十二个月让新平台承担一部分真实交付任务但保留回退路径。这个阶段的重点是建立信心让团队感受到这条路是通的同时把踩过的坑沉淀成内部规范。一年之后再做决策是全面切换还是维持双轨还是回到原来的工具。三种结果都是合理的关键是决策要有依据而不是凭感觉。最后说个我自己的体会。这几年参与过几次工具替换的评估最大的收获不是搞清楚了哪个工具更强而是搞清楚了自家团队到底依赖什么。很多时候我们以为自己依赖的是某个软件的功能实际上依赖的是团队里那两三个人的经验和默契。工具可以换经验得慢慢长。所以真要动先把人算明白再动软件。再补一个实操上的小建议做对比测试的时候一定把测试用例和结果数据完整存档包括模型版本、参数配置、运行环境、原始曲线。我见过太多团队做完对比之后只剩一份 PPT半年后再想复核什么都找不到了。存档这件事花不了多少时间但能省掉后面很多扯皮。
返回列表