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

资讯详情

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

实时仿真平台选型实录:从dSPACE/VeriStand到SimuRTS的迁移与实测对比

实时仿真平台选型实录:从dSPACE/VeriStand到SimuRTS的迁移与实测对比 1. 我为什么把手里的VeriStand和dSPACE换成了SimuRTS1.1 第一个触动我的不是参数是售后的响应速度两年前我负责一个电机控制器的硬件在环项目当时用的是某国外平台的实时仿真器。项目卡在了一个很尴尬的问题上模型部署之后IO采样偶尔会出现毛刺示波器上的波形每几十秒抖一次。排查了两周我们怀疑是实时任务被系统中断打扰但这套平台的实时内核是封闭的你只能通过它提供的API去查查来查去发现日志信息非常有限。后来我们联系厂家支持反馈流程走下来一个邮件来回要两到三天加上时差一个问题前前后后拖了三周多。那段时间我正好听到同行提到SimuRTS。起初我并没有当回事国内做实时仿真工具链的团队这几年冒出来不少但大多数停留在能跑demo的阶段。真正让我改变想法的是后来一次技术交流他们把自己的平台装到一台普通的x86工控机上跑了一个步长为10微秒的电力电子模型抖动数据贴出来确实比我当时的环境好。更重要的是问题反馈在一个小时内就收到了人工回复第二天工程师直接远程上来帮我们查环境。我不是说国外平台不好dSPACE和VeriStand在稳定性、文档成熟度上是行业标杆这点必须承认。但在项目工期紧张、出了问题要快速定位的场景下支持渠道的响应速度会直接决定你的交付日期。这是我在实际项目中第一次认真考虑迁移。1.2 换平台前我列的评估清单虽然对售后服务有不满但换平台这件事不能拍脑袋。实时仿真平台是测试体系的底座换一个意味着模型要重新适配、板卡驱动要重新验证、自动化脚本可能要重写而这些成本往往比软件本身的授权费高得多。我当时给自己列了一份评估清单大约包含这几项步长覆盖范围现有模型里最快被控对象的时间常数是多少平台能否跑到10微秒甚至更小抖动和超限概率平台给出的步长指标是否基于真实负载而不是空载跑出来的Simulink模型兼容性直接导入现有模型还是需要手动替换大量模块IO和总线接口本项目用到的模拟量输入输出、PWM、CAN和以太网接口是否有现成驱动在线调参与数据记录能否支持参数在线修改长时间记录时是否会丢帧自动化测试接口Python和.NET脚本能否控制启停、回放测试用例技术支持和定制能力遇到问题时能不能得到及时的、本地的支持。这份清单对应的就是我平时用dSPACE和VeriStand时会关心的东西没有一项是性能跑分式的指标。因为实时仿真这种工具真正的价值不在于纸面的最大能力而在于你在项目里能不能稳定复现它、能不能在自己手里快速解决问题。2. 10微秒步长背后的实时平台基本功调度、中断与抖动2.1 “确定”比“快”重要很多刚接触实时仿真的人会有一个误解实时平台就是CPU跑得快所以仿真步长越小越好。这个说法只对了一半。实时仿真关心的核心指标其实是“确定性”也就是每个仿真步长是否都能在指定的时间窗口内完成计算并且这个时间窗口不能有明显波动。举个生活中的例子。你让一个人每隔一秒钟拍一次手这个要求不难。但如果要求他每次拍手的间隔误差不超过10微秒那就不是靠“更快”能解决的而是要保证他脑子里那个节拍器足够稳定还得排除旁边有人突然喊他名字、窗外车响、手机震动的干扰。实时平台要解决的正是后面这些“干扰”也就是操作系统的中断、其它进程抢占、CPU缓存未命中、内存读写延迟。SimuRTS能把步长从常规的1毫秒做到10微秒本质上不是把CPU主频拉高了而是把底层调度机制换掉了。我在搭建环境时观察到它把实时任务单独绑定在特定的CPU核心上同时屏蔽了系统中断的默认分发让这个核只服务仿真循环。这种做法在通用操作系统里是不允许的但在实时仿真场景下牺牲一部分通用性换取确定性是值得的。2.2 步长从1毫秒缩到10微秒系统发生了什么变化1毫秒步长和10微秒步长看似是100倍的性能差距但从系统设计角度看变化远不止“CPU变快100倍”这么简单。先看计算量。仿真步长减到原来的百分之一意味着相同仿真时长内模型的求解次数变成了原来的100倍。以我常用的一个永磁同步电机模型为例状态方程加上逆变器开关逻辑每个步长大约是几千次浮点运算。1毫秒步长下这只是一次毫秒级任务到10微秒步长时每个步长的计算必须在10微秒内完成而现代CPU的单个核心在一个10微秒窗口内能执行的计算量其实并不像想象中那么大所以你必须确保模型在编译阶段做了充分的优化比如开优化选项、避免动态内存分配、把函数调用内联掉。再看向上层的工程问题。步长到了10微秒以后IO采样的触发方式也需要跟着变。如果还用传统的轮询方式主线程每执行一次计算前都要查询一遍IO缓存会白白浪费几个微秒更合理的做法是让硬件定时器直接触发任务IO采样完成后再唤醒计算任务尽量减少空转等待。我自己的工程里这个调整带来的性能改善比换更强CPU还要明显这大概就是平台底层对硬件资源的管理方式差异。最后是数据落盘。10微秒步长意味着每秒钟会产生10万条仿真数据如果把这些数据全部写进硬盘再好的固态硬盘也会被IO阻塞拖累。所以平台在数据记录上通常会采用“内存预分配后台周期落盘”的思路只有在记录缓冲区写满时才真正触发文件写入避免实时循环被文件系统卡住。这一点在我长时间跑耐久测试的时候尤其重要。2.3 用GPIO翻转法实测抖动判断一个实时平台到底“实时”到何种程度只看宣传资料没意义最简单有效的方法是GPIO翻转法。这个方法在业内用了很多年原理大家应该能猜个大概在实时任务里每隔一个步长翻转一次某个数字IO口的电平然后用示波器测量翻转沿之间的时间间隔统计最大值、最小值和标准差。这个统计结果就反映了平台在真实运行时的抖动水平。我第一次在SimuRTS环境下跑这个测试时用的步长就是10微秒运行了整整一小时示波器记录到的最大间隔和最小间隔的偏差在几百纳秒量级标准差更低。相比之下我之前在另一套平台上跑同样的测试步长1毫秒时抖动反而达到了几十微秒。这个结果让我印象很深因为说明SimuRTS的定时机制在短期稳定性上确实做到了位。不过这里要提醒一句GPIO翻转测出来的是定时器触发的稳定性并不完全等于模型计算在10微秒内跑完。如果模型本身太复杂一个步长内的计算量超过10微秒平台会立即报“步长超时”实际表现就是仿真自动暂停或者标志位置位。所以测抖动之前先确认模型的计算量在合理范围内否则测出来的抖动数据没有意义。3. 从0开始搭建SimuRTS工程Simulink模型迁移全流程实录3.1 环境准备装好Simulink插件和实时目标机驱动很多人一开始问我的问题是SimuRTS到底怎么和Simulink配合这个问题其实要分两层看。第一层是模型侧的代码生成第二层是运行时管理。模型侧的工作在开发电脑上完成运行时管理则需要一台连接了IO板卡的实时目标机两者通过以太网进行通信。我在开发机上安装的步骤是这样的先安装SimuRTS主程序然后安装与当前Matlab版本对应的Simulink插件。插件装好后Simulink的模型配置界面里会出现SimuRTS对应的目标语言编译器选项Simulink就可以把模型生成C代码后再交给SimuRTS进行交叉编译。这个过程和dSPACE的RTI或者VeriStand的Simulink接口思路是类似的所以熟悉国外平台的人切换到这边不会感到陌生。实时目标机的部署比我想象中灵活。dSPACE通常绑定专用硬件VeriStand虽然支持PXI和实时PXI但也有一整套硬件配套要求。SimuRTS这边我了解到支持通用x86工控机加实时内核的方式意味着你可以把公司闲置的工控机利用起来只要CPU支持、网口和板卡驱动匹配就可以。对我这种预算敏感的团队来说这是一笔实打实的成本节省。3.2 模型处理把连续求解器换成固定步长离散模型迁移的第一步是处理Simulink模型本身。实时仿真平台要求模型使用固定步长求解器这一点几乎所有平台都一样SimuRTS也不例外。我原来的模型里有一些用连续积分器实现的控制器直接拿到实时平台上跑虽然也能跑但误差和稳定性都不理想必须先把这些连续模块离散化。具体操作时我先把模型配置里的求解器类型从Variable-step改成Fixed-step并指定离散求解器。然后再逐个检查模型里有没有Continuous类型的模块比如Continuous Transfer Fcn、Continuous Integrator、Memory带积分特性的变体。遇到这些模块要么替换为离散对应版本要么根据传递函数手工推导出差分方程再用离散模块实现。这一步最容易出问题的是连续控制器离散化之后的采样时间选择。我个人的经验是离散化的采样时间要和实时仿真步长保持一致否则模型内部会出现多速率混叠表现为仿真结果波形出现异常毛刺。如果模型里有些环节确实需要更快的更新率也要在同一个步长框架下设计成多速率任务而不是直接用一个不统一的离散周期。3.3 配置IO和硬件映射模型处理完之后就该接硬件了。实时仿真平台的价值在于能连接真实的IO设备否则就是纯离线仿真。SimuRTS工程里有一个硬件配置界面类似dSPACE的ConfigurationDesk或者VeriStand的硬件配置页面你可以在这里添加模拟量输入输出板卡、数字量板卡、CAN接口、以太网接口等。我在这个环节的工程习惯是先做一份“信号映射表”把模型里的每个IO端口对应到具体板卡的具体通道。比如模型里的phaseA_current对应模拟量输入卡第2通道gate_pwm对应数字量输出卡第3通道。这样在配置界面操作时不容易漏配。配好之后可以先用一个简单的开环模型做IO回环测试也就是把输出通道短接到输入通道看数据是否能正确读回。这个步骤听起来简单但却是迁移过程中最容易出低级错误的地方。我见过有人把模拟量的量程配错导致采集到的电压差了一倍也见过数字IO方向配反信号一直没反应。所以建议配置完成后一定要做一轮非常基础的IO自检再跑模型。3.4 编译、下载与在线调参IO配置完成、模型也处理好了之后就可以进行代码生成和下载了。在Simulink模型里选择用SimuRTS目标编译器点击Build模型会自动生成C代码并编译成可执行文件然后通过网络下载到实时目标机。这个过程我第一次用时大约花了5分钟和之前用dSPACE的经历相比没有明显的陌生感。下载完成后进入实时运行管理界面在这个界面上你可以做三件最核心的事情启动/停止实时任务、在线修改模型参数、实时查看和记录波形。在线修改参数是实时仿真里非常高频的操作比如PID控制器调试时你不希望每次改一个参数都要重新编译下载一遍而是希望仿真运行中直接改动立刻看到被控对象的响应变化。SimuRTS在这块做得比较顺手参数修改后可以立即生效而且不会导致实时任务重启。另外实时运行管理界面里还提供数据监视和记录的开关。我通常会在跑性能测试之前提前开启记录把波形数据保存下来方便后续做对比分析。这一点后面会展开讲。4. 同一套电机模型三个实时平台的横向实测对比4.1 部署一个模型的流程差别为了搞清楚迁移到SimuRTS到底会损失什么、得到什么我做过一次非常直观的对比实验把同一个永磁同步电机磁场定向控制模型分别部署到dSPACE、VeriStand和SimuRTS三个平台上记录从模型导入到正常运行的耗时和操作步骤。在dSPACE平台使用ConfigurationDesk配合MotionDesk或者ControlDesk部署流程通常是在Simulink里把模型生成dSPACE的RTI库包然后导入ConfigurationDesk做硬件映射再在ControlDesk里做变量管理。整个链路成熟、稳定文档也完善但学习曲线比较陡。我第一次上手时光是搞清楚ConfigurationDesk和ControlDesk各自负责什么就花了两天。在VeriStand平台流程相对简洁一些在Simulink中生成一个编译好的模型文件比如dll或者so文件然后把它作为“Model in the Loop”导入到VeriStand工程里再配置映射最后部署到实时目标机。VeriStand的通用接口设计得不错尤其是对自动化测试的支持很好但模型一旦发生变化重新编译导入的过程还是会打断工作流。在SimuRTS平台整体流程和VeriStand有相似之处但更贴近Simulink原生的开发习惯。模型侧通过目标语言编译器直接生成运行时环境则负责硬件映射和调参。模板化程度虽然不如dSPACE那么深但胜在直观从一个Simulink工程师的视角来看心智负担最小。如果你问我哪个平台部署最快我的答案是SimuRTS在这个场景下的上手速度明显更快原因是它的操作路径更短不需要在多个工具之间来回切换。但如果你问我哪个平台在超大型模型的批处理部署上最成熟说实话dSPACE依然是标杆毕竟它的企业级特性积累了这么多年很多细节处理得更严谨。4.2 步长与抖动实测对比对比实验的第二部分是测量三个平台在相同负载下的实际步长表现。我用同样的模型分别在三个平台上设置目标步长然后运行10分钟记录超时次数和抖动数据。平台目标步长抖动标准差超时次数dSPACE500微秒约8微秒0VeriStand500微秒约15微秒0SimuRTS500微秒约6微秒0其实在这个步长下三个平台的表现都很好抖动都在微秒级超时次数为0说明它们都能满足常规硬件在环测试的需求。接下来我把目标步长缩短到10微秒这时候只有SimuRTS能够稳定运行dSPACE和VeriStand的CPU平台都已经接近极限频繁出现超时除非换用FPGA方案或者进一步简化模型才能跑下来。这也是我在那个项目里最终选择SimuRTS作为主力平台的直接依据——它用一台普通的x86工控机就跑到了10微秒而另外两个平台要么需要降级模型要么需要上更贵的硬件。当然这个对比并不是想证明SimuRTS在绝对性能上优于那两个平台而是在说以我们团队的硬件条件和应用场景来看SimuRTS在CPU平台上的实时优化做到位了性价比确实更高。4.3 扩展生态与二次开发能力实时仿真平台不只是跑模型那么简单它还要融入你的自动化测试体系。dSPACE有ASAM XIL APIVeriStand有丰富的Python和.NET接口这两个生态在行业里都很成熟。SimuRTS作为相对较新的平台我一开始最担心的就是它在这一块会拖后腿。实际用下来SimuRTS提供了Python远程控制接口可以通过脚本实现实时任务的启停、参数的批量设置以及测试报告的自动生成。我在自己的自动化脚本里用Python调用SimuRTS的API做一个自动化回归测试流程跑了一套包含100多个测试用例的序列整个过程很顺畅。和另外两个平台的差距主要在于生态工具链的丰富程度比如dSPACE有专门的自动化测试工具和故障注入模块这些在SimuRTS上还在逐步完善。如果您的团队已经积累了基于某个平台的工具链和脚本库那就需要认真评估迁移成本。但如果是从零开始建设测试体系SimuRTS的接口设计已经足够满足绝大多数场景。5. 迁移实操中踩到的三个隐蔽的坑5.1 连续模块拖累了实时任务第一个坑是我自己踩的原因说起来有点丢人。我把一个现成的电机模型直接拉到SimuRTS里编译下载都很顺利但一跑起来步长缩短到50微秒就开始频繁出现超时告警。一开始我以为是模型太复杂把优化选项打开、并行计算也开了还是有超时。后来我仔细梳理了模型才发现问题出在一处不起眼的地方一个用于计算温升的连续积分环节。这个模块用的是变步长求解器下的连续状态在固定步长实时仿真时它也不会报错但每个步长都会额外执行一次内部迭代消耗的时间远超我预期。我把它换成离散积分器之后步长立刻就能稳定跑到10微秒。这个坑想提醒大家的是从离线模型迁移到实时平台时不能用“编译通过”作为唯一标准一定要检查模型的求解器类型、连续模块数量和仿真步长设置。有时候性能问题不是平台不行而是模型里藏了不适合实时执行的环节。5.2 IO驱动库的对接细节第二个坑出现在IO板卡的初始化和状态同步上。我用的是一块通用的多功能数据采集卡SimuRTS有对应的驱动但第一次启动实时任务时IO数据始终读不到。排查了很久发现原因是板卡驱动在初始化时需要指定一个缓冲区的对齐方式而平台默认的对齐方式和这块板卡不一致。这类问题在dSPACE上一般不会遇到因为它的硬件和软件都是整体交付的。但SimuRTS支持更通用的硬件就意味着驱动适配的工作要自己关注。解决办法是在硬件配置界面里手动调整缓冲区对齐参数或者在板卡初始化代码里显式指定对齐。如果你也在做IO板卡对接我建议先对照板卡的手册逐一确认采样率、量程、触发方式、缓存对齐这几个参数再跑数据回环测试不要想当然地使用默认配置。5.3 数据落盘格式与长时间记录第三个坑和数据记录有关。长时间跑耐久测试时我需要把实时仿真数据连续记录几个小时最初直接把所有数据实时写入文件结果跑了大概20分钟实时任务出现了偶发的超时原因是文件系统的写入操作拖慢了整个实时循环。后来我按照数据记录的最佳实践进行调整先在内存里分配一块较大的循环缓冲区实时任务只负责把数据写入缓冲区再由一个低优先级的后台任务负责把缓冲区里的数据定期写入磁盘。这样实时循环几乎不会被文件IO阻塞。SimuRTS自带的数据记录功能其实也是这么实现的但如果你是自己写脚本做记录就要特别注意这个设计模式。另外还有一个小细节长时间记录时建议把时间戳和通道名一起存下来不要只存纯数据矩阵。否则后期分析数据时你可能会忘记第3列到底对应的是电流还是转速。6. 写在最后换平台的时机与判断标准每次在技术社区分享实时仿真平台相关的经验总有人问“我现在用的dSPACE到底要不要换”。我的看法是基于实际需求来判断而不是盲目追新。简单说可以从以下三个角度来评估第一是看你的应用场景是否需要更小的步长。如果你的被控对象是机电系统步长在毫秒级就够用但如果你做的是电力电子变流器、高频电力电子拓扑、微秒级故障保护这一类应用10微秒级步长就是硬需求。SimuRTS在这种场景下的性价比确实比国外平台高。第二是看你对服务和响应速度的依赖程度。项目交付期紧张、需要频繁和平台厂商沟通调试细节的团队选择本地化技术支持能省掉大量等待时间。这个因素在选型时容易被低估但在实际项目中往往是决定成败的。第三是看团队的自动化测试基础。如果你的测试脚本都是基于某个平台的API写的迁移成本就会很高反过来如果团队还在用传统的手工测试方式那换到SimuRTS反而是一个重新搭建自动化体系的机会。从我个人的使用感受来说SimuRTS并不是要在所有维度上替代dSPACE或者VeriStand。它在项目部署速度、步长支持和本地化服务上有明显优势但在生态成熟度上还有提升空间。工具链的选择本质上是对应用场景和团队资源的匹配你需要做的是找到当下最适合自己团队的那一个而不是永远跟着某个品牌走。如果要说一条最实用的建议那就是在正式招标或者采购之前一定要争取到一次POC测试机会拿你手里最有代表性的模型实际部署到你计划购买的硬件上跑一周真实负载测试。只有跑过你自己的工作负载你才会知道一个平台到底行不行。纸上谈兵选出来的平台往往会在项目的第三个月给你上一课。
返回列表