
做视觉项目的人大概都经历过这种尴尬软件在办公室调得顺风顺水一到车间现场就连连掉链子。尤其是用Vision Master做检测流程里模板匹配、卡尺测量都写好了结果到了产线产品从相机下面嗖嗖地过去相机就是不拍或者好不容易拍到了OK和NG的结果又传不回PLC设备只管往前跑。问题出在哪绝大多数时候不是视觉算法不行而是PLC信号和视觉流程之间的“触发链路”没有打通。这次我就围绕Vision Master和PLC联动时的自动化触发实战把方案选型、信号链路、PLC程序和视觉流程的设计以及现场调试踩过的坑完整讲一遍。内容以西门子S7-1200为例但思路对三菱、汇川、倍福等PLC都通用。适合正在做视觉方案、或者刚接手视觉检测项目的工程师参考也适合被“相机不触发”“结果丢失”“重复拍照”折磨过的朋友看完应该能少走不少弯路。1. 为什么触发是视觉项目从Demo到产线的分水岭1.1 从手动拍照到自动化触发需求是怎么来的大部分视觉软件第一次跑通都是“手动触发”鼠标点一下采集拍一张处理。Demo阶段完全没问题。但产线是连续流水的产品什么时候到达相机前你无法提前预测只能靠传感器加PLC来告诉视觉系统“现在拍”。这就是自动化触发要解决的核心问题。而且手动模式下每次点击的时机、产品的位置都会有差异检出的稳定性也很难保证。自动化触发一旦打通产线才能从半自动变成全自动产品到位传感器响PLC发信号视觉系统自己拍照、自己检测、自己输出结果。整个过程就像流水线交接棒信号就是那根接力棒。这根棒什么时候递、递多久、怎么确认对方接住了都是需要认真设计的细节。我的经验是项目里90%的信号类故障都出在这根“接力棒”本身。1.2 硬触发、软触发、通讯触发怎么选生产线上触发视觉系统的常见方式有三种硬触发、软触发和通讯触发。很多新手一听“用PLC触发视觉”第一反应是在PLC里写一段网络指令发过去其实不一定要这样。三者的差异和适用场景可以看下面这张表。触发方式原理典型延迟适用场景硬触发IOPLC输出信号直接接视觉控制器或相机输入硬件电平变化触发拍照微秒级到毫秒级最稳定高速线、对时序要求严格的场景软触发SDK/指令PLC通过串口或以太网发送触发指令视觉软件收到指令后执行取像毫秒到几十毫秒依赖协议栈速度要求不高、IO接线不便的场景通讯触发协议基于Modbus TCP、Socket等协议在数据报文中携带触发信号或参数与网络负载、PLC扫描周期有关需要同时下传参数、上传结果、多工位复用的场景现场首选硬触发。因为IO信号是电平直接触发不依赖协议栈和CPU调度延迟抖动小得多。尤其是有曝光时间在几百微秒的高速相机用软触发经常出现“收到指令时产品已经过去了”的问题。但硬触发也有硬触发的坑比如电平类型、脉宽、信号抖动、隔离、接地这些我会在第2节详细展开。1.3 为什么选Vision Master而不是OpenCV/Halcon顺带说一句框架选择。Vision Master和OpenCV、Halcon经常被放在一起比较但它们的定位差别挺大。Halcon更适合做算法原型开发和深度定制算法库强跨语言但相机采集、IO通信、界面、结果管理这些工程问题都要自己搭。OpenCV适合做嵌入式、轻量级应用免费开源但项目化周期长稳定性要自己扛。Vision Master这类图形化流程编排软件做“流程编排加PLC联动”的时候效率最高硬触发、结果输出、通信模块这些工程能力基本是开箱即用现场接线、调试、改流程都快。选型没有绝对优劣主要看项目周期和实施团队。如果是标准视觉检测项目要在几天内完成部署并和产线PLC对接我用Vision Master的效率远高于从Halcon或OpenCV开始写代码。如果是要做深度定制的算法那老老实实用Halcon或OpenCV。2. 信号链路搭建从PLC接线到Vision Master触发配置2.1 硬件接线NPN/PNP、光耦隔离和抖动问题先看整条信号链路PLC输出点经过中间继电器或光耦可选接到视觉控制器或相机的触发输入再到Vision Master里的取像触发。这一步看起来简单实际上是最容易出问题的地方。第一NPN和PNP必须匹配。NPN输出管是低电平有效也叫漏型PNP输出管是高电平有效也叫源型。PLC输出模块有源型漏型之分相机或视觉控制器的触发输入也分NPN和PNP。如果PLC输出NPN接到了只支持PNP输入的视觉系统信号逻辑是反的永远不触发。这种问题在现场太常见了尤其是不同厂家的设备混搭的时候一定要先查手册确认两边的极性定义。第二信号隔离。如果信号线长度超过一两米建议加中间继电器或光耦隔离避免现场干扰串入视觉系统的IO。特别是PLC输出是继电器型触点时触点抖动会造成重复触发最好选用固态继电器或者晶体管输出。在变频器、伺服驱动器多的柜子里这个隔离几乎不能省。第三触发信号的脉宽。很多PLC工程师习惯在程序里输出一个10ms的脉冲觉得够了但相机可能存在触发信号有效沿之后的曝光准备时间。实测很多相机需要触发脉宽大于50ms才稳定。我建议在PLC里用定时器产生50到200ms的高电平确保触发沿可靠。如果PLC输出的是窄脉冲也可以在视觉控制器的输入端做滤波或延展。第四接地和屏蔽。信号线要用屏蔽双绞线屏蔽层单端接地避免和大功率变频器、伺服驱动器的动力线平行走线。这个就是“信号完整性”在工业现场的体现电磁干扰会导致偶发误触发时有时无最难查。2.2 Vision Master侧的触发配置与取像流程硬件信号到了之后还需要在Vision Master里配置好触发源。新建一个流程后第一步就是取像。在取像步骤里要选择触发源一般有三种软件触发、硬件触发、连续采集。调试阶段用软件触发鼠标点一下采集一张产线运行阶段必须切到硬件触发选择对应的IO输入并根据接线方式配置高电平有效还是低电平有效。配置硬件触发时要注意触发有效沿。PLC输出默认高电平有效的话视觉系统侧就选上升沿触发。这里有个容易忽略的地方很多工业相机本身就支持硬触发模式需要把相机的TriggerMode设为OnTriggerSource设为对应的Line口同时Vision Master的取像步骤也要配置对应的IO触发源。两层没对齐信号到了相机也不拍。配置完成后一定要先手动触发一次确认流程能跑通。再模拟PLC发一个信号用万用表或者示波器确认信号到达视觉控制器后视觉流程能否按照预期启动。信号链路到这里只是通了但还不算稳链路稳定性的验证需要放到联调阶段做。3. 核心实战PLC程序怎么写视觉流程怎么排3.1 PLC侧梯形图设计触发脉冲、结果锁存、防重复以一个西门子S7-1200为例假设I0.0光电传感器到位信号常开Q0.0视觉触发信号接视觉控制器输入I0.1视觉OK信号I0.2视觉NG信号Q0.1剔除气缸Q0.6NG报警灯第一段检测到位产生触发请求Network 1: 产品到位产生触发请求 A I0.0 FP M0.0 // 上升沿检测 S M0.1 // 触发请求置位这里的关键是FP上升沿检测而不是直接用传感器电平去触发。因为传感器在产品停在工位的整个过程中都保持高电平如果用电平触发同一个产品会被重复触发视觉系统就会对同一个产品拍好几次。第二段生成触发脉冲Network 2: 生成触发脉冲 A M0.1 TON T1, 50ms // 消抖延时等产品稳定 S Q0.0 // 视觉触发输出置位 R M0.1 A T1.Q TON T2, 150ms // 触发脉宽150ms R Q0.0 // 触发输出复位为什么用两个定时器第一个定时器T1是为了消除传感器信号抖动等产品在工位上完全稳定后再发触发信号。第二个定时器T2决定触发信号的脉宽一般建议100ms到200ms保证视觉系统能可靠接收到。用这种方式生成的脉冲宽度和稳定性都远好于直接输出一个扫描周期的脉冲。第三段接收视觉结果并锁存Network 3: 视觉结果锁存 A I0.1 S M0.2 // OK结果锁存 A I0.2 S M0.3 // NG结果锁存为什么结果要锁存因为视觉系统的OK/NG输出可能是一个几十毫秒的脉冲而PLC的扫描周期可能在10ms左右虽然理论上能采到但如果视觉输出脉宽更短、或者PLC扫描循环恰好在输出结束之后才执行到这一句就会错过。用置位指令把结果锁存下来等PLC程序在合适时机处理这样最稳妥。第四段处理结果Network 4: 结果处理 A M10.0 // 下一工位就绪信号 A M0.2 S Q0.1 // 剔除气缸动作 R M0.2 A M10.0 A M0.3 S Q0.6 // NG报警灯 R M0.3这段根据项目实际调整但核心是一个“锁存-消费”关系。PLC收到结果后置位对应输出处理完再复位中间标志。如果不注意这个关系可能结果被重复处理两次。3.2 Vision Master检测流程从取像到结果输出Vision Master流程的基本结构一般是这样取像等待硬件触发获取输入图像。图像预处理灰度转换、滤波、对比度增强把要检测的特征凸显出来。定位模板匹配或几何找边确定ROI的基准位置补偿产品在视野里的偏移和旋转。检测在定位基础上进行卡尺测量、Blob分析或差值检测得到实际测量值。判断将测量值和上下限公差比较输出OK或NG。输出把结果写入全局变量通过IO模块或通信模块发送给PLC。在Vision Master这类图形化流程里我的习惯是取像步骤接硬件触发。检测步骤尽量少而精每增加一个步骤都会增加流程耗时和不确定性。结果判断不要散落在多个步骤里统一放到流程末端的全局脚本里做汇总。为什么要用全局脚本获取变量结果这是很多人都会问的。举个例子比如我要同时测三个尺寸每个尺寸都有单独的测量步骤如果每个步骤各自判断OK/NG那么只要有一个步骤NG就整个NG。但我也可能想把三个尺寸的具体数值都记录下来或者在特殊配方下用不同的公差范围做判断。把这些逻辑写在全局脚本里可以统一读取各步骤的变量结果做综合判断再统一输出。这是视觉流程设计里很实用的一招。全局脚本的大致逻辑可以写成这样def main(): w1 get_variable(Width_1) w2 get_variable(Width_2) d1 get_variable(Diameter_1) ok (w1 min_w1 and w1 max_w1) and \ (w2 min_w2 and w2 max_w2) and \ (d1 min_d1 and d1 max_d1) set_output(Result_OK, ok) set_output(Result_NG, not ok) set_variable(Measure_Width_1, w1) set_variable(Measure_Width_2, w2) set_variable(Measure_Diameter_1, d1)这样整个流程的结构就很清晰一个检测流程里包括取像、预处理、定位、若干测量步骤、一个全局脚本步骤。全局脚本汇总结果后置位OK/NG输出IO。后面要改公差、改逻辑只需要动脚本不用重新排流程。3.3 结果回传PLCIO映射和以太网通信的取舍结果回传有两种主流方式IO方式也就是视觉系统直接输出OK、NG两个开关量给PLC通讯方式比如通过Modbus TCP或Socket把结果数据发给PLC。IO方式适合只需要合格或不合格判断的场合。需要注意电平类型要和PLC输入模块匹配视觉输出的脉宽要大于PLC扫描周期建议大于100ms。如果视觉输出的是持续信号必须由PLC在合适时机复位如果视觉输出的是脉冲PLC可能因为扫描周期错过所以前面特意做了结果锁存。通讯方式适合需要数据追溯、统计分析或者视觉和PLC参数需要互相读取的场景。比如每次检测完成发送一帧ASCII字符串RESULT,2024-06-15 08:30:12,OK,Width12.34,OD5.67PLC侧用TCON/TRCV或者Modbus客户端去读取。需要提前定义好报文格式比如字段顺序、分隔符、OK/NG的表示方式。很多人觉得Modbus TCP会不会太慢其实单次检测结果才几十字节在百兆局域网里传输是微秒级的瓶颈不在网络本身而在PLC的扫描周期和通信轮询时间。两条路怎么取舍我的原则是只要判断OK/NG就用IO方式简单可靠不涉及协议也不占PLC通信资源。需要记录测量值、需要追溯批次、通讯线距离长就用Modbus TCP或Socket。大项目里视觉结果要进MES那必须通讯方式IO方式只能做中间过渡。但不管用哪种方案设计阶段就要和电气工程师约定好信号模式是“电平保持加复位”还是“脉冲触发加锁存”这个不提前说清楚现场一定两天吵三回。4. 现场调试实录触发不稳、丢帧、假NG怎么查4.1 高频故障排查表我把这几年遇到的高频故障整理成一张速查表可对着现象查原因。现象可能原因排查方法解决方向相机不拍照触发信号没到、脉宽太短、电平不匹配用万用表量视觉控制器输入有示波器看波形调整PLC输出脉宽检查NPN/PNP增加光耦隔离一个产品拍两次传感器信号抖动、PLC触发信号重复输出检查PLC程序是否用了上升沿检查中间继电器触点PLC程序加TON消抖加触发请求标志位防重复检测结果丢失视觉输出脉宽短、PLC扫描周期长、输入滤波时间长查看PLC输入点是否捕捉到看视觉日志视觉侧延长结果输出PLC侧做结果锁存偶发误触发电磁干扰、长线串扰查走线是否与动力线平行临时换屏蔽线测试屏蔽双绞线、屏蔽层单端接地加输入滤波换光耦视觉流程整体变慢流程步骤太多、预处理复杂、相机曝光过长统计单次流程耗时定位耗时步骤精简流程缩小ROI优化预处理参数这张表并不能覆盖所有情况但覆盖了80%的触发类故障。每次排查信号问题我的第一反应不是改程序而是先确认“信号到底到没到、波形对不对”。4.2 三个实测案例和解决过程案例一触发信号脉宽只有8ms偶发漏拍。现象是产线跑快了之后相机隔几分钟就漏一张检测频率大概在每分钟30个产品漏拍率不高但很难接受。排查过程用示波器看PLC输出点Q0.0的波形发现脉冲只持续了一个扫描周期大约8ms输出点又恰好在扫描末期动作视觉系统那边还没来得及响应脉冲就结束了。解决办法是把触发输出改成了两个定时器组合ON延时50msOFF延时150ms保证脉宽200ms左右。改完后连续跑了一晚上再没漏拍。案例二同一个产品被拍了两次甚至三次。原因是传感器用了漫反射光电产品表面反光导致信号抖动PLC程序又直接用传感器电平触发没有做上升沿锁存。排查时先看了PLC程序发现同一个传感器信号被多个网络引用其中一个网络直接驱动了触发输出。解决方法是PLC程序加上升沿检测和触发请求标志同时把传感器的输出回路加了一个小电容滤波PLC输入端也启用了数字量滤波。两个措施叠加之后单次触发链路才稳定下来。案例三视觉流程明明显示NGPLC却没有任何动作。排查时先确认视觉侧确实输出了NG再拿万用表量PLC输入点发现NG信号只持续了20ms而PLC扫描到这一路时信号已经消失了。而且PLC输入端默认的数字量滤波时间大约是10ms又加剧了信号被过滤的情况。解决方法是两个方向同时改视觉侧把结果输出脉宽调整到150msPLC侧把该输入点的数字量滤波时间调小到0.1ms同时程序里对该输入做了锁存。两个措施都实施后故障彻底消除。调试心法就一句话排查信号问题第一步永远是拿万用表或示波器确认信号到底到没到、波形对不对。很多时候觉得是软件问题其实信号根本没进来。这也是为什么我一直说做视觉的工程师至少要会用万用表和示波器能看懂基本的数字波形不然到现场就是盲人摸象。5. 进阶优化与个人体会5.1 多工位协同、数据追溯和MES对接一条产线如果有多个视觉工位比如外观检测工位、尺寸测量工位、字符识别工位那最好从一开始就统一规范和协议。每个工位的触发信号和结果返回都走同一个标准PLC程序里用符号名而不是硬地址这样排查问题的时候不用翻着地址表一个个对。多个视觉工位同时和PLC通信时要特别注意通信负载。之前有个项目PLC一边跑着Modbus总线控制三十多台变频器一边又要和视觉系统做TCP通信结果视觉结果偶尔延迟几百毫秒排查了半天才发现是通信端口资源被变频器轮询占满了。后来单独给视觉系统划了一个独立网段和独立通信端口问题才解决。这种通信负载的问题在方案设计阶段就要想好不然后期改动代价很大。如果视觉系统有数据追溯需求建议提前预留产品ID和检测结果字段。比如报文里带批次号、产品序列号、时间戳这样后续上MES系统或者在产线上做质量追溯的时候数据都是现成的不用重新改协议、改流程。很多人前期嫌麻烦不做等客户提需求了才加班补数据那个滋味不好受。至于部署平台Vision Master这类软件主要在Windows上跑如果碰到Linux或者嵌入式平台的需求可能得考虑OpenCV等方案但PLC触发逻辑是通用的无非就是IO边沿触发或协议触发思路完全一致。5.2 我做视觉项目的一些门道最后分享几条我自己比较坚持的做法算是一些经验之谈。项目一开始就约定信号时序。不要到了现场再商量更不要等接完线了才说信号模式不对。我会画一张时序图标明产品到位、PLC输出触发、视觉拍照、视觉输出结果、PLC处理结果这几个关键点的时间关系项目组的电气、机械、软件各看各的省得现场扯皮。别把信号线和动力线绑在同一个线槽里。就算多走几步线槽、多花一点线缆后期也能少很多奇怪的问题。因为电磁干扰导致的偶发误触发往往是所有故障里最难查的。视觉流程里所有测量步骤的变量名要起得足够清楚。比如Width_1、Diameter_OK这种命名要能一眼看懂含义不要用Var1、Var2这种不然写全局脚本的时候自己都容易搞混。产线试运行前单独做一次连续触发联调。比如跑一晚上统计触发次数和检测次数是否完全一致。这个阶段只验证信号可靠性不计检测精度。信号链路稳定了再谈算法精度。如果信号和精度的问题混在一起查定位起来非常痛苦。每次调试修改都记录下来。改的是PLC程序还是视觉流程对应的现象是什么改了之后有没有效果。记录做得好排查效率会成倍提升。这个习惯帮我解决过很多“是不是改回去了”“上次不是好的吗”这种说不清的现场问题。