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

资讯详情

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

LabVIEW与VISA串口通信在四工位转盘检测机中的应用实践

LabVIEW与VISA串口通信在四工位转盘检测机中的应用实践 做自动检测设备的朋友应该都清楚凡是配上转盘的项目十有八九都在跟节拍较劲。前段时间一个四工位转盘检测机的上位机项目让我把LabVIEW、VISA和串口通信这几个老组合重新啃了一遍。设备本身不复杂工控机上有两个串口一个通过VISA去读仪表压力值判断保压是否合格另一个跟PLC通信交换转盘位置和气缸动作状态。真正花时间的不是画前面板而是把通信链路、程序结构和现场各种意外捋顺。这里我把整条思路整理出来给准备做同类检测设备的同行一点参考。1. 四工位转盘与两个串口的任务分工机械节拍和通信链路先理清1.1 转盘工位怎么定决定了上位机状态机的粒度四工位转盘在检测机里很常见但“四工位”具体放什么流程每个项目差异很大。我这台设备的工位分配是1号位上料、2号位做保压检测、3号位做复检和标记、4号位下料。转盘每转90度停一次上位机要做的就是判断当前转盘停在哪一工位该工位需要触发什么动作然后跟PLC打配合。工位分配直接决定上位机状态机的写法。如果只把整个转盘当成“启动—检测—完成”三个大状态程序写起来简单但现场稍微一乱套你根本不知道卡在哪一步。比较好的做法是按“工位索引”建状态每个工位都有独立的到位判断、动作触发和结果判定。这样无论是哪一站报警操作工和调试员都能一眼看出问题。我在前面板上留了一个工位状态指示四个圆灯对应四个工位哪个工位在动作、哪个工位在等待灯亮到哪一步一目了然。这个习惯后来帮了大忙现场反馈问题基本不用远程看程序光看前面板就能说清楚“2号位没夹紧”“4号位压装超时”之类的信息。1.2 串口1接仪表、串口2接PLC为什么这样分配工控机上两个串口我这边是这么分工的COM1接保压仪表用来读压力和保压曲线数据COM2接PLC用来交换转盘的到位、气缸夹紧和启动检测等信号。这个分配看起来随意其实有讲究。仪表走VISA通信通常是主从模式上位机发指令仪表回数据。这要求通信过程尽量独占不要有其他数据流插进来干扰。PLC通信是另一套协议一般会周期循环发一些状态字节如果和仪表共用同一个串口很容易互相踩脚导致仪表那边刚等来一条完整返回帧PLC的状态字节又把缓冲区搅乱。所以两个串口分开是省心而不是浪费。还有一个经验如果现场距离超过15米仪表和工控机之间的RS232线会变得非常不可靠最好用RS232转RS485接口或者直接选带485通信的仪表。我这台设备原来表体自带RS232但工控机到仪表走线接近20米实测丢包率高得吓人后来在仪表侧加了个隔离转换头改成485链路才稳定下来。PLC那边本来就用485两个串口正好各管一头。1.3 转盘到位信号和上位机握手协议转盘每转一次机械上都有一个“到位检测”通常是接近开关或光电开关信号进PLCPLC再通过串口通知上位机。这里最容易犯的错误是上位机收到“到位”信号后以为转盘已经彻底稳定马上就去读仪表开始检测。实际上转盘到位只是“位置到了”但机械冲击、气缸夹紧、仪表充压都需要时间。我这里的处理方式是PLC先发“到达2号位”的状态帧上位机收到后发一个“请求检测”指令PLC等气缸夹紧动作完成后再回一条“检测开始”的应答帧上位机这才启动仪表采集。前后多了一个握手但避免了气缸还没夹紧就充压导致误测的尴尬。2. LabVIEW用VISA读仪表之前驱动、端口和参数要对齐2.1 为什么放着现成的串口VI不用非要走VISALabVIEW里直接有VISA Serial的底层VI也可以直接用简单的串口读写。但实际做仪表通信时我还是推荐优先用NI-VISA封装好的接口尤其是涉及多台仪表、不同通信协议的场景。VISA的好处是它把底层驱动差异封装掉了。同一个PC串口可能插的是国产PCI串口卡也可能是USB转串口还可能走网络转串口服务器如果直接用And/Or操作串口换一次硬件就要改一遍配置。VISA层面统一用资源名区分逻辑图的串口配置部分基本不用动。其次VISA本身提供了很规范的错误处理和超时管理省得自己处理线程竞争。还有一点很实际很多仪表厂商给的通信案例不管是LabVIEW还是VC都会带上VISA代码。你直接用VISA把手册里的示例复制过来改一改就能跑比从底层串口API吭哧吭哧封装靠谱得多。2.2 安装顺序和驱动识别LabVIEW、NI-VISA、USB转串口芯片做这个项目时我先在自己笔记本上装了LabVIEW 2018再装NI-VISA连上一个国产USB转串口模块结果NI MAX里死活看不到设备。折腾半天才发现是两件事没做好第一VISA和LabVIEW的版本位数要对应。现在电脑上装LabVIEW 2018 64位但NI-VISA装了个32位版本界面看着正常实际VISA节点在底层找不到驱动必须在NI MAX里看资源能否枚举成功。我最后把两个都换成64位版本才算干净。第二USB转串口芯片的驱动一定要先装好。CH340、CH341、FTDI是新电脑上最常用的三款芯片系统不一定自带驱动。设备管理器里如果看到COM口旁边有个黄色感叹号那别怪VISA不干活先把这个搞定。网上说的“labview安装错误”“驱动不识别串口”之类问题八成是卡在芯片驱动这里跟LabVIEW本身关系不大。安装顺序我的习惯是先装USB转串口芯片驱动再装LabVIEW再装NI-VISA最后插上串口设备看系统能不能正常识别一个COM口。这样每一步都有可验证的中间节点排查起来不会一头雾水。2.3 串口参数、终止符和超时的最佳配置VISA串口通信参数看起来是那几个老面孔但不同仪表要求不同必须以仪表手册为准。我给仪表设的参数一般是波特率96008位数据位1位停止位无校验关闭流控。这个配置对于大多数压力仪表和数显表来说比较通用实际使用也稳定。真正容易踩坑的是“终止符”。很多ASCII协议的仪表返回字符串末尾会带回车换行\r\nVISA读的时候如果设了“读取直到终止符”但没有把终止符配置成0x0A或0x0D就会出现“读到一串正常数据后下一次读还是同样的数据或者读到空数据”的情况。我在程序里直接把终止符使能打开终止符设为0x0A再把超时时间预留到1000毫秒以上这个问题就消失了。还有一点串口收到的数据不一定正好是你期望的长度。仪表响应快慢受内部测量周期影响有时候上位机指令发得急仪表还在忙响应就延迟了。我习惯在每次读取到完整数据后用“清空I/O缓冲区”的VI清一下串口缓存避免上一次残留字节污染下一次判断。2.4 上位机写代码前先用NI MAX把链路打通我见过不少同行直接写程序调串口结果一跑全是问号还以为是代码问题。要我说连仪表的串口通信第一件事一定是用NI MAX或串口调试助手验证。打开NI MAX找到串口资源列表把波特率这些参数设好点“打开VISA会话”直接给仪表发一条 *IDN?如果能收到设备返回的型号和固件版本那整个链路就是通的。这一步通了LabVIEW里写VISA读写的调试时间能省掉一大半。如果手边没有NI MAX也可以先用“串口调试助手”之类的工具发送测试指令。之前碰到仪表返回的内容不带换行屏幕上所有数据挤在一行看着像乱码其实是显示设置问题。用调试助手分hex和ASCII双排显示能很快分辨出是通信问题还是协议解析问题。3. 四工位转盘上位机程序骨架状态机、生产消费和仪表解析3.1 把转盘流程画成状态机上位机不是简单读仪表而是要和PLC联动控制整个检测节拍。我的程序里把流程分成几个大状态待机、找原点、自动循环、暂停、报警停机。自动循环里的子状态以工位为线索1号位等待上料、2号位等待检测、3号位等待复检、4号位等待下料。每一个子状态都会检查当前串口收到的PLC状态帧看转盘实际停在哪个位置。这里有个细节转盘每次转完后PLC回传的工位编号必须和上位机期望的编号一致否则要立即报警不允许接着往下跑。这样做能防止转盘因为机械误差发生“半站”错位导致检测工位和仪表对不上。画状态机时我用枚举类型定义状态变量前面板放一个字符串显示当前状态方便现场看。程序里所有状态跳转集中在一个VI里处理不让状态判断散落在各个事件分支中后边加逻辑和维护都没那么疼。3.2 生产者/消费者架构别让VISA读取拖界面串口读取有个特点你发一条指令后不知道仪表到底多久才回时间长度不确定。如果直接在UI线程里调用VISA Read界面会卡住转盘动作和报警提示也跟着停顿。稳定的做法是分成两个循环。一个循环负责定时向仪表发读取指令处理返回数据把解析结果写入队列另一个循环负责从队列取出结果刷新波形图表和显示控件同时和PLC通信循环交换状态。这样即使仪表偶尔延迟了500毫秒界面照常刷新操作工不会觉得程序“死了”。实际上我分了三个循环数据采集循环、状态处理队列循环、UI刷新循环。每个循环之间用队列或者通知器传递消息避免全局变量满天飞。用全局变量写简单但现场改了参数忘了清空容易踩到“上次运行残留值”的坑。队列方式至少每次运行都是干净的数据流。3.3 仪表报文解析ASCII协议、Modbus RTU和四字节浮点仪表返回的数据格式常见就两类一类是SCPI风格的ASCII文本比如返回“:MEAS:PRES 1.023MPa\r\n”另一类是二进制帧常见的是Modbus RTU或者厂家的自定义帧。ASCII文本解析最简单用“匹配模式”或“扫描字符串”直接抓数字但要注意单位。比如有些仪表返回的是kPa有些是MPa上位机显示和判断阈值时千万不能混。Modbus RTU麻烦一点一个数据帧包含地址、功能码、寄存器的CRC校验必须完整实现CRC16计算否则仪表根本不应答。我在一套老式压力仪上就遇到这种情况仪表说明书只给了一串寄存器地址表没有ASCII指令。当时我用VISA发送十六进制字节序列把03读保持寄存器请求发过去再手工校验返回帧的CRC提取第3到第6字节作为压力值。LabVIEW支持直接发字节数组VISA本身不管协议有多“工业”它只负责把字节搬运过去。最坑的是四字节浮点数转换。一些仪表把压力值包装成IEEE 754单精度浮点数四字节顺序还有大小端之分。热搜里有人问“将4字节数据转换为浮点数”我猜十有八九也被仪表字节序折磨过。LabVIEW里可以用“字符串转数值”里的字节顺序选项或者直接用“Unflatten String”指定Big Endian或Little Endian但一定要先拿仪表常数验证一次否则数据看起来像天文数字或者全是“NaN”。4. 现场串口段调试记录丢包、乱码和仪表断线恢复4.1 物理层的坑线长、线径、接地和干扰串口出问题第一个该怀疑的是物理链路而不是程序。我在这台四工位转盘检测机上就经历了一次典型的案例仪表放在2号工位附近工控机在电柜里中间走线经过变频器、伺服电机驱动器的动力线槽。最开始用RS232直连丢包率在空载时看起来还行转盘一启动干扰立刻爆发仪表读回来的压力值偶尔变成0或者乱码。原因是RS232是单端信号抗干扰能力弱。后来我做了三件事一是把通信线换成双层屏蔽的RS485专用线屏蔽层单端接地二是给仪表侧的串口转485模块用独立隔离电源避免和电机驱动共用开关电源三是让线缆在电柜里尽量避开变频器输出线实在绕不开的地方用金属线槽隔断。改完以后连续跑一整天串口误码率基本为零。所以遇到串口通信不稳定不要急着调软件。先拿万用表量通信线两端确认接线没错再把动力线区隔开。很多“数据丢字节”“报文断成两截”的现场问题根源就是干扰。4.2 软件参数的坑波特率、校验位、停止位和缓冲区物理没问题了软件参数才轮到第二层排查。波特率、校验位、停止位这三个必须和仪表手册严格一致。有一台仪表老设备手册上写“19200偶校验2位停止位”结果有人把校验位设成了无校验。仪表那边因为校验错直接丢弃整个帧上位机这边看着就是“我发指令没反应”。这种问题光看报文是看不出来的因为根本没返回必须回到配置界面逐项核对。还有一次仪表返回数据是对的但前面总多几个像是垃圾字符的字节。后来才发现是上位机每次发指令前没有清空接收缓冲区上一次的残留字节被当成这次响应的开头了。解决方式是在VISA Read之前调用VISA Clear或者手动读空缓冲区给每个读取周期一个干净起点。缓冲区大小和读取策略也要配套。如果仪表一次返回几十字节就分多次读最后拼起来再截断别指望VISA Read一次就拿到完整帧。我一般先设置一个较短的读超时比如200毫秒然后循环读取直到读到期望的终止符或者累计字节数达到协议长度。这样既有实时性又不会因为一帧数据没读完就误判通信失败。4.3 仪表无响应的重连、看门狗和超时策略检测机最怕的不是“读错”而是“读不到仪表数据但程序还在继续跑”。如果上位机发指令后一直等仪表回复转盘会在2号工位卡住后面的工位全部停止。如果不等直接按上次的结果往下发又可能把合格品当成NG或者反过来。我的程序里对每次仪表读取都设置了明确超时发指令后等待800毫秒超时后重试一次再超时就把该工位标记为“通信异常”同时给PLC发报警帧让转盘停在当前位置不允许进入下一工位。这样操作工可以立刻去查仪表是否关机、线缆是否松动而不是等着一堆废品出来才反应。另外PLC侧也有一个“看门狗”机制。上位机每200毫秒给PLC发一次心跳帧如果PLC连续3个周期没收到心跳就默认上位机死机或通信断开自动停掉转盘电机并亮红灯。这个设计成本很低但能让设备在半夜无人值守时也保住安全底线。4.4 浮点、负数和带符号数据的解析细节压力值大多为正数但有些仪表在显示负压或大气压偏移时返回的数据是负数。解析时如果只看“ASCII文本提取数字”有时候会把“-0.7”这种负号丢掉导致误判。对于ASCII协议我用“扫描字符串”的格式控件把%f对应的数据直接转成浮点数负号天然处理。对于Modbus RTU返回的16位寄存器值如果协议规定有符号还要判断最高位是否为1决定是否要算补码。这一步我在很多项目里反复教同行读到的数字如果比协议范围上限还大立刻怀疑符号位解析错了而不是怀疑仪表坏了。5. 量产稳定运行后我才看清的几个关键细节5.1 节拍统计必须做而且要按工位拆开看设备调试时感觉节拍还挺快但一到量产节拍就慢得让人着急。问题往往不在转盘速度而在某个工位的“等待时间”过长。为了把这个问题量化我在LabVIEW程序里给每个工位都加了一个耗时统计记录每次动作的起止时间并在前面板做一个简单的柱状图趋势显示。跑了一个班次之后数据非常直观2号位的“保压时间”看起来是测试必要时间但“仪表读取等待”平均已经占了整个保压周期的三成。原因是仪表内部测量周期太长上位机提前发读取请求仪表还没完成测量必须等到超时后才返回。后来我调整了策略让上位机在保压时间结束后再等200毫秒再发读取指令单个工位的节拍直接快了将近1秒。很多时候我们认为“仪表慢”没法改变其实是不读仪表的状态时序盲发指令。节拍统计能帮你发现到底是仪表慢、气缸慢还是程序状态机在某个判定上白白多耗了一个循环。5.2 安全互锁放PLC数据和逻辑放上位机上位机LabVIEW做逻辑很方便但有一类东西我不建议放在上位机涉及人身安全和机械硬件的急停互锁。转盘检测机虽然不大但周围有操作工如果上位机死机或者通信断线所有逻辑都失去依据。所以我把急停、安全门、气缸极限位、转盘过载保护全部放在PLC侧由PLC直接执行硬件互锁不依赖上位机命令。上位机只负责下发“运行/停止”级别的指令具体的机械动作控制全部由PLC阀组执行。这样做的另外一个好处是操作工按急停后PLC能独立切断转盘电机和气缸气源LabVIEW那边即使还停在某个等待状态也不会导致设备继续动作。可以说上位机管好“数据和判断”PLC管好“动作和安全”各司其职才能让整套系统可靠。5.3 预留手动操作页和历史数据回溯设备交付后维护人员和调试人员大概率会来反馈“转盘卡了一下我想手动动作一下某个气缸”这时候如果没有手动操作页面只能断电重启或者让程序员重新写一个临时代码。太折腾。我在上位机里留了一个“手动调试”页面每一站的气缸动作、转盘点动、仪表读取都有按钮但所有手动操作都加了密码保护避免误触。页面里还有一个“通信监视”子页显示最近几十条PLC和仪表收发记录。这个设计后来成了现场解决问题最快的入口。仪表突然没数据了维护师傅看一眼通信监视能分清是本机没发指令、仪表没响应、还是PLC状态没上来很多问题不用等我到现场远程开个视频就能确认。配合历史数据回溯我把每件产品的检测结果、对应的仪表压力曲线、测试时间、工位编号存成了CSV和TDMS双份文件。CSV给产线主管看TDMS给LabVIEW程序做离线分析。后面客户要追溯某一批产品直接按时间段和工位编号筛一遍就能把所有数据导出来少了很多扯皮。一台四工位转盘检测机拆开了看就是“机械 PLC 仪表 上位机”几个部分串起来。而LabVIEW上位机真正难调的往往不是控件的摆放和代码的美观而是串口VISA通信的稳定性以及对现场异常状态的处理。这些都理顺以后剩下的节拍优化和界面美化就都是水磨工夫了。最后提醒一句所有修改都要留好版本备份尤其是前面板和通信参数整合过一次之后现场改动一个字节都可能让整台设备的通信模式变得面目全非。
返回列表