尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LabVIEW、VeriStand与dSPACE迁移:从商业工具链到自主可控新栈

LabVIEW、VeriStand与dSPACE迁移:从商业工具链到自主可控新栈 2023年年初我们实验室的自动化测试系统面临一个躲不开的议题要不要把用了近十年的LabVIEW、VeriStand和dSPACE组合整体替换掉。当时测试组的反应很一致——好好的东西为什么要折腾但真正去算了一笔账之后我发现这个决定没有想象中那么难。今天这篇内容就是记录我们团队从“再见了”到“真的接住了”的过程。如果你也正在被授权费、版本绑定、硬件锁定或供应链风险困扰这篇文章应该能给你一条可落地的迁移路线。先交代一下背景我们原来的测试环境是典型的“三件套”——用LabVIEW写测试上位机和自动化序列用VeriStand做实时测试管理、激励生成和数据记录再用dSPACE跑硬件在环HIL仿真。这套组合在汽车电子、控制系统的测试验证里几乎是标准答案但它的问题不在功能而在“可控性”。当“自主可控”变成一个需要落到合同里的技术指标时工具链本身就成了风险点。1. 告别不是情绪冲动是商业工具链的老账该算了1.1 授权费只是账面数字真正的成本是“版本绑定”很多人一提商业工具就说“贵”其实贵不贵要看怎么算。单套LabVIEW开发环境加模块dSPACE的一套HIL系统VeriStand的实时授权初看都是“一次性投入”但真正的坑在版本升级。我们遇到过最典型的情况LabVIEW 2017项目跑得好好的因为某个新采集卡驱动最低要求LabVIEW 2020被迫升级开发环境。升级本身不复杂复杂的是老程序面板上的控件、属性节点、底层驱动全部要跟着过一遍测试序列里某些行为在新版本下时序变了结果数据就不对了。这个问题排查了一个星期最后定位到是一个官方库在新版里改了默认超时机制。所以商业工具的账单不是买来的那一刻而是每年都在来的路上。维护一个十年历史的LabVIEW项目真正的成本是“版本锁死”——想加新功能先得解决老版本和新硬件的兼容问题想换新硬件先得看它有没有对应版本的驱动。这种绑定不是短时间能解开的越往后拖迁移成本越高这就是我们决定动手的第一个理由。1.2 生态锁定用得越久走得越难dSPACE和VeriStand这类工具真正的壁垒不只是软件本身而是它们和硬件、模型、测试流程深度耦合之后形成的生态。你用dSPACE的板卡跑Simulink模型做HIL时间久了整个团队的测试用例、模型接口、自动运行脚本全部围绕它的API来写。VeriStand也一样激励生成、故障注入、数据记录的逻辑都在它的workspace里别人接手这套系统得先学会这些工具的“方言”。这种生态锁定带来的问题不是功能不够用而是自由度不够用。举个例子客户要求把测试报告改成特定的XML格式VeriStand自带的报告模板不支持你就得想办法绕路想加一个自定义的测试序列调度算法你得在它允许的接口范围内做而不是按自己的想法直接写。说白了商业工具是“我给你什么你用我什么”但测试领域的需求千奇百怪总有它给不到你的时候。我们在迁移时盘点了一下发现真正离不开的其实不是三个软件本身而是三件事实时控制能力、数据采集能力、测试序列管理能力。这三个能力都有成熟的开源或自研方案可以做只是没人愿意承担切换的短期阵痛。1.3 “黑盒”依赖与技术供应链风险最后这根稻草其实是“黑盒”问题。商业工具的源代码和内部实现你是拿不到的这意味着一旦出现一个底层bug或者某个模块在新版本被移除你只能等厂商修复或被迫接受变更。对测试设备来说这种“被动”很容易变成项目延期。更现实的是供应链风险某些测试项目可能明确要求交付物中不依赖特定外部厂家的授权组件或者备件和授权续费存在不确定因素。这不是说国外工具不能用而是说作为一个长期运营的测试实验室把所有核心能力押在一个你无法介入修改的闭源体系上风险是不可控的。所以我们选择主动告别先把当前的资产盘点清楚再规划新栈而不是等到系统维护不下去的那一天被动迁移。2. 替代路线图先选阵营再谈落地2.1 整体替换与渐进迁移怎么选动手之前最纠结的问题就是一下全换还是先拿一个项目试点我们最终选的是“新项目直接新栈老项目分批翻译”的策略。全换的好处是干净坏处是风险集中——替换过程中测试任务不能断如果新平台某个环节没跑通整个实验室都会停摆。渐进迁移的好处是稳坏处是两套系统并行期间工程师要在两种环境之间来回切换学习成本和管理成本都会增加。我们的做法是先选一个非关键但覆盖功能比较全的小项目做“试验田”比如一个使用LabVIEW做数据采集和报表输出的老化测试工位。在这个工位上验证采集、存储、报表、报警这几条核心链路都能跑通之后再逐步把更复杂的HIL项目迁过去。一个关键原则是每个新迁移的项目都要留出至少两周的并行比对时间新旧系统同时跑数据逐项对齐确认一致后再停旧系统。2.2 自研框架的关键组成既然要替代三个商业工具就要先拆出它们各自解决什么问题再分别找对应替代方案。我把这套体系拆成了四层第一层是硬件接口层原先是NI板卡、dSPACE板卡和对应的驱动SDK替换思路是选择硬件厂商提供的C/Python接口或标准的工业协议接口比如Modbus、CANopen、EtherCAT。第二层是数据采集与实时控制层原先由LabVIEW的DAQmx和VeriStand的实时引擎负责替换思路是用Python绑定或C实时线程去操作采集卡和实时通信网卡。第三层是测试逻辑层原先在LabVIEW的图形化流程和VeriStand的测试序列里写替换思路是直接用Python编写状态机或行为驱动框架配合pytest做自动化断言。第四层是数据展示与报告层原先用LabVIEW前面板和VeriStand的报表模块替换思路是Web前端加数据可视化组件或者轻量级桌面界面。这四层拆开之后替代的路线就非常清晰了它不是一个“某某国产软件全面替代LabVIEW”的二选一而是“把商业工具里的能力用开源组件和自研代码慢慢补齐”的过程。2.3 按测试场景的快速选型表很多朋友问的第一个问题是用什么去替代说实话不存在一个现成的“国产LabVIEW”但在具体场景下组合方案是完全成立的。这里给一个我们实测过的选型参考你可以根据自己的实际情况调整原工具/场景核心能力我们的替代组合说明LabVIEW上位机/自动化测试图形化流程、仪器控制、数据展示Python pytest/pytest-html Qt或Web前端图形流程改为代码流程仪器控制用厂商SDK或pyserialVeriStand实时测试管理激励生成、数据记录、测试序列执行Python状态机 Redis/时序数据库 自研测试执行器把激励、采集、记录拆成独立模块由测试脚本调度dSPACEHIL硬件在环实时仿真、IO板卡、故障注入Simulink生成C代码 国产实时控制器 EtherCAT/模拟量板卡模型还可以用Simulink但运行环境换到开放的实时平台LabVIEW前面板波形显示、控件操作ECharts/Plotly Web页面数据可视化能力比原前面板更灵活远程操作也更方便注意这个表里的“替代”不是一键迁移而是重新构建。好处是重建之后所有逻辑都掌握在自己手里后续改接口、加功能、做二次开发都没有任何限制。3. 迁移实操LabVIEW老程序怎么一步步“翻译”成新栈3.1 架构翻译从G语言接线到状态机与数据流LabVIEW的核心是数据流编程VI之间靠连线传递数据信号采集循环、存储循环、界面刷新循环靠队列和事件结构同步。迁移到Python之后第一件事不是写代码而是把老程序的架构“翻译”一遍。我的方法是先把每个VI的主要功能列出来标注输入输出和触发条件然后画成一张数据流图。这一步不要急着写代码老程序里很多逻辑是当初边调试边加进去的直接翻译代码会把历史包袱全带过来。建议按功能把整套测试流程拆成几个大块参数配置、测试执行、数据采集、状态判断、结果记录、异常处理。拆完之后再映射到Python的框架里。我们用的方案是“主流程状态机 数据采集子线程 存储/上报子线程”。状态机负责总体的测试步骤流转每个状态对应一个可重入的测试函数数据采集子线程负责从采集卡持续读取数据并打时间戳存储子线程负责把带时间戳的数据写入到时序数据库或本地文件。这样替代之后代码结构反而比原来更清晰因为状态机让流程显性化了任何一个收到项目的人都能通过状态表看懂整个测试逻辑。3.2 串口与VISA通信的替换细节LabVIEW里做仪器通信大部分是走NI-VISA不管串口、GPIB还是TCP都在VISA的资源管理里统一处理。迁移时我们遇到的最大问题就是老程序里有大量用VISA字符串命令控制仪器的代码比如发*IDN?查询仪器类型读回数据再按字符串解析。对应到Python其实非常简单。串口设备用pyserial直连TCP仪器用socket标准库或者pyvisa如果不想完全弃用VISA的话。关键点有三个第一超时机制要重新设。LabVIEW里的VISA默认超时是2000ms但在Python的serial.read()里如果不显式设置超时就会一直阻塞。我们在迁移时统一封装了一个instrument.py模块把所有仪器的读写命令、超时时间、重试逻辑放在一起任何测试脚本都走这个模块避免每个脚本里各自处理。第二串口参数必须和原系统对齐。波特率、停止位、校验位、流控方式这些参数不要按手册默认值去假设直接到老程序里确认。我们踩过一个坑是原来用的是偶校验迁移时用了默认无校验结果读取数据全是乱码排查了半小时才反应过来参数没对齐。第三一条一条命令做对照测试。迁移完通信层之后不要急着跑整个测试流程先建一个对照表把每个仪器的关键命令在新旧系统上各执行一次对比返回值和耗时。这个步骤虽然枯燥但能省掉后面整个测试流程联调时的大量排错时间。3.3 数据采集与波形显示的替代组合LabVIEW里做数据采集最舒服的是DAQmx采集卡一插选好通道读波形就是一个节点的事。迁移到Python之后采集卡厂商如果没有官方Python库一般有两种选择一是直接用厂商的C动态库通过ctypes或cffi调用二是厂商通常也提供Linux下的C接口用cffi封装成Python调用。这里分享一下我们的采集线程模板思路。不要在主流程里直接读数据而是启动一个专门的采集线程循环读取板卡缓冲区里的数据放入queue.Queue或者一个固定长度的内存缓冲主测试流程只从缓冲里拿最新数据做判断。这样采集节奏和测试逻辑解耦既不会因为某个判断逻辑卡住导致采集数据堆积也不会因为采集延迟导致测试流程时序错乱。波形显示这一块老LabVIEW的前面板确实很方便拖一个波形图控件就完事。迁移到新栈后如果只是本地显示推荐用pyqtgraph它画实时波形性能很好高速数据刷新也不卡。如果需要远程查看就在Web端用ECharts的动态数据接口后端通过WebSocket推数据。我们的选择是两者结合本机调试用pyqtgraph正式测试数据看板用Web页面这样测试人员不在机台旁边也能随时看到曲线和状态。3.4 自动化测试脚本与报表输出LabVIEW里做自动化测试序列本质是配置每一步的动作和判定条件循环执行并记录结果。迁移到新栈后我们用了一个更标准的方法用pytest做测试框架每个测试用例就是一个测试序列。具体做法是把“测试步骤”抽象成pytest里的fixture。比如“上电”“下发配置”“采集数据”“读取结果”“断电”这些动作定义成可复用的fixture不同的测试组合就是不同用例函数。每轮测试的数据都写到统一的JSON或数据库记录最后用pytest-html或者自研的模板生成测试报告。报表输出这一块原来VeriStand和LabVIEW自带的报表模块格式定制能力很弱迁移后反而解放了。我们用了一个非常简单的方案测试结果存到MySQL或SQLite报告模板用HTML加模板引擎渲染想要什么样的排版和内容都能自己控制客户要求的XML、Excel、PDF格式都可以直接对接。4. 迁移路上的坑与对策4.1 性能恐慌Python真的跑得动实时采集吗几乎所有听到我们用Python替代LabVIEW的人都问过同一个问题实时性行不行这里必须说实话如果对实时性要求极高比如HIL测试需要微秒级IO响应纯Python确实不合适。但我们的实测结论是对于绝大多数自动化测试和长时间老化测试场景Python完全够用。原因是这类测试的采集频率一般是几十赫兹到几千赫兹数据处理的实时性瓶颈不在解释执行速度而在底层采集卡驱动和操作系统调度。只要是采集卡驱动自己用C实现了中断传输或DMA传输Python线程从驱动缓冲区里拿数据是不慢的。我们做过对比测试一块100kS/s的采集卡用LabVIEW DAQmx读连续数据和Python ctypes封装SDK读连续数据CPU占用差异不大吞吐量都远高于实际需求。需要注意的倒是Python的GIL问题一定要把耗时的数据处理放到C扩展库里做Python层只做调度和展示就不会卡。对于真正的HIL闭环我们保留了部分底层C模块Python做顶层调度这样既保证了控制回路的实时性又保留了脚本层的灵活性。4.2 界面前面板不是白来的替代需要成本LabVIEW的前面板虽然不算美观但胜在“拖拽即用”从按钮到波形图从数据显示到仪表盘都能在几分钟内搭好。我们在迁移界面时前期进度明显变慢因为Web前端或者Qt界面都需要写代码、调布局、做样式。我的建议是不要一上来就想着复刻原有界面先用最简单的方式跑通功能再考虑美化。这里再分享一个技巧大部分测试界面其实只有几个核心信息需要实时展示——当前测试步骤、关键参数数值、波形曲线、报警状态。只要这四类信息清晰可见操作员用起来就不会差太多。我们最终选了Web技术栈做界面原因是远程访问方便设备在实验室里人在办公室也能看到测试状态。一个轻量后端服务负责提供数据和接收控制指令前端页面定时或通过WebSocket刷新数据展示效果反而比原来的桌面前面板更现代化。4.3 团队技能转型老LabVIEW工程师怎么办这是一个很容易被低估的问题。团队里经验最丰富的是那几位把LabVIEW用了十年的老工程师让他们一下子转Python写代码抵触情绪非常大。但真正执行下来我发现老LabVIEW工程师转型Python并没有想象中那么难。原因是LabVIEW写多了的人最擅长的其实不是画图而是“测试逻辑”和“数据处理”。他们脑子里已经把串口命令、传感器标定、数据判定这些事想得非常清楚只是需要一个新工具把逻辑表达出来。我们当时做了一件很有用的事请Python基础比较好的同事把几个典型模块按“LabVIEW思维”写成了示例比如“while循环队列”对应“采集线程queue缓冲”“事件结构”对应“回调函数”“枚举驱动”对应“状态跳转表”。这样老工程师们很快就找到了对应关系上手速度比从零开始学Python的人快得多。核心经验是不要逼着LabVIEW工程师先学Python语法而是先让他们把已经会的测试流程用伪代码或流程图描述出来再由团队一起翻译成Python代码。过程中保留老工程师在原系统中沉淀的测试方法经验这套经验才是替代后测试质量的兜底。4.4 验收与比对如何证明新系统不比旧系统差迁移项目最怕的不是技术难点而是“证明新系统可靠”这件事没有客观标准。我们在每个迁移项目结束时都会做三组比对第一组是功能比对把老系统的测试用例清单逐项在新系统上执行确认每个步骤、每个判定、每项数据记录都完全一致。第二组是数据精度比对用同一个标准信号源分别接老系统和新系统采集连续运行若干小时对比采集数据的均值、方差和波形形态允许误差控制在设备精度范围内。第三组是长时间稳定性比对新旧系统并行跑完整的老化周期观察有没有死机、数据丢失、通信异常等现象。做完这三组比对基本上就能向使用方证明新系统可以接管任务了。我们当时实际做了两周的并行测试最终新系统在数据精度上没有明显差异稳定性还更好——因为新系统没有旧版本兼容性问题重启速度也更快。这一步对团队信心和项目验收都特别关键无论如何都不能省。在这整个替换过程里我最深的体会是告别VeriStand、dSPACE和LabVIEW这件事本质上不是“外国的工具很差”而是“我们不能让自己长期处于无法掌控核心工具的状态”。自主可控不是一句口号它落到工程师手里的形态就是——源码在你手里接口在你手里测试逻辑的每一行都能被你自己修改和解释。迁移的过程肯定有阵痛但一旦完成后面面对新需求、新硬件、新格式时你会明显感觉到一种“再也没有供应商限制”的轻松。最后再分享一个小建议如果你也想走这条路不要一开始就想着把最复杂的HIL系统拿来做试验品先挑一个功能小而全的项目跑通全链路。只要第一条完整链路能跑起来后面的事情就是时间问题。祝你的迁移之路也能早点迎来那句“再见了”然后发现新世界比想象中顺手得多。
返回列表