前年给一条老产线做改造,客户提出一个要求:把人工目检工位换成相机检测。我在这条产线上负责PLC和电气部分,当时第一反应是:完了,视觉这块要么得请一个专门的视觉工程师,要么自己先啃半年OpenCV再说。后来真正落地时我发现,自己走的是另一条路——用海康VisionMaster把整个视觉方案搭了起来,项目也按期交付了。和同行聊下来,不少PLC背景的人都在用类似的方式切入视觉领域,这其实就是标题里说的那条“捷径”。
我把从PLC视角切入视觉、再用VisionMaster落地项目的完整路径写出来,内容包括工具怎么理解、项目怎么搭建、结果怎么和PLC通信、现场问题怎么排查,以及后续怎么往二次开发进阶。适合做自动化设备、产线改造和集成项目的电气工程师,也对刚接触VisionMaster的朋友有用。先说明我的观点:零代码平台不是玩具,它能上产线、能跑节拍、能稳定交付,关键是你得理解视觉项目背后的逻辑,而这一点,恰恰是PLC工程师平时练得最多的能力。
1. 为什么电气背景的人学机器视觉,我建议从VisionMaster开始
1.1 传统视觉项目的分工,为什么常常把PLC工程师逼到墙角
机器视觉项目在自动化行业里的位置很尴尬。设备机械结构有机械工程师,电气动作有PLC工程师,唯独视觉系统是个模糊地带。大公司有专职视觉工程师,中小型集成商和现场改造项目里,视觉往往被当成“相机加电脑加软件”的附赠品,谁接谁头疼。
我在现场见过很多类似情况:客户要求加一个视觉检测位,项目组临时把任务塞给电气负责人。原因很简单,视觉结果最终要进PLC,而懂PLC的人最容易理解触发、信号、时序这些概念。但真要打开视觉平台,满屏的算法名词、图像参数,第一眼确实劝退。
后来我发现,这类恐惧来自“视觉题只属于会写代码的人”这个错觉。工业视觉最终落地后,它跟PLC的关系远大于跟软件工程的关系。你不需要重新学习一门学科,你需要的是换个工具,把已有的逻辑能力迁移过来。
1.2 零代码不代表是玩具,别把平台当教学demo
有同行跟我说,拖拽式平台做做演示没问题,真上产线还是得OpenCV。这个观点在几年前有一定道理,现在已经不完全成立。
海康VisionMaster的定位是工业级机器视觉算法平台,它把底层算法封装成模块,这些模块不是简化版的演示算法,而是经过大量现场验证的成熟算子。模板匹配、找边、卡尺测量、二维码识别、深度学习缺陷检测,这些在工业场景里高频使用的功能,平台上都有。它做的是把“从零写算法”这个成本极高的部分替你完成了,剩下的是按工艺要求把模块正确组合起来。
零代码省掉的是工程搭建和算法调试成本,但它没有省掉“理解检测需求”这一步。你要想清楚检测目标是什么、用什么方法把目标特征量化、阈值定在多少合理、结果怎么和产线联动。这些能力,和PLC编程里“分析工艺、设计程序结构、确定联锁条件”的思维方式是相通的。
1.3 从PLC到VisionMaster,本质是思维迁移
我用过一个比喻:VisionMaster里的“方案”相当于PLC项目里的主程序OB1,“流程”相当于FC/FB调用链,“模块”相当于具体的程序块,模块参数则类似FB的背景数据块。
PLC工程师天天做的事情是:看输入信号,做逻辑判断,给输出信号。VisionMaster做的事情是:取一张图像,做算法处理,输出结果。信息载体从“位和字”换成了“图像和数据”,但流程化的处理思路没变。
我第一次在VM里搭流程时,把图像源模块当成输入映射区,把预处理模块当成模拟量滤波和量程转换,把定位模块当成建立工件坐标系,把测量模块当成上下限比较逻辑,把通信模块当成PLC通信指令。这么一类比,界面立刻不陌生了。
干这一行的人都知道,跨领域学习最大的障碍不是知识点本身,而是心里的抵触感。VisionMaster这种“所见即所得”的编排方式,恰好把视觉算法从抽象变成了具体的模块连线,对逻辑思维强、但不熟悉图像处理的电气工程师来说,是一条非常平滑的迁移路径。
2. VisionMaster的“PLC式”思考:方案、流程与模块拆解
2.1 方案、流程、模块、参数,四个层级先搞清楚
在VisionMaster里,你最终保存和加载的单元叫“方案”,一个方案对应一个设备工位或者一台相机的完整视觉任务。方案下面是“流程”,流程是某一台相机从取像到输出结果的一条执行链。流程里的每个节点叫“模块”,模块是算法的最小封装单元。模块内部有“参数”,参数决定这个算法怎么跑。
这四个层级是理解VM的骨架。我把它们和PLC开发里的概念对照过:
- 方案 = PLC项目(对应一台设备或一个站)
- 流程 = 一个FC调用链(对应某台相机要完成的完整动作)
- 模块 = FC块或功能块(每个块只干一件事)
- 参数 = FB的输入输出变量(每个块的运行条件)
调试顺序也类似。PLC调试时先单独测试每个FC,再联调整个OB1;VM调试时先用单张图片把每个模块调好,再连成完整流程跑实时图像。
2.2 算法模块分类,就是视觉版的“指令集”
VisionMaster的模块库里,模块数量不算少,但按功能分成几类后,学习成本就降下来了。下面是我常用的分类方式,也和PLC指令做了一个粗浅对照,方便理解。
| 模块类型 | 典型用途 | PLC思维对照 |
|---|---|---|
| 图像源 | 相机取流、读取本地图片 | 输入映像区/外设读取 |
| 图像预处理 | 亮度对比度调节、滤波、形态学处理、图像归一化 | 模拟量滤波、量程变换 |
| 定位模块 | 模板匹配、找边、找圆、建立坐标系 | 工件找正、坐标偏置 |
| 测量模块 | 距离、角度、几何拟合、卡尺测量 | 模拟量采集、上下限比较 |
| 识别模块 | 条码读取、二维码读取、字符识别 | 字符串比较、数据匹配 |
| 检测模块 | 有无判断、缺陷检测、颜色区分 | 数字量判断、不合格统计 |
| 逻辑模块 | 分支、变量、脚本、结果组合 | 程序块、功能码 |
| 通信模块 | TCP/IP、串口、Modbus、IO信号 | 通信指令、IO映射 |
一开始不用每个模块都研究透。先掌握图像源、预处理、定位、测量、通信这五类,已经能覆盖大部分项目需求。
2.3 图像归一化到底在干嘛,一个例子就能看懂
很多人问“图像归一化是什么意思”,我用一个PLC模拟量的例子来解释。
PLC处理4-20mA电流信号时,先把电流值映射到0到100的工程量,这叫量程转换。这样后续的比例控制、上下限比较都建立在统一标准上。图像归一化本质上是一样的操作:把图像像素灰度从某一个范围,映射到一个标准范围,比如0到255,或者0到1。
为什么要做这一步?因为工业现场的光照不是绝对稳定的。自然光的变化、光源老化、反光角度微变,都会让图像的灰度整体偏移。如果不做归一化,找边算法可能会在同一个工件上因为光线变化,提取出不同的边缘位置,测量结果就在合格与不合格之间反复跳动。
在VM里做检测前,我习惯先加一个图像预处理模块,做灰度化、亮度对比度调节,必要时做归一化,让后续模块面对的是一个稳定的图像状态。这跟PLC里对传感器信号先滤波再使用,是同一个思路。
2.4 模块之间连的不是“线”,是“数据”
很多第一次上手VM的人会忽略:模块之间连线传递的不只是图像,还有区域、点、直线、测量结果、判定结果等数据类型。
举个例子:用“找圆”模块定位了一个圆心,接下来想把圆心作为基准点测量两个孔的距离,那测量模块的输入基准就要选择“找圆模块输出的圆心”,而不是重新在图像上画一个点。连错线的表现往往是:模块运行不报错,但结果不稳定,或者第二个模块永远使用的是固定区域,工件位置一变就测不准。
这种情况和PLC里“数据源选择错误”很像。你从DB块里取了一个没更新的变量,程序不报错,但动作就是不对。VM里排查模块连接问题,核心就是看每个模块的输入数据来源是否准确。
3. 第一次实战:构建从拍照到输出OK/NG的完整流程
3.1 硬件连接与相机网络配置,第一步不能省
以一个典型的传送带检测工位为例:相机加镜头、光源、触发传感器、工控机(或者海康的视觉控制器)。先不说算法,把图像稳定取回来是第一步,这一步出错会坑掉后面所有时间。
GigE接口的工业相机上电后,第一件事是设固定IP。相机的IP地址要跟工控机网卡在同一个网段,子网掩码一致。比如相机设192.168.1.128,工控机网卡设192.168.1.10,然后通过海康官方的MVS软件或相机客户端工具验证能正常取流,再打开VisionMaster去添加相机。
在相机端先把曝光时间、增益调到一个相对合理的范围。曝光时间根据产线节拍和光源强度决定,现场光照不够时,曝光时间可能要拉到5000微秒甚至更高,但曝光太长会拖慢节拍,还可能产生动态模糊。原则是:先把图像调清楚,再进VM做算法。
3.2 图像源模块与触发方式,软触发硬触发怎么选
新建方案和流程后,第一步拖入图像源模块,选择对应的相机。触发方式有“软触发”和“硬触发”,外加在调试时非常常用的“连续采集”。
调试阶段用软触发或连续采集,在软件界面上点一次执行一次,主要用来验证算法和流程。产线运行阶段改硬触发,也就是外部传感器信号直接触发相机拍照,保证图像采集与工件位置严格同步。
触发信号有两种接法:一种是传感器信号接PLC数字量输入,由PLC在合适时机输出一个脉冲给相机触发;另一种是传感器信号直接接相机的Line输入口,减少中间环节。现场如果是老设备改造,传感器信号往往在PLC侧更完整,建议走PLC中转,方便在程序里做条件判断,比如只在气缸到位后才允许拍照。
3.3 定位在前、测量在后,这是视觉稳定的关键
很多初学者搭检测流程,习惯直接把测量模块放到图像源后面,用图像上的固定位置画一条测量线。这个做法在工件位置永远不变时能用,但产线上工件在传送带上多少会有偏移,固定位置的测量结果就会乱跳。
正确的流程是做“先找正、后测量”。先通过模板匹配或者找直线,获得工件在图像中的位置和角度,把这个信息输出为坐标系;后面的测量模块、检测模块都基于这个坐标系执行。相当于在PLC里先做坐标偏置,再做位置控制。
我常用模板匹配建立坐标系,再测两个边缘间距。模板匹配找到工件核心特征,输出X、Y、角度三个值,后面所有测量区域都会跟随这个坐标系移动。这样工件在视野里上下左右偏移几毫米,甚至旋转三五度,测量值都保持稳定。
3.4 从测量值到OK/NG,最后一步是逻辑判断
测量结果出来以后,要用逻辑模块做判断。比如两个边缘之间距离是15.02mm,工艺要求上下限是15.00±0.10mm,那模组就要做一次比较运算,输出“OK”或者“NG”字符串。
这里有个细节值得注意:结果刷新时序。VM里的流程是一帧图像跑完一遍,结果模块输出当前这一帧的结果。如果上一个工件的结果还没被PLC读走,下一个工件的检测又完成了,数据就会错位。所以结果输出通常要配合“完成信号”一起给PLC,让PLC知道“现在结果有效,可以读走了”。
我习惯在流程最后加一个“结果组合”的逻辑,把检测数据、OK/NG状态、图像ID打包在一起,再通过通信模块发送。即使后面要加MES上传,数据也是完整的。
4. 与PLC握手:触发、结果回传与通信调试那些坑
4.1 结果传输的三种常用方式,怎么选
VisionMaster把结果传给PLC,我常用的有三种方式:数字IO、TCP/IP、ModbusTCP。三者各有利弊,选型逻辑如下。
| 通信方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 数字IO | 实时性强,逻辑简单,现场易排查 | 信息量少,只能传OK/NG等开关量 | 节拍快、只要求合格判断 |
| TCP/IP | 数据量大,可传测量值和文本信息 | 需要处理连接和断线重连 | 需要把详细数据传给上位机或MES |
| ModbusTCP | 与PLC集成度高,PLC侧程序简单 | 配置稍繁琐,报文结构固定 | PLC为西门子、汇川等,且支持ModbusTCP |
补充一点:如果只进行“结果是否合格”的判断,IO是最省事的方式。VM里配置好输出信号,PLC侧直接读点就行。但如果客户要求把每个工件的尺寸保存下来,或者做SPC统计分析,就必须走网络通信,把测量结果字符串传出去。
4.2 用“请求—应答”做握手,而不是单向发结果
早期我做视觉和PLC通信时,习惯让VM算完就把结果往PLC发。后来在线上遇到一个经典问题:PLC收到的结果永远比实际工件慢一拍。原因是视觉流程执行完一瞬间发送结果,但PLC的扫描周期不一定刚好读到,于是上一次结果被下一次轮询读走,造成错位。
解决方案是设计成“请求—应答”握手。PLC先给VM发触发指令,VM收到后开始执行流程,检测完成后把结果字符串保存在通信模块的缓冲区里,并置一个“结果有效”标志;PLC侧读到标志后取走结果,再复位标志。这样每一轮检测结果都对应一个明确触发的工件,不会串。
4.3 通信调试里最容易被忽视的三个细节
第一个是IP地址和端口没配对。工控机上有多个网卡时,VM通信模块绑定的IP地址必须和PLC访问的IP一致。第二个是报文编码格式不一致,VM发送的是ASCII字符,PLC侧如果按十六进制解析,读出来的内容就是错的。第三个是结束符不匹配,常见的有\r\n、\n,也可能没有结束符,PLC会把两条结果拼成一条解析。
我处理这类问题的方法比较简单:一开始就跟PLC同事约定好报文模板,比如固定用RESULT:OK;LEN=15.02;这种结构,并以邮件或文档形式存档。调试时先用串口助手或TCP调试工具做收发测试,确认格式无误后,再让PLC连上来。
下面是一段在PLC侧处理结果时常用的ST语言风格的伪代码,供参考:
// 请求触发 IF (bStartVision AND NOT bVisionBusy) THEN bVisionBusy := TRUE; bSendTrigger := TRUE; END_IF; // 等待VM结果有效信号 IF (bResultValid AND bVisionBusy) THEN sResult := sVisionResult; bVisionBusy := FALSE; bSendTrigger := FALSE; // 根据结果置位输出 IF sResult = 'OK' THEN bOK := TRUE; ELSE bNG := TRUE; END_IF; END_IF;这只是一个示意,但“触发—等待—取结果—复位”的时序关系是通用的。
4.4 PLC侧程序设计建议:别把判断逻辑都压在视觉里
还有一个原则:视觉系统负责给出检测结果,PLC负责工艺逻辑和动作执行。不要把“当前工件是否需要检测”“检测完成后把NG工件推到哪条线”这些判断塞给视觉流程。
PLC侧把触发条件做清楚,比如工件到位、气缸夹紧、前序工位完成信号都满足后,才向VM发触发。VM侧的流程只负责计算、返回结果。两边各司其职,后期维护会省很多力气。
5. 现场视觉调试的排查思路:从图像到参数的逐级定位
5.1 先解决“图好不好”,再谈“算法灵不灵”
现场调试里,九成疑难杂症的源头都出在图像质量,而不是算法参数。图像过曝,边缘会丢失;光照不足或反光带,会导致同一条直边在一个工件上有时能提取到、有时提取不到;光源频闪则让灰度值反复变化。图像一不稳定,后续模块再怎么调都白搭。
所以遇到误判时,我的第一反应永远是看原图。打开VM的图像显示模块,把当前帧的原图截图下来看:工件是否完整在视野内,边缘是否清晰,是否因为光源老化出现暗角,是否有油污或水雾影响镜头。这些都不行,直接调整机构、光源、镜头或相机参数,暂时不用动算法。
5.2 误判排查的固定顺序,按这个层级来
踩过几次坑之后,我整理了一套排查误判的固定顺序,每次调试都按这个顺序走,效率高很多。
| 排查层级 | 先检查什么 | 对应做法 |
|---|---|---|
| 原始图像 | 图像清晰与否、曝光是否合适 | 调光源、曝光、增益 |
| 检测区域(ROI) | 模块是否在正确位置提取特征 | 检查是否基于坐标系做区域跟随 |
| 预处理后图像 | 处理后特征是否被保留 | 关掉过度滤波,避免把边缘抹平 |
| 测量/检测结果 | 数据是否稳定、有无跳变 | 连续多帧观察结果分布 |
| 逻辑阈值 | 上下限是否合理 | 基于实际样品数据重新标定阈值 |
很多误判并不是算法错了,而是中间某一层被忽略了。比如检测区域没有跟随工件坐标系,位置一变就测偏;比如为了降噪开了很强的滤波,结果细小边缘被抹掉,测量尺寸系统性偏小。逐级排查可以快速定位是哪一层出了问题。
5.3 重视样张和负样本,比十个模块都管用
调试视觉系统最忌讳“现场拍一张,调一调,好像行了,就上线”。图像存在随机性,同一批工件的姿态、反光、背景都会有细微差异,单张调试通过的方案,可能在连续运行时偶尔误判。
我的做法是:在调试阶段尽量采集几十到上百张典型图片,包括不同位置、不同角度、不同光照下的工件,更重要的是多收集NG样品,也就是故障样本。然后在VM里用本地图片循环测试,反复调整参数,直到方案对样本集全部正确判断,再回到产线跑实时。
有一次调试一个产品表面缺陷检测,所有OK样张都通过了,但我留了一批存在细微划痕的NG样张,放到方案里一跑,漏了一个。后来在预处理阶段增加了一个灰度梯度增强模块,把细划痕的特征放大,才把漏检问题解决。没有负样本,这些问题根本发现不了。
5.4 规则算法搞不定时,再考虑深度学习模块
如果产品缺陷没有稳定的灰度规律、形状规律,用传统算法做很难,这时候可以考虑VisionMaster上的深度学习模块。它适合那种“人一眼能看出来但说不清规则”的场景,比如纹理表面的划痕、脏污、复杂背景下的目标检测。
但深度学习模块的使用有条件:需要一批标注样本做训练,样本量太少效果不稳定,而且训练和迭代的周期比传统算法长。我建议先评估能不能用规则算法,比如尺寸超差、位置偏移、有无判断,这些传统模块又稳又快。深度学习只作为规则算法无法覆盖部分的补充,不要一上来就过度设计。
6. 越过零代码边界:二次开发与视觉工程师的进阶路线
6.1 什么时候必须二次开发,先别急着学
零代码能解决大部分单工位、单相机的检测需求,但有一些场景必须要考虑做二次开发。
比如产线要求把所有检测结果上传MES,并且按订单号、产品批次做数据分组;比如同一个工位要根据配方切换不同检测流程,调用不同方案文件;比如需要在视觉流程里集成自定义的通信协议,对接客户私有平台;再比如结果要跟机器人做坐标引导,涉及相机坐标系和机器人坐标系的转换。这些需求都超出了纯流程配置能简单覆盖的范围。
我的建议是:第一,先不要因为“要二次开发”就排斥零代码平台,恰恰相反,VisionMaster这种平台是先跑通视觉应用、再逐步往底层延伸的很好载体。第二,学习二开的起点是平台自带的脚本模块,在流程里加一个C#脚本块,对流程结果做进一步处理。这样你不离开VM环境,就能先体会“代码和视觉模块结合”的感觉,成本很低。
6.2 从脚本模块到SDK,过渡路径有多平滑
对于PLC工程师,直接上手C++可能有点痛苦,但C#的学习曲线相对平缓,而且和Windows桌面应用开发结合紧密。VisionMaster提供的开发接口,可以在C#工程里加载方案、触发流程执行、读取结果,也可以把VM当成一个视觉计算引擎,嵌入到自研的上位机软件里。
我的过渡路径是这样的:先在VM里用脚本模块处理数据格式,学会变量、条件、循环这些基础语法;然后用官方提供的接口写一个简单的C#程序,加载局部方案并执行一次;接着把方案预加载到内存里,通过命令行或TCP指令触发,这样就不需要每次都打开VM界面;最后再慢慢接触自定义算法集成。
这个路径不需要一次性跨太大步。每走一步,前面的视觉流程依然能复用,所以零代码到二开是连续延伸,而不是推倒重来。
6.3 给想走这条路的同行的个人经验
带过一些从PLC转视觉的同事,我最大的观察是:视觉调试三分在算法、七分在现场。能把光源、机构、相机参数这些基础问题处理好,零代码平台已经能覆盖大部分项目需求。不要一开始就奔着深度学习或者底层算子去,那会把精力从真正重要的现场工程问题上挪走。
另外一个体会是:要重视数据积累。每次项目调试完,把典型样张、检测结果、参数设置、现场照片归档整理好。下一回遇到类似项目,直接调出来做参考,效率翻倍。视觉项目表面上拼算法,实际拼的是经验库。
如果你也是PLC背景,正在准备接触视觉系统,我的建议很简单:装好VM,接一台相机,从读取一张本地图片开始,搭一个最简单的流程,把一个螺丝或一个零件的OK/NG判出来。这个流程走通之后,后面的一切都会顺很多。