ARTICLE DETAIL

资讯详情

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

TSMaster MBD模块实战:Simulink模型DLL加载与自动化测试指南

TSMaster MBD模块实战:Simulink模型DLL加载与自动化测试指南 做汽车电子测试这几年我最大的感受就是环境搭建的时间往往比真正跑测试的时间还长。尤其是需要把Simulink模型和真实的总线报文、IO信号打通的时候传统做法要么写一堆C代码做封装要么在Matlab和总线工具之间来回倒数据调试一次能折腾一整天。后来接触到TSMaster的MBD模块才算是把这条路走顺了。TSMaster是同星智能出的总线工具MBD模块是它专门用来跑Simulink模型的功能。简单说把你写好的Simulink模型编译成一个DLL文件然后在TSMaster里加载这个DLL模型就能实时读取总线信号、计算、输出结果整个过程不需要Matlab在后台跑也不用手写接口代码。这篇文章就围绕这个流程把从模型整理、编译配置、TSMaster端加载、到自动化测试脚本串起来的完整步骤拆开讲一遍顺便把我在实际项目中踩过的坑也一并列出来给刚接触这块的朋友做个参考。1. MBD模块的核心思路先想清楚它到底解决了什么问题1.1 传统测试环境的痛点在讲MBD模块之前有必要先说说传统方案为什么让人头疼。早期做控制器测试最常见的方式是手写C代码模拟被控对象模型然后用总线工具发CAN或LIN报文。问题在于Simulink模型里一个简单的PMSM电机模型手写C代码得几百行起步还要自己处理状态变量、步长控制、数据读写工作量非常大。而且模型一旦更新C代码就要跟着改维护成本极高。另一个常见做法是在Simulink里做Model in the LoopMIL或Software in the LoopSIL仿真仿真结果通过文件或socket转发给总线工具。这种方式的问题是实时性差数据转一圈的延迟可能在几十毫秒到上百毫秒对于一些对时序敏感的信号比如轮速脉冲、PWM占空比误差会直接影响测试结论。我曾经见过有人用文件转发的方式模拟轮速传感器结果跑ABS测试时由于数据更新太慢控制器一直报轮速无效整个测试白做。1.2 MBD模块的解决思路TSMaster MBD模块的思路很简单把Simulink模型编译成原生DLLTSMaster在本地直接加载这个DLL模型和总线工具跑在同一个进程中数据交互通过内存指针完成延迟可以控制在微秒级。这样既保留了Simulink建模的高效率又拿到了接近真实硬件的实时性。具体到架构上TSMaster负责总线报文收发、IO模拟、测试脚本执行Simulink模型作为一个计算引擎嵌入其中。模型需要的输入信号比如车速、挡位、加速踏板位置由TSMaster从总线或界面手动赋值写入模型计算后的输出信号比如电机扭矩、电池SOC再由TSMaster发到总线上或者用于驱动虚拟面板。整个闭环在TSMaster里跑不需要外部传感器和控制器也能完成仿真测试。2. 环境准备软件版本、模型规范和接口约定2.1 软件版本与Matlab支持范围开始动手之前先确认版本兼容性。我常用的是TSMaster 2.9.6及以上版本对MBD模块的支持比较成熟。Matlab方面R2019b到R2023b之间我实测过都没问题再老一点的版本建议先用官方文档确认一下。一个重要提醒MBD模块对Simulink的代码生成器有依赖所以电脑上必须装MATLAB Coder和Simulink Coder否则编译模型时会提示缺少组件。TSMaster软件本身是免费下载的官方提供了标准版和Pro版MBD模块属于基础功能不需要额外购买license。在拉模型之前先把TSMaster安装好配置好对应总线的硬件驱动比如CAN卡驱动再用软件自带的Diagnostic工具确认一下硬件通道能正常识别避免后面测试环境搭好了硬件还连不上。2.2 Simulink模型的接口设计规范这是整个流程里被忽略最多的一环也是导致后期返工最多的原因。TSMaster的MBD模块对模型接口有明确约定模型的输入输出必须通过Inport和Outport模块定义不能直接把信号藏在模型内部。而且接口名称建议使用英文字母、数字和下划线的组合不要出现中文名称、空格和特殊字符否则生成DLL后信号匹配会出问题。接口的数据类型同样需要统一规划。TSMaster端默认使用double类型作为标准输入输出如果你的模型在某些需要整型或布尔信号比如挡位信号、使能信号建议在模型内部用Data Type Conversion模块把信号转换成double。这样做的好处是TSMaster里做信号映射时不需要关心类型转换所有信号都能直接赋值和读取。我之前做过一个项目模型的Enable信号用了boolean类型结果在TSMaster端怎么赋值都无效查了半天才发现是类型不匹配最后在模型出口加了一个转换模块就解决了。模型解算器设置也有讲究。MBD模块加载DLL后模型按离散固定步长执行所以Simulink模型需要设置为Fixed-step离散求解器。步长建议与TSMaster的仿真步长一致我一般默认用1ms如果模型计算量较大或者模型本身需要更细的时间粒度也可以缩短到0.5ms或0.1ms但过小的步长会增大CPU负载实测中如果电脑配置一般当步长小于0.1ms时TSMaster界面会出现卡顿。2.3 工具链安装与工程目录规范版本没问题、模型接口符合规范之后开始搭建工程目录。我个人的习惯是每个MBD项目单独建一个文件夹里面分三个子目录model存放Simulink源文件、release存放生成的DLL、scripts存放TSMaster测试脚本。这样做的理由很简单——模型更新版本时只需要重新编译DLL并替换到release目录TSMaster脚本不用动方便做版本管理。如果整个项目所有文件都堆在一个目录里模型升级几次之后连你自己都分不清哪个DLL对应哪个版本的模型。工程目录设置好后把Simulink模型打开确认模型内没有用到Matlab工作空间的变量块比如From Workspace模块因为DLL加载后不会去读取工作空间变量。如果你确实需要用外部参数建议用Constant模块加上参数值或者在模型初始化回调里直接定义参数值。3. 实操核心从Simulink模型到可加载DLL的完整编译流程3.1 模型参数设置的关键步骤把模型准备好后打开Model Configuration Parameters有几处必须逐一确认。第一处是Solver标签页Type选择Fixed-stepSolver选择discreteno continuous statesFixed-step size设为模型所需步长如0.001。如果模型本身包含连续状态模块需要先用离散化方式处理或者换成离散域等效实现比如积分环节用累加器替代微分用差分近似。选错求解器类型是新手最常犯的错误连续求解器编译出的DLL在TSMaster里实时性无法保证严重时直接跑不起来。第二处是Code Generation标签页System target file选择grt.tlcGeneric Real-Time Target。注意不要选ert.tlc因为ert目标主要用于嵌入式代码生成会做很多代码瘦身和优化反而会影响DLL的通用性。Language选择CGenerate code only可以不勾选但为了排查编译错误我建议勾上先看看代码生成过程有没有报错。第三处是Toolchain设置Windows环境下选择MinGW64或Microsoft Visual C都可以。我自己用的是VS2019 Windows SDK编译稳定MinGW的优点是免安装但某些Matlab版本对MinGW的兼容性一般如果编译过程中报undefined reference之类的链接错误多半是工具链不匹配换一下就能解决。3.2 生成DLL的完整操作配置完成后点击Model Configuration Parameters底部的OK返回Simulink窗口。在Simulink编辑器的左上角找到Build Model按钮点击开始编译。编译过程会持续1到2分钟期间Matlab窗口会输出大量编译日志不用每一行都看重点看有没有Error和Warning。编译成功后在模型对应的model_slrt_rtw或者grt_rtw文件夹里找到模型名.dll文件。把DLL复制到之前规划的release目录中重命名为有意义的名称比如ECU_Model_V1.2.dll。有人喜欢不重命名直接用默认名称但实际项目里模型会频繁迭代不带版本号的DLL容易和旧版本混淆建议养成带版本号的习惯。3.3 DLL在TSMaster中的加载与信号映射打开TSMaster软件新建或打开一个工程在左侧模型树中找到MBD节点右键选择加载模型选中刚才生成的DLL文件。加载完成后TSMaster会自动解析DLL中定义的输入输出接口并显示在MBD模块的接口列表中。我一般是先在MBD模块的界面里手动输入信号数据验证模型计算是否正确再开始配置总线信号映射。信号映射是MBD模块使用中最关键的一步。TSMaster支持把模型的输入输出信号与总线报文信号关联比如把模型的VehicleSpeed输出信号映射到CAN报文0x123中的Speed信号上这样模型计算的速度值就会自动填充到对应报文并发送到总线上。映射的本质是让总线信号和模型信号共享同一块内存区域模型写入输出信号后总线发送的数据自然就是最新的计算值不需要额外的数据搬运操作。TSMaster的信号映射配置界面直观用下拉框选择源信号和目标信号即可配置完成后可以保存成一个映射文件下次加载模型后一键恢复。4. 测试环境搭建与自动化执行真正跑起来才算数4.1 定义总线信号与激励序列模型加载和信号映射完成后开始搭建测试环境。第一步是定义总线的信号包括报文ID、周期、数据格式。TSMaster提供了总线报文编辑器可以手动添加报文和信号也支持从DBC文件导入。如果项目里有现成的DBC直接用导入功能几分钟搞定如果没有DBC就得手动把报文ID、字节长度、信号起始位、数据格式一个个敲进去这项工作比较繁琐但属于一次性工作后面所有测试都会用到。激励序列Stimulus是MBD测试环境的核心。TSMaster支持在Visual Sequence或者Test Table里配置激励信号的时序变化比如设置一个时间轴在t0秒时车速信号为0t1秒时线性增加到60 km/ht2秒时保持60 km/ht3秒时阶跃跳到120 km/h。这些激励信号可以直接赋值给MBD模型的输入信号也可以赋值给总线信号根据测试目标灵活选择。我通常会对模型输入信号做一部分测试检测模型的响应逻辑是否正常同时模拟总线信号做一部分测试检测控制器对异常信号的响应这样覆盖更全面。4.2 运行控制与数据记录环境搭好后点击TSMaster主界面的启动按钮模型开始按步长运行。TSMaster界面上的MBD模块会实时显示当前输入输出信号的数值总线报文也在实时收发。如果想观察信号变化曲线可以在Measurements窗口添加需要观测的信号TSMaster会绘制实时波形方便快速判断模型状态。除了实时观测数据记录也很重要。TSMaster支持将总线报文和MBD信号记录为BLF或CSV文件。我建议在每次测试开始前配置好Automation记录功能把测试时间、报文数据、模型输入输出全部记录下来。测试完成后用TSMaster自带的BLF分析工具或导入到Excel进行后处理。有一次我做一个温度模型的测试跑了一个小时中间某个时间点数据突然跳变如果不记录CSV根本无法回溯分析具体是哪个时刻哪条信号触发了异常。4.3 用自动化脚本串联整个测试流程单个测试手动操作没问题但做回归测试或批量测试时手动点击的效率太低。TSMaster支持用C#脚本或CAPL脚本编写自动化测试逻辑。我一般用C#写测试序列因为TSMaster对C#的支持比较完善而且语法对于懂面向对象的人更友好。脚本的核心流程是加载DLL、配置信号映射、启动模型、按设定的激励序列发送数据、等待一段时间、暂停模型、读取结果、与预期值对比、生成测试报告。整个过程写成一个函数循环跑不同的参数组即可。我没有完整的代码抄录在这里的权利但整体逻辑可以描述先定义测试用例表每组参数包括激励信号值、持续时间、预期输出值然后脚本循环读取测试用例表逐组执行并把实际输出值写入结果表。跑完100组用例大约需要10分钟比手动快了一个数量级而且避免了操作疲劳带来的误差。5. 常见问题与排查技巧实录这些坑我都替你踩过了5.1 编译阶段的坑模型编译时报Build failed这是最常见的一种错误。导致这个问题的原因很多最常见的是Simulink Coder许可证不完整或者Matlab安装的时候没有选择嵌入式代码生成组件。排查方法很简单在Matlab命令行窗口输入coder看能不能输出安装信息再输入which grt.tlc确认目标文件是否存在。如果两者都正常再看编译日志里的具体错误行定位是代码生成报错还是链接报错。编译成功但DLL加载失败提示无法定位程序输入点或找不到依赖库。这种情况一般是Matlab运行时库和TSMaster运行时版本不匹配。解决办法有两个一是把Matlab安装目录下的bin\win64加到系统PATH环境变量二是检查DLL是否依赖了特定版本的MSVC运行时。我之前遇到过换了一台电脑后DLL加载失败就是新电脑缺少VS2019运行库导致的装上对应vc_redist.x64.exe就解决了。5.2 运行异常类问题模型运行速度远低于预期。如果模型计算量较大或者电脑CPU性能不足模型每一步执行时间会超过设定的步长导致运行速度变慢。解决方法是降低输入信号的更新频率或者增大步长如果模型精度允许的话。还有一个小技巧在Simulink里尽量减少连续状态模块改用离散状态因为离散状态在DLL中执行效率更高。实测中同一个模型从连续积分改成离散累加器运行速度提升了接近一倍。总线信号没有更新。这种情况一般是信号映射没配对或者映射的是BYTE数组而不是物理值。TSMaster的信号映射有两种模式一种是映射原始字节另一种是映射物理值。你在配置的时候要根据模型接口类型来定。另外如果模型信号名称和总线信号名称存在大小写不一致映射会失败TSMaster不会报错但总线信号始终是初始值。我养成的习惯是所有信号全部用小写下划线的命名规范从源头上杜绝这个问题。5.3 工作效率方面的优化建议这里再分享几个提升效率的独家技巧。第一个技巧是模型接口变更后免重建。如果你的模型只修改了内部逻辑没有改输入输出接口重新编译生成的DLL可以直接覆盖旧文件TSMaster不用重启也能正常加载。但如果接口有增删TSMaster必须重新加载模型才能识别新接口。所以在开发阶段建议尽量保持接口稳定把频繁变化的内容放到内部逻辑里这样不仅编译快也省去频繁映射信号的麻烦。第二个技巧是利用TSMaster的MBD模块做参数扫描。当你需要测试模型在不同参数下的响应时比如PID参数可以在TSMaster脚本里通过Model.SetParameterValue这个API动态修改模型内部参数不需要重新编译或加载模型。这个功能我用了很久才发现非常实用。实际场景中我经常用它在同一组激励下依次测试多组PID参数然后把结果放到一张图上对比判断哪个参数组合响应最理想。第三个技巧是模型内部Debug。如果模型输出异常不要急着改代码先在TSMaster的MBD模块里把每个输入信号、中间量、输出信号都加到观测窗口实时看波形。TSMaster支持读取模型内部信号编译时需要开启信号记录选项这样能快速定位到是哪一层逻辑出了问题。这比在Simulink里把模型导出、再用Matlab看仿真曲线要方便得多。6. 一点个人体会从手写C代码到用TSMaster MBD模块跑Simulink模型省下来的时间让我有精力去做更值得做的事比如设计更贴合实际工况的测试用例、分析模型在边界工况下的表现。刚开始接触MBD模块时我也觉得配置流程有点绕信号映射、步长设置、编译工具链这些概念叠加在一起上手还是需要一点耐心的。但等你搭建好第一个能跑的闭环测试环境再从模型更新到回归测试都在TSMaster里一气呵成时就会明白这套流程的价值。最后再提醒一句做汽车电子测试环境搭建的标准永远是稳定、可复现、可追溯。MBD模块给你提供了一条比传统方式更顺的路但前提是你得把模型接口规范、版本管理、测试记录这些基本功做扎实。工具只是工具真正决定测试质量的是用工具的人是不是把每一个细节都想到了。
返回列表