ARTICLE DETAIL

资讯详情

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

TSMaster MBD模块实战:让Simulink模型无缝接入总线在环测试

TSMaster MBD模块实战:让Simulink模型无缝接入总线在环测试 我在用TSMaster之前一直觉得国产总线工具只是“能发报文”的水平真正干MIL、SIL测试还得靠MATLAB/Simulink那一套原生环境。直到在一次项目里手里只有一个现成的Simulink控制模型现场又没有dSPACE和CANoe的授权硬是被逼着用TSMaster的MBD模块把模型挂到了CAN总线上效果居然出奇地顺。从那以后我自己的测试机上就常驻了这套组合TSMaster负责总线通讯和测试编排Simulink负责算法模型中间用MBD模块对接。今天就把这套环境怎么搭、怎么跑、坑在哪一次性讲明白。这篇东西适合谁看如果你手头有Simulink模型想不写一堆C代码就能把算法跑在总线环境里或者你是刚接触车载测试、想低成本搭一套模型在环测试环境的工程师这篇文章能帮你少走很多弯路。我不打算照抄官方文档就按自己实际折腾过的流程来讲。1. 先说清楚TSMaster的MBD模块到底干什么1.1 从测试工程师的痛点说起做汽车电子测试尤其是控制器相关的测试经常要面对一个尴尬局面算法工程师在Simulink里把控制策略调得天花乱坠但测试环境里拿不到这个模型的可执行体。传统做法是把模型交给代码生成工程师生成C代码集成到某个上位机或者嵌入式环境里中间环节一多模型和测试环境就脱节了。另一个痛点就是总线数据交互。做HIL或者台架测试时你经常要模拟一些传感器信号给ECU或者接收ECU发出来的控制报文然后判断算法对不对。如果用CANoe你得写CAPL脚本如果用CANalyzer得折腾Panel和变量映射。不管哪条路学习成本都不低。TSMaster这个工具本身是国产的这几年在不少team里用来替代CANoe做日常总线分析。它的MBD模块说白了就是给了Simulink模型一个“插头”让模型编译出来的东西能在TSMaster里当成一个可执行节点跑起来并且和总线报文、系统变量实时交互。我第一回跑通的时候感受就是这一步省掉的不只是代码集成是整个“模型到总线”之间的翻译层。1.2 MBD模块的核心思路MBD模块做的事情可以拆成三块第一把Simulink模型“固化成可执行程序”。你不需要把模型转成手写C代码再手动工程化TSMaster的MBD模块可以调用外部工具链把模型转换成DLL或者直接加载模型导出的接口描述文件。第二提供模型输入输出的实时调度。模型编译成DLL之后谁来调用它TSMaster里的定时器负责这件事。你可以把DLL挂到一个周期任务上1ms执行一次或者10ms执行一次完全由测试需求决定。这个和Simulink原生仿真里按仿真步长跑是完全不同的逻辑MBD环境下模型是在“真实时间”里被调用的这一点做HIL的人应该秒懂。第三完成总线信号和模型端口的映射。在TSMaster里你可以把DBC文件里的信号直接拖给模型的某个输入端口再把模型的输出端口关联到你自定义的系统变量或总线报文信号。这样模型就“长”在总线上了。我印象最深的是TSMaster对Simulink版本没有特别苛刻的限制我试过R2020b到R2023b基本都能正常对接这一点比不少国外工具友好太多。1.3 什么人该用、什么人暂时用不上如果你只是做纯总线分析比如抓包、看曲线、诊断那MBD模块确实用不上别为了用而用。但如果你是下面这几种情况MBD模块基本就是为你准备的手上有Simulink模型想快速验证模型和真实总线数据交互是否正常。做控制器测试需要一套能跑算法的总线仿真环境做“陪练”。不想被CAPL、C代码或者复杂工程化流程卡住想用拖拽方式搞定模型接入。学校或者团队预算有限没有CANoe、dSPACE想用免费工具搭一套模型在环测试环境。我当时就是在预算收紧的项目里临时顶上用TSMaster MBD配合一个简单的电机控制模型硬是把“控制器算法在环测试”这件事撑下来了。2. 环境搭建与版本避坑2.1 软件清单和版本匹配建议先说结论我实际使用的组合是TSMaster最新稳定版 MATLAB R2022b64位 Visual Studio 2019可选但建议装。TSMaster本身官方提供免费版功能对一般测试足够。下载安装直接在官网找“下载中心”或者搜同星TSMaster下载安装也能找到包。安装过程比较傻瓜但有一点要特别注意杀毒软件经常把TSMaster的驱动和授权文件误删装完无论如何先看一眼隔离区。MATLAB这边Simulink模型编译成DLL需要固定的工具链。Windows上我建议直接装VS2019或VS2022并且用MATLAB的“mex -setup”把编译器指到VS上。用MATLAB自带的MinGW编译器也行但我试过几次生成的dll在TSMaster里偶尔会报“无法定位程序输入点”之类的错后来改用VS就稳定多了。版本匹配上有个大原则MATLAB位数和TSMaster位数必须一致。现在基本都是64位环境但你如果电脑上还留着32位的MATLAB那就别怪TSMaster不认你。另外TSMaster的MBD模块对MATLAB版本的要求不算变态但太老的版本比如R2016a会有兼容性风险我建议至少用R2020b以上。2.2 MATLAB外的一些隐藏依赖很多人以为装好MATLAB和TSMaster就能直接干了结果卡在半路。其实还有一个隐藏依赖Simulink的代码生成组件。如果你用的是完整版MATLAB默认就带Simulink Coder和Embedded Coder但如果你的MATLAB是精简安装可能没有代码生成能力MBD模块编译模型时会提示缺少“Simulink Coder”。检查方法很简单在MATLAB命令行输入“license(test,Simulink_Coder)”返回1就说明授权OK。还有个东西不是必须但强烈建议装编译器环境变量。TSMaster调用模型编译时会去查CCC Compiler环境变量如果找不到就一直卡在“Waiting for compiler”让你以为程序死了。我自己的装机顺序是先装VS再装MATLAB最后装TSMaster。这个顺序比较稳每装一个软件就重启一次别嫌麻烦有些环境变量在重启后才生效。2.3 第一步先跑通自带Demo环境装好之后先别急着拖你自己的模型上去。TSMaster自带的Demo里就有一个MBD模块的示例工程路径一般在安装目录的Demo文件夹里名字里带“MBD”字眼。第一次接触的人我建议先不看教程直接双击打开Demo跑起来然后再去看模型和总线配置是怎么组织的。这个习惯是我当年学CANoe时候养成的先跑通再理解。Demo里通常有一个Simulink模型一个TSMaster工程里面已经配好了定时器、DBC、变量映射。你可以先改一改模型的某个常数重新生成DLL再在TSMaster里看输出变化。这步要是通了后面就是水到渠成的事。如果你连Demo都跑不起来问题大概率出在版本匹配或者编译器配置上别急着怼代码。3. 实操从Simulink模型到TSMaster可加载的DLL3.1 模型设计阶段的几个关键设置很多人栽在第一步模型是能跑但就是生成不了适合MBD的DLL。原因多半是模型设计习惯不好。先说模块选择。MBD模块加载DLL后TSMaster按端口名称和模型描述文件去识别输入输出所以模型顶层不要用复杂的Subsystem嵌套包装太多层尽量让顶层接口清晰。我习惯把算法核心放在一个Subsystem里顶层只保留Inport、Outport和必要的常量/使能控制。再说仿真步长。在Simulink里模型求解器要设置成固定步长比如定步长0.001秒。如果你用可变步长生成代码后虽然也能跑但TSMaster外部调度时容易出时间对齐问题。另外模型里最好不要有依赖工作空间变量的模块比如直接用“From Workspace”读参数。因为生成DLL后工作空间的变量不存在了读取会报错。凡是需要外部传入的数据一律通过Inport口进来。这里有个小技巧如果你有大量标定参数可以用Simulink的Parameter对象在代码生成时把这些参数封装成可修改的结构体然后在TSMaster里动态修改。不过这是进阶玩法新手先别碰。3.2 生成DLL的操作要点在模型准备好之后生成DLL主要有两种路子。第一种是在TSMaster的MBD模块界面里直接选择“加载Simulink模型”它会调用MATLAB自动完成生成和编译。这种方式适合模型文件不算特别大的情况TSMaster会帮你协调MATLAB和编译器。第二种是手动在Simulink里生成代码然后在MATLAB里用“codegen”命令或者Simulink Coder生成DLL再回到TSMaster里加载。这种方式可控性更强适合要加入自定义TLC或者要定制内存分配的场景。我平时用第一种多因为省事。具体操作在TSMaster里新建一个MBD模块节点点击“Build”或“Rebuild”按钮选择你要加载的.slx文件它会自动调起MATLAB在后台生成代码并编译成DLL整个过程大概几十秒。这里重点提醒模型文件的路径不要有中文不要有空格。我吃过一次亏模型放在桌面“新建文件夹2”里结果编译器找不到路径报了一堆莫名其妙的错误。生成完成后TSMaster界面里应该能看到模型的输入输出端口列表这就说明DLL被正确识别了。3.3 在TSMaster里建MBD模块并关联模型新建MBD模块的入口在TSMaster的“仿真/模型”相关的菜单里不同版本叫法略有差异但逻辑一样新建节点选择MBD类型指定DLL或模型文件。建完之后你会看到一个类似编辑器的界面左边是模型的输入端口右边是输出端口。这一步相当于你把Simulink模型的“接口”暴露给了TSMaster。我举个具体的例子。我之前做过一个简化的PMSM电机控制器模型输入端口有目标转矩、母线电压、电机转速反馈、电机三相电流反馈输出端口有PWM占空比、控制器状态字、故障码。在TSMaster里加载这个DLL后端口列表自动就出来了每个端口还能配置数据类型、缩放系数、偏移量。这一步相当于是给模型做“标定”把模型内部物理量映射到总线上的工程值。配置好端口之后记得把MBD模块的执行使能打开。很多新手加载了模型却看不到结果就是执行使能没勾上模型根本没被调度执行。4. 数据交互与映射把总线报文和模型变量接起来4.1 DBC与模型变量的连接方式MBD模块只是让模型跑起来真正有意思的是让模型和总线数据实时互通。在TSMaster里你可以通过“数据库”加载DBC文件然后建立“报文信号”和“模型端口”之间的映射。比如目标转矩这个输入端口正常在实车上是通过CAN报文发到控制器里的。你在DBC里找到对应的信号“TargetTorque”再在MBD模块的映射表里把“TargetTorque”信号关联到“目标转矩”输入端口。这样总线上来了一个目标转矩值TSMaster会自动解析并把工程值传给模型模型跑完再把输出写回CAN信号完成闭环。这个过程用拖拽就能完成不用写一行代码。对比在CANoe里用CAPL写“message.msg.TargetTorque model_output”这种语句效率高太多。我当时做测试的时候一边开着TSMaster的报文发送窗口用周期报文持续发目标转矩另一边在MBD模块的输出曲线上观察PWM占空比变化整个过程是实时响应的基本没有明显延迟。4.2 一个很典型的闭环例子电机控制器我用这个PMSM电机控制器的模型做过一个闭环测试流程是这样的模型输入是DBC里发过来的目标转矩模型内部经过电流环、转速环的PI运算都是Simulink里搭好的输出PWM占空比和状态字。TSMaster这边再通过另一个节点模拟一个电机负载反馈把转速值发回模型的转速反馈端口。这样整个环路就是TSMaster模拟电机反馈 → MBD模块跑控制算法 → 输出PWM → 再计算出转速 → 回到输入端。实际测下来模型执行周期设为5msCAN报文周期设为10ms抓到的数据曲线非常平滑。有人会问CAN报文周期比模型执行周期慢会不会有数据断层这里就要用到TSMaster的信号保持机制即使总线上一段时间没有新报文模型端口也能维持上一次的有效值不会突然掉到0。4.3 定时器与调度细节这里展开说一下TSMaster的定时器因为这是很多人的盲区。TSMaster的MBD模块本身不负责调度模型真正调度模型的是工程里配置的定时器。你新建一个定时任务周期设为5ms任务内容就是“调用MBD模块的Step函数”。定时器一到时间TSMaster就把模型的输入从端口缓存里取出来执行一次模型计算再把输出写回输出缓存然后总线系统对这些变化做处理。第一次搞的人容易犯一个错把定时器周期设得比模型内部步长还小。比如模型内部步长是1ms你定时器却设为0.5ms去调用这没有任何意义反而占CPU。我的经验是定时器周期要么等于模型步长要么是模型步长的整数倍比如模型步长1ms定时器就设1ms或者5ms这样系统最稳。定时器还有个细节是可以设置“立即执行”和“首次延迟”。在测试启动时如果你想先让总线稳定再启动模型就给定时器设个首次延迟比如200ms。这个小功能在压力测试时特别好用避免了一启动模型的输出就对总线造成冲击。5. 从仿真到HILMBD模块的扩展思路5.1 和Simulink外部模式的对比可能有人会问Simulink自带“外部模式”好像也能让模型在外部环境下运行为啥还用TSMaster的MBD模块我对比过关键区别在于“独立性”。外部模式必须要MATLAB在后台实时运行模型数据通过TCP/IP或者串口和Simulink通信一旦MATLAB卡顿或者通信链路不稳整个实时性就崩了。而且外部模式下的总线交互能力很弱你要去操作CAN报文还是得回到TSMaster这边。MBD模块就不一样编译成DLL后模型彻底脱离了MATLAB运行时TSMaster就是宿主机。这样不但启动快而且占用的系统资源小很多可以长时间稳定跑。我在做电机控制器耐久测试时模型连续跑了72小时没掉过链子如果是外部模式MATLAB估计早就内存溢出了。这也是为什么我更倾向MBD方案。5.2 与CarSim、FMU等模型的配合方式聊到联合仿真很多人喜欢用“CarSim Simulink”或者“AMESim Simulink”这种玩法在算法开发阶段确实很爽但到了测试环境就有点重了因为要同时开好几个软件。我的思路是CarSim这类工具生成的FMU模型或者直接生成的DLL一样可以拿到TSMaster里用。TSMaster本身也支持FMU格式的模型导入这给了你更多选择。如果你有一个基于FMU的标准模型完全不需要把它改造成Simulink模型直接把FMU加载到TSMaster的模型节点里再配置好输入输出映射它就能和总线数据联动了。这个做法在需要把你的系统模型和第三方工具供应商给的模型做集成时非常有用。我自己也做过一次供应商把他们的整车动力学模型打成一个FMU丢给我我没装任何第三方工具直接在TSMaster里当普通模型节点跑起来了那个感觉是真的爽。5.3 MBD模块在测试体系里的定位有人可能会说我用dSPACE或者NI的HIL系统那才是正统HILTSMaster这个充其量算“软HIL”。我不否认专用HIL硬件在实时性、IO能力、故障注入上更强但对于很多应用场景比如控制器软件的回归测试、信号级测试、整车控制器逻辑验证TSMaster MBD 总线仿真这套软环境已经够用了。它尤其适合在项目早期、硬件还没到位的时候先把控制算法挂在模拟总线上跑起来发现逻辑层面的bug。我记得有一次团队成员用传统HIL流程光是配置IO通道就花了两天。而我在TSMaster里10分钟就把模型和CAN信号连好了当天下午就开始跑测试用例。当然硬件在环的故障注入精度、电气级仿真TSMaster替代不了但定位就是两个方向。6. 我把坑踩了一遍常见问题与排查6.1 DLL加载失败提示“无法加载程序集”这个我遇到过不止一次原因通常有三类一是生成的DLL位数不对。你Simulink是32位的但TSMaster是64位的DLL加载必然失败。检查方法打开MATLAB运行“computer”命令看是不是“PCWIN64”TSMaster里“关于”页面也能看位数。两边对不上就重新生成。二是缺少运行时依赖。有些模型用到了MATLAB的部分运行时库虽然你编译成功了但换到另一台机器或者另一个环境里跑就需要对应的MATLAB Runtime。最简单的做法是把MATLAB的“runtime”目录加进系统PATH或者干脆把dll放到TSMaster的安装目录下让它就近找库。三是杀毒软件误隔离。我吃过一次大亏模型生成的dll被Windows Defender直接隔离了TSMaster加载时提示“找不到文件”但文件明明在目录里。后来把目录加了白名单世界就清净了。6.2 模型加载成功但输出一直是0这种情况多半是执行使能没打开或者定时器没有启动。我检查的流程是先看MBD模块的执行状态指示灯是不是绿色在闪再看定时器是否启用了周期配置是否正确最后看模型的输入端口有没有值进来。如果输入就是0那你模型输出0很正常先把输入信号源头查一下。还有一个小概率问题模型里设置了“使能端口”Enable但TSMaster这边没有对Enable信号赋值。这个在模型设计时就要注意自带的“Enabled Subsystem”或“Enable Port”需要外部给一个布尔量。6.3 模型跑起来后曲线和Simulink里对不上这个问题最容易让人抓狂但仔细一想就知道原因物理时间对不齐。Simulink仿真里你是用仿真时间跑完整个模型比如仿真0到2秒步长自动调整。但在TSMaster里模型是实时被调用的每次调用只执行一个步长相当于把仿真时间压缩到真实时间里。如果你的模型是非线性系统对步长敏感那仿真结果和实时结果有偏差很正常。解决办法是模型里尽量用固定步长求解器并且把步长设小一点比如1ms或0.5ms。步长越小实时执行结果越接近离线仿真但CPU负担也越大。我一般先按总线周期的一半去设模型步长比如CAN报文10ms模型步长5ms效果通常都不错。6.4 模型多了之后TSMaster越来越卡当你一个工程里挂了好几个MBD模块或者模型比较大TSMaster的界面刷新和曲线绘制会成为瓶颈。我遇到过最强的情况三个模型节点同时跑2ms执行周期曲线窗口开了十几条工程开始掉帧。我的优化手段有这几种把不需要实时观察的曲线关闭只在测完之后从日志文件里看。用TSMaster的“通道记录”功能把数据存到文件里测试完成后再离线分析。把模型的采样时间适当地拉大比如控制回路用1ms但状态监测回路用10ms模型内部也可以配置不同的采样组。这里分享一个小技巧TSMaster的曲线窗口如果用“滚动模式”刷新会比较吃CPU改成“累积模式”或者只显示最近N个点性能会好很多。摸清这个设置后多模型的工程跑起来明显顺滑了。6.5 快速排查表现象可能原因检查方法DLL加载失败位数不匹配 / 缺运行时确认两边都是64位加runtime路径模型输出为0执行使能未开 / 无输入检查执行状态和输入端口值结果与仿真不符步长不匹配模型内固定步长设小定时器不触发配置错误 / 用户未启动检查定时器状态和首次延迟TSMaster崩溃杀软隔离 / 内存不足白名单、加内存、减少曲线窗口无法调用MATLAB生成代码Simulink Coder失效检查license重装coder组件这张表是我在实际项目里汇总出来的基本都是高频问题照着排查一般能解决80%以上的故障。写在最后这篇文章写到这里差不多把我用TSMaster MBD模块的核心经验都倒出来了。从环境搭建到模型生成从数据映射到定时器调度这套流程如果你能自己完整走一遍基本就能上手实际项目了。我个人在实际操作中最大的体会是工具链的进步真的在降低测试工程师的门槛。以前玩转仿真和总线测试要求你会C语言、会编译原理、会嵌入式集成现在用TSMaster的MBD模块很多环节被“封装”掉了你可以把精力更多放在测试用例的设计和系统行为的分析上。最后再分享一个小经验不要一开始就把模型改得花里胡哨先让一个最简单的demo跑通确认链路没问题再逐步把你的真实控制算法加进来。这个“由简入繁”的策略能帮你避开90%的引入性问题。等这套流程用熟了你甚至会发现原来很多以为要上大型HIL平台才能做的测试自己桌面上就能搞定。
返回列表